howtos:fpga

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
howtos:fpga [2025/09/20 12:40] – créée hackens-pubhowtos:fpga [2025/09/20 14:04] (Version actuelle) hackens-pub
Ligne 1: Ligne 1:
 <!DOCTYPE markdown> <!DOCTYPE markdown>
  
-# FPGA ULX3S (EPC5-85F)+Comment utiliser le FPGA d'hackens (ULX3S)
  
  
Ligne 24: Ligne 24:
 ## Génération des fichiers verilog à partir de Bluespec ## Génération des fichiers verilog à partir de Bluespec
  
-```make +Bluespec est un langage de description de hardware de haut niveau, il permet de décrire des circuits sous forme d'un ensemble de règles que le compilateur ordonnance.  
-PACKAGES ./src/:++On peut ainsi faire clignoter une LED avec le programme suivant : 
 + 
 +```bsc 
 +interface Top; 
 +  (* always_ready, always_enabled *) 
 +  method Bit#(8) led; 
 +endinterface 
 + 
 +(* synthesize *) 
 +module mkTop(Top); 
 +  Reg#(Bit#(32)) counter <- mkReg(0); 
 + 
 +  rule incr_counter; 
 +    counter <counter 1; 
 +  endrule 
 + 
 +  method led = truncateLSB(counter); 
 +endmodule 
 +``` 
 +et le compiler sous forme de fichiers verilog avec cette commande: 
 + 
 +```bash
 bsc \ bsc \
  -verilog \  -verilog \
- -vdir $(RTL) -bdir $(BUILD) -info-dir $(BUILD) \+ -vdir rtl -bdir build -info-dir build \
  -no-warn-action-shadowing  -check-assert \  -no-warn-action-shadowing  -check-assert \
  -keep-fires -aggressive-conditions -show-schedule \  -keep-fires -aggressive-conditions -show-schedule \
  -cpp +RTS -K128M -RTS  -show-range-conflict \  -cpp +RTS -K128M -RTS  -show-range-conflict \
- -p $(PACKAGES) -g mkTop -u $(TOP)+ -p :+ -g mkTop -u Main.bsv
 ``` ```
  
-- ``` PACKAGES``` liste des dossiers dont les fichiers .bs et .bsv sont importés, le + représente la lib standard+- ``` -p :+``` liste des dossiers dont les fichiers .bs et .bsv sont importés, le + représente la librarie standard
 - ``` Top``` est le fichier principale - ``` Top``` est le fichier principale
 - ``` mkTop``` est le module principale - ``` mkTop``` est le module principale
-- ``` keep-fires``` utilise le sceduling intuitif: active chaque règne dés que possible (moins les conflits) +- ``` keep-fires``` utilise le sceduling intuitif: active chaque règle dés que possible, certaines règles peuvent tout de même rester inactives en cas de conflit avec une autre règle 
-- ``` aggressive-conditions``` je pense que c'estsi $e_1$ est gardé par la condition $c_1$ et $e_2$ est gardé par la condition $c_2$ alors $(c e_1 e_2)$ a pour condition de garde $(c c_1 c_2)$ plutot que $c_1 \lor c_2$, les conditions sont plus difficile à calculer mais c'est plus intuitif et ne demande pas de faire deux règles pour scheduler $e_1$ et $e_2$+- ``` aggressive-conditions``` défini l'ordonnancement en cas de ``` ... ? ... ...```, ainsi, ``` cond fifo1.first fifo2.first``` sera ordonnancer avec la condition de garde ``` cond fifo1.notEmpty fifo2.notEmpty``` plutôt que ``` fifo1.notEmpty || fifo2.notEmpty``` sans utiliser cet argument. Ainsi, les conditions de garde sont plus difficiles à calculermais aussi plus intuitives.
  
 ## Génération des LUT (look-up-table) avec yosys ## Génération des LUT (look-up-table) avec yosys
  
 ```make ```make
-yosys -DULX3S -q -p "synth_ecp5 -abc9 -top mkTop -json mkTop.json" $(LIB)+yosys -DULX3S -q -p "synth_ecp5 -abc9 -top mkTop -json mkTop.json" rtl/mkTop.v
  
 ``` ```
-- ``` LIB``` est la liste des fichiers verilog+- ``` rtl/mkTop.v``` est la liste des fichiers verilog, dans ce cas le fichier générer par Bluespec
 - ``` mkTop``` est le module verilog principale - ``` mkTop``` est le module verilog principale
 - ``` mkTop.json``` est la sortie de yosys - ``` mkTop.json``` est la sortie de yosys
Ligne 63: Ligne 84:
 - ``` --85k``` nombre de LUT du FPGA - ``` --85k``` nombre de LUT du FPGA
 - on peut ajouter ``` -gui``` pour avoir une interface graphique et voir le placement sur le FPGA - on peut ajouter ``` -gui``` pour avoir une interface graphique et voir le placement sur le FPGA
 +
 +Pour cet exemple,  ulx3s.lpf décrit les pins de la LED, l'horloge et du signal de réinitialisation :
 +
 +```
 +BLOCK RESETPATHS;
 +BLOCK ASYNCPATHS;
 +## ULX3S v2.0 and v2.1
 +
 +# The clock "usb" and "gpdi" sheet
 +LOCATE COMP "CLK" SITE "G2";
 +IOBUF  PORT "CLK" PULLMODE=NONE IO_TYPE=LVCMOS33;
 +FREQUENCY PORT "CLK" 40 MHZ;
 +
 +# JTAG and SPI FLASH voltage 3.3V and options to boot from SPI flash
 +# write to FLASH possible any time from JTAG:
 +SYSCONFIG CONFIG_IOVOLTAGE=3.3 COMPRESS_CONFIG=ON MCCLK_FREQ=62 MASTER_SPI_PORT=ENABLE SLAVE_SPI_PORT=DISABLE SLAVE_PARALLEL_PORT=DISABLE;
 +# write to FLASH possible from user bitstream, not possible form JTAG:
 +# SYSCONFIG CONFIG_IOVOLTAGE=3.3 COMPRESS_CONFIG=ON MCCLK_FREQ=62 MASTER_SPI_PORT=DISABLE SLAVE_SPI_PORT=DISABLE SLAVE_PARALLEL_PORT=DISABLE;
 +
 +LOCATE COMP "RST_N" SITE "D6";  # BTN_PWRn (inverted logic)
 +IOBUF  PORT "RST_N" PULLMODE=UP IO_TYPE=LVCMOS33 DRIVE=4;
 +
 +## LED indicators "blinkey" and "gpio" sheet
 +LOCATE COMP "led[7]" SITE "H3";
 +LOCATE COMP "led[6]" SITE "E1";
 +LOCATE COMP "led[5]" SITE "E2";
 +LOCATE COMP "led[4]" SITE "D1";
 +LOCATE COMP "led[3]" SITE "D2";
 +LOCATE COMP "led[2]" SITE "C1";
 +LOCATE COMP "led[1]" SITE "C2";
 +LOCATE COMP "led[0]" SITE "B2";
 +IOBUF  PORT "led[0]" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4;
 +IOBUF  PORT "led[1]" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4;
 +IOBUF  PORT "led[2]" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4;
 +IOBUF  PORT "led[3]" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4;
 +IOBUF  PORT "led[4]" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4;
 +IOBUF  PORT "led[5]" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4;
 +IOBUF  PORT "led[6]" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4;
 +IOBUF  PORT "led[7]" PULLMODE=NONE IO_TYPE=LVCMOS33 DRIVE=4;
 +```
  
 ## Génération du bitstream avec ecppack ## Génération du bitstream avec ecppack
  • howtos/fpga.1758372055.txt.gz
  • Dernière modification : 2025/09/20 12:40
  • de hackens-pub