FPGA内蔵のメモリブロックを利用する VHDL記述サンプル。ここでは Xilinx Spartan 7 を想定している。
ポイントは、以下の2点。
・メモリ用配列の定義
・メモリロジックの記述
1. メモリ用配列の定義
配列の定義は、ロジック記述とは別ファイルに分けることを勧める。
ロジック記述が短い場合はまとめてもよいが、記述が増えファイルが複数になった場合は、
配列の定義を別ファイルとし、各ロジックファイルの先頭に [ use WORK.TYPES.all ]を追加する方法がすっきりする。
配列の記述例は以下の通り。 ※メモリ構成 4K x 16bit の例
-- Use IEEE library
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
package TYPES is
type ram_array is array ( 0 to 4095 ) of STD_LOGIC_VECTOR (15 downto 0);
end TYPES;
2. メモリロジックの記述例
2-1. IEEE 記述
配列定義を別ファイルとしたため、S-RAMロジック記述用ファイルの IEEE 記述部分に [ use WORK.TYPES.all ] を追加する
-- Use IEEE library
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use WORK.TYPES.all; <-- 配列使用時の記述、配列定義は別ファイル
2-2. メモリロジック本体の記述例
※外部信号の同期化ロジックは記述していない。
-- [WRITE] --------------------------------------
process(CLK20M)
begin
if ( CLK20M'event and CLK20M = '1' ) then
if ( RAM_ENABLE = '1' ) then
if ( RAM_WRITE = '1' ) then
-- RAM_ADD は integer に変換して使用する
block_ram_4K_16bit( conv_integer(RAM_ADD) ) <= RAM_DATA_IN;
end if;
end if;
end if;
end process;
-- [READ] ---------------------------------------
process(CLK20M)
begin
if CLK20M'event and CLK20M = '1' then
if ( RAM_ENABLE = '1' ) then
RAM_DATA_OUT <= block_ram_4K_16bit( conv_integer(RAM_ADD) );
end if;
end if;
end process;
3. テストベンチ
テストベンチにて、メモリにWRITE/READを行い、データが正しいかを確認する。
if文にて期待値チェックを行っており、期待値エラー発生時はその場で終了する。最後まで完走すればOK。
テストベンチは MODELSIM/VIVADOシミュレーション共通で使える記述にしている。
・MODELSIM によるシミュレーション
・VIVADO によるシミュレーション
4. サンプルファイル
主なファイル構成は下記の通り。
・MODULE_RAM.VHD RAMロジック
・TEST_BENCH_RAM.VHD シミュレーション用テストベンチ。MODELSIM/VIVADシミュレーション共通。
プロジェクトファイル一式
・MODELSIM用プロジェクトファイル:japanlogicdesign_sram_test_modelsim.zip
・VIVADO用プロジェクトファイル:japanlogicdesign_sram_test_vivado.zip
※注意:VIVADO プロジェクトファイルは参考にとどめ、新規に作成しなおすことを推奨する
MODELSIM プロジェクトは相対パスではないため、ソースファイルの再登録が必要な場合あり
5. VIVADO コンパイル後の確認
ブロックRAMが割り当てられているか、コンパイル後に確認する。
もし使用ブロックRAMの数が 0 だった場合は組み込みは失敗。※BRAMではなくFFに割り振られている可能性あり。
※デバイスが 7S50 の場合、内蔵ブロックRAM数は75個。これに 4Kx16bit を割り当てると 8bitのブロックRAMが2個(16bit分)使用される。

中国プロテクト:天安門事件、法輪功、チベット
|