【问题标题】:How to access values in a 2D array in Verilog?如何在 Verilog 中访问二维数组中的值?
【发布时间】:2017-07-20 02:24:33
【问题描述】:

我需要为模块中的坐标系使用二维数组,并且我创建了下面的测试代码来测试在数组中创建和访问值。当 LED 输出为 1'b1 时,此代码应打开 LED LED 输出,但当前 LED 保持关闭状态(除了 2D 阵列的东西,我已经对所有其他代码进行了故障排除,当我在这里使用 1D 阵列时它可以工作)。

input clk;
reg [7:0] check[9:0];
reg ledreg;
output led;

initial begin
    check[0][0] = 1'b1;
    ledreg = 1'b0;
end

always @(posedge clk) begin
    if (check[0][0] == 1'b1) begin
        ledreg = 1'b1;
    end
end

assign led = ledreg;

我不确定我的数组初始化语法是否关闭reg [7:0] check[9:0] 或者值检查语法是否关闭check[0][0] == 1'b1,或者这是否是仅与 Verilog 一起使用的 SystemVerilog 功能(我没有SystemVerilog,但是这段代码编译没有错误,所以我不认为是这样)。

如何检查二维数组中的值,以便在它具有特定值时执行操作?

【问题讨论】:

  • 代码看起来正确。 clk 正在切换您的代码吗?请确保它确实如此。另外,请在posedge逻辑中使用非阻塞赋值<=
  • 您是在运行仿真还是直接运行 FPGA?我记得我曾尝试回答一个先前的问题,结果证明他们的 FPGA 被简化为读取 2D 阵列的单个位。解决方案是将数据缓冲到一维数组中,然后读取该位。仅供参考,您应该启动整个阵列,而不仅仅是您使用的位;在初始块的顶部添加一个 for 循环,将每个条目分配给 0。

标签: arrays multidimensional-array verilog


【解决方案1】:

为了在verilog中声明一个2D reg,这是更常规的

注册 [7:0] 检查[0:9]; //插入 reg [7:0] check[9:0]

这意味着你有 10 * 8bit regs

您可以通过 check[0] 评估前 8 位,您可以通过 check[0][3] 访问第一个元素的第 3 位

是的,你可以;)

【讨论】:

    【解决方案2】:

    您在初始块中分配了一个值,这就是它不接受它的原因。我已编辑您的代码并检查它

     module led(clk,led,address
            );
             input clk;
             input [3:0] address;
        reg [7:0] check[9:0];
        reg ledreg;
        output led;
    
        //  initial begin
        //    check[0] = 1;
        //    ledreg = 1'b0;
        //  end
    
            always@(posedge clk) begin
                check[0][0] = 1'b1;
    
            if ( check[0][0] == 1'b1) begin
    
                ledreg = 1'b1;
            end
            end
        assign led = ledreg;
        endmodule
    

    这个 mite 可以帮助你,我已经包含了二维数组的输入信号。

    module led(clk,led,address
        );
         input clk;
         input [3:0] address;
    reg [7:0] check[9:0];
    reg ledreg;
    output led;
    
    //  initial begin
    //    check[0] = 1;
    //    ledreg = 1'b0;
    //  end
    
        always@(posedge clk) begin
            check[address] = 8'b11111111;
    
        if ( check[0][0] == 1'b1) begin
    
            ledreg = 1'b1;
        end
        end
    
        assign led = ledreg;
    
    
    endmodule
    

    上面的代码会为多维数组的第一行中的bit分配数据,然后你就可以访问它了。

    【讨论】:

    • 这个建议毫无意义。就像说assing led = 1; 并删除其他所有内容一样好。
    • 是的,但是在我的第二个程序中,我给出了一个地址,我们可以将值存储在数组中想要的位置,然后我们就可以使用了。我不关心导致 led = 1 我只关心从数组中检索值。
    猜你喜欢
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多