一、基本类型
边沿检测的类型包括上升沿检测,下降沿检测,以及对上升沿和下降沿都进行检测。
二、设计思路
边沿检测功能简单,信号也不复杂,因此可以用真值表加卡诺图化简的方法进行设计。
上一拍(a) | 当前拍 (b) | 上升沿输出值(f1) | 下降沿输出值(f2) | 边沿输出值(f3) |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 1 |
图2-1 边沿检测卡诺图化简
三、veriog设计
module edgedetect(
input clk,
input rst_n,
input data_in,
output posedge_detect,
output negedge_detect,
output edge_detect);
/* 写法1
reg a,b;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
a <= 1'b0;
else
a <= data_in;
end
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
b <= 1'b0;
else
b <= a;
end
assign posedge_detect = ~a & b;
assign negedge_detect = a & ~b;
assign edge_detect = a ^ b;
*/
//写法2
reg [1:0] D;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
D <= 2'b0;
else
D <= {D0, data_in};
end
assign posedge_detect = ~DO & D1;
assign negedge_detect = D0 & ~D1;
assign edge_detect = D0 ^ D1;
endmodule
上述写法1中用到了两个1位寄存器,写法2中用到了个两位的寄存器,两者用到的寄存器资源相同。此外还有一种只用1个寄存器的方法,就是将数据只打一拍,将打拍过的值与新传来的值进行同样的逻辑操作,便可得到只用1个寄存器资源的边沿检测电路。