Xilinx-nextpnr und M1-Mac für Kintex7 XC7325T


Bild zu Post '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.

Kommentare per Mail an post@wolfgang-jung.net.