在VHDL中,我可以很容易地做到这一点:
constant cmdbytes : bytearray(0 to Total) := (x"05", x"00", x...};
我想要可合成的常量,以便在FPGA启动时,该数组具有我提供的数据。这些寄存器连接到VCC或接地以表示1或0.然后我可以使用它们来生成波形。另外我想在verilog世界中拥有2D字节数组,这是3D。
答案 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}