e19*_*001 6 synchronization verilog
我想检测一个来自触发器的信号的上升沿AA到BB
+----+
A ----------------| |----- OUT
+----+ | BB |
B ----| |------|> |
| AA | +----+
clk ----|> |
+----+
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
输出AA用作BB表示AA已完成其工作的时钟,然后BB可以继续其操作.
我很少看到这段代码.这是一个好习惯吗?
如果没有,有没有其他正确的方法来检测信号的边缘?
由于各种原因,人们往往不愿意将数据用作时钟.
就个人而言,如果我写这篇文章,我会选择:
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 ----|> |
+----+ +----+
Run Code Online (Sandbox Code Playgroud)
但行为有点不同.