FPGA边沿检测及亚稳态的消除
一、FPGA边沿检测的实现
边沿检测主要包括上升沿和下降沿的检测
1.原理
上升沿是指从低到高的电平转变,而下降沿是指从高到低的电平转变
上升沿 下降沿
那么如何判定上升沿和下降沿呢?
上升沿不就是前一个时刻为低电平,这时刻为高电平不就是了,下降沿则刚好相反。
答对了,那么前一时刻怎么实现呢?
学过数字电路就知道了,寄存器可以存储前一个的值,前一时刻和这一时刻加起来可以极性判定了。
2.实现
- 寄存器1
reg data_r1;
reg data_r0;
wire data_pos; //上升沿检测
always @ (posedge clk)
begin
if (rst == 1'b1)
begin
data_r0 <= 1'b0;
data_r1 <= 1'b0;
end
else
begin
data_r0 <= data;
data_r1 <= data_r0;
end
end
assign data_pos = (~data_r1) & data_r0;
- 寄存器2
reg [1:0] data_r;
wire data_pos;
always @ (posedge clk)
begin
if (rst == 1'b1)
data_r <= 'd0;
else
data_r <= {data_r[0], data};
end
assign data_pos = ~data_r[1] & data_r[0]; //data_r == 2'b01;
二、FPGA亚稳态的消除
1.原理
由于时序的不一致,导致输出的数据不统一,存在问题,这里采用延时打拍的方式进行解决。一般来说,打两拍可以解决大多数的问题。
2.实现
reg [1:0] data_r;
always @ (posedge clk)
begin
data_r <= {data_r[0], data};
end