在 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 信号都是单个位。例如,在您的代码中,SIGNALxout 都是一位宽。它们不能存储数字(0 或 1 除外)。

在定义信号时指定宽度(如 reg [1:0] yreg)控制用于表示该信号的位数。例如,yreg 是一个两位信号。这并不意味着它 "shifts automatically";它只是意味着信号是两位宽的,允许它被用来表示从 0 到 3 的数字(除其他外)。

我强烈建议您完成数字电子设计课程。 Verilog 编程与过程编程语言(例如 Python)非常 不同,如果不透彻理解您实际构建的内容,您将很难理解它这里。