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

ID 683082
日付 4/13/2020
Public

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

ドキュメント目次

1.4.1.5. 古いデータのRead-During-Write動作を備えたシングルクロック同期RAM

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

これらの例でのread-during-write動作は、メモリーアドレスで古いデータを読み出すことです。 MLABメモリーで最高のパフォーマンスを得るには、適切な属性を使用して、ライト動作中にデザインがリードデータに依存しないようにします。シンプル・デュアル・ポートRAMコードは、 Intel同期メモリーに直接サンプルします。

メモリーブロックのシングル・ポート・バージョン(つまり、同じリードアドレスとライトアドレス信号を使用)は、デバイス・ファミリーに応じて、デュアルポートメモリーブロックよりも優れたRAM使用率を実現します。ターゲットデバイスに関する推奨事項については、適切なデバイス・ハンドブックを参照してください。

古いデータの読み出し時、書き込み時の動作を備えた修正されたシングルクロック同期RAMを改訂。

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

Verilog HDL Single-Clock, Simple Dual-Port Synchronous RAM with Old Data Read-During-Write Behavior

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のサイズが小さいと、CompilerはメモリーをM20KメモリーブロックではなくMLABメモリーブロックとして推測します。 single_clock_ramがより大きな幅を指定する場合、CompilerはメモリーをM20Kメモリーブロックとして推測します。