在Verilog中访问寄存器值

时间:2018-07-31 02:31:34

标签: verilog fpga

我初始化寄存器

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

2 个答案:

答案 0 :(得分:1)

您对Verilog信号的工作方式有基本的误解。

默认情况下,所有Verilog信号均为单个位。例如,在您的代码中,SIGNALxout的宽度都是1位。他们不能存储数字(0或1除外)。

在定义信号时指定宽度(例如reg [1:0] yreg)可控制使用多少位来表示该信号。例如,yreg是一个两位信号。这并不意味着它“自动移动”;它只是意味着信号是两位宽的,因此可以用来表示0到3(除其他外)的数字。

我强烈建议您完成数字电子设计课程。 Verilog编程与程序编程语言(例如Python)有很大的不同,如果您不了解您在此处实际构建的内容,您将很难理解它。

答案 1 :(得分:0)

显然,按照this answer,使用方括号来获取寄存器的某个索引是正确的。我只是忘了正确调用变量-我是在调用reg[0]而不是yreg[0]。更改此错误可修复错误。