VHDL を使った PLD 設計のすすめ PLD 利用のメリット 小型化 高集積化 回路の修正が容易 VHDL 設計のメリット 汎用の設計になる ( どこのデバイスにも搭載可能 ) 1/16 2001/7/13 大久保弘崇 http://www.aichi-pu.ac.jp/ist/~ohkubo/ 2/16 設計の再利用が促進 MIL 記号の D での設計との比較 Verilog-HDL などでも別に同じ メーカー独自の HDL は 今となっては特にメリットはない PLD 制作の作業フロー 動作記述 *.vhd テストベンチ *.vhd VHDL 記述の概略 : 階層構造 エンティティ : インタフェースを定義 論理合成配置配線 シミュレーション動作検証 アーキテクチャ : 実現を定義 コンポーネント : エンティティを利用 3/16 構成ファイル 4/16
エンティティ : インタフェースを定義 entity HLFDD is port (, : in std_logic ;, : out std_logic ) ; end HLFDD ; アーキテクチャ : エンティティの実現 architecture RH1 of HLFDD is <= xor ; <= and ; end RH1 ; RH1 5/16 HLFDD 6/16 HLFDD ひとつのエンティティに対して いくつもアーキテクチャを定義することができる 例 ) 加算回路のエンティティに キャリーの繰り上げ方の異なる複数のアーキテクチャが宣言できる コンポーネント : 部品の呼び出し entity FULLDD is port (,,i : in std_logic ;,o : out std_logic ) ; end FULLDD ; architecture F1 of FULLDD is 7/16 component HLFDD port (, : in std_logic ;, : out std_logic ) ; end component ; architecture F1 signal 1, 1, 2 : std_logic ; H1 : HLFDD port map(=>,=>,=>1,=>1); H2 : HLFDD port map(1,i,,2) ; o <= 1 or 2 ; end F1 ; 8/16 i H1 1 1 H2 F1 FULLDD 2 o
VHDL のデータ型 std_logic 'U' : Unknown 'X' : Undefined '0' : Low '1' : High 'Z' : Hi-Z '-' : Don't are std_logic_vector Integer haracter ユーザ定義型 ( 列挙 部分値 ) 9/16 ベクタの例 entity DDER8bit is port (, : in std_logic_vector (7 downto 0) ; : out std_logic_vector (7 downto 0) ; o : out std_logic ) ; [ 中略 ] signal : std_logic_vector (8 downto 0) ; L : for i in 0 to 7 generate Fx : FULLDD port map (=>(i),=>(i),=>(i+1),=>(i)); end generate; (0) <= '0' ; o <= (8) ; 0/16 プロセス : 逐次処理風の記述が可能 architecture 1 of ELET is センシティビィティリスト PRO1 : process (,,EL) if EL='1' then Y <= ; else Y <= ; end if ; end process ; end 1 ; Y EL 1/16 状態の保持 : PU 内レジスタの例 architecture REG1 of REGITER is signal content : std_logic_vector (7 downto 0) ; write : process ( reset, clock ) 2/16 値を入れる信号線 非同期リセット if reset = '1' then content <= '00000000' ; 立ち上がり動作 elsif ( clock'event and clock = '1') then if we='1' then content <= inbus ; endif ; endif ; end process ; outbus <= content when oe='1' else 'ZZZZZZZZ' ; end REG1 ; プロセス文は センシティビティリストの信号が変化したとき プロセス内で信号代入している ( 出力 ) 信号を対応して変化させる回路を生成する センシティビティリストの信号が変化しない間は それ以外の ( 入力 ) 信号が変化しても 出力は変化せず先の値を保持する そのような信号をもつプロセスは一般に順序回路に合成されるが ここの例の VHDL プログラムのように 組合せ回路で充分表現できるものもある そういうプロセスはちゃんと組合せ回路に合成される ( はず )
検証も VHDL の枠組みで 実演 1 Halfdd Fulldd 4bit dder プロジェクト作成 シミュレーション 制約 合成 ダウンロード 3/16 テストパターン テスト対象の VHDL プログラム 結果を比較 テストベンチの VHDL プログラム ファイル入出力 wait, after, assert 構文 配置配線後のタイミング検証も 合成不可能なことがらも VHDL は記述可能 実演 2 コンポーネント設計 有限状態機械 (FM) クロック 4/16 カウンタ 4 比較器 4 速度指定数値入力 リセット eq 内部状態 状態遷移 出力生成 Finite tate Machine LED 点滅 参考文献 HDLによるデジタル設計の基礎桜井至, テクノプレス, 1997, 3,200 円実践的に例から入っていくのでとっつきやすい Verilog-HDL の例も平行して掲載されている 詳細に入っていくと物足らなくなる VHDLによるハードウェア設計入門長谷川裕恭, Q 出版社, 1995, 2300 円変に合成結果の詳細に入り込んでいるところがあるが 一通りのことが説明されている VHDL 言語入門, Jayaram hasker, Q 出版社, 1995, 3200 円訳本 VHDL, Douglas L.Perry, II, 1996, 4500 円これも訳本 この中で一番字が多い 関連 URL Xilinx ltera www.xilinx.co.jp www.xilinx.com www.altera.co.jp www.altera.com ModelTech www.model.com ビーアイティ www3.famille.ne.jp/~bit/ 5/16 6/16
Fri Jul 13 01:58:52 2001 rotator.vhd page 1 2 use IEEE.TD_LOGI_1164.LL; 3 4 entity rotator is 5 Port ( pulse : in std_logic; 6 led : out std_logic_vector(7 downto 0)); 7 end rotator; 8 9 architecture behavioral of rotator is 10 type tmystate is (s0,u1,u2,u3,u4,u5,u6,s7,d6,d5,d4,d3,d2,d1); 11 signal mystate : tmystate ; 12 13 -- state machine 14 process(pulse) 15 16 if (pulse event and pulse = 1 ) then 17 case mystate is 18 when s0 => mystate <= u1 ; 19 when u1 => mystate <= u2 ; 20 when u2 => mystate <= u3 ; 21 when u3 => mystate <= u4 ; 22 when u4 => mystate <= u5 ; 23 when u5 => mystate <= u6 ; 24 when u6 => mystate <= s7 ; 25 when s7 => mystate <= d6 ; 26 when d6 => mystate <= d5 ; 27 when d5 => mystate <= d4 ; 28 when d4 => mystate <= d3 ; 29 when d3 => mystate <= d2 ; 30 when d2 => mystate <= d1 ; 31 when d1 => mystate <= s0 ; 32 end case; 33 end if ; 34 end process ; 35 -- signal output 36 process(mystate) 37 38 -- led <= "00000000" ; 39 case mystate is 40 when s0 => led <= "10000000" ; 41 when u1 => led <= "01000000" ; 42 when u2 => led <= "00100000" ; 43 when u3 => led <= "00010000" ; 44 when u4 => led <= "00001000" ; 45 when u5 => led <= "00000100" ; 46 when u6 => led <= "00000010" ; 47 when s7 => led <= "00000001" ; 48 when d6 => led <= "00000010" ; 49 when d5 => led <= "00000100" ; 50 when d4 => led <= "00001000" ; 51 when d3 => led <= "00010000" ; 52 when d2 => led <= "00100000" ; 53 when d1 => led <= "01000000" ; 54 end case; 55 end process ; 56 57 end behavioral; Fri Jul 13 01:35:32 2001 comparate.vhd page 1 2 use IEEE.TD_LOGI_1164.LL; 3 4 entity comparate is 5 Port ( a,b : in std_logic_vector(3 downto 0); 6 eq : out std_logic); 7 end comparate; 8 9 architecture behavioral of comparate is 10 11 12 eq <= 1 when a = b else 0 ; 13 end behavioral;
Fri Jul 13 02:03:12 2001 kr.vhd page 1 2 use IEEE.TD_LOGI_1164.LL; 3 4 entity kr is 5 Port ( clk : in std_logic; 6 inp : in std_logic_vector(3 downto 0); 7 led : out std_logic_vector(7 downto 0); 8 mon : out std_logic_vector(3 downto 0)); 9 end kr; 10 11 architecture kr1 of kr is 12 component counter is 13 Port ( clk,rst : in std_logic; 14 val : out std_logic_vector(3 downto 0)); 15 end component; 16 component comparate is 17 Port ( a,b : in std_logic_vector(3 downto 0); 18 eq : out std_logic); 19 end component; 20 component rotator is 21 Port ( pulse : in std_logic; 22 led : out std_logic_vector(7 downto 0)); 23 end component; 24 signal countval : std_logic_vector(3 downto 0); 25 signal pulse : std_logic ; 26 27 T1 : counter port map (clk,pulse,countval) ; 28 P1 : comparate port map (countval,inp,pulse) ; 29 RT1 : rotator port map (pulse,led) ; 30 mon <= countval ; 31 end kr1; Fri Jul 13 01:33:42 2001 counter.vhd page 1 2 use IEEE.TD_LOGI_1164.LL; 3 use IEEE.TD_LOGI_UNIGNED.LL; 4 5 entity counter is 6 Port ( clk,rst : in std_logic; 7 val : out std_logic_vector(3 downto 0)); 8 end counter; 9 10 architecture ct1 of counter is 11 12 signal value : std_logic_vector(3 downto 0) ; 13 14 15 16 process(clk) 17 18 if (clk event and clk= 1 ) then 19 if rst= 1 then 20 value <= "0000" ; 21 else 22 value <= value + "0001" ; 23 end if; 24 end if ; 25 end process ; 26 27 val <= value ; 28 29 end ct1;