在 verilog 中访问寄存器值
Accessing register values in verilog
我初始化一个寄存器
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
显然根据 this answer 使用括号获取寄存器的特定索引是正确的。我只是忘了正确调用变量——我调用的是 reg[0]
而不是 yreg[0]
。更改此修复了错误。
您对 Verilog 信号的工作原理存在根本性的误解。
默认情况下,所有 Verilog 信号都是单个位。例如,在您的代码中,SIGNAL
、x
和 out
都是一位宽。它们不能存储数字(0 或 1 除外)。
在定义信号时指定宽度(如 reg [1:0] yreg
)控制用于表示该信号的位数。例如,yreg
是一个两位信号。这并不意味着它 "shifts automatically";它只是意味着信号是两位宽的,允许它被用来表示从 0 到 3 的数字(除其他外)。
我强烈建议您完成数字电子设计课程。 Verilog 编程与过程编程语言(例如 Python)非常 不同,如果不透彻理解您实际构建的内容,您将很难理解它这里。
我初始化一个寄存器
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
显然根据 this answer 使用括号获取寄存器的特定索引是正确的。我只是忘了正确调用变量——我调用的是 reg[0]
而不是 yreg[0]
。更改此修复了错误。
您对 Verilog 信号的工作原理存在根本性的误解。
默认情况下,所有 Verilog 信号都是单个位。例如,在您的代码中,SIGNAL
、x
和 out
都是一位宽。它们不能存储数字(0 或 1 除外)。
在定义信号时指定宽度(如 reg [1:0] yreg
)控制用于表示该信号的位数。例如,yreg
是一个两位信号。这并不意味着它 "shifts automatically";它只是意味着信号是两位宽的,允许它被用来表示从 0 到 3 的数字(除其他外)。
我强烈建议您完成数字电子设计课程。 Verilog 编程与过程编程语言(例如 Python)非常 不同,如果不透彻理解您实际构建的内容,您将很难理解它这里。