Plik wsadowy .bin można też zamienić lokalnie na tablicę C w pliku nagłówkowym .h za pomocą aplikacji:
https://github.com/AntumDeluge/bin2header/releases/tag/v0.3.1
Odpowiednio ustawiając skrypty poprzedzające kompilację, możemy automatycznie dokonywać konwersji. Oczywiście to tylko przykład, wsad mikrokontroler może odbierać dynamicznie z innego źródła, np. USB. Jedynym ograniczeniem jest wtedy pamięć RAM, która musi zbuforować ciąg danych.
Skompensowana funkcja dokonująca programowania:
/* * SPI has to be configured in range (1..25MHz)SCK Freq, 8-bit, MSB-first. * CRESET_B, SS, - GPIO OUTPUT * CDONE - GPIO INPUT * Returns: 0-programming failed; 1-programming successful */ uint8_t flash_fpga(SPI_HandleTypeDef *hspi, const uint8_t *bitstream){ uint8_t retval = 0; const uint8_t zeroes[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; HAL_GPIO_WritePin(CRESET_B_GPIO_Port, CRESET_B_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(CRESET_B_GPIO_Port, CRESET_B_Pin, GPIO_PIN_SET); HAL_Delay(2); HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET); if(HAL_SPI_Transmit(hspi,(uint8_t *) zeroes, 1, HAL_MAX_DELAY) != HAL_OK) return 0; HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_RESET); if(HAL_SPI_Transmit(hspi,(uint8_t *) bitstream, sizeof(fpga_bin), HAL_MAX_DELAY) != HAL_OK) return 0; HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET); if(HAL_SPI_Transmit(hspi,(uint8_t *) zeroes, 13, HAL_MAX_DELAY) != HAL_OK) return 0; retval = HAL_GPIO_ReadPin(CDONE_GPIO_Port, CDONE_Pin); if(HAL_SPI_Transmit(hspi,(uint8_t *) zeroes, 7, HAL_MAX_DELAY) != HAL_OK) return 0; return retval; }
Toolchain FPGA
Pliki wsadowe można otrzymać również z darmowego toolchaina pod Linux. Ja sprawdziłem na maszynie wirtualnej z Lubuntu 22.
https://mcmayer.net/first-steps-with-the-icestorm-toolchain/
W tej linii dostosowałem swój układ FPGA:
arachne-pnr -d 384 -P qn32 -o build/blinky.asc -p blinky.pcf build/blinky.blif
Mój plik Makefile:
all: build/blinky.bin
cp build/blinky.bin /media/sf_share/fpga.bin
python3 /media/sf_share/bin2header.py /media/sf_share/fpga.bin
build/blinky.bin: build/blinky.asc
icepack $< $@
build/blinky.asc: blinky.pcf build/blinky.blif
arachne-pnr -d 384 -P qn32 -o $@ -p $^
build/blinky.blif: blinky.v
yosys -p "synth_ice40 -top top -blif $@" $^
prog: build/blinky.bin
iceprog build/blinky.bin
clean:
rm build/*
.PHONY: prog clean
Timing
Czas programowania układu wynosi ok. 30 ms