2015-06-18 158 views
-1

我想將值保存在任意時鐘週期的寄存器中。基本上,我想這樣做類似的像一個狀態機的處理:Verilog:將值保存在寄存器中(分配給相同的寄存器)

[email protected] (posedge Clock) begin 
if (Reset) CurrentState <= STATE_Initial ; 
else CurrentState <= NextState ; 
end 

[email protected] (*) begin 
NextState = CurrentState ; 
    case (CurrentState) 
    STATE_Initial : begin 
    NextState = STATE_1 ; 
    end 
    STATE_1 : begin 
    NextState = STATE_2 ; 
    end 
    endcase 
end 

我的問題是,現在,我想除了這一點,同樣用24位的標準寄存器進行:

[email protected] (posedge Clock) begin 
if (Reset) 
    CurrentState <= STATE_Initial ; 
    curReg <= 24'd0; 
else 
    CurrentState <= NextState ; 
    curReg <= nextReg; 
end 

[email protected] (*) begin 
NextState = CurrentState ; 
nextReg = curReg; 
    case (CurrentState) 
    STATE_Initial : begin 
    NextState = STATE_1 ; 
    nextReg = 24'd2048; 
    end 
    STATE_1 : begin 
    NextState = STATE_2 ; 
    nextReg = 24'd211; 
    end 
    endcase 
end 

對我來說,它似乎是以同樣的方式處理,但我總是收到一些錯誤,時間約束沒有得到滿足。那麼,爲什麼這是一個問題?在ifend - -

回答

1

呦缺少beginelse聲明

always @(posedge Clock) begin 
    if (Reset) begin // <---- HERE 
    CurrentState <= STATE_Initial ; 
    curReg <= 24'd0; 
    end // <---- HERE 
    else begin // <---- HERE 
    CurrentState <= NextState ; 
    curReg <= nextReg; 
    end // <---- HERE 
end 

爲了提高時序,可以直接合成執行並行情況。這將增加面積。 IEEE Std 1364-2001(又名Verilog-2001)爲2.8版中描述的verilog for synthesis增加了屬性。但是我還沒有看到可能的工具使用此功能,大多數都去了一個更SystemVerilog的方法,並不斷地支持他們的自定義關鍵字的評論

IEEE標準1364-2001及以上從LRM建議:

(* parallel_case *) 
case(CurrentState) 
    ... 
endcase 

IEEE標準1800至2005年(SystemVerilog中)和上述溶液中:(推薦)

unique case(CurrentState) 
    ... 
default: begin end // blank default for parallel only, else unique means parallel+full 
endcase 

IEEE標準1800年至2009年(SystemVerilog中)和上述溶液中:(最好如果支持)

unique0 case(CurrentState) // unqiue0 is explicit parallel case 
    ... 
endcase 

典型的供應商特定語法。請參閱綜合手冊以獲取準確語法:

case(CurrentState) // synthesis parallel_case 
    ... 
endcase 

並行性將有助於您的下一個狀態計算。如果足夠聰明並且有時間感知,你的合成器可能已經在做它了。根據您的標準單元和佈線,您仍然可能遇到500MHz的時序問題。

如果一切都失敗了,您將需要放慢時鐘速度,或者不要在每個時鐘週期更新所有觸發器。例如一個微小的更新計數器:

always @(posedge Clock) begin 
    if (Reset) begin 
    CurrentState <= STATE_Initial ; 
    curReg <= 24'd0; 
    tiny_update_counter <= 0; 
    end 
    else begin // <---- HERE 
    if(tinly_update_counter == 0) begin 
     CurrentState <= NextState ; 
     curReg <= nextReg; 
     tiny_update_counter <= next_tiny_update_counter; 
    end 
    else begin 
     tiny_update_counter <= tiny_update_counter - 1; 
    end 
    end 
end 
+0

嘿,是的,那只是「僞代碼」。但那不是我所面臨的問題。這是將寄存器賦值給自己的方法嗎? – Ernte1893

+0

@ Ernte1893,那麼你將需要提供更多信息。除了缺少'begin'''end'之外,所提供的代碼沒有任何問題。 – Greg

+0

感謝您的回覆。我也這麼認爲,因爲我是這樣編程的。這裏的問題是時序條件不符合(我們正在使用500 MHz的快速時鐘)。我認爲這個問題可能會發生,因爲24位的大小,我沒有問題,只有3位的狀態。 – Ernte1893