我是Verilog的新手,我遇到了很多麻烦。例如,我想要一个包含八个单元的数组,每个单元的宽度为8位。以下不起作用:
reg [7:0] transitionTable [0:7];
assign transitionTable[0] = 10;
既不只是做transitionTable[0] = 10;
或transitionTable[0] = 8'h10;
任何想法?
(如果它不明显且相关:我想创建一个有限状态机,并指定数组中的状态转换,因为这似乎比一个大规模的情况切换更容易。)
答案 0 :(得分:8)
使用assign
时,您应该将数组声明为wire
而不是reg
。
答案 1 :(得分:2)
由于您的目标是设计FSM,因此无需将状态值存储在数组中。这通常使用Verilog parameter
,state
寄存器和带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 。