目录
接续上篇,进行FIR 滤波器的板级验证调试。
FPGA设计平台:VIVADO IDE 2018.3 (WIN10 操作系统)
FPGA芯片型号:xc7a35tfgg484-2
MATLAB验证平台:MATLAB R2022a
将上篇所编写的 FIR 模块和 DDS 模块,封装至顶层。
- `timescale 1ns / 1ps
-
- // 备注:FIR 滤波器顶层
- // BY :Xu Y. B.
-
-
- module FIR_FILTER_TOP(
- // ---------------------------------输入
- input I_CLK_50M,//系统时钟 50M
- input I_RST, //系统复位信号 高有效
- // ---------------------------------输出
- output O_RES_VAL //由FPGA外部LED灯指示
- );
-
- // ---------------------------------内部信号
- // 时钟
- wire W_CLK_10M;
- wire W_CLK_20M;
- (*mark_debug = "true"*)wire W_LOCKED;
- // DDS
- (*mark_debug = "true"*)wire W_TRDY;
- (*mark_debug = "true"*)wire W_DATA_VAL;
- (*mark_debug = "true"*)wire [15:0] W_DATA;
- // FIR
- (*mark_debug = "true"*)wire [31:0] W_RES_DATA;
- (*mark_debug = "true"*)wire W_RES_VAL;
- reg R_OPR_EN; //运算使能信号 高有效
- reg [15:0] R_DATA;
- reg [15:0] RR_DATA;
- reg R_DATA_VAL;
- reg RR_DATA_VAL;
-
- // ---------------------------------实现
- // ----时钟域跨越处理(此部分也可以在模块内部实现)
- // 20——>10M
- always @ (posedge W_CLK_10M)
- begin
- if(W_LOCKED == 1'b0)
- begin
- R_DATA <= 0;
- RR_DATA <= 0;
-
- R_DATA_VAL <= 0;
- RR_DATA_VAL <= 0;
- end
- else
- begin
- R_DATA <= W_DATA;
- RR_DATA <= R_DATA;
-
- R_DATA_VAL <= W_DATA_VAL;
- RR_DATA_VAL <= R_DATA_VAL;
- end
- end
- // 10——>20M
- // 此处的时钟跨越安全
-
- // 系统复位后 1个 CLK延迟 拉高运算使能
- always @ (posedge W_CLK_10M)
- begin
- if(W_LOCKED == 1'b0)
- begin
- R_OPR_EN <= 0;
- end
- else
- begin
- R_OPR_EN <= 1;
- end
- end
-
- // 结果
-
- assign O_RES_VAL = W_RES_VAL;
-
-
- // ---------------------------------例化模块
-
- // MMCM
- MMCM_IP MMCM_INST
- (
- // Clock out ports
- .CLK_10M(W_CLK_10M), // output CLK_10M
- .CLK_20M(W_CLK_20M), // output CLK_20M
- // Status and control signals
- .reset(I_RST), // input reset
- .locked(W_LOCKED), // output locked
- // Clock in ports
- .clk_in1(I_CLK_50M)); // input clk_in1
-
- // DDS
- DDS_IP_WRAP #(
- .P_OUT_WIDTH(16)
- ) inst_DDS_IP_WRAP (
- .I_CLK (W_CLK_20M),
- .I_RSTN (W_LOCKED),
- .I_TRDY (W_TRDY),
- .O_DATA (W_DATA),
- .O_VAL (W_DATA_VAL)
- );
-
-
- // FIR
- DIRECT_FIR #(
- .P_FILTER_LEN(32),
- .P_FILTER_WIDTH(16),
- .P_DATA_IN_WIDTH(16),
- .P_DATA_OUT_WIDTH(32)
- ) inst_DIRECT_FIR (
- .I_CLK (W_CLK_10M),
- .I_RSTN (W_LOCKED),
- .I_OPR_EN (R_OPR_EN),
- .I_DATA_VAL (RR_DATA_VAL),
- .I_DATA (RR_DATA),
- .O_RES_VAL (W_RES_VAL),
- .O_RES_DATA (W_RES_DATA),
- .O_TRDY (W_TRDY)
- );
-
-
- endmodule
编写 testbench :
- `timescale 1ns / 1ps
- // 备注:顶层文件测试
- // BY: 在路上,正出发
-
-
- module TB_TOP();
- // ---------------------------------输入
- reg I_CLK_50M;//系统时钟 50M
- reg I_RST; //系统复位信号 高有效
- // ---------------------------------输出
- wire O_RES_VAL;
-
-
-
- // 时钟
- `define CLK_PERIOD 20
- initial I_CLK_50M = 0;
- always #(`CLK_PERIOD/2) I_CLK_50M = ~I_CLK_50M;
-
- // 控制信号
- initial
- begin
- I_RST = 1;
- #(`CLK_PERIOD * 10 +1);
- I_RST = 0;
- end
-
-
- // 例化
- FIR_FILTER_TOP inst_FIR_FILTER_TOP
- (
- .I_CLK_50M (I_CLK_50M),
- .I_RST (I_RST),
- .O_RES_VAL (O_RES_VAL)
- );
-
- endmodule
仿真波形 :

对设计文件进行约束、综合、实现、生成比特流后下载验证。
对引脚进行约束:

综合实现情况:

上板测试:

有问题可以留言交流~