跳转到主要内容

使用vivado和Modelsim进行仿真

<font color="#FF8000">作者:米联客(milianke)</font>

软件版本:vitis2021.1(vivado2021.1)

操作系统:WIN10 64bit

硬件平台:适用AMD-XILINX A7/K7/Z7/ZU/KU系列FPGA

<strong>1 概述</strong>
仿真是每个初学者必须学会的一项技能,因为FPGA程序编译时间往往很长,所以对程序进行仿真就成为了校验程序正确性的最快捷的方式。

本节课,我们将通过Modelsim以及vivado两个不同软件,使用两种方法对我们上节课所生成的程序进行仿真,带读者快速掌握基本的FPGA开发技能。

<strong>2使用vivado进行仿真</strong>
相比较Modelsim仿真,我们直接使用vivado进行仿真就显得简单得多,仅仅只需要编辑好我们的Test Bench,也就是我们俗称的TB文件就可以了。

<strong>2.1添加RTL仿真文件</strong>
首先我们打开上一节课做的程序,添加RTL文件。添加RTL文件的方法跟添加verilog文件的文件方法类似

Step1:单击 Add Sources
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318165-1.png…; alt=""></center>

Step2:选择需要添加的文件类型,这里我们选择仿真类型的文件,点击Next添加确定
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318166-2.png…; alt=""></center>

Step3:点击Create File创建一个新的Test Bench文件,当然,如果你有提前写好的TB文件也可以直接点Add Files添加已有的文件。
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318167-3.png…; alt=""></center>

Step4:创建一个pll_test_TB的文件,并且文件类型选择Verilog,路径可以选择存放在工程默认路径下,米联客推荐存放在创建的FPGA工程目录的uisrc\02_sim目录下,方便管理,注意整个路径不允许出现中文。
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318168-4.png…; alt=""></center>
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318169-5.png…; alt=""></center>

Step5:点击OK确认生成文件,点击Finsh结束
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318170-6.png…; alt=""></center>

Step6:这边可以预先添加端口以及修改模块名,我们保持默认,直接点击OK即可。
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318171-7.png…; alt=""></center>

Step7:这边我们的TB文件就新建完成了,但是我们发现他跟我们的主程序"pll_test.v"是保持平行状态的。那是因为我们的TB文件里面内容为空,所以并不对我们的主程序有任何激励,也同样没有对我们的主模块进行例化,所以我们接下来就是要进行例化操作。

<strong>2.2编写RTL仿真文件</strong>
首先我们要有一个概念,我们仿真的目的是模拟代码实际运行时候的一个状态。所以我们要做的就是尽可能真实的还原我们将程序下载后,我们实际开发板的运行状态。然后使用例化的方式,将我们的信号接入我们的主程序模块,方法类似我们例化IP,所以例化的部分我们不详细讲解。

我们目前的代码比较简单,由于我们的使用的开发板的系统时钟是50M,所以我们仅仅需要模拟一个50M的系统时钟即可。

本教程具有通用性,可作为其他型号的FPGA参考学习资料,如果作为其他型号的FPGA参考使用,开发板的系统时钟存在差异,请在理解原理后适当修改,切勿生搬硬套。

由于时钟翻转我们需要保持高/低电平的状态,所以我们设置一个reg类型的寄存器"clk_i",然后使该寄存器定时翻转。

这边我们使用一个关键词"`timescale"来控制我们仿真的精度,我们本次模拟的是一个50M的时钟,我们的周期为20ns,所以我们设置每10ns进行一次翻转,我们的仿真精度是1ns,所以我们翻装的周期设置"#10",我们具体代码如下

`timescale 1 ns/100ps

module sim_top_tb;

reg sysclk; //时钟信号

wire [1:0] up_led; //仿真的LED 信号

pll_test u_pll_test(

.I_sysclk_p(sysclk),

.O_up_led(up_led)

);

initial

begin

sysclk = 1'b0;

end

///////////////////////////////////////////////////////////////////

//

// Clock generation

//

always #10 sysclk = ~sysclk; //duty cycle 50%, period 20 ns; Frequency 50Mhz;

endmodule

TB文件保存后,我们可以发现,文件结构又发生了变化,主程序并入了我们TB文件下,说明我们程序例化成功,可以开始仿真。
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318172-8.png…; alt=""></center>

<strong>2.3运行仿真</strong>
Step1:点击Run Behavioral Simulation
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318173-9.png…; alt=""></center>

Step2:等待数秒,我们进入仿真界面,这时候我们需要选出我们需要观察的信号,然后右键添加进我们的观察窗口,
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318174-10.pn…; alt=""></center>

Step3:添加完成后,我们需要重新开始仿真或者刷新一下我们的观察数据,然后点击run运行仿真。
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318175-11.pn…; alt=""></center>

Step4:运行后,由于我们计数器要经过一段时间比较长的计数,所以我们需要等待一段时间。通过结果可以看到经过PLL IP分频出来的时钟跟预期保持一致,LED正常翻转。
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318176-12.pn…; alt=""></center>

<strong>3使用Modelsim进行仿真</strong>
默认电脑上已经安装完成vivado以及Modelsim软件。

Step1:打开vivado,点击Tools --> Compile Simulation Libraries,生成库函数
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318177-13.pn…; alt=""></center>

Step2:生成库函数设置

Simulator选择ModelSim Simulator

Language,Library,Family选择全部(All)

Compiled library location:编译库目录,可以选择在ModelSim的安装路径下,新建一个Vivado_2021_lib的文件夹

Simulator executable path:选择ModelSim的启动路径
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318178-14.pn…; alt=""></center>

点击Compile,即可开始生成库文件,等待编译完毕。

Step3:在Vivado中添加ModelSim调用设置

Vivado --> Tools --> setting,分别设置仿真软件和仿真库
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318179-15.pn…; alt=""></center>

Step4:在Simulation中选择ModelSim来仿真并且调用之前到处的库。
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318180-16.pn…; alt=""></center>

Step5:点击Run Behavioral Simulation,Modelsim正常启动
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318181-17.pn…; alt=""></center>

Step5:右键添加信号
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318182-18.pn…; alt=""></center>

Step6:先把信号复位,然后重新开始仿真
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318183-19.pn…; alt=""></center>

Step6:仿真结果无误
<center><img src="https://cdn.eetrend.com/files/2023-09/wen_zhang_/100574567-318184-20.pn…; alt=""></center>

<strong>4本章小结</strong>
本章节主要学习了两种仿真方法,并且分别对工程进行仿真。

原文链接:https://www.cnblogs.com/milianke/p/17693603.html