Verilog-消除复位毛刺(全志科技)

原题

题目理解

该题目有2个要求,首先是要对输入的rstn_i进行过滤,小于等于32个时钟周期的当作“不正常”复位请求;另外,正常复位请求撤销后,也就是有效的rstn_i恢复高电平后,rstn_o能够在2个时钟周期后恢复高电平。

代码思路

1、外围rstn_i作为异步信号,需要进行打2拍处理,缓解亚稳态;由于此处已经对rstn_i打了2拍,按照题目要求,正常复位撤销后,rstn_o能够在2个时钟周期后恢复高电平,因此rstn_o由低到高的跳变与rstn_reg2必须一致,assign rstn_o = (count==6'd32 && rstn_reg2==1'b0)? 1'b0 : 1'b1; 的判断条件有rstn_reg2==1'b0, 不加这个的话rstn_o在正常复位撤销后需要3个时钟周期后才能恢复高电平
2、设置一个计数器对打拍后的rstn_reg2进行统计,只要检测到高电平,计数清零,否则计数加1,直到32

代码

`timescale 1ns / 1ps

module rstn_allwinner(
	input clk,
	input rstn_i,
	
	output rstn_o
    );
	 
reg rstn_reg1,rstn_reg2;
reg [5:0] count;

always @(posedge clk) begin
	{rstn_reg1,rstn_reg2} <= {rstn_i,rstn_reg1};
end

always @(posedge clk) begin
	if(rstn_reg2) count <= 6'd0;
	else begin
		if(count == 6'd32) count <= count;
		else count <= count + 1'b1;
	end
end 

assign rstn_o = (count==6'd32 && rstn_reg2==1'b0)? 1'b0 : 1'b1;

endmodule

仿真波形

1、rstn_i持续31个周期,rstn_o无复位动作

2、rstn_i持续32个周期,rstn_o仍无复位动作

3、rstn_i持续33个周期,rstn_o产生复位动作

原文地址:https://www.cnblogs.com/wt-seu/p/13430052.html