AR# 7929

Exemplar - VHDL または Verilog で Virtex のブロック RAM を自動追加する方法

説明

キーワード : block RAM, select RAM, single, dual, port, block_ram, Leonardo, init, ブロック RAM, シングル, デュアル, ポート

重要度 : 標準

概要 :
LeonardoSpectrum では、Verilog または VHDL のメモリ文を Virtex デバイス上のブロック RAM にマップできます。

LeonardoSpectrum のブロック RAM に関する詳細は次のとおりです。

- Virtex のブロック RAM は完全に同期です。 読み込み、書き込み動作は同期です。

- LeonardoSpectrum では次のブロック RAM が自動追加されます。
1. シングル ポート RAM または同じアドレスに読み込みと書き込みがある RAM
2. デュアル ポート RAM - 読み込みと書き込みで異なるアドレスを持つ RAM (ポート A で書き込み、ポート B で読み込み)

- LeonardoSpectrum では次の RAM は自動追加されません。
1. ポート A およびポート B の両方で読み込みと書き込みができるデュアル ポート RAM
2. RST ピンおよび ENA ピンの機能を使用するブロック RAM

変数 :
RAM を抽出しない場合、次のように変数を「false」に設定します (デフォルトは true)。

set extract_ram false

デフォルトで、ブロック RAM にマップ可能な RAM はブロック RAM にマップされます。 このオプションを無効にするには、次のように block_ram 属性を「false」に設定します。

set_attribute -name block_ram -value false

この場合、RAM は可能な限り Select RAM を使用してインプリメントされます。

メモ :
- ブロック RAM を使用してインプリメントされるシングル ポート RAM は、Select RAM を使用してインプリメントされません。

- デュアル ポート ブロック RAM の自動追加については、(ザイリンクス アンサー #10728) を参照してください。

- HDL コードで自動追加された RAM の初期化はサポートされていません。 これを行うには、LeonardoSpectrum の回路図ビューワまたは EDIF ネットリストからインスタンス名を取得し、UCF ファイルで INIT 属性を指定します。 (自動追加された RAM は、デフォルトで 0 に初期化されます。)

ソリューション

1

Verilog の例 :
(LeonardoSpectrum 1999.1f でテスト済み)

module ram(din, we, addr, clk, dout);
parameter data_width=7, address_width=6,mem_elements=64;
input [data_width-1:0] din;
input [address_width-1:0] addr;
input we, clk;
output [data_width-1:0] dout;

reg [data_width-1:0] mem[mem_elements-1:0];
// Exemplar attribute mem block_ram FALSE

/* Use the directive above ONLY if you want to disable Block RAM extraction.
Set the block_ram attribute to FALSE on the signal memory.
The block_ram attribute must be set on the memory signal. */

reg [address_width - 1:0] addr_reg;

always @(posedge clk)
begin
addr_reg <= addr;
if (we)
mem[addr] <= din;
end

assign dout = mem[addr_reg];

endmodule

2

ブロック RAM の VHDL 例 :
(LeonardoSpectrum 1999.1f でテスト済み)

library ieee, exemplar;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity ram_example1 is
generic(data_width: integer:= 8;
address_width:integer := 8;
mem_depth: integer:= 256);

port (data: in std_logic_vector(data_width-1 downto 0);
address: in unsigned(address_width-1 downto 0);
we, clk: in std_logic;
q: out std_logic_vector(data_width-1 downto 0));
end ram_example1;

architecture ex1 of ram_example1 is

type mem_type is array (mem_depth-1 downto 0) of std_logic_vector (data_width-1 downto 0);
signal mem: mem_type;
signal raddress : unsigned(address_width-1 downto 0);

begin
l0: process (clk, we, address)
begin
if (clk = '1' and clk'event) then
raddress <= address;
if (we = '1') then
mem(to_integer(raddress)) <= data;
end if;
end if;
end process;

l1: process (clk, address)
begin
if (clk = '1' and clk'event) then
q <= mem(to_integer(address));
end if;
end process;

end ex1;
AR# 7929
日付 04/24/2007
ステータス アーカイブ
種類 一般