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

ID 683082
日付 8/03/2023
Public
ドキュメント目次

1.4.1.5. シングルクロック同期RAM (古いデータでのRead-During-Write動作)

このセクションのコード例では、Verilog HDLおよびVHDLのコードでシンプル・デュアルポート、シングルクロックの同期RAMを推論しています。シングルポートRAMブロックでも、同様のコーディング・スタイルを使用します。

ここで示されているRead-During-Write動作は、メモリーアドレスの古いデータを読み出すものです。MLABメモリーで最高のパフォーマンスを実現するには、適切な属性を使用して、書き込み動作時に読み出しデータに依存するデザインにならないようにします。シンプル・デュアルポートRAMのコードサンプルは、インテルの同期メモリーに直接マッピングされます。

メモリーブロックのシングルポート・バージョン (つまり、同じ読み出しアドレス信号と書き込みアドレス信号を使用) では、デバイスファミリーによっては、デュアルポート・メモリー・ブロックよりも優れたRAM使用率が得られます。該当するデバイス・ハンドブックを参照し、お使いのターゲットデバイスに関する推奨事項を確認してください。

Verilog HDLシングルクロック、シンプル・デュアルポート同期RAM (古いデータでのRead-During-Write動作)

module single_clk_ram( 
    output reg [7:0] q,
    input [7:0] d,
    input [4:0] write_address, read_address,
    input we, clk
);
    reg [7:0] mem [31:0];

    always @ (posedge clk) begin
        if (we)
            mem[write_address] <= d;
        q <= mem[read_address]; // q doesn't get d in this clock cycle
    end
endmodule

VHDLシングルクロック、シンプル・デュアルポート同期RAM (古いデータでのRead-During-Write動作)

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY single_clock_ram IS
    PORT (
        clock: IN STD_LOGIC;
        data: IN STD_LOGIC_VECTOR (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 STD_LOGIC_VECTOR (7 DOWNTO 0)
    );
END single_clock_ram;

ARCHITECTURE rtl OF single_clock_ram IS
    TYPE MEM IS ARRAY(0 TO 31) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
    SIGNAL ram_block: MEM;
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); 
            -- VHDL semantics imply that q doesn't get data 
            -- in this clock cycle
        END IF;
    END PROCESS;
END rtl;
注: この single_clock_ram のサイズが小さいと、コンパイラーはメモリーをM20KメモリーブロックではなくMLABメモリーブロックとして推論します。single_clock_ram でより大きな幅を指定している場合、コンパイラーはメモリーをM20Kメモリーブロックとして推論します。