Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog 为什么我的输出信号有2个时钟周期延迟?_Verilog - Fatal编程技术网

Verilog 为什么我的输出信号有2个时钟周期延迟?

Verilog 为什么我的输出信号有2个时钟周期延迟?,verilog,Verilog,对于32位向量中的每一位,在输入信号从一个时钟周期的1变为下一个时钟周期的0时进行捕获。“捕获”表示在寄存器复位(同步复位)之前,输出将保持为1。 每个输出位的行为类似于SR触发器:输出位应在发生1到0转换后的周期内设置(设置为1)。当复位为高电平时,输出位应在正时钟边缘复位(至0)。如果上述两个事件同时发生,则重置优先。在下面示例波形的最后4个周期中,“重置”事件比“设置”事件早一个周期发生,因此此处不存在冲突。 在下面的示例波形中,为清晰起见,再次分别显示复位、输入和输出 我的代码: mo

对于32位向量中的每一位,在输入信号从一个时钟周期的1变为下一个时钟周期的0时进行捕获。“捕获”表示在寄存器复位(同步复位)之前,输出将保持为1。 每个输出位的行为类似于SR触发器:输出位应在发生1到0转换后的周期内设置(设置为1)。当复位为高电平时,输出位应在正时钟边缘复位(至0)。如果上述两个事件同时发生,则重置优先。在下面示例波形的最后4个周期中,“重置”事件比“设置”事件早一个周期发生,因此此处不存在冲突。 在下面的示例波形中,为清晰起见,再次分别显示复位、输入和输出

我的代码:

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 del
    in\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