1 | |
---|
2 | README for the spi_boot core |
---|
3 | ============================ |
---|
4 | Version: $Id: README 77 2009-04-01 19:53:14Z arniml $ |
---|
5 | |
---|
6 | |
---|
7 | Description |
---|
8 | ----------- |
---|
9 | |
---|
10 | The SD/MMC Bootloader is a CPLD design that manages configuration and |
---|
11 | bootstrapping of FPGAs. It is able to retrieve the required data from |
---|
12 | SecureDigital (SD) cards or MultiMediaCards (MMC) and manages the FPGA |
---|
13 | configuration process. SD cards as well as MMCs are operated in SPI mode which |
---|
14 | is part of both standards thus eliminating the need for dedicated |
---|
15 | implementations. The SD/MMC Bootloader fits both. Beyond configuration, this |
---|
16 | core supports a bootstrapping strategy where multiple images are stored on one |
---|
17 | single memory card. |
---|
18 | For example consider a system completely based on SRAM. The bootloader |
---|
19 | provides the initial configuration data from the first image to the FPGA. This |
---|
20 | image contains a design which pulls the next image from the memory card and |
---|
21 | transfers this data to SRAM. In the third step the final FPGA design is loaded |
---|
22 | from the third image. |
---|
23 | These images are clustered in sets which can be selected by external switches |
---|
24 | for example. Several configuration sets can be stored on one memory card |
---|
25 | allowing you to provide a number of applications which are downloaded quickly |
---|
26 | to the FPGA. |
---|
27 | The schematic (rev. B) shows how the core can be used with an FPGA board. I |
---|
28 | use it to configure/boot the Xilinx Spartan IIe on BurchED's B5-X300 |
---|
29 | board. SV2 fits the "SERIAL MODE" connector on this board but you will have to |
---|
30 | add a separate wire from R6 to attach INIT. Please check the proper use of the |
---|
31 | pull-up resistors for your specific board. |
---|
32 | |
---|
33 | |
---|
34 | Features |
---|
35 | -------- |
---|
36 | |
---|
37 | * Configuration mode: configures SRAM based FPGAs via slave serial mode |
---|
38 | (Xilinx and Altera) |
---|
39 | * Data mode: provides stored data over a simple synchronous serial interface |
---|
40 | * Broad compatability using SPI mode |
---|
41 | + SecureDigital cards using dedicated initialization command |
---|
42 | + MultiMediaCards (see below) |
---|
43 | * Operation triggerd by power-up or card insertion |
---|
44 | * Multiple configuration sets stored on on single memory card |
---|
45 | |
---|
46 | |
---|
47 | Compatability |
---|
48 | ------------- |
---|
49 | |
---|
50 | These cards have been tested with the SD/MMC Bootloader: |
---|
51 | |
---|
52 | * Hama 64 MB SD |
---|
53 | * SanDisk 128 MB SD |
---|
54 | * SanDisk 64 MB MMC |
---|
55 | * Panasonic 32 MB SD |
---|
56 | |
---|
57 | Some MMC might fail with this core as not all cards support CMD18 |
---|
58 | (READ_MULTIPLE_BLOCK). Please consult the data sheet of your specific |
---|
59 | model. In case your MMC does not implement CMD18 you might want to have a look |
---|
60 | at the FPGA MMC-Card Config project. |
---|
61 | |
---|
62 | |
---|
63 | Tools |
---|
64 | ----- |
---|
65 | |
---|
66 | Downloading the configuration data to the card is a straight forward |
---|
67 | process. The images have to be written starting at dedicated locations. For |
---|
68 | the provided toplevel designs, these locations are multiples of 256 K. I.e. 0, |
---|
69 | 0x40000, 0x80000 and so forth. |
---|
70 | |
---|
71 | dd (part of the GNU coreutils) serves this purpose: |
---|
72 | $ dd if=ram_loader.bin of=/dev/sdX bs=512 |
---|
73 | $ dd if=pongrom_6.bin of=/dev/sdX bs=512 seek=512 |
---|
74 | $ dd if=pacman.bin of=/dev/sdX bs=512 seek=1024 |
---|
75 | |
---|
76 | The name of the device node depends on how the card reader is attached to the |
---|
77 | kernel. For Linux systems this is most often something like /dev/sdX with X |
---|
78 | ranging from a-z. Please note that it is essential to use the device without |
---|
79 | any trailing numbers as they refer to partitions leading to wrong offsets for |
---|
80 | data written to the card. |
---|
81 | All this works perfectly for my Spartan IIe device as this FPGA expects the |
---|
82 | configuration data as it is delivered from the card: Consecutive bytes each |
---|
83 | with its most significant bit first. Altera devices like the FLEX family are |
---|
84 | different here. They expect the bytes with least significant bit |
---|
85 | first. Therefore, the configuration data has to be swapped bitwise before it |
---|
86 | is written to the card. Michael Libeskind kindly provided a program that |
---|
87 | accimplishes this task. Find it in sw/misc/bit_reverse.c. |
---|
88 | |
---|
89 | |
---|
90 | Verification |
---|
91 | ------------ |
---|
92 | |
---|
93 | The spi_boot core comes with a simple testbench that simulates an SD/MMC |
---|
94 | card. All four implementations of the core are verified there in parallel |
---|
95 | while transferring the data for several sets. |
---|
96 | You should normally not need to run the testbench. But in case you modified |
---|
97 | the VHDL code the testbench gives some hints if the design has been broken. |
---|
98 | |
---|
99 | |
---|
100 | Directory Structure |
---|
101 | ------------------- |
---|
102 | |
---|
103 | The core's directory structure follows the proposal of OpenCores.org. |
---|
104 | |
---|
105 | spi_boot |
---|
106 | | |
---|
107 | \--+-- doc : Documentation |
---|
108 | | | |
---|
109 | | \-- src : Source files of documentation |
---|
110 | | |
---|
111 | +-- rtl |
---|
112 | | | |
---|
113 | | \-- vhdl : VHDL code containing the RTL description |
---|
114 | | of the core. |
---|
115 | | |
---|
116 | +-- bench |
---|
117 | | | |
---|
118 | | \-- vhdl : VHDL testbench code. |
---|
119 | | |
---|
120 | \-- sim |
---|
121 | | |
---|
122 | \-- rtl_sim : Directory for running simulations. |
---|
123 | |
---|
124 | |
---|
125 | RAM Loader |
---|
126 | ---------- |
---|
127 | |
---|
128 | Directory rtl/vhdl/ram_loader contains the sample design which loads the next |
---|
129 | image from the card and stores its contents to external asynchronous |
---|
130 | RAM. After reading 64 KB it triggers a new configuration process for the final |
---|
131 | FPGA design. |
---|
132 | Refer to the code for the mechanisms involved. |
---|
133 | |
---|
134 | |
---|
135 | Compiling the VHDL Code |
---|
136 | ----------------------- |
---|
137 | |
---|
138 | VHDL compilation and simulation tasks take place inside in sim/rtl_sim |
---|
139 | directory. The project setup supports only the GHDL simulator (see |
---|
140 | http://ghdl.free.fr). |
---|
141 | |
---|
142 | To compile the code simply type at the shell |
---|
143 | |
---|
144 | $ make |
---|
145 | |
---|
146 | This should result in a file called tb_behav_c0 which can be executed as any |
---|
147 | other executable. |
---|
148 | |
---|
149 | The basic simple sequence list can be found in COMPILE_LIST. This can be |
---|
150 | useful to quickly set up the analyze stage of any compiler or |
---|
151 | synthesizer. Especially when synthesizing the code, you want to skip the VHDL |
---|
152 | configurations in *-c.vhd and everything below the bench/ directory. |
---|
153 | |
---|
154 | |
---|
155 | References |
---|
156 | ---------- |
---|
157 | |
---|
158 | * SanDisk SD Card Product Manual |
---|
159 | http://www.sandisk.com/pdf/oem/ProdManualSDCardv1.9.pdf |
---|
160 | |
---|
161 | * SanDisk MMC Product Manual |
---|
162 | http://www.sandisk.com/pdf/oem/manual-rs-mmcv1.0.pdf |
---|
163 | |
---|
164 | * Toshiba SD Card Specification |
---|
165 | http://i.cmpnet.com/chipcenter/memory/images/prod055.pdf |
---|
166 | |
---|
167 | * BurchED |
---|
168 | http://burched.biz/ |
---|
169 | |
---|
170 | * FPGA MMC-Card Config project |
---|
171 | http://www.opencores.org/projects.cgi/web/mmcfpgaconfig/overview |
---|