このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。
1.4.1.11. 電源投入時に初期メモリーの内容の指定
合成ツールには、推定メモリーの初期コンテンツを指定するさまざまな方法が用意されている場合があります。 MLABの連続リードにより、専用RAMブロックとMLABメモリーの間にわずかなパワーアップと初期化の違いがあります。
Intel FPGA専用のRAMブロック出力は常にゼロにパワーアップされ、最初のリード時に初期値に設定されます。たとえば、アドレス0が事前にFFに初期化されている場合、RAMブロックは0の出力で起動します。電源投入後のアドレス0からの後続のリードは、FFの事前初期化された値を出力します。したがって、RAMの電源がオンになり、イネーブル(リードイネーブルまたはクロックイネーブル)がLowに保持されると、最初の有効なリードサイクルまでパワーアップ出力0が維持されます。合成ツールは、 0にパワーアップするレジスターを使用してMLABを実装しますが、パワーアップまたはリセット時にすぐに初期値に初期化します。したがって、有効化状態に関係なく、初期値が表示されます。 インテル® Quartus® Prime HDLコードが適切なramstyle属性を指定すると、ソフトウェアは推論されたメモリーをMLABにマップします。
Verilog HDLでは、初期ブロックを使用して、推定メモリーの内容を初期化できます。 インテル® Quartus® Primeプロ・エディション合成では、推論されたRAMの初期ブロックがメモリー初期化ファイル( .mif )に自動的に変換されます。
Verilog HDL RAM with Initialized Contents
module ram_with_init(
output reg [7:0] q,
input [7:0] d,
input [4:0] write_address, read_address,
input we, clk
);
reg [7:0] mem [0:31];
integer i;
initial begin
for (i = 0; i < 32; i = i + 1)
mem[i] = i[7:0];
end
always @ (posedge clk) begin
if (we)
mem[write_address] <= d;
q <= mem[read_address];
end
endmodule
インテル® Quartus® Primeプロ・エディション合成およびその他の合成ツールも、 $ readmembおよび$ readmemh属性をサポートしています。これらの属性により、RAMの初期化とROMの初期化は、合成とシミュレーションで同じように機能します。
Verilog HDL RAM Initialized with the readmemb Command
reg [7:0] ram[0:15];
initial
begin
$readmemb("ram.txt", ram);
end
VHDLでは、対応する信号のデフォルト値を指定することにより、推定メモリーの内容を初期化できます。 インテル® Quartus® Primeプロ・エディション合成では、デフォルト値が自動的に推論されたRAMの.mifファイルに変換されます。
VHDL RAM with Initialized Contents
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;
ENTITY ram_with_init IS
PORT(
clock: IN STD_LOGIC;
data: IN UNSIGNED (7 DOWNTO 0);
write_address: IN integer RANGE 0 to 31;
read_address: IN integer RANGE 0 to 31;
we: IN std_logic;
q: OUT UNSIGNED (7 DOWNTO 0));
END;
ARCHITECTURE rtl OF ram_with_init IS
TYPE MEM IS ARRAY(31 DOWNTO 0) OF unsigned(7 DOWNTO 0);
FUNCTION initialize_ram
return MEM is
variable result : MEM;
BEGIN
FOR i IN 31 DOWNTO 0 LOOP
result(i) := to_unsigned(natural(i), natural'(8));
END LOOP;
RETURN result;
END initialize_ram;
SIGNAL ram_block : MEM := initialize_ram;
BEGIN
PROCESS (clock)
BEGIN
IF (rising_edge(clock)) THEN
IF (we = '1') THEN
ram_block(write_address) <= data;
END IF;
q <= ram_block(read_address);
END IF;
END PROCESS;
END rtl;