邊沿檢測電路--上升沿、下降沿、雙邊沿


邊沿檢測--針對輸入信號的跳變進而輸出判斷結果,上升沿、下降沿可以分別進行寄存器打拍,而后相與或者相或。當然針對與邊沿檢測,還有其他方法,例如通過移位寄存器,將輸入信號打入移位寄存器中,然后對移位寄存器中的信號進行相與、相或和異或。這里進行打拍處理。

針對上升沿分析:--當時鍾處於上升沿時,檢測輸入信號是否發生從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:

module down_decetor_tb;
reg clk;
reg rst;
reg d_in;
wire d_out;

down_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
  #10;
  d_in=1'b1;
  #10;
  d_in=1'b0;
  #10;
  d_in=1'b0;
  #10;
  d_in=1'b1;
  #10;
  d_in=1'b0;
  #20;
  d_in=1'b1;
  #10;
  d_in=1'b1;
  #10;
  d_in=1'b0;
  #30;
  d_in=1'b1;
  #50;
  $finish();
end
endmodule
 

 

 

雙邊沿檢測:

module double_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:
module down_decetor_tb;
reg clk;
reg rst;
reg d_in;
wire d_out;

double_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
  #10;
  d_in=1'b1;
  #20;
  d_in=1'b0;
  #10;
  d_in=1'b1;
  #10;
  d_in=1'b0;
  #10;
  d_in=1'b1;
  #10;
  d_in=1'b0;
  #20;
  d_in=1'b1;
  #10;
  d_in=1'b0;
  #30;
  d_in=1'b1;
  #50;
  $finish();
end
endmodule

 

 










免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM