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 学习的参考,也可根据实际需求进行修改和使用。

Verilog 低通滤波器模块设计与实现

原文地址: https://www.cveoy.top/t/topic/cBeZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录