我想检测信号的上升沿从触发器AA
到BB
+----+
A ----------------| |----- OUT
+----+ | BB |
B ----| |------|> |
| AA | +----+
clk ----|> |
+----+
Verilog代码:
module edge_detect (
input A,
input B,
input clk,
output OUT
);
reg AA;
reg BB;
always @(posedge clk) begin
AA <= B;
end
always @(posedge AA)begin
BB <= A;
end
assign OUT = BB;
endmodule
AA
的输出用作BB
的时钟,表示AA
已完成其工作,然后BB
现在可以继续其操作。
我很少看到这段代码。这是一个好习惯吗?
如果没有,是否还有其他正确方法来检测信号的边缘?
答案 0 :(得分:7)
由于各种原因,人们往往不愿意将数据用作时钟。
就个人而言,如果我写这篇文章,我会选择:
module edge_detect (
input A,
input B,
input clk,
output OUT
);
reg AA;
reg BB;
wire enA;
always @(posedge clk) begin
BB <= B;
end
assign enA = !BB && B;
always @(posedge clk)begin
if (enA) begin
AA <= A;
end
end
assign OUT = AA;
endmodule
+----+
A ----------------------------|D |----- OUT
+---+ | AA |
/--------------| | | |
| +----+ |AND|------|E |
B ----| |------o| | | |
| BB | +---+ | |
clk ----|> | clk ----|> |
+----+ +----+
但行为有点不同。
答案 1 :(得分:0)
如果要在Verilog中检测上升沿或下降沿,只需将信号流水线或延迟1个时钟脉冲即可。在数字环境中,可以将边缘视为0到1的过渡或1到0的过渡。 因此,您可以检查信号是否过渡到任一状态,然后仅针对该条件将输出置为高电平。
例如:
output out_flag;
reg temp;
reg temp_d;
always@(posedge clk)
temp_d <= temp;
always@(posedge clk)
begin
if (temp && ~temp_d)
out_flag<= 1'b1;
else
out_flag<= 1'b0;
end