这里有个小发现, 通过 JTAG 接口 控制 A3P250 ,读取 idcode ,usercode 等等 指令 ,存在 BSDL 文件中 ;
![image]()
https://ww1.microchip.com/downloads/aemdocuments/documents/fpga/ProductDocuments/BoardDesignFiles/a3p250_vq100.bsd
![image]()
但是 我没有找到 编程 相关指令 !
只能 在 JTAG C代码 中 找到, 实现文档说明 JTAG-DirectC v2022.1 User Guide , 源码下载 DirectC | Microchip Technology
/* General opcodes */
#define ISC_NOOP 0x84u
#define DESELECT_ALL_TILES 0xC0u
/* Erase opcodes */
#define ISC_ERASE 0x85u
/* UROW opcodes */
#define ISC_PROGRAM_UROW 0xA7u
#define ISC_READ_UROW 0xA8u
#define ISC_PROGRAM_RLOCK 0x8Cu
#define HIGHZ 0x07u
#define BYPASS 0xFFu
#define LDVPROP 0xB4u
/* Factory row opcodes */
#define FACTORY_ADDRESS_SHIFT 0xF9u
#define READ_FACTORY 0xBFu
#define ISC_PROGRAM 0x83u
#define ISC_VERIFY0 0x8Du
#define ISC_VERIFY1 0x8Eu
#define ISC_INCREMENT 0x87u
#define ISC_DATA_SHIFT 0x89u
#define ISC_ADDRESS_SHIFT 0xA9u
1、 好长的代码 函数 void dp_program_action(void);
CORE_ENCRYPT :固件加密编程, 暂时不加密, 因此 这个暂时不关注!
CORE_SUPPORT: 我认为是 FPGA 主程序编程!
FROM_SUPPORT:FLASH ROM 编程, A3P250 支持 1Kbits 的 FLASH ROM!暂时 没有用到!
NVM_SUPPORT: A3P250 不支持 NVM , smartfusion2 支持 NVM 存储, 给 cortex-m3 内核 用的!
下面分析 CORE_SUPPORT 部分代码 :
第一步: 调用 dp_erase(); 函数进行 擦除 !
第二步:dp_program_array() 函数 执行 编程! 因为 A3P250 rows = 2300, 因此 循环 2300次!
第三步: dp_reset_address 复位 地址, 指令是 ISC_INCREMENT = 0x87
第四步: 这里有个循环 , device_rows 因为 是 A3P250 , device_rows 初始化为 2300 , 烧录文件 header 的 Mapped rows = 0x08FC = 2300!
第五步:dp_load_row_data 加载数据,先发 指令 ISC_DATA_SHIFT = 0x89,
第六步 dp_exe_program 编程,
第七步,判断是否发生错误,出错,则种植编程,并报告编程错误码!
第八步 地址递增 ,调用函数 dp_increment_address
void dp_load_row_data(void) 函数 解析
外循环 是 4次,因为 device_SD = 4, 内循环 8次,
datastream_ID = 5 ; 这里指 数据块 5, 数据块5 是 FPGA 核心配置数据,A3P250 共计 2300行, 每行应该是104字节, 分成4个 SD 每个SD 26字节!
ARRAY_ROW_LENGTH = 26 ; 单位 是 字节
DataIndex = 0;每次 递增 26
带入函数
dp_get_and_DRSCAN_in(5, 26, 0);
dp_get_and_shift_in( 5, 26, 0 );