沿检测技术大家并不陌生,也在运用。举一个简单的例子,CPLD助学小组里的一个按键消抖程序就用到了下降沿检测技术。但是这里我并不想多说下降沿和上升沿的检测,这里我想从理论上推到双沿的检测,同时也给出上升沿和下降沿检测的代码。
1、上升沿检测
always @ (posedge clk or negedge)
begin
if(rst_n == 1'b0)
begin
r1 <= 1'b0 ;
r2 <= 1'b0 ;
end
else
begin
r1 <= data_in ;
r2 <= r1 ;
end
end
assign r3 = r1 & (~r2);
2、下降沿检测
always @ (posedge clk or negedge)
begin
if(rst_n == 1'b0)
begin
r1 <= 1'b0;
r2 <= 1'b0;
end
else
begin
r1 <= data_in ;
r2 <= r1 ;
end
end
assign r3 = ~r1 & r2;
3、双沿检测
顾名思义,既可以检测下降沿又可以检测上升沿,那么双沿检测应该是上升沿检测和下降沿检测的一个并集,用数字电路的表达式应该是或“|”,所以双沿检测的表达式为:
r3 = (~r1 & r2) | (r1 & ~r2)
用真值表对上面的表达式化简吧:
r1 r2 r3
0 0 0
0 1 1
1 0 1
1 1 0
很明显r1 和 r2是异或的关系,所以双检测的程序如下:
always @ (posedge clk or negedge)
begin
if(rst_n == 1'b0)
begin
r1 <= 1'b0 ;
r2 <= 1'b0 ;
end
else
begin
r1 <= data_in ;
r2 <= r1 ;
end
end
assign r3 = r1 ^ r2;
欢迎大家批评指正!
ash_riple_768180695 2010-2-12 06:45