2.8 KiB
2.8 KiB
FPGA ULX3S (EPC5-85F)
Un FPGA est un océan de portes reprogrammable. Plus puissant qu'un microcontrôlleur, on peut installer dessus un CPU ou du hardware spécialisé.
Pour un example d'utilisation voir:
- https://ulx3s.github.io/
- https://github.com/ulx3s/blink/tree/main
- https://blog.dave.tf/post/getting-started-fpga/
Le board d'HackENS est un terrain de jeu avec plein d'IO :
- de la SDRAM
- une carte SD
- un ESP32
- des boutons
- des leds
- un port jack
- un port hdmi
- ...
Génération des fichiers verilog à partir de Bluespec
PACKAGES = ./src/:+
bsc \
-verilog \
-vdir $(RTL) -bdir $(BUILD) -info-dir $(BUILD) \
-no-warn-action-shadowing -check-assert \
-keep-fires -aggressive-conditions -show-schedule \
-cpp +RTS -K128M -RTS -show-range-conflict \
-p $(PACKAGES) -g mkTop -u $(TOP)
PACKAGES
liste des dossiers dont les fichiers .bs et .bsv sont importés, le + représente la lib standardTop
est le fichier principalemkTop
est le module principalekeep-fires
utilise le sceduling intuitif: active chaque règne dés que possible (moins les conflits)aggressive-conditions
je pense que c'est: sie_1
est gardé par la conditionc_1
ete_2
est gardé par la conditionc_2
alors(c ? e_1 : e_2)
a pour condition de garde(c ? c_1 : c_2)
plutot quec_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 schedulere_1
ete_2
Génération des LUT (look-up-table) avec yosys
yosys -DULX3S -q -p "synth_ecp5 -abc9 -top mkTop -json mkTop.json" $(LIB)
LIB
est la liste des fichiers verilogmkTop
est le module verilog principalemkTop.json
est la sortie de yosys-abc9
est l'algorithme de génération des LUT par défault, parfois il crash (je pense à cause des inout qui ne sont pas entièrement supporter), dans ce cas utiliser-noabc9
semble marcher
Rooting avec nextpnr
nextpnr-ecp5 --85k --json mkTop.json \
--lpf ulx3s.lpf \
--textcfg mkTop.config
ulx3s.lpf
fichier qui map les variables verilog sur les pins--85k
nombre de LUT du FPGA- on peut ajouter
-gui
pour avoir une interface graphique et voir le placement sur le FPGA
Génération du bitstream avec ecppack
ecppack mkTop.config mkTop.bit
Flash du fpga avec fujprog
fujprog mkTop.bit
Il faut que le tty du fpga soit accessible par l'utilisateur courant!
Nix
On peut tout installer avec ce nix-shell:
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [
pkgs.bluespec
pkgs.verilator
pkgs.verilog
pkgs.gtkwave
pkgs.openfpgaloader
pkgs.yosys
pkgs.nextpnrWithGui
pkgs.trellis
];
shellHook = ''
export BLUESPECDIR=${pkgs.bluespec}/lib
'';
}