hackens.org/docs/tutorials/fpga.md
Sélène Corbineau e304b79eff
Some checks failed
build configuration / build (push) Failing after 16s
Theming, logo d'en-tête, page FPGA
2024-09-23 22:16:34 +02:00

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:

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 standard
  • Top est le fichier principale
  • mkTop est le module principale
  • keep-fires utilise le sceduling intuitif: active chaque règne dés que possible (moins les conflits)
  • aggressive-conditions je pense que c'est: si 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

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 verilog
  • mkTop est le module verilog principale
  • mkTop.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
    '';
}