通过MCU/MPU/CPU嵌入式下载升级Anlogic EF2/3的调试经验分享-Anlogic-安路社区-FPGA CPLD-ChipDebug

通过MCU/MPU/CPU嵌入式下载升级Anlogic EF2/3的调试经验分享

感谢安路技术交流群里的FPGA小99的分享,挣点积分换资源咯。

目录
EF2/3 嵌入式升级FAQ
EF2/3 - 15/25/45
支持的升级接口
从串模式
JTAG模式
EF3-40/70/90/A0支持的升级接口
SSPI模式
I2C模式
各种升级之间的区别
支持的升级文件格式
JTAG升级细节
JTAG接口TAP状态机
JTAG TAP伪代码
JTAG时序
各种烧写文件间的关系
TDE生成
SVF及升级流程理解
VME移植
AJE移植
调试指南
硬件调试
Tips
调试软件Tips
调试案例
参考资料
ABC

1. EF2/3 – 15/25/45支持的升级接口

20231029191818403-image

支持MSPI 从串,从并,主并,JTAG等。并行不常用,主要介绍从串和JTAG模式1.1. 从串模式

从动串行(SS) 模式下, FPGA 可以通过 MCU 进行加载。 TD 软件可以生成 bin 文件用于 MCU 加载。
MCU 通过 SCLK、 DIN 信号使用串行方式将数据写入 FPGA。 EF3L15&EF3L25&EF3L45 FPGA 芯片在每个
SCLK 的上升沿接收数据, 数据发送完成后, DONE 拉高表示配置完成, 如果配置出错, 会将 INITN 信号
拉低

20231029191944562-image

1.2. JTAG模式

EF3L15&EF3L25&EF3L45 FPGA 还可以通过 JTAG 方式进行配置。 JTAG 方式配置是通过配置引脚(TDI,
TDO, TMS, TCK, JTAGEN) 进行的。 在 INITN 信号变高后, JTAG 可以通过指令中断其他模式, 进入
JTAG
配置模式。
TDI, TDO, TMS, TCK, JTAGEN 为复用 IO。 当 TDI, TDO, TMS, TCK 配置为专用 IO 时, JTAGEN 可
配 置
成用户 IO。 当 TDI, TDO, TMS, TCK 配置成用户 IO 时, JTAGEN=1 可以将 TDI, TDO, TMS, TCK
强制变
成专用 IO。
JTAG 配合使用安路公司专用的 USB 下载线, 配合 TD 软件进行, 可以通过软件查看配置是否成功。

20231029192007468-image

备注: 非背景模式下通过 Jtag 烧写 flash 数据, tck 的频率要大于等于 100KHz

2. EF3-40/70/90/A0支持的升级接口

相较于EF2/3-15/25/45, 90和A0增加了对SSPI模式和I2C模式的支持

20231029192020910-image

2.1. SSPI模式

EF3LA0 和 EF3L70 器件可以选择 SSPI 端口配置 FLASH,通过将码流写入 FLASH 后转存的方式将码
流下载到 SRAM, 但不能直接通过 SSPI 端口直接对 SRAM 进行写操作。
使用 SSPI 配置模式并进入用户模式后,可以通过 Feature 寄存器配置 SSPI 配置引脚
SI/SO/CSN/SCLK 是否用作 GPIO。

20231029192035652-image

注: 1.在 SSPI 配置模式中, 数据通过** SI 端口在 SCLK 的下降沿输入,输出数据在 SCLK 的下降沿通
过 SO 输出**
2.启动 SSPI 配置模式时, CSN 信号至少需保持 8 个 SCLK 的高电平之后再拉低;在发送指令之
前或指令发送之后, CSN 信号也应至少保持 8 个 SCLK 的高电平
3.若在用户模式保留 SSPI 接口, 需要在配置完成、 DONE 信号变高后, 拉高 CSN; 当需要再次
执行加载操作时,才可拉低 CSN 信号
EF3 器件有两种方式可以进入 SSPI 模式。配置阶段通过加载 Feature 寄存器来开
启 SSPI 接口流程;用户模式阶段 wakeup 后通过 Feature 寄存器来保留 SSPI 接口的
流程

2.2. I2C模式

EF3LA0 和 EF3L70 器件可选择 I2C 配置模式对 FLASH 进行访问,有 7bit 和 10bit 两种地址模式;
支持 Fast mode; 支持 FPGA 作为 Slave 从器件。通过 I2C 模式进行配置时,外部上位机(I2C 总线
的 Ma
ster)通过 I2C 接口将码流数据写入 FLASH 进行配置。

20231029192106951-image

EF3 器件 I2C 配置模式流程有两种。通过 Feature 寄存器确定 I2C 配
置模式,对 FLASH 进行写操作的配置流程;通过设置 Feature 寄存器保留
I2C 接口作为配置接口

2.3. 各种升级之间的区别

从规格书上看可以留意到,本质上通过各种下载口进行下载的区别只有两个:1.从已有资料看,只有JTAG支持
SRAM烧写 2.接口的时序要求,比如SS模式需要先预送8个CLK。更多细节请参见规格书。
3. 支持的升级文件格式
主要支持以下几种格式
1. bit
2. bin
3. svf
4. aje
5. tde
6. vme
相比于其它方式,JTAG能支持以上所有格式,其中4、5、6用于嵌入式。其它接口更适于BIN文件或自定义文
件。
注:TDE改名即为VME,AJE与二者不等价。

4. JTAG升级细节

4.1. JTAG接口TAP状态机

状态机如 IEEE 1149.1-2013 标准中所示,如下图 1 所示。
状态机很简单,包含两条路径:
数据寄存器(DR)路径(以绿色显示),用于加载指令
指令寄存器(IR)路径(以蓝色显示),用于从数据寄存器读取数据/向数据寄存器写入数据,包括边界扫描
寄存器(BSR)
 

20231029192132979-image

状态机在测试时钟 (TCK) 边沿上进行,测试模式选择 (TMS) 引脚的值控制其行为。
假设状态机从测试逻辑复位开始,我们首先计时 TMS = 0 以进入运行测试/空闲状态,然后计时 TMS = 1 以
开始选择路径。
图 2 简要总结了不同状态的角色。

20231029192150347-image

20231029192158416-image

TAP 控制器管理状态机,并根据所选状态切换输出 MUX。
这两条路径是:
指令捕获移位路径
数据捕获-转移路径
更多细节请参见 IEEE 1149.1-1990, IEEE Standard for Test Access Port and Boundary-Scan
Architecture。

4.2. JTAG TAP伪代码

// Define pins

JTAG_TMS = PA01

JTAG_TCK = PA02

JTAG_TDI = PA03

JTAG_TDO = PA04

// Create a string of five 1’s, for forcing reset

tms_reset_str = {1,1,1,1,1}

// JTAG FUNCTIONS 

// Transmit a constant string to the TAP, without setting TDI or TDO

transmit_tms_str(tms_str)

{

    for i = 0 : len(tms_str)

    {

        set_pin(JTAG_TMS, tms_str[i])

        jtag_short_delay()

        set_pin(JTAG_TCK, HIGH)

        jtag_clock_delay() 

        set_pin(JTAG_TCK,LOW)

        jtag_clock_delay()

    }

}

shift_tdi_str(tdi_str)

{

    set_pin(JTAG_TMS, LOW) // Hold TMS LOW while shifting<br /> <br />    

    for i = 0 : len(tdi_str)

    {

        set_pin(JTAG_TDI,tdi_str[i])

        jtag_short_delay()

        set_pin(JTAG_TCK, HIGH)

        jtag_clock_delay()

        set_pin(JTAG_TCK, LOW)

        jtag_clock_delay()

    }

}

shift_tdo_str(length)

{

    // This function returns the string shifted out from TDO

    set_pin(JTAG_TMS, LOW) // Hold TMS LOW while shifting

    output_str = {}<br /> <br />    

    for i = 0 : length

    {

        set_pin(JTAG_TCK, HIGH)

        jtag_short_delay()

        output_str += read_pin(JTAG_TDO)

        jtag_clock_delay()

        set_pin(JTAG_TCK, LOW)

        jtag_clock_delay()

    }

    return output_str

}

reset_jtag()

{

    transmit_tms_str(tms_reset_str)

}

load_jtag_instruction(instr)

{

    // Assuming we're in run-test/idle

    // Note: No error checking, early exiting, or pausing is 

    // implemented here

    transmit_tms_str( {1,1,0,0} ) // Puts us at Shift-IR state

    shift_tdi_str( instr ) // Shift in the instruction data

    transmit_tms_str( {1,0,1,1,0} ) // Return to Run-Test/Idle

}

read_jtag_register(reg_length)

{

    // This function reads the current data register (set by most 

    // recent instruction)

    // Assuming we're in run-test/idle

    // Note: No error checking, early exiting, or pausing is  

    // implemented here

    transmit_tms_str( {1,0,0} ) // Puts us at Shift-DR state

    reg_str = shift_tdo_str(reg_length) // Shift out register data

    transmit_tms_str( {1,0,1,1,0} ) // Return to Run-Test/Idle

    return reg_str

}

4.3. JTAG时序

下图是Download Refresh时的波形

20231029192345563-image

下图是CHECK_ID指令的波形

20231029192404392-image

20231029192417625-image

20231029192431245-image

从上面这些图可以观察到JTAG状态机中一个相对完整的SHIFT-DR流程。
再看一下SHIFT_IR的流程

20231029192451992-image

需要注意的是嵌入式设备模拟出来的波形未必跟上面下载器的波形完全一样,它有可能是下面这样的,但它仍
然是正确且符合JTAG协议的。芯片是可以识别这种信号的,但是TD中的Download是无法识别的这种信号的。

20231029192507898-image

5. 各种烧写文件间的关系

bit——-(property)—–>bin

| |
—–(device chain工具)–> svf —–(svf2aje.exe)—-> AJE
| |
—–> TDE —-(改名)–> VME
其中SVF文件可读文本,且最易与JTAG状态机建立关联,SVF可以理解为JTAG模拟器的执行脚本,AJE TDE VME
都是二进制的SVF转译版(非直接转译), SVF中时间是相对TCK计算,AJE VME等是以ms为单位计算。由于TDE
是VME的改名版本,后面不再区分。

5.1. TDE生成

1. 第一种方式
由于TDE是兼容VME的第三方格式,安路不再提供对TDE的主流支持,TD GUI中选项已去除或不可用,通常是
通过以下指令生成TDE。

svfgen -scan_mode prog_sram -level 1 -bit sfp100m.bit -svf D:/SFP_100M/FPGA_PRJ/par/s
fp100m/al_devicechain/sfp100m_L1.svf -opt no_comment -bypass 11111111 -freq 1MHz -ver
ify -tde

2. svf转VME,可以用svf2vme.exe来直接由SVF生成VME。

20231029192630781-image

注意:这个工具有一个参数 -full 用于控制否压缩。
SVF转VME由于是第三方的,安路不直接提供,但是SVF转VME的代码在LATTICE DIAMOND的安装目录下有提供,
可以自行编译成WINDWOS或LINUX版。Windows上可以下载tcc编译器
Tiny C Compiler

20231029192654940-image

5.2. SVF及升级流程理解


该SVF中的第18行即为CHECK_ID操作对应的文本

20231029192714822-image

因为安路并未提供JTAG升级相关指令解释,也未提供升级流程细致文档,为了更好的理解整个升级流程,可以
在生成SVF时为其打开注释。

20231029192728107-image

20231029192739782-image

5.3. VME移植


vme升级代码移植没有什么难度,且代码结构简单,注释清晰,一个好的开始是多阅读源码包中提供的
readme.txt文档。
1. vme源码包中有readme.txt,建议先通读该文件, 所有的移植细节都在里有描述,重点请查看截图中内容。
这一段内容对代码里面文件的作用做了说明。

20231029192821534-image

下面这一段说明了你如果用CPU进行升级其实只需要下面这三个文件,

20231029192835633-image

其它相关内容讲自行阅读。
3. 关于修改过的代码,重点内容在 hardware.c里面,可以参考我的代码修改,注要是针对IO配置以及delay
移植,特别注意calibration这个函数,这个函数的输出用示波器进行测试,以确认实际的TCK脉冲跟你想
要的一样。
另一个文件ispvm_ui.c这个文件,里面要修改成你平台上的文件读取函数,和内存申请函数,如果是linux
的其实直接用就好了。


5.4. AJE移植


参阅 《TN008_Anlogic AJE移植指南》.pdf
调试阶段, 可以在 aje2vec.c 开启 debug。
#define AJE_DEBUG
配置阶段会打印相关信息, 供调试使用

20231029192856494-image

在调试过程中可能会出现 Failed 的情况, 可根据下表指示代码进行修改。
AJE_FILE_OPEN_FAIL -6 Value returned when the AJE file cannot be open
AJE_FILE_INVALID -7 Value returned when the AJE file is invalid
AJE_INVALID_COMMAND -10 Value returned when command is invalid
AJE_TRANSFER_FAIL -16 Value returned when data transferred failed
AJE_VERIFY_FAIL -17 Value returned when verify failed


6. 调试指南

6.1. 硬件调试Tips

1. 确认JTAG的上下拉电阻是否正确,上拉4.7K,下拉安路建议1K(仅建议)。
18
2. 确认JTAG的TCK的频率是否小于或等于生成SVF、VME、AJE时的频率。
3. 确认JTAG管脚上的信号不存在回沟,时序是否符合要求,电气信能是否符合要求。

20231029192927411-image

4. 若采用 MSPI 加载模式,并且通过 JTAG 非背景升级外部 FLASH 数据, tck 的频率要大于等于 100K。

6.2. 调试软件Tips

1. 确认CHEKC_ID是否能够正常读出。
2. 借助逻辑分析仪确认所发指令是否与SVF一致,指令是否有漏发
3. 确认指令之间的延时是否符合SVF要求
4. 软件打印调试信息看看具体在哪一步出错


6.3. 调试案例


1. 最常见的就是TCK的延时不够,导致实际TCK频率大于GUI指定的频率,特别是针对SVF。对于SVF可以将SVF的
Freq调高进行测试确认,但该选项对AJE和TDE无效。最好用示波器实测TCK频率。

20231029192938552-image

2. 执行擦除指令等指令时所给等待时间不够。
3. 在开始执行升级前,软件可能在JTAG口上输出了一些多余的信息。
4. 软件控制的JTAG口驱动能力不够,增加驱动能力
5. 对于通过SPI口直接写SPI FLASH的情况,要注意CS的控制,保证数据帧的完整性。


6.4. 参考资料ABC

1. EF2/3 DS.pdf
2. IEEE 1149.1 spec
3. TN008

请登录后发表评论

    没有回复内容