Flex10K は、論理回路を構成出来るLC(Logic Cell)の他にEAB(Embeded Array Block)というものを持っている。本研究室で用いるデバイスEPF10K200SRC240-3ではEAB 1個辺り 16bit×256(4096bit) のRAM を構成することができ、このEAB が24個ある。例えば、16bit メモリが欲しい場合、EAB を 1つ使うとFlex10KE だと256Word 分構成できる。ここにそのEAB を使ったRAMの設計方法を示す。
初期値ファイルを作成するにはIntel HEX ファイルとMaxplus2 独自のMIF ファイルというものがある。ここではMIF ファイルの作成方法を示す。
図2
-- ALTERA LPM RAM_DQ Evaluation Module --
--LPM_RAM_DQ のアドレスとデータはクロックが、Write Enable
信号に同期して出力されるソース
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.all;
ENTITY CMEM is
port(
SYNC : in std_logic; --WE と同じ
CQ : out std_logic_vector(31 downto 0); --出力データ
CADD : out std_logic_vector(7 downto 0); --出力アドレス
MCLK : in std_logic); --クロック信号
end CMEM;
architecture CMEM of CMEM is
--コンポーネント宣言 ここで信号名をLPM_RAM_DQ の信号と合わせる
component coderam
port ( Data : in std_logic_vector(31 downto
0); --データ幅を指定
Address : in std_logic_vector(7 downto 0); --アドレス幅を指定
WE : in std_logic; --Write Enable信号
Q : out std_logic_vector(31 downto 0); --出力信号
Inclock : in std_logic); --クロック信号
end component ;
signal CADDj : std_logic_vector(7 downto
0);
signal CW : std_logic;
signal CDAT : std_logic_vector(31 downto
0);
signal MCLKj : std_logic;
begin
--コンポーネントインスタンスを使って、LPM_RAM_DQに信号を振り分ける
UCMEM:coderam port map(
Inclock => MCLKj,
Address => CADDj,
Data => CDAT,
Q => CQ,
WE => CW);
CADD <= CADDj;
CW <= '0';
CDAT <= "00000000000000000000000000000000"; --データの初期値
MCLKj <= MCLK;
process(MCLK,SYNC) begin
if(SYNC='0') then
CADDj <= "00000000";
elsif(MCLK'event and MCLK='1') then
CADDj <= CADDj + 1;
end if;
end process;
end CMEM;
ソースのcomponent coderam はLPM_RAM_DQ の信号を指定しています。architecture 内部のコンポーネントインスタンスでLPM_RAM_DQ の信号に何を接続するか指定します。コンポーネントインスタンスはインスタンス名を変えることで増やすことができる。つまりLPM_RAM_DQ を複数使う場合は、
UCMEM : coderam
UCMEM1 : coderam
UCEMEM2 : coderam
と変えることにより、複数のLPM_RAM_DQ を使うことができる。
上のソースをPEAK VHDL で合成することはできない。PEAK VHDL ではcomponent を使った階層構造では下位のモジュールにentity coderam を期待しているため、コンパイル、論理合成共に通らない。仮に通ったとしても、Maxplus2 でコンパイルする際にはエラーが出てしまう。
そこでこのソースの論理合成にはLeonardo を使う。Leonardo ではcomponent entityを空のまま合成することができる。空のまま合成し、Maxplus2 に受け渡すとMaxplus2 は自動的にマクロを認識し、空のマクロを埋めることができる。以下にその方法を示す。
Leonardo の論理合成の仕方はこちら
図3
ダイアロゴボックスで作成したmif ファイルを取り組む => こちら