我初始化寄存器
reg[1:0] yreg;
并对其进行一些操作,即从上一步获得的值。当我在0点添加新值时,程序的迭代移至1点
yreg = SIGNAL; //here SIGNAL is an input to the program
然后我想稍后访问寄存器中0和1点的值以进行计算。我怎样才能做到这一点?我最初的反应是yreg[0]
和yreg[1]
(我通常使用python =编程),但这产生了错误(第35行是具有yreg[0]
和yreg[1]
的代码行在其中):
ERROR:HDLCompiler:806 - "/home/ise/FPGA/trapezoid/trapverilog.v" Line 35: Syntax error near "[".
当我看到这时,我的假设是使用括号访问寄存器的某个索引不是正确的语法。您如何正确访问寄存器索引中的信息?我在查找有关此信息时遇到麻烦。
很抱歉,这可能是一个荒谬的问题,这是我第一次使用Verilog或FPGA。
module trapverilog(
input CLK,
input SIGNAL,
input x,
output OUT
);
reg[1:0] yreg;
float sum = 0;
always @(posedge CLK)
begin
yreg = SIGNAL; //should shift automatically...?
sum = ((reg[0] + reg[1])*x/2) + sum; //this is effectively trapezoidal integration
OUT = sum;
end
endmodule
答案 0 :(得分:1)
您对Verilog信号的工作方式有基本的误解。
默认情况下,所有Verilog信号均为单个位。例如,在您的代码中,SIGNAL
,x
和out
的宽度都是1位。他们不能存储数字(0或1除外)。
在定义信号时指定宽度(例如reg [1:0] yreg
)可控制使用多少位来表示该信号。例如,yreg
是一个两位信号。这并不意味着它“自动移动”;它只是意味着信号是两位宽的,因此可以用来表示0到3(除其他外)的数字。
我强烈建议您完成数字电子设计课程。 Verilog编程与程序编程语言(例如Python)有很大的不同,如果您不了解您在此处实际构建的内容,您将很难理解它。
答案 1 :(得分:0)
显然,按照this answer,使用方括号来获取寄存器的某个索引是正确的。我只是忘了正确调用变量-我是在调用reg[0]
而不是yreg[0]
。更改此错误可修复错误。