VHDLでは、これを簡単に行うことができます。
constant cmdbytes : bytearray(0 to Total) := (x"05", x"00", x...};
FPGAの起動時に、この配列に指定したデータが含まれるように、合成可能な定数が必要です。これらのレジスタは、1または0を表すためにVCCまたはグランドに配線されています。次に、それらを使用して波形を生成できます。また、Verilogの世界では3Dである2Dバイト配列が欲しいです。
VHDLでは、これを簡単に行うことができます。
constant cmdbytes : bytearray(0 to Total) := (x"05", x"00", x...};
FPGAの起動時に、この配列に指定したデータが含まれるように、合成可能な定数が必要です。これらのレジスタは、1または0を表すためにVCCまたはグランドに配線されています。次に、それらを使用して波形を生成できます。また、Verilogの世界では3Dである2Dバイト配列が欲しいです。
配列を使用して一度に1つの値を引き出すだけの場合は、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 '{
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で正常に動作しています。
case
ステートメントアプローチの代わりに、を使用しfunction
て値にアクセスすることもできます。
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);
Verilog 2005では、アレイの初期化は許可されていません。ただし、FPGAベンダーにはROMを生成する手段が必要です。