FPGA NCO+FIRip核的使用及仿真(加法)(quartusii 13.1+modelsimse 10.5)

1、NCO及FIR ip核的调用

在使用ip核之前,首先要将IP核进行破解,可以参考上一篇文章:FPGA NCOip核的使用及仿真(quartusii 13.1+modelsimse 10.5)

FPGA NCOip核的使用及仿真(quartusii 13.1+modelsimse 10.5)_机械 zp的博客-CSDN博客

57b2f779de994fbe8823434fd41a6881.png

这里使用两个nco ip核来产生两个正弦信号,频率分别设定为1MHz和10MHz:ip_nco,ip_nco10

c5e100a86df9435abcda8d756fb291c6.png

2fa4d977acd7448d93ea930d72d371a8.png

FIRip核的相关参数设置:

846f3eb947b840eca5c3d7e2a3770661.png

da1a01f6a95a4db183dfd54c9a054f13.png

 这里的系数设置也可以通过matlab的fdatools工具生成,然后导入系数文件(.txt)

勾选仿真,选择语言:, 

e131a13030824636877c1b390848c820.png

 生成ip核,接口如下:

05bb968bbf7c47849f3c0bfc06fb46d7.png

2、代码部分

module fir_top(
	input							sys_clk,
	input							sys_rst_n,
	output	signed[9:0]		sin1,
	output 						sin1_vld,
	output   signed[9:0]		sin10,
	output 						sin10_vld,
	output	signed[10:0]	add_sin,
	output 						add_vld,
	output	signed [29:0]	fir_out
	
);

reg 	    signed[10:0] 	    sum_sin		;
wire      	signed[9:0]        	sin1_do   	;
wire      	signed[9:0]        	sin10_do  	;
wire                           	out_en    	;
wire                           	s_val     	;
wire                           	s_err     	;

assign sin1 = sin1_do;
assign sin10 = sin10_do;
assign add_sin = sum_sin;
assign add_vld = sin1_vld & sin10_vld;
   
//信号相加
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)begin
      sum_sin <= 10'd0;
    end
    else begin
		if(sin1_vld & sin10_vld)
			sum_sin <= sin1 + sin10;
		else
			sum_sin <= sum_sin;
    end
end



   ip_nco     u_ip_nco
   (
	.clk                         ( sys_clk    ),
	.reset_n                     ( sys_rst_n  ),
	.clken                       ( 1'b1       ),
	.phi_inc_i                   ( 32'd85899346),
	.fsin_o                      ( sin1_do    ),
	.out_valid                   ( sin1_vld   )
    );

    ip_nco10     u_ip_nco10
    (
     .clk                            ( sys_clk    ),
	  .reset_n                        ( sys_rst_n  ),    
	  .clken                          ( 1'b1       ),
	  .phi_inc_i                      ( 32'd858993459),
	  .fsin_o                         ( sin10_do   ),
	  .out_valid                      ( sin10_vld  )
    );


    ip_fir        u_ip_fir
    (
    .clk                             ( sys_clk   ),              
    .reset_n                         ( sys_rst_n ),          
    .ast_sink_data                   ( add_sin   ),    
    .ast_sink_valid                  ( add_vld   ),   
    .ast_sink_error                  ( 2'b0      ),  
	 
	 
	 .ast_source_ready 					 (1'b1       ), 
    .ast_source_data                 ( fir_out   ),  
    .ast_source_valid                ( s_val     ), 
    .ast_source_error                ( s_err     )
    );
   
endmodule

Test benches代码:


`timescale 1ns/1ns

module tb_fir_top();

//输入信号
reg                             sys_clk    ;
reg                             sys_rst_n  ;

//输出信号
wire              [9:0]        sin1       ;
wire                            sin1_vld   ;
wire              [9:0]        sin10      ;
wire                            sin10_vld  ;
wire              [10:0]        add_sin    ;
wire                            add_vld    ;
wire              [29:0]        fir_out    ;

 //模块例化
 fir_top     u_fir_top
 (
     .sys_clk       ( sys_clk   ),
     .sys_rst_n     ( sys_rst_n ),
     .sin1          ( sin1      ),
     .sin1_vld      ( sin1_vld  ),
     .sin10         ( sin10     ),
     .sin10_vld     ( sin10_vld ),
     .add_sin       ( add_sin   ),
     .add_vld       ( add_vld   ),
     .fir_out       ( fir_out   )
 );

 //产生时钟
 parameter CLK_PRE = 20;

 //时钟周期
 always #(CLK_PRE/2) sys_clk = ~sys_clk;

 integer i;//循环变量
 //产生激励
 initial    begin
     sys_clk = 1'b1;
     sys_rst_n = 1'b0;
     i=0;
     #(CLK_PRE*10);
     sys_rst_n = 1'b1;
     forever begin
         #(CLK_PRE);
         i=i+1;
         if(i==4000)
         $stop;
     end
 end
endmodule

3、仿真

402b7f04b7c940faac4689cbb974b92e.png

19774c84bc5c4be6b5c42db7c02c3663.png

0eb11b4a9a9b4c02b24658ee74475a03.png

dfc6c02eba144721ac1663819ce3b0bf.png

 a060643e08b9415ab34f1fefb30dffe8.png

频率显示,右击黄线,勾选显示频率。 

参考:NCO ip核生成正弦波并用FIR滤波器输出滤波波形_兄弟抱一下~的博客-CSDN博客_fir滤波器波形

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谭安民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值