HDLBits总结——边缘检测verilog模块
1.上升(下降)沿检测
module edge_detect (
input clk,
input [7:0] in,
output [7:0] pedge
);
reg [7:0] in_reg
//将本次输入电平保存至in_reg
always@(posedge clk)begin
in_reg <= in;
end
//将本次输入电平和前一次的保存电平in_reg的反进行与操作,探测0 to 1的上升沿
always@(posedge clk)begin
pedge <= in&~in_reg;
end
//将本次输入电平的反和前一次的保存电平in_reg进行与操作,探测1 to 0的下降沿
//always@(posedge clk)begin
// pedge <= in&~in_reg;
//end
endmodule
2.双边沿检测
module top_module (
input clk,
input [7:0] in,
output [7:0] anyedge
);
reg [7:0] in_reg;
#将本次输入电平保存至in_reg
always@(posedge clk)begin
in_reg <= in;
end
#将本次输入电平和前一次的保存电平in_reg的进行异或操作,探测上升沿或下降沿
always@(posedge clk)begin
anyedge <= in^in_reg;
end
endmodule
3.上升(下降)沿捕获锁存
探测输入信号每一位的下降沿,若其中部分位有下降沿,则下一周期输出对应位高电平并锁存,直到复位信号reset到来才复位为0。
注意:下降沿捕获均为按位操作,其中一位下降沿只影响对应位的输出,其他位不受影响。
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg [31:0] in_reg;
always@(posedge clk)begin
in_reg <= in;
end
always@(posedge clk)begin
if(reset)
out <= 32'b0;
else
out <= ~in&in_reg | out; //锁存下降沿或保持原始输出
//out <= in&~in_reg | out; 则可以上升沿锁存或保持原始输出
end
endmodule
4.clk双边沿触发
module top_module (
input clk,
input d,
output q
);
reg q_d1;
reg q_d2;
always@(posedge clk)begin
q_d1 <= d ^ q_d2;
end
always@(negedge clk)begin
q_d2 <= d ^ q_d1;
end
assign q = q_d1 ^ q_d2;
endmodule
当posedge clk触发时:
q_d1 变为 d ^ q_d2。因此 q = q_d1 ^ q_d2 = d ^ q_d2 ^ q_d2 = d。
当negedge clk触发时:
q_d2 变为 d ^ q_d1。因此 q = q_d1 ^ q_d2 = q_d1 ^ d ^ q_d1 = d。