Verilog数组语法

时间:2011-01-31 01:28:26

标签: verilog

我是Verilog的新手,我遇到了很多麻烦。例如,我想要一个包含八个单元的数组,每个单元的宽度为8位。以下不起作用:

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

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

(如果它不明显且相关:我想创建一个有限状态机,并指定数组中的状态转换,因为这似乎比一个大规模的情况切换更容易。)

4 个答案:

答案 0 :(得分:8)

使用assign时,您应该将数组声明为wire而不是reg

答案 1 :(得分:2)

由于您的目标是设计FSM,因此无需将状态值存储在数组中。这通常使用Verilog parameterstate寄存器和带next_state语句的case/endcase来完成。

以下文章显示了一个完整的示例:FSM Fundamentals

答案 2 :(得分:1)

如果这是针对综合的:

稍微超出上面的回答,您应该遵循标准的FSM编码样式,以便工具可以执行更好的优化。正如Cummings论文所述,单热通常最适合FPGA器件,事实上ISE(默认设置)将忽略您的编码并实现它认为最能利用设备资源的任何内容。这几乎总是会导致单热编码的FSM,无论您选择哪种状态编码,只要它能识别您的FSM。

答案 3 :(得分: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的好书是Pong P. Chu的 FPGA Prototyping By Verilog Examples