用ModelSim仿真PLL模块 .
来源:互联网 发布:html5与java交互 编辑:程序博客网 时间:2024/05/18 03:32
由于要对FPGA读写SDRAM的工程进行调试,第一步就是验证PLL模块的功能,故结合网上找的一些资料,进行了如下PLL仿真实验。
下面是仿真的全过程
- 首先,看一下Quartus中的PLL模块:
从上面图中可以看出:我的FPGA输入时钟是20MHZ,该PLL有三个输出,其中
C0:5倍频,100MHZ
C1:1倍频,20MHZ
C2:5倍频,100MHZ,同时相对于C0延时2ns,也就是72度的相位差。
- 下面,新建一个Modelsim的工程。然后在工程目录下新建两个文件夹,分别为src以及modelsim,如图所示
- 下面,给工程添加库文件,源文件以及激励文件:
首先,添加库文件,在quartus目录下(E:\Altera\quartus\eda\sim_lib),即sim_lib文件夹中复制两个库文件:
altera_mf.v 和 220model.v,把它们复制到src目录下
然后,找到Quartus工程中生成的pll模块的文件,我的是clk_ctrl.v(第一幅图可以看出),把它复制到src目录下;
然后新建一个pll_module.v文件,对PLL模块进行一次小包装,代码如下:
接下来,编写testbench文件,pll_module_tb.v
- <SPAN style="FONT-SIZE: 13px"><SPAN style="FONT-FAMILY: 'Microsoft YaHei'">`timescale 1 ps / 1 ps
- module pll_module_tb;
- reg clk;
- reg reset;
- wire clk_100m;
- wire clk_20m;
- wire sdram_clk;
- wire sys_reset;
- pll_module u1(
- .clk(clk),
- .reset(reset),
- .clk_20m(clk_20m),
- .clk_100m(clk_100m),
- .sdram_clk(sdram_clk),
- .sys_reset(sys_reset)
- );
- initial
- begin
- clk = 0;
- reset=0;
- end
- always #25000 clk = ~clk;
- endmodule</SPAN></SPAN>
`timescale 1 ps / 1 psmodule pll_module_tb;reg clk;reg reset;wire clk_100m;wire clk_20m;wire sdram_clk;wire sys_reset;pll_module u1( .clk(clk), .reset(reset), .clk_20m(clk_20m), .clk_100m(clk_100m), .sdram_clk(sdram_clk), .sys_reset(sys_reset) ); initial begin clk = 0; reset=0; end always #25000 clk = ~clk; endmodule
由于仿真以ps为单位,而FPGA的输入时钟为20MHZ,即每周期50ns=50000ps,所以上面代码中的clk每25000个仿真时间进行一次翻转。完成后的src目录下现在应该有5个文件:
- 下面,我们可以开始准备仿真了。通常我们都是先编译,然后在添加波形文件,然后run xxxxxx ;这样比较繁琐,其实用命令往往比较方便快捷。
在工程的modelsim目录下新建文件pll.do,并写入如下代码
- <SPAN style="FONT-SIZE: 13px"><SPAN style="FONT-FAMILY: 'Microsoft YaHei'">#Creat a work lib
- vlib work
- #Map the work lib to current lib
- vmap work work
- #Compile the source files
- vlog E:/Project/ModelSim/sdram_test/src/altera_mf.v
- vlog E:/Project/ModelSim/sdram_test/src/220model.v
- vlog E:/Project/ModelSim/sdram_test/src/clk_ctrl.v
- vlog E:/Project/ModelSim/sdram_test/src/pll_module.v
- vlog E:/Project/ModelSim/sdram_test/src/pll_module_tb.v
- #Start simulation
- vsim -novopt work.pll_module_tb
- #add wave
- add wave -hex /*
- run 500000000</SPAN></SPAN>
#Creat a work libvlib work #Map the work lib to current libvmap work work #Compile the source filesvlog E:/Project/ModelSim/sdram_test/src/altera_mf.vvlog E:/Project/ModelSim/sdram_test/src/220model.vvlog E:/Project/ModelSim/sdram_test/src/clk_ctrl.vvlog E:/Project/ModelSim/sdram_test/src/pll_module.vvlog E:/Project/ModelSim/sdram_test/src/pll_module_tb.v #Start simulationvsim -novopt work.pll_module_tb #add waveadd wave -hex /* run 500000000
上面这段代码完成了以下事情:1.建立了一个工作lib
2.使该lib成为当前lib
3.编译工程中的文件
4.开始仿真,其中 -novopt是禁止优化的意思
5.添加波形文件
6.仿真 500000000个时间单位
- 现在,整个modelsim工程的文件结构如下:
- 下面,右键点击pll.do,选择execute就可以执行该脚本了。modelsim会自动帮您把所有事情搞定。(这一过程时间比较长,请耐心等待一会),结果如下图:
不难看出,从波形上看,是满足预先的设想的。下面可以放大来看一下。
从放大的图片可以看出,两个100m的时钟之间确实存在相位差,换算成时间约为2ns,这也就验证了我的PLL模块的功能。
- 用ModelSim仿真PLL模块
- 用ModelSim仿真PLL模块
- 用ModelSim仿真PLL模块 .
- ModelSim仿真PLL模块
- 用Modelsim仿真PLL IP核
- modelsim仿真PLL
- modelsim仿真带IP核(PLL)的方法
- 用ModelSim仿真FIFO
- 用ModelSim仿真FIFO
- 用ModelSim仿真FIFO .
- 用ModelSim仿真SDRAM操作
- 用ModelSim仿真SDRAM操作
- 求助APB接口和RTC仿真(程序模块已有,需要编写测试模块用ModelSim仿真)
- Modelsim仿真
- ModelSim仿真
- modelsim仿真
- 在modelsim里仿真用ALTERA的IP core 生成的RAM/ROM模块
- PLL行为级仿真
- PLL的重要性
- IO负载高的来源定位
- MongoDB的安装配置
- 用ModelSim仿真FIFO .
- 在Android4.0中Contacts拨号盘界面剖析(源码)
- 用ModelSim仿真PLL模块 .
- C#提供的XML注释功能的预定义的标签
- 黑马程序员--------Java基础加强
- 《Qt编程的艺术》——8.1model/view结构的底层概念
- win7下怎么配置ODBC数据源
- Flex建立编译环境
- 数据类型对应字节数
- acm要看的书
- DIV 下拉条代码