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的字体?

image

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产生了接收中断,但是中断控制器没有产生中断,原因找到了。 image

image

14) vivado sdk调试模式,memory窗口,如何让其一行显示4个byte,或者1个word?如何修改hex或者十进制显示?

image

image

15) vivado block设计模式, block ram generator的size不可编辑,那怎么办?

可以通过这种方式编辑:修改Address Editor的容量,然后再去看block ram generator,发现它的尺寸变了。

16) 如何使用ip的官方demo例程?

右键点击这个ip,可以看到“Open IP Example Design...."选项,打开即可生成一个新的工程。

image

17) 不小心把ILA调试界面关闭了,如何重新打开?

打开Hardware Manager,点击xc7z010可以看到下面有3个器件(XADC, hw_ila_1, hw_vio_1),右键xc7z010选择Program Device....,重新下载程序后,ILA/VIO界面会自动弹出来。

image

18) 底层IP不要包括ILA,否则会导致上层调用IP仿真的时候报错。因为ILA是不能仿真的。如果需要看到底层信号,用mark debug模式。

image

19) AXI Traffice Generator模块,如果修改addr.coe或data.coe后,需要重新Generate Ouput Product才能更新到这个IP的仿真模型。如果修改后,不重新Generate,仿真结果仍然是旧的。

image

这是ip的仿真模型,只有通过Generate Output Product之后,用户定义的addr.coe和data.coe才能更新到这里。当然,如果手动修改这里可能也是可以的,但是不建议,因为这会导致ip仿真模型里的数据与用户输入的数据不同步。另外,这里是临时的,会随时被冲掉。

20) rom的.coe文件,注意radix值。例如下面的rom_sin.coe用的是10进制

image

21)验证代码编写

image

验证代码中,我们经常使用wait语句。

image

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);

image 打开prinf函数测到的延时

image 关闭prinf函数测到的延时

程序中在等待te中断

image

图中标红线的是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都访问不到。后来发现是这个原因。 image

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 image image

根据这里1,2,3来创建combine的verilog文件。1取其中的接口定义,2取其中的input/output定义,3取例化定义。

step2:于是就可以把combine的verilog写出来了。由于信号名比较多,建议放到linux下用vim来编辑。

image image

可以看到,axi_quad_spi_combine包含了2个axi_quad_spi ip核,根据spi_sel来选择。

image image

这是封装后的效果。以及用microblaze驱动的效果。

29) 封装qspi接口时,遇到bus interface property ID_WIDTH does not match问题

image

30) 如何设置sdk的编译等级,编译参数?

右键bsp的设置里面有。 image

31) vivado创建的ip,用vscode修改了代码后,vivado会检测到变化,然后会提示你需要update ip status,并重新编译。

除非你修改了端口,否则不需要重新打开ip操作。例如,你只修改了内部代码,端口没有变化,那么就不需要打开ip操作。

32) sdk使用xilffs,经常遇到找不到f_open函数的问题,解决方案找到了,确实解决了

https://blog.csdn.net/weixin_44167319/article/details/104074045 image

33) vivado修改代码后,仿真波形不更新,看起来就像代码修改没有同步到vivado一样。

image

解决方法:关闭仿真,然后reset behavioral simulation。然后重新开启仿真即可。确实可以。

34) vscode中编辑的代码,在vivado中打开中文是乱码,如何解决?

image image image

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文件,非常简洁。

image image

39) verilog仿真技巧:修改底层的参数或者net信号

用defparam来穿透多层模块,修改底层模块的参数 用force来穿透多层模块,修改底层模块的net信号

image