邊沿檢測--針對輸入信號的跳變進而輸出判斷結果,上升沿、下降沿可以分別進行寄存器打拍,而后相與或者相或。當然針對與邊沿檢測,還有其他方法,例如通過移位寄存器,將輸入信號打入移位寄存器中,然后對移位寄存器中的信號進行相與、相或和異或。這里進行打拍處理。
針對上升沿分析:--當時鍾處於上升沿時,檢測輸入信號是否發生從0到1的跳變。正確理解其中的邏輯就很簡單了。
上升沿檢測:
module up_decetor(clk,rst,d_in,d_out);
input clk;
input rst;
input d_in;
output d_out;
reg d_out_1,d_out_2;
always@(posedge clk or negedge rst) begin
if(!rst) begin //通過寄存器保存前一個數據,使后一個數據與前一個數據進行比較
d_out_1 <= 1'b0;
d_out_2 <= 1'b0;
end
else begin
d_out_1 <= d_in;
d_out_2 <= d_out_1;
end
end
assign d_out = (~d_out_2)&d_out_1; //取反相與
endmodule
tb:
module up_decetor_tb;
reg clk;
reg rst;
reg d_in;
wire d_out;
up_decetor u1(
.clk(clk),
.rst(rst),
.d_in(d_in),
.d_out(d_out)
);
initial begin
clk=1'b1;
rst=1'b0;
#5;
rst=1'b1;
end
always #5 clk = ~clk;
/*initial begin
$vcdpluson;
end*/
initial begin
repeat(40) begin
#10;
d_in = {$random}%2;
end
end
endmodule
下降沿檢測
module down_decetor(clk,rst,d_in,d_out);
input clk;
input rst;
input d_in;
output d_out;
reg d_out_1,d_out_2;
always@(posedge clk or negedge rst) begin
if(!rst) begin
d_out_1 <= 1'b0;
d_out_2 <= 1'b0;
end
else begin
d_out_1 <= d_in;
d_out_2 <= d_out_1;
end
end
assign d_out = (~d_out_1)&d_out_2; //
endmodule
tb:

雙邊沿檢測:
