hackens.org/docs/tutorials/fpga.md

101 lines
2.8 KiB
Markdown
Raw Normal View History

2024-09-23 22:16:34 +02:00
# 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
```make
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
```make
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
```make
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
```make
ecppack mkTop.config mkTop.bit
```
## Flash du fpga avec fujprog
```make
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
'';
}
```