Picoblaze Jtag Loader in Vivado

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值