バスやワイヤードORのように,信号線に複数の出力が接続されるような記述は
どのようにすればいいのでしょうか.
VHDLではいく通りかの記述方法がありますが,トライステートバッファの記
述はCADツールによる方言が一番多い部分でもあります.実際現状では,ある
記述はA社のVHDLでは利用できるが,B社のでは使えないなどの問題が発生して
います.
以下の説明は,今回使用するMentor Graphics社製CADツールで使用できる記
述を説明します.なお,他社メーカのCADツールを使用する場合には,マニュ
アル等で記述法をご確認ください.
以下の例は,出力段にトライステートバッファが備えてある8ビットのレジ スタを記述したものです.出力制御線である ``OE'' が '1' になったときの み,レジスタの値が ``OUT_BUS'' に出力されます.
なお,バスとなる信号には port文
中での宣言時に``bus'' というキーワードを付けておく必要があります.
-- ライブラリ宣言
library IEEE;
use IEEE.std_logic_1164.ALL;
-- エンティティ宣言
entity TriState is
port(
IN_BUS : in std_logic_vector( 7 downto 0 ) bus; -- 入力
OUT_BUS : out std_logic_vector( 7 downto 0 ) bus; -- 出力
CLK : in std_logic; -- クロック
RESET : in std_logic; -- リセット
WE : in std_logic; -- 書込み制御
OE : in std_logic -- 出力制御
);
end TriState;
-- アーキテクチャ本体
architecture TriState_body of TriState is
signal TMP : std_logic_vector( 7 downto 0 );
begin
-- 記憶回路記述
D_FF : PROCESS( RESET, CLK )
begin
if RESET = '1' then -- 非同期リセット
TMP <= "00000000";
elsif CLK'event and CLK = '1') then
if WE = '1' then -- 書込み制御
TMP <= IN_BUS;
end if;
end if;
end process;
--レジスタ出力制御
TRI_GATE : block( OE = '1') -- 出力制御
begin
OUT_BUS <= guarded TMP;
end block;
end TriState_body;
以下の例も同様に,出力段にトライステートバッファが備えてある8ビット のレジスタを記述したものですが,出力制御線が2本で,その組合せにより出 力が変化します.すなわち,
-- ライブラリ宣言
library IEEE;
use IEEE.std_logic_1164.ALL;
-- エンティティ宣言
entity TriState is
port(
IN_BUS : in std_logic_vector( 7 downto 0 ) bus; -- 入力
OUT_BUS : out std_logic_vector( 7 downto 0 ) bus; -- 出力
CLK : in std_logic; -- クロック
RESET : in std_logic; -- リセット
WE : in std_logic; -- 書込み制御
OE : in std_logic_vector( 1 downto 0 ) -- 出力制御
);
end TriState;
-- アーキテクチャ本体
architecture TriState_body of TriState is
signal TMP : std_logic_vector( 7 downto 0 );
begin
-- 記憶回路記述
D_FF : PROCESS( RESET, CLK )
begin
if RESET = '1' then -- 非同期リセット
TMP <= "00000000";
elsif CLK'event and CLK = '1') then
if WE = '1' then -- 書込み制御
TMP <= IN_BUS;
end if;
end if;
end process;
--レジスタ出力制御
TRI_GATE : process( OE, TMP ) -- 出力制御
begin
case OE is
when "01" => OUT_BUS <= "0000" & TMP( 3 downto 0 );
when "10" => OUT_BUS <= "0000" & TMP( 7 downto 4 );
when "11" => OUT_BUS <= TMP( 7 downto 0 );
when others => OUT_BUS <= NULL;
end case;
end process;
end TriState_body;
--レジスタ出力制御
with CB( 5 downto 3 ) select
DB <= "11111111" & REG_TMP( 7 downto 0) when ON8N,
"0000" & REG_TMP(11 downto 0) when ON12,
"00000000" & REG_TMP( 7 downto 0) when ON8P,
NULL when others;
では,最後に簡単にまとめます.
ホーム
もどる
辞書