Verilog 为什么我的输出信号有2个时钟周期延迟?
对于32位向量中的每一位,在输入信号从一个时钟周期的1变为下一个时钟周期的0时进行捕获。“捕获”表示在寄存器复位(同步复位)之前,输出将保持为1。 每个输出位的行为类似于SR触发器:输出位应在发生1到0转换后的周期内设置(设置为1)。当复位为高电平时,输出位应在正时钟边缘复位(至0)。如果上述两个事件同时发生,则重置优先。在下面示例波形的最后4个周期中,“重置”事件比“设置”事件早一个周期发生,因此此处不存在冲突。 在下面的示例波形中,为清晰起见,再次分别显示复位、输入和输出 我的代码:Verilog 为什么我的输出信号有2个时钟周期延迟?,verilog,Verilog,对于32位向量中的每一位,在输入信号从一个时钟周期的1变为下一个时钟周期的0时进行捕获。“捕获”表示在寄存器复位(同步复位)之前,输出将保持为1。 每个输出位的行为类似于SR触发器:输出位应在发生1到0转换后的周期内设置(设置为1)。当复位为高电平时,输出位应在正时钟边缘复位(至0)。如果上述两个事件同时发生,则重置优先。在下面示例波形的最后4个周期中,“重置”事件比“设置”事件早一个周期发生,因此此处不存在冲突。 在下面的示例波形中,为清晰起见,再次分别显示复位、输入和输出 我的代码: mo
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out );
integer i;
reg [31:0] in_del;
reg [31:0] out_del;
always @ (posedge clk)
begin
in_del<=in;
out_del<=~in & in_del;
if (reset)
out=0;
else
begin
for (i=0; i<32;i=i+1) begin
if (out_del[i])
out[i]=out_del[i];
end
end
end
endmodule
模块顶部\u模块(
输入时钟,
输入复位,
在中输入[31:0],
输出[31:0]输出);
整数i;
reg[31:0]在_del;
reg[31:0]输出数据;
始终@(posedge clk)
开始
在_del中,首先介绍您的代码
它不能被编译。out
必须是reg
才能在始终块内分配
在out\u delin\u del
和out\u del
中使用非阻塞分配是在始终@posedge
块中分配给的寄存器,因此它们将分别遇到一个时钟周期的延迟。您可以考虑使用阻塞赋值语句<代码> OutoDele= ~In和InDele,并且您可能意识到该代码不能合成,包含语义错误(不能编译),并且违反了使用阻塞/非阻塞赋值的行业实践吗?它的目的是什么?
module top_module (
input clk,
input reset,
input [31:0] in,
output reg [31:0] out );
reg lock;
always @ (posedge clk)
begin
if (reset) begin
lock <= 0;
out <= 0;
end
else if (lock == 0)
begin
out <= in;
lock <= 1;
end
end
endmodule
module real_top();
reg clk, reset;
reg [31:0] in;
reg [31:0] out;
top_module tm(clk, reset, in, out);
initial begin
clk = 0;
forever #5 clk = ~clk;
end
integer i;
initial begin
in = 0;
reset = 1;
#7 reset = 0;
for (i = 1; i < 5; i++) begin
#10 in = i;
#10 reset = 1;
#10 reset = 0;
end
$finish;
end
initial
$monitor(clk, reset, in, out);
endmodule