openFPGALoader/README.md

231 lines
6.1 KiB
Markdown
Raw Normal View History

2019-12-06 11:51:47 +01:00
# openFPGALoader
2019-12-06 13:24:36 +01:00
Universal utility for programming FPGA
2019-09-26 18:53:30 +02:00
2019-12-06 13:24:36 +01:00
__Current support kits:__
2019-12-06 07:45:19 +01:00
2019-09-26 18:53:30 +02:00
* Trenz cyc1000 Cyclone 10 LP 10CL025 (memory and spi flash)
* Digilent arty Artix xc7a35ti (memory and spi flash)
* Lattice MachXO3LF Starter Kit LCMX03LF-6900C (memory and flash)
2019-12-06 07:45:19 +01:00
* [Trenz Gowin LittleBee (TEC0117)](https://shop.trenz-electronic.de/en/TEC0117-01-FPGA-Module-with-GOWIN-LittleBee-and-8-MByte-internal-SDRAM)
* [Sipeed Tang Nano](https://tangnano.sipeed.com/en/) (memory)
2019-12-06 07:45:19 +01:00
2019-12-06 13:24:36 +01:00
__Supported (tested) FPGA:__
2019-12-06 07:45:19 +01:00
* Gowin [GW1N (GW1N-1, GW1NR-9)](https://www.gowinsemi.com/en/product/detail/2/) (SRAM and Flash (flash mode only tested with GW1NR-9))
* Lattice [MachXO3LF](http://www.latticesemi.com/en/Products/FPGAandCPLD/MachXO3.aspx) (SRAM and Flash)
2019-12-06 13:24:36 +01:00
* Xilinx Artix 7 [xc7a35ti](https://www.xilinx.com/products/silicon-devices/fpga/artix-7.html) (memory and spi flash)
* Intel Cyclone 10 LP [10CL025](https://www.intel.com/content/www/us/en/products/programmable/fpga/cyclone-10.html)
2019-12-06 07:45:19 +01:00
__Supported cables:__
2019-11-19 16:21:04 +01:00
* JTAG-HS3: jtag programmer cable from digilent
2019-12-06 07:45:19 +01:00
* FT2232: generic programmer cable based on Ftdi FT2232
* Tang Nano USB-JTAG interface: FT2232C clone based on CH552 microcontroler
(with some limitations and workaround)
2019-09-26 18:53:30 +02:00
## compile and install
2019-10-05 12:00:29 +02:00
This application uses **libftdi1**, so this library must be installed (and,
2019-09-26 18:53:30 +02:00
depending of the distribution, headers too)
```bash
apt-get install libftdi1-2 libftdi1-dev libftdipp1-3 libftdipp1-dev libudev-dev
2019-09-26 18:53:30 +02:00
```
2019-10-05 12:00:29 +02:00
and if not already done, install **pkg-config**, **make** and **g++**.
2019-09-26 18:53:30 +02:00
To build the app:
```bash
$ make
```
To install
```bash
$ sudo make install
```
Currently, the install path is hardcoded to /usr/local
## Usage
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader --help
Usage: openFPGALoader [OPTION...] BIT_FILE
openFPGALoader -- a program to flash cyclone10 LP FPGA
2019-09-26 18:53:30 +02:00
-b, --board=BOARD board name, may be used instead of cable
-c, --cable=CABLE jtag interface
-d, --device=DEVICE device to use (/dev/ttyUSBx)
-f, --write-flash write bitstream in flash (default: false, only for
Gowin devices)
--list-boards list all supported boards
--list-cables list all supported cables
--list-fpga list all supported FPGA
-m, --write-sram write bitstream in SRAM (default: true, only for
Gowin devices)
2019-09-26 18:53:30 +02:00
-o, --offset=OFFSET start offset in EEPROM
-r, --reset reset FPGA after operations
-v, --verbose Produce verbose output
-?, --help Give this help list
--usage Give a short usage message
-V, --version Print program version
```
To have complete help
### Generic usage
#### display FPGA
With board name:
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader -b theBoard
```
(see `openFPGALoader --list-boards`)
With cable:
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader -c theCable
```
(see `openFPGALoader --list-cables`)
With device node:
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader -d /dev/ttyUSBX
```
**Note:** for some cable (like *digilent* adapters) signals from the converter
are not just directly to the FPGA. For this case, the *-c* must be added.
2019-12-06 11:51:47 +01:00
**Note:** when -d is not provided, *openFPGALoader* will opens the first *ftdi*
found, if more than one converter is connected to the computer,
the *-d* option is the better solution
#### Reset device
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader [options] -r
```
#### load bitstream device (memory or flash)
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader [options] /path/to/bitstream.ext
```
2019-09-26 18:53:30 +02:00
### CYC1000
#### loading in memory:
sof to svf generation:
```bash
quartus_cpf -c -q -g 3.3 -n 12.0MHz p project_name.sof project_name.svf
```
file load:
2019-09-26 18:53:30 +02:00
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader -b cyc1000 project_name.svf
2019-09-26 18:53:30 +02:00
```
#### SPI flash:
sof to rpd:
2019-09-26 18:53:30 +02:00
```bash
quartus_cpf -o auto_create_rpd=on -c -d EPCQ16A -s 10CL025YU256C8G project_name.svf project_name.jic
2019-09-26 18:53:30 +02:00
```
file load:
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader -b cyc1000 -r project_name_auto.rpd
```
**Note about SPI flash:
svf file used to write in flash is just a bridge between FT2232 interfaceB
configured in SPI mode and sfl primitive used to access EPCQ SPI flash.**
**Note about FT2232 interfaceB:
This interface is used for SPI communication only when the dedicated svf is
loaded in RAM, rest of the time, user is free to use for what he want.**
### ARTY
To simplify further explanations, we consider the project is generated in the
current directory.
#### loading in memory:
*.bit* file is the default format generated by *vivado*, so nothing special
task must be done to generates this bitstream.
__file load:__
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader -b arty *.runs/impl_1/*.bit
```
#### SPI flash:
.mcs must be generates through vivado with a tcl script like
```tcl
set project [lindex $argv 0]
set bitfile "${project}.runs/impl_1/${project}.bit"
set mcsfile "${project}.runs/impl_1/${project}.mcs"
write_cfgmem -format mcs -interface spix4 -size 16 \
-loadbit "up 0x0 $bitfile" -loaddata "" \
-file $mcsfile -force
```
**Note:
*-interface spix4* and *-size 16* depends on SPI flash capability and size.**
The tcl script is used with:
```bash
vivado -nolog -nojournal -mode batch -source script.tcl -tclargs myproject
```
__file load:__
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader -b arty *.runs/impl_1/*.mcs
```
2019-11-18 16:05:33 +01:00
### MachXO3 Starter Kit
#### Flash memory:
*.jed* file is the default format generated by *Lattice Diamond*, so nothing
special must be done to generates this file.
__file load__:
```bash
2019-12-06 11:51:47 +01:00
openFPGALoader -b machXO3SK impl1/*.jed
2019-11-18 16:05:33 +01:00
```
#### SRAM:
To generates *.bit* file **Bitstream file** must be checked under **Exports Files** in *Lattice Diamond* left panel.
__file load__:
```bash
openFPGALoader -b machXO3SK impl1/*.bit
```
2019-12-06 07:45:19 +01:00
### Trenz GOWIN LittleBee (TEC0117) and Sipeed Tang Nano
2019-12-06 07:45:19 +01:00
*.fs* file is the default format generated by *Gowin IDE*, so nothing
special must be done to generates this file.
Since the same file is used for SRAM and Flash a CLI argument is used to
specify the destination.
#### Flash SRAM:
with **-m**
__file load (Trenz)__:
```bash
openFPGALoader -m -b littleBee impl/pnr/*.fs
```
__file load (Tang Nano)__:
```bash
openFPGALoader -m -b tangnano impl/pnr/*.fs
```
#### Flash (only with Trenz board):
with **-f**
2019-12-06 07:45:19 +01:00
__file load__:
```bash
openFPGALoader -f -b littleBee impl/pnr/*.fs
2019-12-06 07:45:19 +01:00
```