FPGA 学习之路(四) modesim仿真方法
来源:互联网 发布:python spark 环境搭建 编辑:程序博客网 时间:2024/06/08 16:43
1)首先新建一个文件夹,把你需要仿真的设计文本和仿真文本全部放在同一个文件夹下面,注意,文件夹路径不能包含中文。
2)打开modelsim软件,选择“File > new >project,新建一个工程,工程保存在上述所建的文件夹中,点击ok。
3)点击add existing file,选择所要仿真的文件。
4)点击编译进行文本编译找错。
5)编译无错后,选择simulate>start simulate,进行仿真。
6)选择work中文件名为xx-tb的文件(只需仿真顶层文件,其他文件不用选择)
7)进入仿真界面。点击sim中顶层文件名,右击选择 Add Wave将所要观测的信号添加到Wave窗口,为便于查找观察信号点击Wave窗口左下角,如图;
8)在Transcript窗口输入 run 5000ns,仿真开始运行,运行5000ns。(5000ns为大致所需的仿真时间)若用run-all配置低的电脑容易卡死。
9)为便于观测data中数据,点击data右击选择hex模式。
10)仿真方法
用于精确寻找出发,有效的对代码进行分析。
Find prvious transition(寻找前一个传输)
Find next transition(寻找后一个传输)
上下边沿寻找。
11)若需改动Testbench代码,在不退出Simulation的前提下,右击文件窗口中,project中需改动的文本文档选择Edit进行保存改动编译。如下图方式可方便改动和编译。(有时候会遇见.v文件打开时不用modesim自带的编辑软件打开,这是笔者采用的一种方法是选中文件,点击菜单栏project中的edit打开)也可用其他编程软件直接打开修改。
12)编译后,点击modesim右上方,如下图,进行复位,然后重新点击simulate>start simulate,进行仿真进行重新仿真
13)Testbench如下(内含语法):
/***************************************************************************一个testbench要包含时钟信号发生器,模块的例化,系统初始化,生成系统激励;本例还要产生一个模拟总线时序。//mcu spi interfaceinputspi_cs,//Chip select enable, default:Linputspi_sck,//Data transfer clockinputspi_mosi,//Master output and slave inputinputspi_miso,//Master input and slave output***************************************************************************/`timescale 1ns/1nsmodule MCU2FPGA_SPI_TB;//------------------------------------------//clock generate moduleregclk; //所要仿真的接口信号都要设置成reg类型regrst_n;parameter PERIOD = 10;//时钟周期我为10nsinitial //inital 执行一次beginclk = 0;forever#(PERIOD/2) //每半个时钟周期翻转一次clk = ~clk;endtask task_reset; //类似于子函数,调用方式为task_reset(接口信号)beginrst_n = 0;repeat(2) @(negedge clk); //重复两个时钟下降沿执行下一步rst_n = 1;endendtask //任务函数task要有endtaskwireclk_ref = clk;wiresys_rst_n = rst_n;//----------------------------------------------//the target component instantiationregspi_cs; //接口信号regspi_sck;regspi_mosi;//-----------------------------------wirerxd_flag;wire[7:0]rxd_data;spi_receiveru_spi_receiver (//global clock.clk(clk_ref),//100MHz clock.rst_n(sys_rst_n),//global reset//mcu spi interface.spi_cs(spi_cs),//Chip select enable, default:L.spi_sck(spi_sck),//Data transfer clock.spi_mosi(spi_mosi),//Master output and slave input//.spi_miso(spi_miso),//Master input and slave output//user interface.rxd_flag(rxd_flag),.rxd_data(rxd_data));//---------------------------------------wiretxd_flag;spi_transfer u_spi_transfer(//global clock.clk(clk_ref),//100MHz clock.rst_n(sys_rst_n),//global reset//mcu spi interface.spi_cs(spi_cs),//Chip select enable, default:L.spi_sck(spi_sck),//Data transfer clock//.spi_mosi(spi_mosi),//Master output and slave input.spi_miso(spi_miso),//Master input and slave output//user interface.txd_en(rxd_flag),.txd_data(rxd_data),.txd_flag(txd_flag));//---------------------------------------------//mcu spi data transfertask task_mcu_spi_txd; //spi总线时序input[7:0] mcu_data;beginspi_cs = 0; #100;spi_sck = 0;spi_mosi = mcu_data[7]; #100;spi_sck = 1; #100;//Bit[7]spi_sck = 0;spi_mosi = mcu_data[6]; #100;spi_sck = 1; #100;//Bit[6]spi_sck = 0;spi_mosi = mcu_data[5]; #100;spi_sck = 1; #100;//Bit[5]spi_sck = 0;spi_mosi = mcu_data[4]; #100;spi_sck = 1; #100;//Bit[4]spi_sck = 0;spi_mosi = mcu_data[3]; #100;spi_sck = 1; #100;//Bit[3]spi_sck = 0;spi_mosi = mcu_data[2]; #100;spi_sck = 1; #100;//Bit[2]spi_sck = 0;spi_mosi = mcu_data[1]; #100;spi_sck = 1; #100;//Bit[1] spi_sck = 0;spi_mosi = mcu_data[0]; #100;spi_sck = 1; #100;//Bit[0]spi_cs = 1; spi_sck = 0; #100;endendtask//---------------------------------------------//system initializationtask task_sysinit; //spi总线时序chushihuabeginspi_cs = 1;spi_sck = 0;spi_mosi = 0;endendtask//---------------------------------------//testbench of the RTLinitial //生成系统激励begin //多个inital文件可以并行执行task_sysinit;task_reset;#100;task_mcu_spi_txd(8'h95);#100;task_mcu_spi_txd(8'hbe);#100;task_mcu_spi_txd(8'hab);endendmodule
- FPGA 学习之路(四) modesim仿真方法
- FPGA 学习之路(三) FPGA的固化方法
- modesim仿真错误解决
- MFC六大关键技术之仿真学习笔记(四)
- FPGA学习手记(四)ModelSim入门及Testbench编写——合理利用仿真才是王道
- FPGA学习之路
- FPGA 学习之路(八)状态机
- FPGA 学习之路(二) 管脚锁定的两种方法
- xilinx fpga 学习笔记6:行为仿真
- FPGA学习之always@(*)
- 关于modesim仿真更改工程路径之后编译出错
- FPGA 学习之路(一)EDA软件设计流程
- FPGA 学习之路(五)边沿检测技术
- FPGA 学习之路(六)任意分频技术
- FPGA 学习之路 (七) UART串口设计
- FPGA 学习之路(九)SPI协议通信
- 【搬家】FPGA学习手记(二) 简单功能仿真及Verilog基础电路设计
- FPGA学习(第8节)-Verilog设计电路的时序要点及时序仿真
- const
- yii2框架-yii2文档资料整理(一)
- MySQL(6):约束
- jQuery——层叠选择器
- UVA1585
- FPGA 学习之路(四) modesim仿真方法
- iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现
- 输入框被限制效果,只能输入指定类型的数据
- 盒式布局栗子
- http协议之request案例二:防止非法链接
- Activity的启动模式(LaunchMode)
- ajax请求失败的状态码都是0
- 练习
- request.getSession().invalidate()