Загрузка данных


Алгоритм прошивки программы в RAM через JTAG(openFPGALoader):
1) preload()->wr_rd(PRELOAD_SAMPLE, tx_buf, tx_len, NULL, 0)->tx_buf={0xFF},tx_len=46,PRELOAD_SAMPLE=0x1C
2) EnableISC(0x00)->EnableISC(uint8_t flash_mode)->wr_rd(cmd, &flash_mode, 1, NULL, 0); cmd=0xC6; flash_mode=0x00
3) wr_rd(REFRESH, NULL, 0, NULL, 0); - REFRESH=0x79(LSC_REFRESH)
4) wr_rd(LSC_DEVICE_CONTROL, tx_tmp, 1, NULL, 0); tx_tmp[0] = 0x08; LSC_DEVICE_CONTROL=0x7D
5) wr_rd(LSC_DEVICE_CONTROL, tx_tmp, 1, NULL, 0); tx_tmp[0] = 0x00;
6) wr_rd(FLASH_ERASE, tx, 1, NULL, 0); tx=0x00(for Nexus) FLASH_ERASE=0x0E(ISC_ERASE)
7)wr_rd(RESET_CFG_ADDR, NULL, 0, NULL, 0) RESET_CFG_ADDR=0x46(LSC_INIT_ADDRESS)
8) wr_rd(LSC_BITSTREAM_BURST, NULL, 0, NULL, 0); LSC_BITSTREAM_BURST=0x7A
9) loading *.bit file
10) wr_rd(0xff, NULL, 0, NULL, 0); - bypass
11) wr_rd(0xff, NULL, 0, NULL, 0); - bypass
12) wr_rd(ISC_DISABLE, NULL, 0, NULL, 0); ISC_DISABLE=0x26
13) wr_rd(BYPASS, NULL, 0, NULL, 0); BYPASS=0xFF
14) wr_rd(0xff, NULL, 0, NULL, 0); - bypass

bool Lattice::wr_rd(uint8_t cmd, uint8_t *tx, int tx_len, uint8_t *rx, int rx_len, bool verbose)
после выполнений определённых команд вычитывается статус(0x3C 8byte), это я тут не описывал.