在 VHDL 中,我可以很容易地做到这一点:
constant cmdbytes : bytearray(0 to Total) := (x"05", x"00", x...};
我想要可综合的常量,这样当 FPGA 启动时,这个数组就有我提供的数据。这些寄存器连接到 VCC 或接地以表示 1 或 0。然后我可以使用它们来生成波形。我也想有 2D 字节数组,它在 verilog 世界中是 3D。
在 VHDL 中,我可以很容易地做到这一点:
constant cmdbytes : bytearray(0 to Total) := (x"05", x"00", x...};
我想要可综合的常量,这样当 FPGA 启动时,这个数组就有我提供的数据。这些寄存器连接到 VCC 或接地以表示 1 或 0。然后我可以使用它们来生成波形。我也想有 2D 字节数组,它在 verilog 世界中是 3D。
如果您只是使用数组一次提取一个值,那么使用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 '{
语句方法的替代case
方法是使用 afunction
来访问值。
包含 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);
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 中运行良好。
Verilog 2005 不允许数组初始化。尽管您的 FPGA 供应商应该有办法生成 ROM。