设计任务:
实现高通滤波器,参数如下:
通过频率:200KHz;
截止频率:180KHz;
通带纹波:<1dB;
阻带衰减:>40dB。
本次实验需要用上篇文章用matlab生成vivado fir ip核需要用的ceo文件
module fir_top(
input clk,
input axis_data_tvalid,
input axis_data_tvalid_f,
output [15:0]S,//叠加波形
output [39:0]fir_out,//滤波后的波形
output [15 : 0] m_axis_data_tdata_1,//100kHz正弦波
output [15 : 0] m_axis_data_tdata_2//200kHz正弦波
);
wire event_pinc_invalid_1,event_pinc_invalid_2;
wire event_poff_invalid_1,event_poff_invalid_2;
wire [15:0]m_axis_phase_tdata_1,m_axis_phase_tdata_2;
wire m_axis_phase_tvalid_1,m_axis_phase_tvalid_2;
c_addsub_0 your_instance_name (
.A( m_axis_data_tdata_1), // input wire [15 : 0] A
.B(m_axis_data_tdata_2), // input wire [15 : 0] B
.S(S) // output wire [15 : 0] S
);
dds_compiler_0 dds_1 (
.aclk(clk), // input wire aclk
.m_axis_data_tvalid(axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata_1), // output wire [15 : 0] m_axis_data_tdata
.m_axis_phase_tvalid(m_axis_phase_tvalid_1), // output wire m_axis_phase_tvalid
.m_axis_phase_tdata(m_axis_phase_tdata_1), // output wire [15 : 0] m_axis_phase_tdata
.event_pinc_invalid(event_pinc_invalid_1), // output wire event_pinc_invalid
.event_poff_invalid(event_poff_invalid_1) // output wire event_poff_invalid
);
dds_compiler_1 dds_2 (
.aclk(clk), // input wire aclk
.m_axis_data_tvalid(axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata_2), // output wire [15 : 0] m_axis_data_tdata
.m_axis_phase_tvalid(m_axis_phase_tvalid_2), // output wire m_axis_phase_tvalid
.m_axis_phase_tdata(m_axis_phase_tdata_2), // output wire [15 : 0] m_axis_phase_tdata
.event_pinc_invalid(event_pinc_invalid_2), // output wire event_pinc_invalid
.event_poff_invalid(event_poff_invalid_2) // output wire event_poff_invalid
);
wire axis_data_tready;
wire m_axis_data_tvalid_3;
fir_compiler_0 fir1 (
.aclk(clk), // input wire aclk
.s_axis_data_tvalid(axis_data_tvalid_f), // input wire s_axis_data_tvalid
.s_axis_data_tready(axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tdata(S), // input wire [15 : 0] s_axis_data_tdata
.m_axis_data_tvalid(m_axis_data_tvalid_3), // output wire m_axis_data_tvalid
.m_axis_data_tdata(fir_out) // output wire [39 : 0] m_axis_data_tdata
);
endmodule
module fir_tb(
);
reg clk;
reg axis_data_tvalid;
wire [15 : 0] m_axis_data_tdata_1;
wire [15 : 0] m_axis_data_tdata_2;
reg axis_data_tvalid_f;
wire [15:0]S;
wire [39:0]fir_out;
// fir_top u1(.clk(clk),.axis_data_tvalid(axis_data_tvalid),. m_axis_data_tdata_1(m_axis_data_tdata_1),.m_axis_data_tdata_2(m_axis_data_tdata_2));
fir_top u1(.clk(clk),.axis_data_tvalid(axis_data_tvalid),.S(S),.fir_out(fir_out),.axis_data_tvalid_f(axis_data_tvalid_f),. m_axis_data_tdata_1(m_axis_data_tdata_1),.m_axis_data_tdata_2(m_axis_data_tdata_2));
initial begin
clk<=1'b0;
axis_data_tvalid<=1'b1;
axis_data_tvalid_f<=1'b1;
end
always #5 clk<=~clk;
endmodule
这次用了4个IP核,dds0用来生成100kHz的信号,dds1生成200kHz信号,fir用来设置滤波参数,c_addsub_0是加法器用来进行信号累加。
加法器ip核配置:
dds ip核配置:
dds1把频率控制字改成2000的二进制数即可。
fir ip核设置
其余保持默认
仿真波形:
可见对200kHz和100kHz正弦波叠加后的信号S进行滤波,只剩下200kHz的信号,滤波成功。