2011-01-31 96 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。