2014-03-31 78 views
0
always @(state) 
    begin 
      case (state) 
       zero: 
        rowcounter = 1'b0; 
       one: 
        rowcounter = 1'b0; 
       two: 
        rowcounter = rowcounter + 1'b0; 
       three: 
        rowcounter = rowcounter + 1'b1; 
       default: 
        rowcounter = 1'b0; 
      endcase 
    end 

基本上,當狀態= 2,我希望「rowcounter」保持其當前值,而如果狀態= 3,我想要「rowcounter」遞增。去除的Verilog推斷鎖存器(遞增寄存器)

我在合成上述代碼時遇到問題,它說有推斷鎖存器。我追蹤了鎖存器,當狀態爲'2'或'3'時,它們就位於此處。儘管我已經設置「rowcounter」的初始值爲零像下面

initial 
begin 
rowcounter <= 1'b0; 
end 

它仍然推斷鎖..替代品有哪些去除鎖?

回答

3

組合塊(always @*)會推斷鎖存器是否保持狀態。組合邏輯的輸出通常由當前輸入完全定義。

僅限數字邏輯鎖存器觸發器可以保持狀態。既然你沒有定義一個觸發器,你有一個鎖存器。

使用always @(posedge clk)推斷人字拖,你還應該使用非阻塞作業<=

always @(posedge clk) begin 
    case (state) 
    zero: rowcounter <= 1'b0; 
    one: rowcounter <= 1'b0; 
    two: rowcounter <= rowcounter + 1'b0; 
    three: rowcounter <= rowcounter + 1'b1; 
    default: rowcounter <= 1'b0; 
    endcase 
end 
+0

不幸的是,我嘗試按照這個(第一總是塊),http://www.altera.com/support/examples/verilog/ver_statem.html ..我不能代替@(狀態)@( posedge clk) – WantIt

+1

你**有**使用鎖存器或觸發器來維持狀態。 – Morgan