libero ProASIC3 A3P250 JTAG-DirectC 烧录文件格式解析

文档参考: .dat 文件格式   DirectC   P26 页面 

 

image

 

image

image

 文件头部信息 共计 69字节, 解析如下:

 

版本 24字节 →  Designer 11.10.0.4      

header  长度 0x45 =  69个字节

image size  0x0003A7AF = 239535 字节, 这里 我看了 一下 jtag_top.dat 整个文件大小 正好是  239535 个 字节 !

数据压缩标志  0x00

M1/P1/M7 标志 0x00

目标ID  0x03A141CF

工具版本号: 00.01

主版本号:00.01

Core Support Flag:01

FORM Support Flag : 00; A3P250 有 1Kbits 的  FLASH ROM 存储, 但是 此固件 没有 初始化 FLASH ROM  的相关信息!,  FLAG 为 0

NVM Support Flag:00  此固件不包含 NVM 存储信息, 因为 A3P250 没有 NVM , smartfusion2 有 NVM。 

中间 加密 NVM 等 都不支持!

Device Exception Flag : 设备异常标志, 0x0001.  这里为啥是 1 , 不理解!有异常?

SD titles  : 应该是 Scan Domain 扫描域 = 4 !

Mapped rows = 0x08FC = 2300 行!  干啥用的 暂时不理解!

BSR length = 0x02C4 = 708 , BSR 是 啥 未知!

data block 数量 6个!

Look-up Table Description , 数了下 共计 6个表!和  头文件 中  data block 保持一致!

image

 第6个块 数完, 第一个字节地址 0x7B  正好对应 第一个块 数据地址!

image

 最后一个块编号 0x06  数据地址: 0x0003A745 ,  数据长度 0x68    ,  计算 两者之和 = 0x3A7AD 在加 2个 校验 =  0x3A7AF  正好  等于 整个文件大小!

 

image

 

DirectC dpG3alg.h 文件里  ,6个数据块 对应 含义 如下, 

#define ACT_UROW_DESIGN_NAME_ID   1u // 长度=9个字节 存储用户自定义信息 版本烧录时间戳 等等
#define BsrPattern_ID             2u  // 长度=0x59 = 89个字节 BSR 边界扫描模式块 相关信息
#define SILSIG_ID                 3u        // 厂商签名 之类的长度= 4个字节
#define CHECKSUM_ID               4u // 校验信息 长度=4个字节 0xA7D0 这个 与 FLASH RPO 工具 打开一致, 
#define datastream_ID             5u  // 这个就是核心配置数据 ,长度= 0x3A660 = 239200 字节 /  这里 包含了 A3P250 2300 ROWS 的数据 每行数据 = 239200 / 2300 = 104 字节
#define rlock_ID                  6u  // 存储 FPGA 的读保护配置,烧录完成后启用,防止配置数据被非法读取
#define FRomAddressMask_ID        7u
#define FRomStream_ID             8u // FLASH ROM 数据块

这里 的 每行 104字节 ,分成 4个 SDNumber ,  每次 104/4 = 26 字节 ,与程序中 ARRAY_ROW_LENGTH = 26相等;

DirectC 文件 dpcore.c / 579 / dp_load_row_data 函数/ 

 

image

 

 

整个文件 的 最后 两个 字节 是 CRC 校验值!  

校验方法:

void dp_compute_crc(void)
{
    for (global_uchar2 = 0u; global_uchar2 < 8u; global_uchar2++)
    {
        global_uint2 = (global_uchar1 ^ global_uint1) & 0x01u;
        global_uint1 >>= 1u;
        if (global_uint2)
        {
            global_uint1 ^= 0x8408u;
        }
        global_uchar1 >>= 1u;
    }
    
    return;
}

 

DirectC  dpG3alg.h 文件里 :

#define AXX125X_ROWS                1244u
#define AXX250X_ROWS                2300u
#define AXX400X_ROWS                2300u
#define AXX600X_ROWS                3444u
 
#define AXX1000X_ROWS              4500u
 

posted on 2026-01-20 17:42  所长  阅读(8)  评论(0)    收藏  举报

导航