
实验五Modelsim仿真教案.doc
5页实验五 ModelSim仿真【实验内容】1.仔细阅读ModelSim软件简要使用说明〔下文〕〔"实例代码〞压缩包用于ModelSim软件学习用〕2.Testbench写法简要介绍〔可以参考"Testbench模版〞〕3.用ModelSim完成10位全加器的功能仿真ModelSim软件简要使用说明ModelSim是对VHDL,Verilog,SystemC以及混合语言编写的设计文件进展仿真和调试的工具软件1.仿真流程在ModelSim中对一个设计进展仿真的根本步骤如下列图所示:2.仿真具体步骤Create a new project选择"File > New > Project〞,会弹出对话框,如下图:其中:"Project Name〞项:填写要创立的工程的名字"Project Location〞项:确定创立的工程所要存放的位置请在E盘下建文件夹!"Default Library Name〞项:填写工程的工作库的名字注:在用ModelSim进展仿真之前,必须要对设计文件进展编译,生成与设计文件逻辑功能相对应的设计单元由于ModelSim是用库文件来进展仿真的,所以编译后的设计单元需要存放在库文件里。
这个库文件叫作"工作库〞926以上三项填写完毕后,点击"OK〞按钮,会在指定的位置处创立工程及工作库,如下图:在工作库文件夹内,有一个名为"_info〞的特殊格式文件,如下图:这个文件指定了此文件夹为ModelSim的工作库文件夹在编译步骤内生成的所有设计单元都会被添加到工作库文件夹内Adding objects to the project在上一步点击OK后,ModelSim会弹出一个对话框,如下图:其中:"Create New File〞项:在工程中创立新的设计文件"Add E*isting File〞项:把已经存在的设计文件参加到工程中"Create Simulation〞项:在工程中创立仿真配置文件"Create New Folder〞项:在工程中创立新的文件夹〔1〕创立文件夹〔此步骤也可以不要,不过推荐采用此步骤,便于文件管理〕选择"Create New Folder〞项,在弹出的对话框中输入要创立的文件夹的名字,如下图:点击"OK〞按钮,会在"Workspace〞列表里显示出新创立的文件夹如下图:〔2〕将设计文件参加到文件夹内选择"Add E*isting File〞项,会弹出对话框,如下图:其中:"File Name〞项:指定设计文件所在位置。
"Reference from location〞项:表示只将设计文件与工程关联起来"Copy to project directory〞项:表示将设计文件复制一份到工程目录下存放的具体位置由"Folder〞项指定指定设计文件的具体位置后,选择"Copy to project directory〞项,并通过"Folder〞项,将存放位置改成"HDL〞,如下图:点击"OK〞按钮,会在工程文件夹内多出两个设计文件,如下图:这两个设计文件就是从指定的路径下将源文件复制过来的点击"OK〞按钮后,会在"Workspace〞列表的"HDL〞文件夹里新参加两个设计文件如下图:piling your design将设计文件参加到工程中以后,就可以编译设计文件了,编译器会将编译生成的设计单元添加进你所创立的工作库中编译的步骤如下:〔1〕编译设计文件在"Workspace〞列表的"Project〞栏内,点击右键,在弹出的列表中选择"pile > pile All〞,如下图:如果设计文件编译无误,每个设计文件后面的"Status〞栏会有绿色的对勾,否则会有红色的错叉出现当有错叉出现时,需要根据ModelSim的"Transcript〞栏内的提示信息修改设计文件,并重新编译,直到编译通过为止。
编译通过后,由设计文件编译成的设计单元会被参加到工作库中,如下图:〔2〕查看编译后的设计单元点击"Workspace〞列表里的"Library〞栏,展开"WorkLIB〞库,会看到编译后参加到库中的设计单元如下图:Loading the design into the simulator编译后生成的设计单元需要参加到仿真器中才能进展仿真由于测试文件〔testbench〕例化了要仿真的模块,所以只需要将测试文件生成的设计单元加载到仿真器中双击"Workspace〞列表内工作库下测试文件生成的设计单元,就可以将其加载到仿真器中也可以选择"Simulate > Start Simulation〞,会弹出一个对话框,展开"WorkLIB〞工作库,选中测试文件生成的设计单元,如下图:点击"OK〞按钮即可将测试文件生成的设计单元加载到仿真器中设计单元成功加载到仿真器后,ModelSim会自动弹出仿真器,并将"Workspace〞列表切换成"sim〞栏,如下图:Running the simulation运行仿真器进展仿真的步骤如下:〔1〕将信号参加到波形窗口中在"Workspace〞列表内,选择"sim〞栏。
右键点击测试文件生成的设计单元,在弹出的列表里选择"Add > Add to Wave〞,如下图:参加信号后的波形窗口如下图:也可以在"Objects〞列表里选择感兴趣的信号参加到波形窗口里方法是选**号,右键单击此信号,在弹出的列表里选择"Add to Wave〞,会弹出三个选项,如下图:其中:"Selected Signals〞项:表示参加到波形窗口中的信号是被选中的信号,即图中"Objects〞列表里的"count〞信号"Signals in Region〞项:表示参加到波形窗口中的信号是"Objects〞列表里的所有信号,即图中"Objects〞列表里的"clk〞、"reset〞和"count〞信号"Signals in Design〞项:表示参加到波形窗口中的信号是测试文件生成的设计单元里的所有信号,即图中"Workspace〞列表里的"test_counter〞下面展开的所有设计单元的信号其中"Signals in Design〞的效果与上一种方法效果是一样的〔2〕运行仿真器,开场仿真点击"run〞按钮,就可以进展仿真了,如下图:需要注意的是,"run〞按钮每次只能仿真100ns,如果要一直仿真下去的话,点击"run all〞按钮可以实现。
如下图:如果要停顿仿真,可以按"break〞按钮,如下图:如果要重新仿真,可以按"restart〞按钮,如下图:Debugging your results对仿真波形进展分析,确定逻辑是否正确如果没有得到你要的仿真结果,则需要修改设计文件,并重新编译,加载到仿真器中进展仿真注:ModelSim的编译器在对设计文件进展编译时,并不会对设计文件进展综合,即将设计文件与硬件对应,这点从上面的仿真步骤也可以看出,仿真步骤中并没有选择器件型号的步骤因此编译时生成的设计单元并没有包含硬件信息,即不会存在器件延时,所以只用ModelSim作的仿真是一种功能仿真,有时也称为"前仿真〞如果想用ModelSim作仿真时参加器件的延时信息,模拟硬件来仿真,则需要Quartus的配合才能完成参加器件延时信息的仿真称为"后仿真〞,仿真结果接近真实器件的运行结果关于ModelSim作"后仿真〞,有兴趣的读者可查阅相关资料自学,我们这里只介绍"前仿真〞Testbench写法简要介绍描述测试信号的变化和测试过程的模块叫做测试平台〔Testbench〕,它可以对电路模块进展动态的测试通过观测被测试模块的输出信号是否符合要求,可以调试和验证逻辑系统的设计和构造是否正确,便于发现问题并修改。
Testbench用于测试模块的示意图如下图:由示意图可知,Testbench要对被测模块进展测试,需要产生被测模块所需的鼓励信号〔比方时钟信号,复位信号等〕,这个就像我们用Quartus波形仿真时拖波形一样,只是Testbench里需要我们用代码来实现波形的变化产生的鼓励信号需要与被测模块对口〔比方产生的时钟信号要送入时钟输入口,产生的复位信号要送入复位输入口等〕,如何实现对口,这就需要对被测试模块的例化来实现例化的写法如下:被测模块名 例化进Testbench后的模块名〔.被测模块输入口 Testbench产生的鼓励信号,.被测模块输出口 Testbench里用来显示输出的信号〕;上面的示意图对应的例化写法为:被测模块名例化进Testbench后的模块名( .Input_1 (In_1), .Input_2 (In_2), .Input_3 (In_3), .Output_1 (Out_1), .Output_2 (Out_2), .Output_3 (Out_3));更具体的写法请参考Testbench模版10位全加器的功能仿真实验要求【输入端口】 【输出端口】clk, // 模块时钟 dout[9:0], // 和数rst, // 模块复位 cout // 高位进位din_1[9:0], // 加数1din_2[9:0], // 加数2cin // 低位进位以抓图的方式给出仿真波形图,并对结果作适当分析。
补充说明`timescale 10ns/1ns时钟clk的产生写法:Initial Clk = 0;always #50 clk = ~clk; // 表示从仿真开场算起,每隔50个时间单位,将clk翻转一次复位rst的产生写法:Initial // 下面的写法使rst=1持续的时间为120个时间单位begin#0 rst = 1'b0; //仿真开场时,rst置0#5 rst = 1'b1; //仿真开场后5个时间单位时,rst置1#125 rst = 1'b0; //仿真开场后125个时间单位时,rst置0end加数的产生写法:always ( negedge clk )// 时钟下降沿将加数改变begindin_1<= $random%1024;// 随机数除以1024后取余数给加数,加数在[0,1023]// 之间din_2 <= $random%1024; // $random调用了一个能产生随机数的系统任务 cin <= $random%2;end仿真时间的写法:initial #5000 $stop; // $stop调用了一个使仿真器停顿仿真的系统任务。
仿真时间为 // 2000个时间单位 z.。












