3461|1

5979

帖子

8

TA的资源

版主

楼主
 

ModelSim仿真PLL模块 Altera fpga(转) [复制链接]

由于要对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 [plain] view plaincopy
  • `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
由于仿真以ps为单位,而FPGA的输入时钟为20MHZ,即每周期50ns=50000ps,所以上面代码中的clk每25000个仿真时间进行一次翻转。 完成后的src目录下现在应该有5个文件:
  • 下面,我们可以开始准备仿真了。通常我们都是先编译,然后在添加波形文件,然后run xxxxxx ;这样比较繁琐,其实用命令往往比较方便快捷。
在工程的modelsim目录下新建文件pll.do,并写入如下代码 [plain] view plaincopy
  • #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
上面这段代码完成了以下事情: 1.建立了一个工作lib 2.使该lib成为当前lib 3.编译工程中的文件 4.开始仿真,其中 -novopt是禁止优化的意思 5.添加波形文件 6.仿真 500000000个时间单位
  • 现在,整个modelsim工程的文件结构如下:
  • 下面,右键点击pll.do,选择execute就可以执行该脚本了。modelsim会自动帮您把所有事情搞定。(这一过程时间比较长,请耐心等待一会),结果如下图:
不难看出,从波形上看,是满足预先的设想的。下面可以放大来看一下。

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

转载自http://blog.csdn.net/ruby97/article/details/7345173

此帖出自FPGA/CPLD论坛

最新回复

学习学习  详情 回复 发表于 2015-3-31 17:27
点赞 关注
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 

回复
举报

33

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
学习学习
此帖出自FPGA/CPLD论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表