使用Quartus对NCOip核心进行设计,用modelsim对设计的模型进行仿真验证,Quartus版本是13.1。
打开NCOip核,对其进行设置,设置界面如下。
左边一栏是NCO的实现方式,中间一栏是输出的精度参数,分别是相位增量精度、相位精度和幅度精度,右边一栏是相位抖动,下面一栏是输入的时钟频率和输出信号的频率,由此可得到相位增量值以及实际输出信号的频率值,实际输出信号由下式决定:
设置完ip核之后,点击Generate生成。注意,若生成界面卡住不动,需要打开任务管理器关掉quartus_map.exe,之后便可成功生成ip核。
module NCO_test
(
input clk,
input n_rst,
output [17:0] signal
);
NCOip NCOip_inst(
.phi_inc_i('d257698038),
.clk(clk),
.reset_n(n_rst),
.clken(1'b1),
.fsin_o(signal),
.fcos_o(),
.out_valid());
endmodule
对编写的模块进行仿真验证,系统时钟采用50MHz,测试代码如下:
`timescale 1ns/1ns
module tb_NCO_test
();
reg clk;
reg n_rst;
wire [17:0]signal;
initial
begin
clk<=1'b1;
n_rst<=1'b0;
#40
n_rst<=1'b1;
#15
n_rst<=1'b0;
#25
n_rst<=1'b1;
end
always #10 clk=~clk;
NCO_test NCO_test_inst
(
.clk(clk),
.n_rst(n_rst),
.signal(signal)
);
endmodule
编译完成之后,启动modelsim对编写的模块进行仿真,发现modelsim会报错:
此时,先检查是否导入了相关的库文件。若没有,则点击Add导入。
导入完之后编译,发现还是报错,此时对生成的ip核的.vo文件进行编译,我这里是NCO_test.vo:
最后再对测试文件进行仿真:
此时modelsim不再报错了。将待测信号导入,便可得到正弦信号,信号频率为2.94MHz左右,与设计值3MHz接近。