Arrays 在Verilog中用常量值初始化可合成2D数组的方法
在VHDL中,我可以轻松做到这一点:Arrays 在Verilog中用常量值初始化可合成2D数组的方法,arrays,initialization,constants,vhdl,verilog,Arrays,Initialization,Constants,Vhdl,Verilog,在VHDL中,我可以轻松做到这一点: constant cmdbytes : bytearray(0 to Total) := (x"05", x"00", x...}; 我想要可合成的常数,这样当FPGA启动时,这个数组就有了我提供的数据。这些寄存器连接到VCC或接地以表示1或0。然后我可以用它们来生成波形。此外,我想有二维字节数组,这是在verilog世界的三维 Verilog 2005不允许阵列初始化。虽然您的FPGA供应商应该有办法生成ROM。如果您只是使用阵列一次提
constant cmdbytes : bytearray(0 to Total) := (x"05", x"00", x...};
我想要可合成的常数,这样当FPGA启动时,这个数组就有了我提供的数据。这些寄存器连接到VCC或接地以表示1或0。然后我可以用它们来生成波形。此外,我想有二维字节数组,这是在verilog世界的三维 Verilog 2005不允许阵列初始化。虽然您的FPGA供应商应该有办法生成ROM。如果您只是使用阵列一次提取一个值,那么使用
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
如果您的FGPA合成工具支持某些SystemVerilog,您将能够像这样初始化阵列:
reg [0:34][7:0] my_array = '{ 8'd90, 8'd34, ... }; // note the '{
我尝试了上面的系统verilog代码,它在modelsim和Vivado中运行良好。使用
case
语句方法的替代方法是使用函数访问值
包含8位常量的大小为4的“数组”示例:
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);
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);