バスやワイヤード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;
では,最後に簡単にまとめます.