2017-02-28 34 views
2

现在我打算按照下面的方式实现时钟门控。 但我不明白为什么以及如何处理De信号?我是否需要在顺序总是块中的else语句?

module ClockGating( 


      input wire rst_n, 
      input wire clk, 
      input wire De, 
      input wire InReg, 

      output reg OutReg 

    ); 

    always @(posedge clk or negedge rst_n) 
    begin 
    if (!rst_n) begin 
      OutReg <= 0; 
    end 
    else begin 
     if (De) begin 
       OutReg <= InReg; 
      end 
     else 
       OutReg <= OutReg; 
    end 
    end 

endmodule 

但我想知道如果我没有使用else语句那么会发生什么? 我可以使用没有else语句吗?

module ClockGating( 


      input wire rst_n, 
      input wire clk, 
      input wire De, 
      input wire InReg, 

      output reg OutReg 

    ); 

    always @(posedge clk or negedge rst_n) 
    begin 
    if (!rst_n) begin 
      OutReg <= 0; 
    end 
    else begin 
     if (De) begin 
       OutReg <= InReg; 
      end 
     end 

endmodule 
+0

这是我的学生经常遇到的问题。 –

+0

是的,您可以删除'else'语句,并且'OutReg'将保留它的值,因为它是一个'reg' –

回答

1

是的,你可以不else使用(因为它会表现相同与else版本)。是的,你应该使用没有else(因为否则你看起来像一个业余爱好者,没人愿意!)

OutReg是一个reg。 Verilog中的reg就像任何软件语言中的变量;它的价值将是分配给它的最后价值。在您的电路中,如果De不是1'b1,则不希望更改OutReg的值,因此在这种情况下不需要为OutReg分配任何新值。因此,你不需要else

+0

但是我担心在合成之后它将保持锁存状态。据我所知,我们必须摆脱锁定。 – grander3

+0

@ grander3我保证你不会得到闩锁。如果这是组合逻辑,你会很担心。如果在组合逻辑中没有_完成赋值_那么可能会出现输出保持其值的情况,这需要某种类型的存储器才能在硬件中实现,这就是为什么您的合成器会推断锁存器。但是你的代码是顺序逻辑。顺序逻辑具有存储 - 触发器 - 因此完全分配并不是必需的,合成器推断存储(触发器不是锁存器)正是应该发生的事情。 –

相关问题