2017-02-28 35 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我保證你不會得到閂鎖。如果這是組合邏輯,你會很擔心。如果在組合邏輯中沒有_完成賦值_那麼可能會出現輸出保持其值的情況,這需要某種類型的存儲器才能在硬件中實現,這就是爲什麼您的合成器會推斷鎖存器。但是你的代碼是順序邏輯。順序邏輯具有存儲 - 觸發器 - 因此完全分配並不是必需的,合成器推斷存儲(觸發器不是鎖存器)正是應該發生的事情。 –

相關問題