de     

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
en:ztex_boards:ztex_fpga_boards:sd_cards_on_series_2_fpga_boards [2014/07/15 22:24] stefanen:ztex_boards:ztex_fpga_boards:sd_cards_on_series_2_fpga_boards [2014/07/21 13:03] stefan
Line 3: Line 3:
 By introduction of [[http://www.ztex.de/usb-fpga-2/|Series 2 FPGA Boards]] the microSD socket used on Series 1 FPGA Boards has been replaced by fixed SPI Flash. Nevertheless, SD-Card support can be easily be re-enabled by adding an (micro)SD card socket to the application circuit and routing the signals through FPGA. This is explained best by an example: By introduction of [[http://www.ztex.de/usb-fpga-2/|Series 2 FPGA Boards]] the microSD socket used on Series 1 FPGA Boards has been replaced by fixed SPI Flash. Nevertheless, SD-Card support can be easily be re-enabled by adding an (micro)SD card socket to the application circuit and routing the signals through FPGA. This is explained best by an example:
  
 +A SD card is connected to an [[http://www.ztex.de/usb-fpga-2/usb-fpga-2.01.e.html|USB-FPGA Module 2.01]] as follows
 +
 +| ^  External I/O  || ^  FX2 I/O  ^^
 +^  Signal  ^  pin  ^  FPGA pin  ^  direction  ^  pin  ^  FPGA pin  ^
 +|  CS  |  B13  |  K15  |  ← (in)  |  PC1  |  N12  |
 +|  DI  |  B14  |  J13  |  ← (in)  |  PC2  |  P12  |
 +|  CLK  |  B18  |  J14  |  ← (in)  |  PC3  |  N5  |
 +|  DO  |  B19  |  H15  |  → (out)  | PA2  |  H15  |
 +
 +The HDL code for routing the signals is:
 +
 +<code ucf>
 +# ...
 +
 +NET "pa2" LOC = "B10" | IOSTANDARD = LVCMOS33 ; # PA2
 +NET "pc1" LOC = "N12" | IOSTANDARD = LVCMOS33 ; # PC1/GPIFADR1
 +NET "pc2" LOC = "P12" | IOSTANDARD = LVCMOS33 ; # PC2/GPIFADR2
 +NET "pc3" LOC = "N5" | IOSTANDARD = LVCMOS33 ; # PC3/GPIFADR3
 +
 +NET "b13" LOC = "K15" | IOSTANDARD = LVCMOS33 ;
 +NET "b14" LOC = "J13" | IOSTANDARD = LVCMOS33 ;
 +NET "b18" LOC = "J14" | IOSTANDARD = LVCMOS33 ;
 +NET "b19" LOC = "H15" | IOSTANDARD = LVCMOS33 ;
 +
 +# ...
 +</code>
 +
 +(.ucf constraints file) and 
 +
 +<code verilog>
 +// ...
 +
 +module top (
 +
 +        // ...
 +        
 + input pc1,pc2,pc3, b19,
 + output b13,b14,b18, pa2
 +    );
 +    
 +    // ...
 +    
 +    assign b13 = pc1;
 +    assign b14 = pc2;
 +    assign b18 = pc3;
 +    assign pa2 = b19;
 +    
 +    // ...
 +        
 +endmodule
 +</code>
 +(verilog HDL file).
 +
 +In order to enable firmware support the following lines have to be inserted between ''#include[ztex-conf.h]'' and ''#include[ztex.h]''
 +
 +<code>
 +ENABLE_FLASH2;            // enables SD support as secondary Flash
 +#define[MMC_PORT][C]      // Port for input signals, valid values: A..D
 +#define[MMC__PORT_DO][A]  // Port for output signals (valid values: A..D,
 +                          // can be omitted if equal to input port)
 +#define[MMC_BIT_CS][1]    // Pin number for CS signal, i.e. PC1
 +#define[MMC_BIT_DI][2]    // Pin number for DI signal, i.e. PC2
 +#define[MMC_BIT_DO][2]    // Pin number for DO signal, i.e. PA2
 +#define[MMC_BIT_CLK][3]   // Pin number for CLK signal, i.e. PC3
 +</code>
 +
 +From the firmware the SD card now can be accessed using the functions ''flash2_read_init'', ''flash2_read'', ''flash2_read_finish'',''flash2_write_init'', ''flash2_write'', ''flash2_write_finish''. The syntax is is the same as of ''flash_read_*'' and ''flash_write_*'' functions.
 +
 +From host software the SD card can be accessed using then functions [[http://www.ztex.de/firmware-kit/docs/java/ztex/Ztex1v1.html#flash2Enabled()|flash2*]] (which are equivalent to the [[http://www.ztex.de/firmware-kit/docs/java/ztex/Ztex1v1.html#flashEnabled()|functions for primary flash]]).
 +
 +Their usage can be explained with ''flashdemo'' example ported to secondary flash. The firmware code is:
 +
 +<code c>
 +#include[ztex-conf.h] // Loads the configuration macros, see ztex-conf.h for the available macros
 +#include[ztex-utils.h] // include basic functions and variables
 +
 +// select ZTEX USB FPGA Module 2.01 as target  (required for FPGA configuration)
 +IDENTITY_UFM_2_01(10.18.0.0,0);  
 +
 +// enable Flash support
 +ENABLE_FLASH;
 +ENABLE_FLASH_BITSTREAM;
 +
 +ENABLE_FLASH2;            // enables SD support as secondary Flash
 +#define[MMC_PORT][C]      // Port for input signals, valid values: A..D
 +#define[MMC__PORT_DO][A]  // Port for output signals (valid values: A..D,
 +                          // can be omitted if equal to input port)
 +#define[MMC_BIT_CS][1]    // Pin number for CS signal, i.e. PC1
 +#define[MMC_BIT_DI][2]    // Pin number for DI signal, i.e. PC2
 +#define[MMC_BIT_DO][2]    // Pin number for DO signal, i.e. PA2
 +#define[MMC_BIT_CLK][3]   // Pin number for CLK signal, i.e. PC3
 +
 +// this product string is also used for identification by the host software
 +#define[PRODUCT_STRING]["Flash2 demo for UFM 2.01"]
 +
 +__code char flash2_string[] = "Hello World!";
 +
 +// include the main part of the firmware kit, define the descriptors, ...
 +#include[ztex.h]
 +
 +void main(void)
 +{
 +    __xdata DWORD sector;
 +
 +    init_USB(); // init everything
 +
 +    if ( flash2_enabled ) {
 + flash2_read_init( 0 ); // prepare reading sector 0
 + flash2_read((__xdata BYTE*) &sector, 4); // read the number of last sector 
 + flash2_read_finish(flash2_sector_size - 4); // dummy-read the rest of the sector + finish read operation
 +
 + sector++;
 + if ( sector > flash2_sectors || sector == 0 ) {
 +     sector = 1;
 + }
 +
 + flash2_write_init( 0 ); // prepare writing sector 0
 + flash2_write((__xdata BYTE*) &sector, 4); // write the current sector number
 + flash2_write_finish_sector(flash2_sector_size - 4); // dummy-write the rest of the sector + CRC
 + flash2_write_finish(); // finish write operation
 +
 + flash2_write_init( sector ); // prepare writing sector sector
 + flash2_write((__xdata BYTE*) flash2_string, sizeof(flash2_string)); // write the string 
 + flash2_write_finish_sector(flash2_sector_size - sizeof(flash2_string)); // dummy-write the rest of the sector + CRC
 + flash2_write_finish(); // finish write operation
 +    }
 +
 +    while (1) { } //  twiddle thumbs
 +}
 +</code>
 +
 +and the host software is defined by 
 +<code java>
 +import java.io.*;
 +import java.util.*;
 +
 +import ch.ntb.usb.*;
 +
 +import ztex.*;
 +
 +// *****************************************************************************
 +// ******* ParameterException **************************************************
 +// *****************************************************************************
 +// Exception the prints a help message
 +class ParameterException extends Exception {
 +    public final static String helpMsg = new String (
 + "Parameters:\n"+
 +   -d <number>  Device Number (default: 0)\n" +
 +   -f   Force uploads\n" +
 +   -p           Print bus info\n" +
 +   -ue          Upload Firmware to EEPROM\n" +
 +   -re          Reset EEPROM Firmware\n" +
 +   -w           Enable certain workarounds\n" +
 +   -h           This help" );
 +    
 +    public ParameterException (String msg) {
 + super( msg + "\n" + helpMsg );
 +    }
 +}
 +
 +// *****************************************************************************
 +// ******* Test0 ***************************************************************
 +// *****************************************************************************
 +class FlashDemo extends Ztex1v1 {
 +
 +// ******* FlashDemo ***********************************************************
 +// constructor
 +    public FlashDemo ( ZtexDevice1 pDev ) throws UsbException {
 + super ( pDev );
 +    }
 +
 +// ******* main ****************************************************************
 +    public static void main (String args[]) {
 +    
 + int devNum = 0;
 + boolean force = false;
 + boolean workarounds = false;
 +
 + try {
 +// init USB stuff
 +     LibusbJava.usb_init();
 +
 +// scan the USB bus
 +     ZtexScanBus1 bus = new ZtexScanBus1( ZtexDevice1.ztexVendorId, ZtexDevice1.ztexProductId, true, false, 1);
 +     if ( bus.numberOfDevices() <= 0) {
 + System.err.println("No devices found");
 +         System.exit(0);
 +     }
 +     
 +// scan the command line arguments
 +        for (int i=0; i<args.length; i++ ) {
 +         if ( args[i].equals("-d") ) {
 +         i++;
 +     try {
 + if (i>=args.length) throw new Exception();
 +    devNum = Integer.parseInt( args[i] );
 +     } 
 +     catch (Exception e) {
 +         throw new ParameterException("Device number expected after -d");
 +     }
 + }
 + else if ( args[i].equals("-f") ) {
 +     force = true;
 + }
 + else if ( args[i].equals("-p") ) {
 +         bus.printBus(System.out);
 +     System.exit(0);
 + }
 + else if ( args[i].equals("-w") ) {
 +         workarounds = true;
 + }
 + else if ( args[i].equals("-h") ) {
 +         System.err.println(ParameterException.helpMsg);
 +             System.exit(0);
 + }
 + else if ( !args[i].equals("-re") && !args[i].equals("-ue") )
 +     throw new ParameterException("Invalid Parameter: "+args[i]);
 +     }
 +     
 +
 +// create the main class     
 +     FlashDemo ztex = new FlashDemo ( bus.device(devNum) );
 +     ztex.certainWorkarounds = workarounds;
 +     
 +// upload the firmware if necessary
 +     if ( force || ! ztex.valid() || ! ztex.dev().productString().equals("Flash2 demo for UFM 2.01" ) {
 + System.out.println("Firmware upload time: " + ztex.uploadFirmware( "flashdemo.ihx", force ) + " ms");
 +     }
 +
 +        for (int i=0; i<args.length; i++ ) {
 + if ( args[i].equals("-re") ) {
 +     ztex.eepromDisable();
 +
 + else if ( args[i].equals("-ue") ) {
 +     System.out.println("Firmware to EEPROM upload time: " + ztex.eepromUpload( "flashdemo.ihx", force ) + " ms");
 + }
 +     }
 +     
 +// print some information
 +     System.out.println("Capabilities: " + ztex.capabilityInfo(", "));
 +     System.out.println("Enabled: " + ztex.flash2Enabled());
 +     System.out.println("Size: " + ztex.flash2Size());
 +     ztex.printMmc2State();
 +     
 +     if ( ztex.getFlash2EC() == ztex.FLASH_EC_PENDING ) {
 + System.out.print("Another operation is pending. Waiting ..");
 + int i = 20;
 + do {
 +     System.out.print(".");
 +     try {
 +    Thread.sleep( 1000 );
 +        }
 +     catch ( InterruptedException e) {
 +        } 
 +        i--;
 + } while ( ztex.getFlash2EC()==ztex.FLASH_EC_PENDING && i>0 );
 + System.out.println();
 +     }
 +     
 +     byte[] buf = new byte[ztex.flash2SectorSize()];
 +     ztex.flash2ReadSector(0,buf); // read out the last sector;
 +     int sector = (buf[0] & 255) | ((buf[1] & 255) << 8) | ((buf[1] & 255) << 16) | ((buf[1] & 255) << 24);
 +     System.out.println("Last sector: "+sector);
 +
 +     ztex.flash2ReadSector(sector,buf); // read out the string
 +     int i=0;
 +     while ( buf[i] != '\0'&& i < ztex.flash2SectorSize() )
 +         i++;
 +     System.out.println("The string: `" + new String(buf,0,i)+ "'");
 + }
 + catch (Exception e) {
 +     System.out.println("Error: "+e.getLocalizedMessage() );
 +
 +   
 +   
 +}
 +</code>
 
en/ztex_boards/ztex_fpga_boards/sd_cards_on_series_2_fpga_boards.txt · Last modified: 2016/09/14 19:45 by stefan
 
Recent changes RSS feed Creative Commons License Powered by PHP Debian Driven by DokuWiki
[ZTEX Home] [Imprint] [Privacy policy]