Quartus® Prime プロ・エディションのユーザーガイド: パーシャル・リコンフィグレーション

ID 683834
日付 10/23/2024
Public
ドキュメント目次

1.7.10. オンチップメモリーのクロックイネーブルの実装

次のガイドラインに従って、オンチップメモリーのクロックイネーブルを実装します。
  1. メモリーに対するPRプログラミング中のスプリアス書き込みを回避するには、クロックイネーブル回路をM20KまたはMLAB RAMと同じPR領域に実装します。この回路は、静的領域からのアクティブHighのクリア信号に依存します。
  2. PRプログラミングを開始する前に、この信号をアサートしてメモリーのクロックイネーブルをディスエーブルします。システムのPRコントローラーは、PRプログラミングの完了時にクリア信号をデアサートする必要があります。フリーズ信号をこの目的で使用します。
  3. Quartus® Prime IP Catalogまたはプラットフォーム・デザイナーを使用し、この回路を自動的に追加するオプションを含むOn-Chip Memory Intel FPTA IPコアおよびRAM Intel® FPGA IPをインスタンス化します。
    注: IP CatalogからRAM Intel FPGA IPをパラメーター化する際、Implement clock-enable circuitry for use in a partial reconfiguration region オプションをオンにすると、 Quartus® Prime開発ソフトウェアはPR領域で使用するRAM IPに freeze ポートを追加します。
    図 31. RAM 1 Port Intel FPGA IP Parameter EditorのClock-Enable Circuitryオプション


図 32. PR領域のRAMクロックイネーブル回路


クロックイネーブルのVerilog RTL

module mem_enable_verilog (
        input clock,      
        input freeze,
        input clken_in, 
        output wire ram_wrclocken
);
   reg ce_reg;
    reg [1:0] ce_delay;

    always @(posedge clock, posedge freeze) begin
        if (freeze) begin
            ce_delay <= 2'b0;
        end
        else begin
            ce_delay <= {ce_delay[0], 1'b1};
        end
    end

    always @(posedge clock, negedge ce_delay[1]) begin
        if (~ce_delay[1]) begin
            ce_reg <= 1'b0;
        end
        else begin
            ce_reg <= clken_in;
        end
    end

    assign ram_wrclocken = ce_reg;
endmodule

クロックイネーブルのVHDL RTL

ENTITY mem_enable_vhd IS PORT(
        clock      : in  std_logic;
        freeze  : in  std_logic;
		clken_in : in std_logic;
        ram_wrclocken : out std_logic);
END mem_enable_vhd;

ARCHITECTURE behave OF mem_enable_vhd is
	SIGNAL ce_reg: std_logic;
	SIGNAL ce_delay: std_logic_vector(1 downto 0);
BEGIN
PROCESS (clock, freeze)
BEGIN
	IF ((clock'EVENT AND clock = '1') or (freeze'EVENT AND freeze = '1')) THEN
		IF (freeze = '1') THEN
			ce_delay <= "00";
		ELSE
			ce_delay <= ce_delay(0) & '1';
		END IF;
	END IF;
	
END PROCESS;

PROCESS (clock, ce_delay(1))
BEGIN
	IF ((clock'EVENT AND clock = '1') or (ce_delay(1)'EVENT AND ce_delay(1) = '0')) THEN
		IF (ce_delay(1) = '0') THEN
			ce_reg <= '0';
		ELSE
			ce_reg <= clken_in;
		END IF;
	END IF;
	
END PROCESS;

ram_wrclocken <= ce_reg;

END ARCHITECTURE behave;