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

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

1.4.1.9. 混合幅デュアルポートRAM

このセクションのRAMコード例では、SystemVerilogおよびVHDLのコードで異なる幅のデータポートを備えるRAMを推論しています。

Verilog-1995は混合幅のRAMをサポートしません。この規格には異なる読み出し幅、書き込み幅、またはその両方をモデル化する多次元配列がありません。Verilog-2001は混合幅のRAMをサポートしません。このタイプのロジックにはパッキングされた次元が複数必要です。合成ツールによっては、これらのメモリーのサポートが異なる場合があります。このセクションでは、 インテル® Quartus® Prime プロ・エディションの合成における推論規則について説明します。

多次元パッキング配列の最初の次元は、幅の広いポートと幅の狭いポートの比率を表します。2番目の次元は、幅の狭いポートのポート幅を表します。読み出しおよび書き込みポートの幅では、ターゲットデバイスのメモリーブロックでサポートされる読み出しまたは書き込みの比率を指定する必要があります。これを行わないと、合成ツールはRAMを推論しません。

インテル® Quartus® PrimeのHDLテンプレートを参照し、サポートされる読み出し幅と書き込み幅の組み合わせでパラメーター化されている例を確認してください。また、混合幅の2つの読み出しポートと混合幅の2つの書き込みポートを備えるトゥルー・デュアルポートRAMの例も提供されています。

SystemVerilog混合幅RAM (読み出し幅が書き込み幅より小さい)

module mixed_width_ram    // 256x32 write and 1024x8 read
(
		input [7:0] waddr,  
		input [31:0] wdata, 
		input we, clk,
		input [9:0] raddr,
		output logic [7:0] q
);
	logic [3:0][7:0] ram[0:255];
	always_ff@(posedge clk)
		begin
			if(we) ram[waddr] <= wdata;
			q <= ram[raddr / 4][raddr % 4];
		end
endmodule : mixed_width_ram

SystemVerilog混合幅RAM (読み出し幅が書き込み幅より大きい)

module mixed_width_ram     // 1024x8 write and 256x32 read	
(	
		input [9:0] waddr,	
		input [31:0] wdata, 	
		input we, clk, 	
		input [7:0] raddr,	
		output logic [9:0] q	
);	
	logic [3:0][7:0] ram[0:255];	
	always_ff@(posedge clk)	
		 begin	
			if(we) ram[waddr / 4][waddr % 4] <= wdata;	
			q <= ram[raddr];	
		 end	
endmodule : mixed_width_ram

VHDL混合幅RAM (読み出し幅が書き込み幅より小さい)

library ieee;	
use ieee.std_logic_1164.all;	
	
package ram_types is	
	type word_t is array (0 to 3) of std_logic_vector(7 downto 0);	
	type ram_t is array (0 to 255) of word_t;	
end ram_types;	
	
library ieee;	
use ieee.std_logic_1164.all;	
library work;	
use work.ram_types.all;	
	
entity mixed_width_ram is	
	port (	
		we, clk : in  std_logic;	
		waddr   : in  integer range 0 to 255;	
		wdata   : in  word_t;	
		raddr   : in  integer range 0 to 1023;	
		q       : out std_logic_vector(7 downto 0));	
end mixed_width_ram;	
	
architecture rtl of mixed_width_ram is	
	signal ram : ram_t; 	
begin  -- rtl	
	process(clk, we)	
	begin	
		if(rising_edge(clk)) then 	
			if(we = '1') then	
				ram(waddr) <= wdata;	
			end if;	
			q <= ram(raddr / 4 )(raddr mod 4);	
		end if;	
	end process;		
end rtl;

VHDL混合幅RAM (読み出し幅が書き込み幅より大きい)

library ieee;
use ieee.std_logic_1164.all;

package ram_types is
	type word_t is array (0 to 3) of std_logic_vector(7 downto 0);
	type ram_t is array (0 to 255) of word_t;
end ram_types;

library ieee;
use ieee.std_logic_1164.all;
library work;
use work.ram_types.all;

entity mixed_width_ram is
	port (
		we, clk : in  std_logic;
		waddr   : in  integer range 0 to 1023;
		wdata   : in  std_logic_vector(7 downto 0);
		raddr   : in  integer range 0 to 255;
		q       : out word_t);
end mixed_width_ram;

architecture rtl of mixed_width_ram is
	signal ram : ram_t; 
begin  -- rtl
	process(clk, we)
	begin
		if(rising_edge(clk)) then 
			if(we = '1') then
				ram(waddr / 4)(waddr mod 4) <= wdata;
			end if;
			q <= ram(raddr);
		end if;
	end process; 
end rtl;