接口界面主要对相关的指示信号进行设置,这里可暂时保持默认,实际应用时可根据需要进行使能相关信号。
总结界面对前面的相关设置进行了小结展示,方便用户进行检查核对并修改错误设置的参数。
同时在左侧栏中可以看到滤波器的频率响应,以及该IP设置的相关资源使用情况,以便于在实际工程应用中对数据链路的信号进行操作处理,以及对资源的合理分配。
修改DDS IP
之前进行混频设计时,使用了DDS的IP输出三路信号分别为10MHz,3MHz和4MHz。这里为了减少一路输出,设置两路的信号输出,匹配FIR的ip采样频率的50MHz。或者这里采用频率直接修改为33.33MHz也可以。
修改顶层文件
修改了DDS ip后,要对逻辑进行调整使得可根据m_axis_data_tuser信号输出3M和4M的信号。并在顶层模块中调用例化FIR的IP,将混频后的数据接入到FIR的输入数据端,将DDS的data_tvalid接到FIR ip的tvalid端口,tready可悬空。因为仿真设计的是100MHz时钟,而FIR ip需要的是50MHz所以用寄存器生成一个二分频时钟接入到FIR ip的时钟端口。
module top( input clk ); // wire m_axis_data_tvalid_ch1; // wire [7:0] m_axis_data_tdata_ch1; // //单通道测试 // dds_compiler_0 ch1_dds( // .aclk(clk), // input wire aclk // .m_axis_data_tvalid(m_axis_data_tvalid_ch1), // output wire m_axis_data_tvalid // .m_axis_data_tdata(m_axis_data_tdata_ch1) // output wire [7 : 0] m_axis_data_tdata // ); wire m_axis_data_tvalid_ch3; wire [7 : 0] m_axis_data_tdata_ch3; wire [0 : 0] m_axis_data_tuser_ch3; // wire m_axis_phase_tvalid_ch3; // wire [31 : 0] m_axis_phase_tdata_ch3; // wire [1 : 0] m_axis_phase_tuser_ch3; //多通道测试 dds_compiler_1 multi_ch_dds( .aclk(clk), // input wire aclk .m_axis_data_tvalid (m_axis_data_tvalid_ch3), // output wire m_axis_data_tvalid .m_axis_data_tdata (m_axis_data_tdata_ch3), // output wire [7 : 0] m_axis_data_tdata .m_axis_data_tuser (m_axis_data_tuser_ch3), // output wire [1 : 0] m_axis_data_tuser .m_axis_phase_tvalid(), // output wire m_axis_phase_tvalid .m_axis_phase_tdata (), // output wire [31 : 0] m_axis_phase_tdata .m_axis_phase_tuser () // output wire [1 : 0] m_axis_phase_tuser ); reg [7 : 0] data10MHz; reg [7 : 0] data3MHz; reg [7 : 0] data4MHz; always @(posedge clk) begin case(m_axis_data_tuser_ch3) 0:data3MHz<=m_axis_data_tdata_ch3; 1:data4MHz<=m_axis_data_tdata_ch3; endcase end //混频测试 wire [15 : 0] mixer_singal; mult_gen_0 mult_mixer ( .CLK(clk), // input wire CLK .A(data3MHz), // input wire [7 : 0] A .B(data4MHz), // input wire [7 : 0] B .P(mixer_singal) // output wire [15 : 0] P ); wire [39:0] after_fir_singal; reg div_clk=0; always @(posedge clk ) begin div_clk<=!div_clk; end fir_compiler_0 uut_fir( .aclk(div_clk), // input wire aclk .s_axis_data_tvalid(m_axis_data_tvalid_ch3), // input wire s_axis_data_tvalid .s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready .s_axis_data_tdata(mixer_singal), // input wire [15 : 0] s_axis_data_tdata .m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid .m_axis_data_tdata(after_fir_singal) // output wire [39 : 0] m_axis_data_tdata ); endmodule
运行仿真测试
点击运行行为级仿真,添加信号波形,并修改信号的进制(进制可选择有符号十进制)和类型(选择模拟类型),可观察到下面的情况。
从截图中可看出,混频后的信号经过了滤波处理消除了高频分量,添加游标可观察滤波后的信号的频率。添加游标后观察发现滤波后的信号为混频信号的1Mhz的信号。因此,工程设计中的低通滤波很好地滤除掉了7MHz的高频分量。
小结思考
在使用FIR滤波器中的实际设计的数字滤波器效果可能会因设置的不同而效果不同。因此,在实际使用时要关注一下方面确保滤波器的效果能达到预期。
- 在滤波器工具使用时应考虑不同类型的滤波器的实际效果,可经过对比选择性能较优异,阶数少,且滤波效果能达到使用预期的类型,例如在使用FIR滤波器时,同样阶数的不同类型窗的滤波效果可能对特定信号的滤波效果不同。
- 该工程仅仅验证了FIR滤波器的基本功能,在实际使用时特别是遇到实时处理的情况需谨慎考虑滤波器的并行度,确保在规定的处理时间内能完成相关信号处理操作,且要关注数据链路的数据位宽,确保在实际应用做切片处理时不会损失精度,或造成数据溢出。