Picoblaze Jtag Loader in Vivado
Picoblaze是一个好东西,Xilinx从Cpld年代开始支持,虽然逻辑上的改变不多,但工具上的支持还没完全切换到Vivado。现在要用Jtag loader必须要安装ISE开发工具,这给我们只安装Vivado的工程师带来了不便。本文从技术的角度探讨一下Vivado下如何上传Picoblaze编译后的软件代码,而不用重新去编译整个Vivado工程。
打开前篇文章所用工程,双击Source里面的jtag_loader_6
滚动鼠标,找到BSCANE2元件安装。在7系列里面有4个USER寄存器,也就是说我们可以在设计中最多用上4个这样的元件。这里参数JTAG_CHAIN设置的数字对应用户寄存器相应的数字。比如设置为1,就代表是USER1。右图为xc7s50_csga324.bsd文件里面关于JTAG指令。Picoblaze参考设计里面用的是USER2,用户可以自己修改。
我们先看看边界扫描状态机,有4个主要状态,TLR复位状态,IDLE空闲状态,DR数据移位相关状态,IR指令移位相关状态,如下图:
边界扫描元件的信号:
CAPTURE:边界扫描状态机处于Capture DR/IR状态下置1
DRCK:由TCK与其他逻辑产生的门控时钟,我们捕获数据用此时钟,平时为高或三态?
RESET:边界扫描状态机处于TLR状态下置1
SEL:边界扫描装载USER1~USER4指令后,SEL为高,直到其他IR指令装载
SHIFT:边界扫描状态机处于SHIFT状态下置1
TCK:外部边界扫描时钟信号
TDI:外部边界扫描数据输入信号
TMS:外部边界扫描测试模式选择信号
UPDATE:边界扫描状态机处于Update DR/IR状态下置1,此信号可作为移位后的数据并行锁存的时钟信号。
TDO:外部边界扫描数据输出信号,可以移位用户数据输出。
JTAG LOADER逻辑在CAPTURE DR状态下,装载上一次的数据到jtag_din_int,在SHIFT DR时候会逐步移出。
分析HDL代码,可以发现SHIFT DR状态下,数据移入方向:
TDI-_>control_reg_ce--> bram_ce -->jtag_we_int--> jtag_addr_int -->jtag_din_int-->TDO
如果有多个Picoblaze,则ce,we是一个向量。 jtag_addr_int在4K程序空间时候是12位,jtag_din_int是18位,内容来自汇编后生成的hex文件。用一个向量表示如下:
{ control_reg_ce, bram_ce, jtag_we_int, jtag_addr_int[0:11], jtag_din_int[0:17]}
其中bram_ce, jtag_we_int, jtag_addr_int[0:11], jtag_din_int[0:17]是分别接到Bram的EN、WE、ADDR跟DATA端口。如果jtag_we_int & control_reg_ce,执行写复位操作。如果~jtag_we_int & control_reg_ce,根据jtag_addr_int低4位地址来选择picoblaze一些状态配置输出(本次只装载,实际数需要下次发起shift dr才会从tdo输出,注意:输出是最先输出数在最低位)。
左图是一个编译后的一个HEX文件部分,可以看到这个HEX文件其实是文本文件,指令高位在左边。我们可以通过软件很容生成一个新的文件,按如下格式:
{ jtag_din_int[17:0], jtag_addr_int[11:0], jtag_we_int,bram_ce, control_reg_ce }
边界扫描是LSB先移,所以我们再高低位交换一下,这个通过计算机软件也很容易实现。本文用Python实现这个功能。
我们已经知道control_reg_ce在读回的时候为高,写复位信号(RDL)为高。在更新代码的时候ce,we一直为高。我们传完所有数据,需要产生复位信号(RDL)。
道理很简单,实现起来也很简单,with as方式open汇编产生的hex文件,读所有行到lines这个list里面. 写地址每行加1即可.
写一个texttojtag函数完成高低位转换.来符合边界扫描数据方向.
注意,写输出文件我们多写了四行,分别是复位PB,读PB寄存器0跟1,释放复位。
有了这个数据文件后,我们处理问题就很简单了.
你可以查询Xilinx UG835 TCL命令大全(注意:2019.2里面close_hw,open_hw命令做了修改,变成了close_hw_manager,open_hw_manager. 下面我们假定的只有S7一个设备,所以直接取索引里面的第一个target.
我们让边界扫描状态机进入复位状态,这样可以用此复位一些相关逻辑.移入IR指令为USER2(jtag loader用的USER2) : scan_ir_hw_jtag 6 -tdi 3
进入USER2指令后,我们就可以开始移入数据,打开我们转换后的文本文件,逐行把数据移入到jtag loader里面的程序双口RAM。注:jtagdata出来的是上一次锁存的数据。
限制:由于TCL文件需要进入VIVADO TCL CONSOLE,连接HW_SERVER,会导致上传代码的时候无法使用VIVADO DEBUG.即便是通过vivado –mode tcl –source xxx.tcl也一样.
本例实现的时候采用的是4K程序空间,所以地址是12位,总位宽是33位,如果程序空间是1K或2K,则可能需要做小小改动.本文代码在windows x64,x32,linux x64,x32上均可以正常使用(python,tcl都可跨平台).
希望通过本文,你可以用边界扫描接口实现更多有用的功能.大家可以多多交流!
Author: Eric
参考: ug835-vivado-tcl-commands.pdf
ug470_7Series_Config.pdf
xc7s50_csga324.bsd