在Verilog中使用常量值初始化可合成2D阵列的方法

时间:2013-01-02 22:22:33

标签: arrays initialization constants vhdl verilog

在VHDL中,我可以很容易地做到这一点:

constant    cmdbytes       : bytearray(0 to Total) := (x"05", x"00", x...};

我想要可合成的常量,以便在FPGA启动时,该数组具有我提供的数据。这些寄存器连接到VCC或接地以表示1或0.然后我可以使用它们来生成波形。另外我想在verilog世界中拥有2D字节数组,这是3D。

5 个答案:

答案 0 :(得分:8)

如果您只是使用数组一次提取一个值,那么使用case语句怎么样?当然,这是一种冗长的方式,但您总是可以编写一个脚本来为您编写RTL。

reg [7:0] value;
reg [7:0] i;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        i <= 8'd0;
    else
        i <= i + 1;
end

always @(*) begin
    case(i) 
        8'h00: value = 8'd0;
        8'h01: value = 8'd34;
        ...
    endcase
endcase

另一种方法是使用initial语句。据我所知,FPGA综合工具允许您以下列方式设置数组的初始值。再一次,编写这个的脚本可能就是这样。

reg [0:35][7:0] my_array;

initial begin
    my_array[0] = 8'd45;
    my_array[1] = 8'd26;
    ...
end

如果您的FGPA综合工具支持某些SystemVerilog,您将能够像这样初始化数组:

reg [0:34][7:0] my_array = '{ 8'd90, 8'd34, ... }; // note the '{

答案 1 :(得分:0)

Verilog 2005不允许阵列初始化。虽然您的FPGA供应商应该有办法生成ROM。

答案 2 :(得分:0)

module test (

   input [7:0]   p1_sa,            // i
   input [7:0]   p1_sb,            // i
   output [7:0]   p3,            // o
   output [7:0]   p3b            // o
);

logic [7:0] array2d [7:0] = {99,124,119,123,242,107,111,197};

   assign p3    = array2d[p1_sa];
   assign p3b   = array2d[p1_sb];

endmodule

我尝试了上面的系统Verilog代码,并且在modelsim和Vivado中运行良好。

答案 3 :(得分:0)

case 语句方法的替代方法是使用 function 来访问值。

大小为 4 的包含 8 位常量的“数组”示例:

function [7:0] cmdbytes;
        input    [1:0] index;
        reg      [7:0] t[0:3];
    begin
        {   
             t[0],t[1],t[2],t[3]
        } = {   
             8'h05, 8'h00, 8'h5b, 8'h45
        };

        cmdbytes = t[index];
    end
endfunction

可以像这样访问常量:

wire [7:0] value0;
wire [7:0] value1;
wire [7:0] value2;
wire [7:0] value3;

assign value0 = cmdbytes(2'd0);
assign value1 = cmdbytes(2'd1);
assign value2 = cmdbytes(2'd2);
assign value3 = cmdbytes(2'd3);

答案 4 :(得分:-1)

这有用吗?

reg [31:0] array2d[3:0]
....
array2d[3:0] = {{32'd0}};

array2d[3:0] = {32'd0, 32'd0, 32'd0, 32'd0}