用Modelsim仿真PLL IP核

由于要对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模块进行一次小包装,代码如下:
`timescale 1 ps / 1 ps

module pll_module(
clk,
reset,
clk_20m,
clk_100m,
sdram_clk,
sys_reset
);

input clk;
input reset;
output clk_20m;
output clk_100m;
output sdram_clk;
output sys_reset;



clk_ctrl clk_ctrl_u1 (
.areset(reset),
.inclk0(clk),
.c0(clk_20m),
.c1(clk_100m),
.c2(sdram_clk),
.locked(sys_reset)
);

endmodule
接下来,编写testbench文件,pll_module_tb.v
[plain]  view plain copy
  1. <span style="font-size: 13px; "><span style="font-family:'Microsoft YaHei';">`timescale 1 ps / 1 ps  
  2. module pll_module_tb;  
  3.   
  4. reg     clk;  
  5. reg      reset;  
  6. wire    clk_100m;  
  7. wire    clk_20m;  
  8. wire    sdram_clk;  
  9. wire    sys_reset;  
  10.   
  11. pll_module    u1(  
  12.      .clk(clk),  
  13.      .reset(reset),  
  14.      .clk_20m(clk_20m),  
  15.      .clk_100m(clk_100m),  
  16.      .sdram_clk(sdram_clk),  
  17.      .sys_reset(sys_reset)  
  18.      );  
  19.    
  20.  initial  
  21.  begin  
  22.      clk = 0;  
  23.      reset=0;  
  24.  end  
  25.    
  26.  always #25000 clk = ~clk;  
  27.    
  28.   
  29.  endmodule</span></span>  
由于仿真以ps为单位,而FPGA的输入时钟为20MHZ,即每周期50ns=50000ps,所以上面代码中的clk每25000个仿真时间进行一次翻转。

完成后的src目录下现在应该有5个文件:

  • 下面,我们可以开始准备仿真了。通常我们都是先编译,然后在添加波形文件,然后run xxxxxx ;这样比较繁琐,其实用命令往往比较方便快捷。
在工程的modelsim目录下新建文件pll.do,并写入如下代码
[plain]  view plain copy
  1. <span style="font-size: 13px; "><span style="font-family:'Microsoft YaHei';">#Creat a work lib  
  2. vlib work   
  3. #Map the work lib to current lib  
  4. vmap work work  
  5.    
  6. #Compile the source files  
  7. vlog E:/Project/ModelSim/sdram_test/src/altera_mf.v  
  8. vlog E:/Project/ModelSim/sdram_test/src/220model.v  
  9. vlog E:/Project/ModelSim/sdram_test/src/clk_ctrl.v  
  10. vlog E:/Project/ModelSim/sdram_test/src/pll_module.v  
  11. vlog E:/Project/ModelSim/sdram_test/src/pll_module_tb.v  
  12.    
  13. #Start simulation  
  14. vsim  -novopt work.pll_module_tb  
  15.    
  16. #add wave  
  17. add wave -hex /*  
  18.    
  19. run 500000000</span></span>  
上面这段代码完成了以下事情:
1.建立了一个工作lib
2.使该lib成为当前lib
3.编译工程中的文件
4.开始仿真,其中 -novopt是禁止优化的意思
5.添加波形文件
6.仿真 500000000个时间单位

  • 现在,整个modelsim工程的文件结构如下:


  • 下面,右键点击pll.do,选择execute就可以执行该脚本了。modelsim会自动帮您把所有事情搞定。(这一过程时间比较长,请耐心等待一会),结果如下图:


不难看出,从波形上看,是满足预先的设想的。下面可以放大来看一下。


从放大的图片可以看出,两个100m的时钟之间确实存在相位差,换算成时间约为2ns,这也就验证了我的PLL模块的功能。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值