Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog数组语法_Verilog - Fatal编程技术网

Verilog数组语法

Verilog数组语法,verilog,Verilog,我是Verilog的新手,在这方面遇到了很多麻烦。例如,我想要一个有8个单元的数组,每个单元都有8位宽。以下操作不起作用: reg [7:0] transitionTable [0:7]; assign transitionTable[0] = 10; 也不只是做transitionTable[0]=10或可传递表[0]=8'h10

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

reg [7:0] transitionTable [0:7];
assign transitionTable[0] = 10;
也不只是做
transitionTable[0]=10
可传递表[0]=8'h10

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

好的,为了回答您的问题,让我们深入研究一下Verilog语法

首先,要指定位的范围,请执行
[MSB:LSB]
[LSB:MSB]
。标准是MSB:LSB
,但这实际上取决于您,但请尽量保持一致

接下来,在数组实例化中,我们有:

reg WIDTH reg_name NUMBER

其中,
WIDTH
是每个元素的“大小”,而
NUMBER
是数组中元素的数量

因此,您首先要做:

reg[7:0]可传递[7:0]

然后,要分配特定字节(8位=1字节),请执行以下操作:


学习Verilog的一本好书是Pong p.Chu的Verilog示例的FPGA原型制作。

当使用
分配
时,您应该将数组声明为
导线,而不是
reg

,因为您的目标是设计FSM,所以不需要在数组中存储状态值。这通常使用Verilog
参数
、一个
状态
寄存器和一个带有
case/endcase
语句的
下一个状态
来完成


下面的文章给出了一个完整的例子:

如果这是针对合成的:


除了上面回答的问题之外,还有一些标准的FSM编码样式,您应该遵循这些样式,以便这些工具能够执行更好的优化。正如卡明斯论文中所述,一个hot通常最适合FPGA设备,事实上ISE(带有默认设置)将忽略您的编码,并实现它认为最能利用设备上资源的任何功能。这几乎总是会导致一个热编码的FSM,而不管您选择的状态编码是什么,只要它能够识别您的FSM。

仅供参考:在大规模的情况下切换,这样做更容易,也是标准做法。我的意思是,你可以这样做,但在面试一份工作时,你需要提供转换案例。@aqua:谢谢,我想我会选择转换的方式。除非你有老板,否则你是有最终决定权的设计师。你想怎么做就怎么做。但是在我的经验(和我收到的建议)中,用开关语句来做它更容易(第一次更容易得到它),它是100%接受的。对于这个领域51的建议,这是一个完美的问题:考虑支持它。在没有任何敏感的时候使用这种类型的块总是有点尴尬。我认为原来的作业更清楚。事实上,这个答案根本不起作用。由于没有推断出敏感度列表,always块将永远不会触发,transitionTable[0]将保持在x。我想知道为什么这被标记为OK:-)更新:在模拟中确认。
initial begin
    transitionTable[0] = 8'h10;
end