2011-01-31 64 views
3

我是Verilog的新手,並且遇到很多麻煩。例如,我想要有一個8個單元的數組,每個單元都是8位寬。以下不工作:Verilog數組語法

reg [7:0] transitionTable [0:7]; 
assign transitionTable[0] = 10; 

既不會只是做transitionTable[0] = 10;transitionTable[0] = 8'h10;任何想法?

(如果這不是明擺着和相關:我想打一個有限狀態機,並在數組中指定的狀態轉變,因爲這似乎不是一個大規模的情況下切換更容易。)

+1

只是供參考:在一個大型案例切換是一個更容易和標準的做法。我的意思是,你可以這樣做,但在面試工作時,你需要提供開關盒方式。 – aqua 2011-01-31 01:30:59

+0

@aqua:謝謝,我想我會採用切換方式。 – Xodarap 2011-01-31 02:47:39

+0

除非你有一個老闆,否則你是設計師最後的決定權。你可以做到這一點,但是_you_想。但根據我的經驗(以及我收到的建議),使用switch語句做起來更容易(第一次更容易做到),並且100%被接受。 – aqua 2011-01-31 03:01:25

回答

8

當使用assign時,您應該聲明該陣列爲wire而不是reg

0

好了,要回答你的問題,讓我們深入研究一下Verilog語法。

首先,要指定一個範圍的位,可以執行[MSB:LSB][LSB:MSB]。標準是MSB:LSB,但這裏真的取決於你,但要儘量保持一致。

接着,在陣列的實例化,我們有:

reg WIDTH reg_name NUMBER;

其中WIDTH是各元素的「大小」和NUMBER是陣列中元件的數量。

所以,你首先要做到:

reg [7:0] transitionTable [7:0];

然後,指定特定字節(8位= 1個字節),這樣做:

initial begin 
    transitionTable[0] = 8'h10; 
end 

一本好書,學習的Verilog從FPGA原型驗證通過Verilog示例 Pong P. Chu。

2

由於您的目標是設計FSM,因此不需要將狀態值存儲在數組中。這通常使用Verilog parameter's,state寄存器和next_state以及case/endcase聲明來完成。

以下文件表明一個完整的例子:FSM Fundamentals

1

如果這是有針對性的向合成:

有點超出了上述回答,有標準的FSM編碼風格,你應該堅持這樣的工具可以執行更好的優化。正如Cummings論文所述,對於FPGA器件來說,one-hot通常是最好的選擇,事實上ISE(默認設置)會忽略你的編碼,並實現它認爲最好地利用器件資源的任何東西。無論您選擇的是哪種狀態編碼,只要它識別您的FSM,這幾乎總是會產生一個單獨編碼的FSM。