UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

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
作成日 10/25/1999
最終更新日 04/24/2007
ステータス アーカイブ
タイプ 一般