インテル® Quartus® Primeプロ・エディションのユーザーガイド: デザイン上の推奨事項

ID 683082
日付 4/13/2020
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

ドキュメント目次

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;