vivado操作技巧 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki
1)如何给自己设计的ip自动生成例化模板?
https://blog.csdn.net/qq_34895681/article/details/129889977
- 首先,把要生成例化模板的HDL文件设置为top文件,并点击Open Elaborated Design
- 然后,在Tcl Console中执行指令
xilinx::designutils::write_template -template -verilog
- 然后到这个路径下去取
2)在代码写完后,在综合之前,先做一个RTL Analysis。
如果代码有错误,或者引脚分配冲突,都会报错来。这个速度很快。
这个模式也可以分配引脚。
3)如何退出调试模式,回到c/c++开发模式?
4)建议所有的sdk例程都勾选uart,然后先建立一个uart_test项目,用模板,确认printf可以跑,环境ok,再创建正式的项目。
5)如何修改vivado sdk的字体?
6)对于IP采用Global还是Out Of Context综合,哪个好?
推荐使用OOC per IP,综合速度快。但是原子等例程,它们用的是Global,为什么?(Global时序会好一些)
7)产生了HDL Wrapper后,不用再次产生了。如果修改了模块,vivado会自动修改HDL wrapper
8)zynq的axi接口不能与外设的axi接口直接连接,必须要加axi interconnect或者axi smartconnect。原因是zynq是axi3接口,外设是axi4接口,不匹配。
9) 有时候,编译会报错,提示缺少文件(刚才都是好的,现在不行了)。这个时候,有时重新产生bsp包可以解决
10) 需要先添加src下main函数,再添加fats库,才不会报f_read, f_open等函数找不到的问题。另一种解决方法是,先在bsp中remove fats,然后再重新添加fats,这样也是可以的。总之感觉是sdk软件的bug。
11)用win11裁剪适合分辨率的bmp图片的方法:
- 打开图片,如果安装了wps,默认是用wps图片浏览器打开
- 点击编辑->裁剪旋转
- 输入分辨率,并拖动选择框到想要的位置,点击对勾确认。
- 输入名字,保存为bmp格式
- 将产生的bmp图片复制到sd卡中,即ok。
12) vivado综合,如何在design runs中显示进度百分比(progress)?
13) 使用block设计,并用了zynq或microblaze处理器,如何用ILA调试器?
- 在block中插入ILA,如下图所示连接ILA
- 按照正常的流程综合和产生bitstream
- 按照正常的流程产生hardware+bitstream,并打开sdk完成软件设计,并下载到FPGA中
- 多出的步骤:在vivado中连接hardware,这个时候会自动弹出ILA,于是就可以使用了。
- 如下图所示,可以看到捕捉到了uartlite产生了接收中断,但是中断控制器没有产生中断,原因找到了。
14) vivado sdk调试模式,memory窗口,如何让其一行显示4个byte,或者1个word?如何修改hex或者十进制显示?
15) vivado block设计模式, block ram generator的size不可编辑,那怎么办?
可以通过这种方式编辑:修改Address Editor的容量,然后再去看block ram generator,发现它的尺寸变了。
16) 如何使用ip的官方demo例程?
右键点击这个ip,可以看到“Open IP Example Design...."选项,打开即可生成一个新的工程。
17) 不小心把ILA调试界面关闭了,如何重新打开?
打开Hardware Manager,点击xc7z010可以看到下面有3个器件(XADC, hw_ila_1, hw_vio_1),右键xc7z010选择Program Device....,重新下载程序后,ILA/VIO界面会自动弹出来。
18) 底层IP不要包括ILA,否则会导致上层调用IP仿真的时候报错。因为ILA是不能仿真的。如果需要看到底层信号,用mark debug模式。
19) AXI Traffice Generator模块,如果修改addr.coe或data.coe后,需要重新Generate Ouput Product才能更新到这个IP的仿真模型。如果修改后,不重新Generate,仿真结果仍然是旧的。
这是ip的仿真模型,只有通过Generate Output Product之后,用户定义的addr.coe和data.coe才能更新到这里。当然,如果手动修改这里可能也是可以的,但是不建议,因为这会导致ip仿真模型里的数据与用户输入的数据不同步。另外,这里是临时的,会随时被冲掉。
20) rom的.coe文件,注意radix值。例如下面的rom_sin.coe用的是10进制
21)验证代码编写
验证代码中,我们经常使用wait语句。
fifo测试中,这种写法好。在while条件中执行@语序,非常棒啊!
22) 验证代码的技巧
//打印
$display();
//wait
wait(rst_n==1);
//while()+@
while(full==1'b0)
@(posedge clk) begin
end
//repeat()+@
repeat(256)
@(posedge clk) begin
end
//时序控制法
#delay 1
wait(rst_n==1);
@(posedge clk)
//循环
repeat(128) begin
end
while(addra<=128) begin
end
for(i=0; i<128; i=i+1) begin
end
//repeat/while/for+ wait/@/delay等构成复杂语句
//task my_task;
input xxx;
output xxx;
begin
end
endtask
23)复制一个新工程的时候,创建BOOT.bin文件,不能work。后来发现,原来是创建的文件路径还是老路径,生成的BOOT.bin是错误的。必须手动修改为新路径。
24) printf函数的执行,延迟很大长,有几十ms。如下一段程序,用于lcd中,发现printf函数产生了极大的影响:
XTime_GetTime(&t2);
convertRGB565toRGB565(
*frame_dest,
*frame_target,
1920,1080,
x,y,
360,360
);
XTime_GetTime(&t3);
fill_pic(ptr1,*frame_target);
XTime_GetTime(&t4);
xfer_win(0,0,360,360);
for (int i = 0; i < LCD_Y_SIZE; i+=1)
{
xfer_cmd_pdata16_dma((u32)ptr1[i],12*64);
usleep(30);
}
XTime_GetTime(&t5);
int dt32 = (u32)(t3-t2)*(1000000.0/COUNTS_PER_SECOND);
int dt43 = (u32)(t4-t3)*(1000000.0/COUNTS_PER_SECOND);
int dt54 = (u32)(t5-t4)*(1000000.0/COUNTS_PER_SECOND);
xil_printf("dt32=%d, dt43=%d, dt54=%d\r\n", dt32, dt43, dt54);
打开prinf函数测到的延时
关闭prinf函数测到的延时
程序中在等待te中断
图中标红线的是printf的执行时间
原因找到了,是因为coresight_comp_0 uart的波特率非常低导致的。如果使用ps_uart,就没有问题。
25)zynq的中断延迟400ns-1us左右。最大中断频率可以到500kHz以上。
26)设计输出可以有多个输出,但是不分配引脚。比如spi接口,有时候只使用其中的sck, mosi, cs,其余的不使用。解决方法,只要给不分配的引脚设置为3.3V即可。
#其余不用的输入/输出可以不分配引脚,并避免报错
set_property IOSTANDARD LVCMOS33 [get_ports *]
set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
set_property SEVERITY {Warning} [get_drc_checks RTSTAT-1]
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]
27) 给zynq的外设分配地址(包括bram),注意地址范围不能超过AXI_GP0的范围(0x40000000开始,1GB范围)
之前没有注意,bram_ctrl的地址默认给了0xc0000000,然后折腾了很久,zynq都访问不到。后来发现是这个原因。
28) 如何给官方的ip(例如AXI Quad SPI)再自己套一层封装?
目标:我想封装2个AXI Quad SPI,对应不同的模式(一个是Normal,一个是XIP),通过一个引脚信号spi_sel来选择。是可以的。
- 目标是生成包含2个AXI Quad SPI IP的代码。这需要一些临时的辅助过程。
- step1: 进入Create and Package New IP的界面,然后配置2个AXI Quad SPI IP
根据这里1,2,3来创建combine的verilog文件。1取其中的接口定义,2取其中的input/output定义,3取例化定义。
step2:于是就可以把combine的verilog写出来了。由于信号名比较多,建议放到linux下用vim来编辑。
可以看到,axi_quad_spi_combine包含了2个axi_quad_spi ip核,根据spi_sel来选择。
这是封装后的效果。以及用microblaze驱动的效果。
29) 封装qspi接口时,遇到bus interface property ID_WIDTH does not match问题
30) 如何设置sdk的编译等级,编译参数?
右键bsp的设置里面有。
31) vivado创建的ip,用vscode修改了代码后,vivado会检测到变化,然后会提示你需要update ip status,并重新编译。
除非你修改了端口,否则不需要重新打开ip操作。例如,你只修改了内部代码,端口没有变化,那么就不需要打开ip操作。
32) sdk使用xilffs,经常遇到找不到f_open函数的问题,解决方案找到了,确实解决了
https://blog.csdn.net/weixin_44167319/article/details/104074045
33) vivado修改代码后,仿真波形不更新,看起来就像代码修改没有同步到vivado一样。
解决方法:关闭仿真,然后reset behavioral simulation。然后重新开启仿真即可。确实可以。
34) vscode中编辑的代码,在vivado中打开中文是乱码,如何解决?
vscode在保存的时候,选择编码通过编码方式,选择GB2312保存。这样子vivado打开,中文就是可以正常显示的。
35) 有时候,执行vivado simulation,会卡在进入仿真的界面很久,不能进去。
解决方法:删除工程下的sim文件夹,然后重新启动仿真即可。
36) 对bd设计的进行vivado仿真,如果修改代码后,需要重新generate output product吗?
分情况: 如果是自己写的代码,没有封装成bd的模式,那么修改代码后,直接点击Relaunch Simulation即可。 如果是bd封装的代码,修改代码后,一般需要generate output product才能仿真。generate output product会自动运行综合,很慢。 因此,如果是仿真,建议选择reset output product,然后relaunch simulation,这样更快。
37) 如果是在自己的rtl代码中例化了ip,例如例化了ILA,那么生成ip的时候不要选择OOC,需要选择global。
如果选择OOC,那么综合的时候会出错。一定要选择global,也就是让ip以flattern的方式集成到rtl代码中去。
38) vivado生成ip,可以勾选core container模式,这样只有一个xcix文件,非常简洁。
39) verilog仿真技巧:修改底层的参数或者net信号
用defparam来穿透多层模块,修改底层模块的参数 用force来穿透多层模块,修改底层模块的net信号