Synchronization Verilog中信号边缘检测的正确方法
我想检测从触发器Synchronization Verilog中信号边缘检测的正确方法,synchronization,verilog,Synchronization,Verilog,我想检测从触发器AA到BB的信号的上升沿 +----+ A ----------------| |----- OUT +----+ | BB | B ----| |------|> | | AA | +----+ clk ----|> | +----+ Verilog代码: module edge_detect ( inpu
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
模块边缘检测(
输入A,
输入B,
输入时钟,
输出
);
条例AA;
注册BB;
始终@(posedge clk)开始
由于各种原因,人们往往不赞成使用数据作为时钟
就我个人而言,如果我写这篇文章,我会:
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 ----|> |
+----+ +----+
模块边缘检测(
输入A,
输入B,
输入时钟,
输出
);
条例AA;
注册BB;
金属丝;
始终@(posedge clk)开始
BB|
+----+ +----+
不过,这种行为有点不同。如果您想在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
output out\u标志;
注册温度;
注册临时工;
始终@(posedge clk)
温度enA=非BB&B代码>相当于enA=!BB&B
和if(enA){…}
相当于if(enA)begin。。。在verilog中结束
。不管怎样,你能说明它的优点吗?谢谢您的快速回答。=)是的,当写入编辑器时,我得到了VHDL/Verilog。主要的优点是你不必处理派生时钟,这可能会导致合成和布局程序的麻烦。时钟往往被各种工具以一种特殊的方式处理,因此大多数时候不鼓励将逻辑整合到时钟生成中。这些工具有时被称为“一次性”或单稳态多谐振荡器。