NCO仿真

这几天碰到了一个NCO仿真的问题,网上说法比较少,这篇文章供大家参考。本人采用的开发环境是modelsim-SE10.1c,Quartus II 13.1版本,quartus平台对第三方仿真工具的支持比较薄弱,需要进行大量的操作,这篇文章也对这一系列做系统的介绍。一般的IPcore,通常quartus只给你个.v文件,你自己去例化,仿真即可,但是,NCO这个IPcore感觉比较复杂,他吐出来的东西非常多,而且需要配置仿真库,目前网上资源比较少,这篇文章讲述的是比较详细,比较具体的,我们的工程参考一位大兄弟的做法,这里给出链接https://blog.csdn.net/baijingdong/article/details/8095590

一、开发平台的搭建

modelsimSE10.1c是之前使用xilinx平台开发的时候安装的,开发者购买开发板的时候都会进行安装 ,这里不做介绍,quartus使用的是quartusII13.1,给出quartus13.1的永久破解license链接:https://pan.baidu.com/s/1dUPj8ZMFqmAcqzxEOt8EkQ 
提取码:kv4b,这个License里面包含了几乎所有的IPcore,使用该license,用户只需要对里面的HOSTID进行替换,替换为你自己quartus软件安装后的那个license setup里面的hostid的第一个即可,具体的自行百度。我开发环境都搭建好了,最主要的问题是怎么仿真,下面不在环境上下功夫,直接给过程。

二、仿真过程

 1、quartus建立工程

首先在CSDN目录下面,创建目录PAR RTL SIM,我里面会比较乱,姑且先创建吧。,PAR下面还有一个目录名叫ipcore

打开quartus使用project wizard创建工程,工程名叫nco

工程创建过程一路默认,我们只做仿真,选好自己的芯片。

创建好了,然后添加nco这个ipcore

在配置IPcore的时候,选择这个

出现Generating MegaCore function top-level,卡在这个地方不动,杀死quartus_map.exe这个进程。

 

结束

然后就是例化,testbench,本文不做介绍了,参考前面的大兄弟

在开启设置了modelsim仿真的情况变异,出现这种情况

要进行如下操作

编译的时候不要选择simulation,是不是很神奇

然后编译通过,我们就进入了仿真过程

2、modelsim仿真NCO

在SIM文件下编写testbench,文件是nco_tb.v

然后在quartus里面对testbench进行配置,然后从quartus启动modelsim,这一步可能是为了创建PAR目录下的simulation这个文件夹,这可能是modelsim的工程目录,有一点很重要,我的modelsim是没有针对Altera和quartus进行任何配置!

然后你会发现你的modelsim报错了,毕竟nco功能仿真也需要一些库文件。现在关闭modelsim

关闭modelsim后,重新启动modelsim,然后将modelsim的目录切换到simulation/modelsim。通过这里我发现前面那步可能是为了产生这个工作目录或者工程的。

然后添加库

这些库文件在这个文件夹下

库在这个verilog_libs里面,依次添加即可

然后就是编译!nco文件凸出来的东西里有一个.vo文件,请看(我的NCO放在了ipcore文件夹下)

我们在modelsim里面编译,点击compile,进入选择编译文件部分,选择这个.vo文件,点击编译,然后选择nco_tb.v,编译,这两个文件编译结束后,开始仿真,选择nco_tb.v进行仿真

发现进来了

给大家放结果

三、总结

本论文给出了NCO这个IPcore的仿真过程,给出了完整的操作过程。其他复杂的IPcore在Quartus仿真不通过的情况,估计可以参考这个过程。

 

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,下面是一个简单的Verilog代码实现NCO模块,并在ModelSim中进行仿真的步骤: 1. 首先,新建一个Verilog文件,命名为nco.v,然后将以下代码复制粘贴到文件中: ```verilog module nco( input clk, //时钟信号 input reset, //复位信号 input [31:0] phase_increment, //相位增量 output reg sine //正弦波输出 ); reg [31:0] phase; //相位寄存器 phase_accumulator PA(clk, reset, phase_increment, phase); //调用相位累加器模块 always @(posedge clk) begin sine <= $sin(phase[31:28]); //计算正弦波输出 end endmodule ``` 在上面的代码中,我们定义了一个NCO模块,包含了时钟信号、复位信号、相位增量和正弦波输出。我们还定义了一个相位寄存器,并通过相位累加器模块进行相位累加。最后,我们通过计算正弦波输出。 2. 然后,新建一个testbench文件,命名为nco_tb.v,然后将以下代码复制粘贴到文件中: ```verilog `timescale 1ns/1ns module nco_tb; reg clk; reg reset; reg [31:0] phase_increment; wire sine; nco UUT(clk, reset, phase_increment, sine); initial begin clk = 0; reset = 1; phase_increment = 0; #10 reset = 0; #100 $finish; end always #5 clk = ~clk; endmodule ``` 在上面的代码中,我们定义了一个测试台,包括时钟信号、复位信号、相位增量和正弦波输出。我们通过nco模块实例化UUT,并在initial块中初始化信号,并进行仿真。 3. 接下来,打开ModelSim软件,然后新建一个工程,将nco.v和nco_tb.v文件添加到工程中。 4. 然后,编译工程,生成仿真文件。 5. 最后,在仿真窗口中运行仿真,并观察正弦波输出是否符合我们的期望。 这样,我们就用Verilog语言在ModelSim中实现了NCO模块的仿真代码。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值