Verilog 低通滤波器模块设计与实现
module LF_fir_ip(
input s_rst_n,
input [23:0] data,
input fir_sample_clk,
input fir_en,
output fir_ast_sink_ready,
output [33:0] fir_ast_source_data,
output fir_ast_source_valid
);
parameter IDLE=3'b001;
parameter WAIT=3'b010;
parameter DATA_TRANS=3'b100;
wire [33:0] w_fir_ast_source_data;
reg fir_reset_n;
reg fir_ast_sink_valid;
reg [23:0] fir_ast_sink_data; //输入数据寄存,位宽同输入数据位宽
reg [2:0] fir_state; //状态机状态寄存
reg [2:0] rst_cnt; //滤波器软件复位周期设定
//状态转换
always@(posedge fir_sample_clk or negedge s_rst_n)begin
if(s_rst_n==0)
fir_state<=3'b001;
else case(fir_state)
IDLE:if(fir_en==1)
fir_state<=WAIT;
else
fir_state<=IDLE;
WAIT:if(rst_cnt<3'd2)
fir_state<=WAIT;
else
fir_state<=DATA_TRANS;
DATA_TRANS:if(fir_en==0)
fir_state<=IDLE;
default:fir_state<=IDLE;
endcase
end
//滤波器在 使能清除/系统复位 后自动软件复位
always@(negedge fir_sample_clk or negedge s_rst_n)begin
if(s_rst_n==0)
rst_cnt<=3'd0;
else if(fir_en==0)
rst_cnt<=3'd0;
else if(fir_state==WAIT)
rst_cnt<=rst_cnt+1'b1;
else
rst_cnt<=rst_cnt;
end
always@(negedge fir_sample_clk or negedge s_rst_n)begin
if(s_rst_n==0)
fir_reset_n<=1'b0;
else if(fir_state==WAIT)
fir_reset_n<=1'b0;
else
fir_reset_n<=1'b1;
end
//数据传输使能
always@(posedge fir_sample_clk or negedge s_rst_n)begin
if(s_rst_n==0)
fir_ast_sink_valid<=1'b0;
else if(fir_state==DATA_TRANS)begin
if(fir_en==1)
fir_ast_sink_valid<=1'b1;
else
fir_ast_sink_valid<=1'b0;
end
else
fir_ast_sink_valid<=fir_ast_sink_valid;
end
//输入数据寄存
always@(negedge fir_sample_clk or negedge s_rst_n)begin
if(s_rst_n==0)
fir_ast_sink_data<=0;
else begin
if(fir_ast_sink_valid==1'b1)
fir_ast_sink_data<=data;
else
fir_ast_sink_data<=0;
end
end
//加一次数据时钟下降沿寄存,匹配后端时序
reg[33:0] r_fir_ast_source_data;
always @(negedge fir_sample_clk or negedge s_rst_n)begin
if(!s_rst_n)
r_fir_ast_source_data<='b0;
else
r_fir_ast_source_data<=w_fir_ast_source_data;
end
assign fir_ast_source_data=r_fir_ast_source_data;
fir_LF fir_ip_LF(
.clk(fir_sample_clk),//输入时钟
.reset_n(fir_reset_n),//输入,低电平复位
.ast_sink_data(fir_ast_sink_data),//输入,采样输入数据
.ast_sink_valid(fir_ast_sink_valid),//输入,置1时fir输入端数据有效
.ast_source_ready(1'b1),//输入,表示源准备好
.ast_sink_error(2'b00),//输入,标识信宿端出现的错误
.ast_source_data(w_fir_ast_source_data),//输出,滤波器数据输出
.ast_sink_ready(fir_ast_sink_ready),//输出,置1表示fir可以接收数据
.ast_source_valid(fir_ast_source_valid),//输出,置1表示输出数据有效
.ast_source_error()//输出,标识信源端出现的错误
);
endmodule
Verilog 低通滤波器模块解析
该 Verilog 代码实现了一个名为 LF_fir_ip 的低通滤波器模块,其功能是接收输入数据,进行低通滤波处理后输出。
模块接口
module LF_fir_ip(
input s_rst_n,
input [23:0] data,
input fir_sample_clk,
input fir_en,
output fir_ast_sink_ready,
output [33:0] fir_ast_source_data,
output fir_ast_source_valid
);
- 输入信号:
s_rst_n: 低电平有效复位信号。data: 24 位输入数据。fir_sample_clk: 采样时钟信号。fir_en: 滤波器使能信号。
- 输出信号:
fir_ast_sink_ready: 滤波器准备好接收数据信号。fir_ast_source_data: 34 位滤波后的输出数据。fir_ast_source_valid: 滤波后的输出数据有效信号。
状态机设计
该模块使用一个三状态状态机控制数据处理流程,分别为:
IDLE: 空闲状态,等待使能信号fir_en拉高。WAIT: 等待状态,进行软件复位操作。DATA_TRANS: 数据传输状态,接收输入数据并进行滤波处理。
数据传输逻辑
- 当状态机处于
DATA_TRANS状态且fir_en信号有效时,输入数据data被写入fir_ast_sink_data寄存器。 fir_ast_sink_valid信号用于指示fir_ast_sink_data数据有效。- 滤波后的数据
w_fir_ast_source_data在时钟下降沿被锁存到r_fir_ast_source_data寄存器,以匹配后端时序。
滤波器实例化
该模块实例化了一个名为 fir_LF 的低通滤波器 IP 核,并连接了相应的输入输出信号。
总结
该 Verilog 代码实现了一个完整的低通滤波器模块,包含了模块接口定义、状态机控制、数据传输逻辑以及滤波器 IP 核的实例化等关键部分。该代码可作为 Verilog 学习的参考,也可根据实际需求进行修改和使用。
原文地址: https://www.cveoy.top/t/topic/cBeZ 著作权归作者所有。请勿转载和采集!