3

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

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

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

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

4

4 回答 4

8

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

于 2011-01-31T09:18:16.720 回答
2

由于您的目标是设计 FSM,因此无需将状态值存储在数组中。这通常使用 Verilogparameter的、一个state寄存器和一个next_statewithcase/endcase语句来完成。

下面的论文展示了一个完整的例子:FSM Fundamentals

于 2011-01-31T14:05:26.820 回答
1

如果这是针对合成:

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

于 2011-02-08T19:38:02.223 回答
0

好的,所以为了回答你的问题,让我们更深入地研究一下 Verilog 语法。

首先,要指定位范围,可以使用 do[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

于 2011-01-31T01:40:48.083 回答