【问题标题】:Accessing register values in verilog在verilog中访问寄存器值
【发布时间】:2018-08-01 00:52:15
【问题描述】:

我初始化一个寄存器

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

【问题讨论】:

  • 你能提供更多关于你的代码和错误综合症的细节吗?
  • 我很乐意提供帮助,但问题不清楚,请考虑重写以描述错误以及您想要实现的目标以及到目前为止所做的工作。
  • @RaZ 我添加了错误信息。现在清楚了吗?

标签: verilog fpga


【解决方案1】:

您对 Verilog 信号的工作原理存在根本性的误解。

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

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

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

【讨论】:

  • 如何使xout 长于1 位?
  • 与将另一个信号输入总线的方式相同:output [31:0] out。或者其他什么。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多