FPGA系统设计的仿真验证

最近做项目卡住了,仿真已经通过了,可是将程序下载到板子调试时,chipscope中获取信号时,所有信号一直保持高或者低,没有任何变化。后来查资料知道,我只做了功能仿真,没有做时序仿真,可能还有没有发现的问题。事实证明,每个仿真都需要做。

一、前言

FPGA设计验证包括功能与时序仿真和电路验证。

功能仿真是指仅对逻辑功能进行测试模拟,以了解其实现的功能是否满足原设计的要求。仿真过程中没有加入时序信息,不涉及具体器件的硬件特性,如延时特性等,因此也叫前仿真。它是对HDL硬件设计语言的功能实现能力进行仿真,以确保HDL语言描述能够满足设计者的最初意图。

时序仿真则是在HDL可以满足设计者功能要求的基础上,在布局布线后,提取有关的器件延迟、连线延时等时序参数,并在此基础上进行的仿真,因此,也称为后仿真,它是接近真实器件运行的仿真。

我使用的是ISE_14.7,集成MODELSIM_10.1a。仿真的方法分为直接和间接两种。直接是指从ISE 上起动MODELSIM。间接是单独起动MODELSIM,然后使用ISE 生成的用于仿真的文件夹netgen。

下面分别介绍功能仿真和时序仿真,本文只介绍直接从ISE上启动MODELSIM。本文参考的实例为之前的博文《verilog实现中值滤波》。

二、功能仿真

1、建立工程

此步骤不再详细描述,可参考文件《黑金Sparten6开发板Verilog教程V1.5》第四部分  LED流水灯例程。该部分详细介绍从新建一个项目, 建立仿真文件,从ISE中启动ModelSim进行功能仿真以及到最后下载到FPGA的全过程。像我这样的小白可以通过学习这部分,对如何使用FPGA进行一个简易项目的开发,有个直面的感性认识。

2、在用Modelsim仿真前,在ISE中需要确认一下设置,点击菜单的“Project->Design Properties…”。

3、如下图所示,确认这里“Simulator”的选择为“Modelsim-SE Mixed”,这在新建工程时我们已经设定好了,为保万无一失,我们还是确认一下。

4、先切换到Simulation模式, 再选中main_test.v文件, 最后右键选择Simulate Behavioral Model后选择Process Properties..。

 5、弹出“Process Properties”设置窗口,在右边的“Compiled Library Directory”后面填入之前编译库时设置的已编译库的路径“C:\Xilinx\Xilinx_lib”。这个在Xilinx的安装路径下。其他选项默认设置即可,点击“OK” 完成设置。

 6、接下去我们开始写测试脚本文件,右击main.v->New Source...

7、如图所示,选择新建源文件类型是“Verilog Test Fixture”,再输入测试脚本文件的名字和存放目录。

 8、这里“Associate Source”是选择测试脚本对应的设计源文件,如果工程中有多个设计源文件,可以选择任意一个设计源文件进行仿真。这里我选择的是顶层模块的设计源文件main.v,对整个工程进行仿真我们只有一个设计源文件,然后点击“Next”。下一个界面点击“finish”,即完成仿真文件的创建。

 9、这里的测试脚本只是一个基本的模板,它把设计文件mian_test的接口在这个模块里面例化申明了,我们还需要自动动手添加复位和时钟的激励。完成后的脚本文件如下:

`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   16:45:09 10/17/2018
// Design Name:   main
// Module Name:   E:/WorkSpace/FPGAProject/ImageProcessingTest/main_test.v
// Project Name:  ImageProcessingTest
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: main
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module main_test;
	/***输入端口Inputs在测试文件中的数据类型为reg***/
	// Inputs
	reg CLK;
	reg RSTn;
	reg Start_sig;

	/***定义计数器,记录存储的像素个数100*100=10000=10,0000,0000,0000***/
	reg [13:0] pix_cnt;   

	/***输出端口Outputs在测试文件中的数据类型为wire***/
	// Outputs
	wire Done_sig;
	wire [7:0] Data_out;

	/***定义整型变量fouti***/
	integer fouti;

	// Instantiate the Unit Under Test (UUT)
	main uut (
		.CLK(CLK), 
		.RSTn(RSTn), 
		.Start_sig(Start_sig), 
		.Done_sig(Done_sig), 
		.Data_out(Data_out)
	);

	initial begin
	// Initialize Inputs
	CLK = 0;
	RSTn = 0;
	Start_sig = 0;

	fouti = $fopen("medfilter2_re.txt");//@@@

	// Wait 100 ns for global reset to finish
	#100;

	// Add stimulus here
	/***添加复位信息***/
	RSTn = 0;    
	Start_sig = 1;
	pix_cnt = 0;

	#100;   
	// To start the syste        
	RSTn = 1;
	pix_cnt = 1;       
	end

	/***添加时钟激励***/
	always #10 CLK = ~CLK;

	/***计数***/
	always@(posedge CLK)
		begin
			if(Done_sig)
				pix_cnt <= pix_cnt + 1;
		end

	/***通过计数停止仿真***/
	always@(posedge CLK)
		begin
			if(pix_cnt == 14'd10001)
				begin 
				  Start_sig <= 0; 
				  $display("Image Medfilter Completed!\n");
				  $display("The all time is %d \n",$time);
				  $stop;
				end
		end

	/***将结果数据Data_out写入txt文档中***/
	always@(posedge CLK)
		begin
			if(Done_sig)
				begin
				  $fwrite(fouti, "%d", Data_out, "\n");
				  $display("%d",pix_cnt);
				end
	    end

endmodule

 10、保存后main_test.v已经成了这个仿真的顶层了,它下面是设计文件main.v。我们选择仿真模式Behavioral(行为仿真),然后选中main_test.v文件,随后双击“Simulation Behavioral Model”,随后Modelsim将被调用,启动仿真。

11、弹出Modelsim后,我们可以打开Wave查看。如果想添加信号到Wave中查看,点击uut,在Name窗口下选择要添加的信号,例如rom_data,右击选择Add Wave,随后就可以在Wave窗口中观察rom_data信号。

12、点击Restart按钮复位一下,再点击Run All按钮。Modelsim会运行到$stop的地方。

补充:每次添加信号比较麻烦,可以点击“save Format”, 将添加好的信号保存,方便下次使用。

 点击"File",选择"Open",打开文件“wave.do”。如下图所示。

 在“wave.do”文件中,复制下图蓝色部分的语句,在命令行窗口运行这些语句,即可将之前保存的信号添加到wave窗口中。

三、时序仿真

时序仿真一共有四类:

第一类:综合(Synthesize),综合后可生成综合后仿真模型(Generate Post-Synthesis Simulation Model)。

在Implementation状态下,点击Synthesize-XST下Generate Post-Synthesis Simulation Model。

第二类:实现(Implement)中的翻译(Translate),生成Generate Post-Translate Simulation Model。

第三类:实现(Implement)中的映射(Map),生成Generate Post-Map Simulation Model。

第四类:实现(Implement)中的布局布线(Place&Route),生成Generate Post-Place&Route Simulation Model。

综合后,进行ISE的实现(Implement),包括翻译、映射、布局布线。在这三个过程中都可以生成一个仿真模型,翻译和映射不会产生延时,因此常用布局布线后产生的仿真模型进行时序仿真。下面讲解如何使用布局布线后产生的仿真模型进行时序仿真。

1、启动Modelsim仿真

生成仿真模型之后,切换到"Simulation"模式,选择“Post-Route”,然后双击ModelSim Simulator下Simulate Post-Place & Route Model,随后Modelsim启动。

2、如何编写仿真文件及如何使用Modelsim观察信号变化,同功能仿真。

四、参考资料

1、《黑金Sparten6开发板Verilog教程V1.5》

链接:https://pan.baidu.com/s/17Ubnroqc3oNEXt_W2XkXgg 
提取码:1m7m 

2、《用ISE 与Modelsim 进行FPGA 后仿真(时序仿真)的两种方法》

链接:https://pan.baidu.com/s/1w3msgwOHQX0LIkg1nk4yqg 
提取码:bv41 

3、《FPGA应用开发入门与典型案例》
 

猜你喜欢

转载自blog.csdn.net/weixin_38621214/article/details/83831703