Xilinx-nextpnr und M1-Mac für Kintex7 XC7325T
Von QMTech habe ich mir ein Kintex-7 FPGA (XC7325T-FFG676) bestellt. Wie auch immer die diesen Preis halten können (100 € für das gesamte Board mit FPGA vs. 1400 € für den Chip bei mouser), vermutlich scraping alter Bitcoin-Miner.
Da das Board nur einen MP8712 für die VCC1V0 mit 12A hat, werde ich den Chip nicht ausreizen können.
Auch die 2,54 mm Pfostenstecker werden nicht für irgendwelche schnellen Übertragungsraten reichen.
Leider ist der Chip genau eine Leistungsklasse über der, die gerade noch von der kostenlosen Version von Vivado unterstützt wird. Daher habe ich mich für den kintex7-Patch für nextpnr entschieden.
Nativ unter M1-MacOS habe ich nextpnr
nicht zum Laufen bekommen, daher die Abkürzung über eine VM.
Vorbereitungen
debian bullseye in VM (UTM) installieren. Platte > 12GB
apt-get update
# installiere alle benötigten Pakete für snap, nextpnr und yosys.
apt-get install sudo snap snapd sudo
snap install --classic snapcraft
Yosys/nextpnr bauen
Als Basis dienen die snap-Dateien von kintex7-chatter, die sich natürlich nicht mit multipass auf arm64 bauen lassen.
export PATH=$PATH:/snap/bin
export SNAPCRAFT_BUILD_ENVIRONMENT=host
# snap nextpnr
mkdir -p ~/install/nextpnr/snap
cd ~/install/yosys/snap
wget https://raw.githubusercontent.com/kintex-chatter/nextpnr-kintex-snap/main/snap/snapcraft.yaml
# fix to current versions
perl -p -i -e 's/python3.8/python3.9/g' snapcraft.yaml
perl -p -i -e 's/(libboost-.*1)\.71\.0/$1.74.0/g' snapcraft.yaml
cd ..
# first attempt
snapcraft --debug --destructive-mode
# fix paths and different python hashbang
cd ~/install
ln -sf nextpnr/parts parts
cd ~/install/yosys/snap
cp ./prime/usr/lib/python3.9/* parts/pyjson/install/usr/lib/python3.9/
cp ./prime/usr/lib/python3.9/encodings/rot_13.py parts/pyjson/install/usr/lib/python3.9/encodings/rot_13.py
cp ./prime/usr/lib/python3.9/test/* parts/pyjson/install/usr/lib/python3.9/test/
# second try
snapcraft --debug --destructive-mode
snap install --classic --dangerous nextpnr-kintex_0.3.0_arm64.snap
# yosys
mkdir -p ~/install/yosys/snap
cd ~/install/yosys/snap
wget https://raw.githubusercontent.com/kintex-chatter/yosys-snap/main/snap/snapcraft.yaml
snapcraft --debug --destructive-mode
snap install --classic --dangerous yosys_0.17_arm64.snap
Aliase für die nextpnr-Binaries anlegen,
snap alias nextpnr-kintex.bbasm bbasm
snap alias nextpnr-kintex.bit2fasm bit2fasm
snap alias nextpnr-kintex.fasm2frames fasm2frames
snap alias nextpnr-kintex.nextpnr-xilinx nextpnr-xilinx
snap alias nextpnr-kintex.xc7frames2bit xc7frames2bit
# mount shared folder from host
mkdir ~/fpga
sudo mount -t 9p -o trans=virtio share $PWD/fpga -oversion=9p2000.L
blinky
# create project
mkdir -p ~/fpga/blinky
cd ~/fpga/blinky
Dateien von https://github.com/kintex-chatter/xc7k325t-blinky-nextpnr
blinky.v
:
`default_nettype none //do not allow undeclared wires
module blinky (
input wire clk,
output wire led
);
reg [24:0] r_count = 0;
always @(posedge(clk)) r_count <= r_count + 1;
assign led = r_count[24];
endmodule
blinky-qmtech.xdc
:
set_property LOC F22 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]
set_property LOC J26 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports {led}]
Das Makefile wird gleichzeitig dafür genutzt, die benötigten chipdb-Binaries zu erzeugen:
Makefile
:
DB_DIR = /snap/nextpnr-kintex/x1/opt/nextpnr-xilinx/external/prjxray-db/
all: blinky-qmtech.bit
openFPGALoader --cable tigard --board qmtechKintex7 --bitstream blinky-qmtech.bit
devices: xc7k325tffg676-1.bin xc7k325tffg900-2.bin
%.bin:%.bba
bbasm --l $< $@
%.bba:
pypy3 /snap/nextpnr-kintex/x1/opt/nextpnr-xilinx/python/bbaexport.py --device $* --bba $@
blinky.json: blinky.v
yosys -p "synth_xilinx -flatten -abc9 -nobram -arch xc7 -top blinky; write_json blinky.json" $<
blinky-qmtech.fasm: blinky.json xc7k325tffg676-1.bin blinky-qmtech.xdc
nextpnr-xilinx --chipdb xc7k325tffg676-1.bin --xdc blinky-qmtech.xdc --json $< --write blinky-qmtech-routed.json --fasm $@ --verbose --debug
%.frames: %.fasm
fasm2frames --part xc7k325tffg676-1 --db-root ${DB_DIR}/kintex7 $< > $@
%.bit: %.frames
xc7frames2bit --part_file ${DB_DIR}/kintex7/xc7k325tffg676-1/part.yaml --part_name xc7k325tffg676-1 --frm_file $< --output_file $@
.PHONY: clean
clean:
@rm -f *.bit
@rm -f *.frames
@rm -f *.fasm
@rm -f *.bba
Sobald ich wieder einen JTAG-Adapter habe (wie kann man so etwas verlieren?) kann ich das ganze auf dem Board testen.
Links
- Core Schematic
- Starter-Kit Manual
- Starter-Kit Schematic
- SpinalHDL Meta-Programmierung in Scala
- [Amaranth (nmigen])(https://github.com/amaranth-lang/amaranth) Meta-Programmierung in python
- migen Vorläufer von amaranth
- litex System-on-Chip-Generator
- DSP with FPGAs Buch über DSP mit FPGAs, Code in VHDL, Anhang enthält den zugehörigen Verilog-Code.