赞
踩
使用vivado调试FPGA过程中,通常需要ARM或CPU向FPGA下发指令或配置寄存器,在与ARM或CPU联调之前,需要验证FPGA逻辑是否正常,因此一般需要用到vio核。当涉及单个寄存器控制时,手动输入即可,但很多时候需设置多个寄存器来实现功能的控制,比如滤波器参数配置、ad芯片SPI寄存器控制等,此时可通过TCL批量操作VIO核,避免手动逐个输入,极大提高开发效率。
比如vio例化代码:
- vio_adc_cfg vio_adc_cfg (
- .clk(PSCLK), // input wire clk
- .probe_out0(cfadcwdat[23:0]), // output wire [23 : 0] probe_out0
- .probe_out1(cfadcEn) // output wire [0 : 0] probe_out1
- );
生成bit并且烧写后,使用tcl控制vio:
1. tcl栏直接输入
- set_property OUTPUT_VALUE 1 [get_hw_probes cfadcEn -of_objects [get_hw_vios hw_vio_2]]
- commit_hw_vio [get_hw_probes {cfadcEn} -of_objects [get_hw_vios hw_vio_2]]
- set_property OUTPUT_VALUE 0 [get_hw_probes cfadcEn -of_objects [get_hw_vios hw_vio_2]]
- commit_hw_vio [get_hw_probes {cfadcEn} -of_objects [get_hw_vios hw_vio_2]]
即可以实现cfadcEn信号到1再到0。
上述tcl语句中,commit_hw_vio表示将hw_probe OUTPUT_VALUE属性值写入VIO核。注意,TCL语句中VIO名称(hw_vio_2)不是模块中例化的名称(vio_adc_cfg),如果使用vio模块名称,语法如下:
set_property OUTPUT_VALUE 1 [get_hw_probes cfadcEn -of_objects [get_hw_vios -of_objects [get_hw_devices xc7z045_0] -filter {CELL_NAME=~" vio_adc_cfg "}]]
比如在D:/04_record/vio路径下新建tcl文件,写入:
- set_property OUTPUT_VALUE 000010 [get_hw_probes cfadcwdat -of_objects [get_hw_vios hw_vio_2]]
- commit_hw_vio [get_hw_probes {cfadcwdat} -of_objects [get_hw_vios hw_vio_2]]
然后将此文件保存。
在vivado tcl控制台输入
cd D:/04_record/vio
修改工作目录为vio文件夹下,继续输入
source vio_tcl.tcl
可执行tcl中的内容。
可见,当使用vio控制执行多个寄存器或同一寄存器多个值时,编写一个tcl文件即可轻松实现。
不使用tcl控制vio时,手动连续更改寄存器值,间隔时长无法保证,通常为秒级延迟。为验证使用tcl控制的时间,使用ila抓取控制信号进行测试。
验证每条命令响应时间是否是一个clk时钟,使用ila观察被控制的信号如下图:(tcl语句是控制ps1_wr_en信号写1后立即写0)
可见,写后并不是一时钟周期就改变,响应比较慢,不可实现精确的控制。此次测试至少大于4000个时钟周期,至于具体关系还没有完全验证,这点在使用时是需要注意的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。