library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity rams_16 is
port(clka : in std_logic;
clkb : in std_logic;
ena : in std_logic;
enb : in std_logic;
wea : in std_logic;
web : in std_logic;
addra : in std_logic_vector(5 downto 0);
addrb : in std_logic_vector(5 downto 0);
dia : in std_logic_vector(15 downto 0);
dib : in std_logic_vector(15 downto 0);
doa : out std_logic_vector(15 downto 0);
dob : out std_logic_vector(15 downto 0));
end rams_16;
architecture syn of rams_16 is
type ram_type is array (63 downto 0) of std_logic_vector(15 downto 0);
shared variable RAM : ram_type;
begin
process (CLKA) begin
if CLKA’event and CLKA = ’1’ then if ENA = ’1’ then
DOA <= RAM(conv_integer(ADDRA));
if WEA = ’1’ then
RAM(conv_integer(ADDRA)) := DIA;
end if;
end if;
end if;
end process;
process (CLKB) begin
if CLKB’event and CLKB = ’1’ then if ENB = ’1’ then
DOB <= RAM(conv_integer(ADDRB));
if WEB = ’1’ then
RAM(conv_integer(ADDRB)) := DIB;
end if;
end if;
end if;
end process;
end syn;
書き込みポートが 2 つある READ_FIRST モードのデュアル ポート RAM の Verilog コード例
module v_rams_16 (clka,clkb,ena,enb,wea,web,addra,addrb,dia,dib,doa,dob);
input clka,clkb,ena,enb,wea,web;
input [5:0] addra,addrb;
input [15:0] dia,dib;
output [15:0] doa,dob;
reg [15:0] ram [63:0];
reg [15:0] doa,dob;
always @(posedge clka) begin if (ena)
begin if (wea)
ram[addra] <= dia;
doa <= ram[addra];
end end
always @(posedge clkb) begin if (enb)
begin if (web)
ram[addrb] <= dib;
dob <= ram[addrb];
end end endmodule
分散 RAM の推論
次に示すコード例は、頻繁に使用される分散 RAM コンフィギュレーションのコーディング ス タイルであり、ほとんどの合成ツールでサポートされています。
シングル ポート分散 RAM のピンの説明
I/O ピン 説明
clk クロック (立ち上がりエッジ)
we 同期書き込みイネーブル (アクティブ High)
a 読み出し/書き込みアドレス
di データ入力
do データ出力
シングル ポート分散 RAM の VHDL コード例
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity rams_04 is
port (clk : in std_logic;
we : in std_logic;
a : in std_logic_vector(5 downto 0);
di : in std_logic_vector(15 downto 0);
do : out std_logic_vector(15 downto 0));
end rams_04;
architecture syn of rams_04 is
type ram_type is array (63 downto 0) of std_logic_vector (15 downto 0);
signal RAM : ram_type;
begin
process (clk) begin
if (clk’event and clk = ’1’) then if (we = ’1’) then
RAM(conv_integer(a)) <= di;
end if;
end if;
end process;
do <= RAM(conv_integer(a));
end syn;
シングル ポート分散 RAM の Verilog コード例
module v_rams_04 (clk, we, a, di, do);
input clk;
input we;
input [5:0] a;
input [15:0] di;
output [15:0] do;
reg [15:0] ram [63:0];
always @(posedge clk) begin if (we)
ram[a] <= di;
end
assign do = ram[a];
endmodule
デュアル ポート分散 RAM のピンの説明
I/O ピン 説明
clk クロック (立ち上がりエッジ)
we 同期書き込みイネーブル (アクティブ High)
a 書き込みアドレス/プライマリ読み出しアドレス
DPRA デュアル読み出しアドレス
di データ入力
SPO プライマリ出力ポート
DPO デュアル出力ポート
デュアル ポート分散 RAM の VHDL コード例
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity rams_09 is
port (clk : in std_logic;
we : in std_logic;
a : in std_logic_vector(5 downto 0);
dpra : in std_logic_vector(5 downto 0);
di : in std_logic_vector(15 downto 0);
spo : out std_logic_vector(15 downto 0);
dpo : out std_logic_vector(15 downto 0));
end rams_09;
architecture syn of rams_09 is
type ram_type is array (63 downto 0) of std_logic_vector (15 downto 0);
signal RAM : ram_type;
begin
process (clk) begin
if (clk’event and clk = ’1’) then if (we = ’1’) then
RAM(conv_integer(a)) <= di;
end if;
end if;
end process;
spo <= RAM(conv_integer(a));
dpo <= RAM(conv_integer(dpra));
end syn;
デュアル ポート分散 RAM の Verilog コード例
module v_rams_09 (clk, we, a, dpra, di, spo, dpo);
input clk;
input we;
input [5:0] a;
input [5:0] dpra;
input [15:0] di;
output [15:0] spo;
output [15:0] dpo;
reg [15:0] ram [63:0];
always @(posedge clk) begin if (we)
ram[a] <= di;
end
assign spo = ram[a];
assign dpo = ram[dpra];
endmodule
数値演算
ザイリンクス FPGA デバイスには、従来から LUT やキャリー チェーンなどのハードウェア リ ソースが含まれています。これらのハードウェア リソースは、加算器、減算器、カウンター、ア キュムレータ、コンパレータなどの演算を効率的にインプリメントします。
Virtex®-4 デバイスから、DSP48 という新しいプリミティブが導入されました。このブロックは、
Virtex-5 および Spartan®-3A DSP などの新規デバイスでさらに向上しています。DSP48 を使 用すると、乗算器、加算器、カウンター、バレル シフター、コンパレータ、アキュムレータ、積 和演算器、複素乗算器など、さまざまなファンクションを作成できます。
現在のところ、合成ツールで乗算器、加減算器、乗加算/減算器、積和演算器などの DSP ア プリケーション用に DSP48 モードがサポートされ、頻繁に使用されます。また、DSP48 に含ま れる内部レジスタおよびダイナミック OPMODE ポートも使用できます。
DSP48 の高速接続により、の高速 DSP48 チェーンをフィルターとして効率的に作成できます。
この高速接続は、現在の合成ツールでサポートされています。
DSP48 のサポート レベルは合成ツールによって異なります。
詳細は、合成ツールのマニュアルを参照してください。
ターゲット デバイスにある数値演算操作をインプリメントする方法は複数あり、操作のタイプ、
サイズ、使用される状況、タイミング要件などに応じて、合成ツールにより自動的に選択され ます。合成ツールによる自動選択で要件が満たされない場合は、XST の use_dsp48や Synplicity のsyn_dspstyleなど、インプリメンテーション プロセスを制御する制約が用意 されています。
詳細は、合成ツールのマニュアルを参照してください。
デザインを DSP48 ブロックを含む FPGA デバイス ファミリに移行し、DSP48 ブロックの機能を 利用する場合は、最適なパフォーマンスを得るため次の事項に注意してください。
• DSP48 は、完全にパイプライン化すると最高のパフォーマンスを得られます。最高のパ フォーマンスを達成するには、パイプライン段を追加してください。
• 内部 DSP48 レジスタでは、同期セットおよびリセット信号がサポートされます。非同期 セットおよびリセット信号はサポートされません。非同期の初期化信号は、同期信号に置 き換える必要があります。合成ツールによっては、この置換が自動的に実行されます。こ の処理により、生成されたネットリストが元の RTL 記述と異なるものになります。
詳細は、合成ツールのマニュアルを参照してください。
• DSP アプリケーションで DSP48 の機能を最大限に利用するには、RTL 記述にツリー構 造ではなくチェーン構造を使用してください。
DSP48 ブロックおよび DSP アプリケーション特定のコーディング スタイルについては、ター ゲット ファミリ用のXtremeDSP™ ユーザー ガイドを参照してください。