2014/09/28 版 組み込みシステム基礎 ~ VHDL 入門 ~ 鳥取大学 工学部 知能情報工学科 菅原 一孔 1 HDL設計の手順 設計 仕様 RTL 設計 RTL 検証 ok? HDLで回路を記述 HDLのまま動作確認: 機能の検証 RTL:Register Transfer Level レジスタ間の転送関係を表現したレベル • 機能を,代入,if, case などで表現したもの • 論理合成できる記述 • クロックを意識した記述 論理 合成 ゲー トレ ベル 検証 レイアウト ツールへ ok? HDLから回路へ変換 回路で動作確認: タイミングの検証 ゲートレベル:Gate Level • ゲート回路やフリップフロップ等 の接続関係を示したもの • ネットリストともいう 2 VHDLの書き方 3 データタイプ std_logic integer '0' 0 'W' 弱い不定値 '1' 1 'L' 弱い0 'U' 未定値 'H' 弱い1 'X' 不定値 '-' ドントケア 'Z' ハイ イン ピーダンス boolean 2 で表される符 号付の値 -2 true 真 false 偽 ~ 2 -1 注意:'X'は小文字 'x'ではエラー 回路記述で使うデータタイプ テストベンチで使うデータタイプ std_logic 1ビット time 時間 std_logic_vector 複数ビット real 実数 integer 整数 character 文字 boolean 論理値(真か偽) string 文字列 text ファイルアクセス 4 VHDLによる回路記述の基本構成 CIRCUIT.vhd : エンティティ名はファイル名と一致 ライブラリ宣言 バッケージ呼び出し library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all エンティティ宣言 entity エンティティ名 is 入出力ピンの記述; end エンティティ名; entity CIRCUIT is port(入出力ピンの記述 ); end CIRCUIT; アーキテクチャ宣言 architecture アーキテクチャ名 of エンティティ名 is 回路の動作の記述; endアーキテクチャ名; architecture RTL of CIRCUIT is 回路の動作の記述; end RTL; 5 エンティティ宣言 ~入出力端子の宣言 port文 port(信号名,信号名:方向 データタイプ(型); 信号名,信号名:方向 データタイプ(型); … 信号名,信号名:方向 データタイプ(型)); 例 3 A X B Y CIRC1 6 entity CIRC1 is port( A : in std_logic; B : in std_logic_vector(2 downto 0); X : out std_logic; Y : out std_logic_vector(5 downto 0)); end CIRC1; 6 port文の方向とデータタイプ(型) 方向 データ タイプ (型) in 入力 out 出力 (内部参照は不可) std_logic inout 双方向 buffer 出力 (内部参照可) std_logic_vector linkage 方向指定なし 注意: outの指定したポートは内部で参照できない ⇒ 式の右辺には書けない 例: port (Q:out std_logic); Q <= Q + '1'; 7 アーキテクチャ宣言 ~回路構造の記述 architecture アーキテクチャ名 of エンティティ名 is -- process文を使わない組合せ回路の記述; 同時信号代入文; 下位コンポーネント宣言; -- component文 -- prosess文を使った組合せ回路の記述 *1 process(センシティビティリスト) begin 回路記述 end process; -- 順序回路の記述 *2 process(センシティビティリスト) begin 回路記述 end process; end アーキテクチャ名; 8 アーキテクチャ宣言の種類 A: process文を使わない回路記述 ⇒ 同時信号代入文による組合せ回路の記述 B: process文を使った回路記述 ⇒ B1 順次信号代入文による組合せ回路の記述 B2 順序回路の記述 ① 回路の構造による回路記述 ② 回路の動作による回路記述 ③ 階層構造による回路記述 9 ⇒ component文 :下位コンポーネント接続 信号,変数,定数 文法 信号 signal 信号名,信号名,...: データタイプ [:= 初期] ; 宣言場所 アーキテクチャの宣言部 代入記号 <= 文法 変数 定数 variable 変数名,変数名,...: データタイプ [:= 初期] ; 宣言場所 プロセス文の宣言部 代入記号 := 文法 宣言場所 constant 定数名,定数名,...: データタイプ [:= 初期] ; アーキテクチャ,プロセス文の宣言部 10 演算子 論理演算子 算術演算子 関係演算子 not NOT + 加算 プラス記号 = 等しい and AND - 減算 マイナス記号 /= 等しくない or OR * 乗算 < 小さい / 除算 <= 小さいか等しい nand NAND nor NOR mod モジュロー > 大きい xor ExOR rem 剰余 >= 大きいか等しい ** 累乗 xnor ExNOR 演算子 方向 sll 左 絶対値 srl 右 連接 sla 左 sra 右 rol 左 ror 右 その他の演算子 abs & シフト演算子 注意: 実際の設計では赤字は使用せず 動作 論理シフト シフトもとには0 算術シフト シフトもとは不変 回転シフト 11 LSBとMSBが結合して回転 信号代入文 信号代入文 否定 : not 信号名 2項演算 : 信号名 <= 信号名 二項演算子 2項演算子 信号名 and or 例 Q<=(D1 and S) or (D0 and (not S)); nand nor xor コメント xnor -- (ハイフン2つ,複数行にわたるコメントの記述はない) 信号名などの識別子 大文字,小文字は区別しない 最初は英文字 英字,数字,アンダースコア(最後の文字や,連続した使用はできない) 12 演算子の優先順位 高 優先 順位 低 論理否定など not ** 乗除算,剰余 * / mod rem 符号 + - 加減算,連接 + - シフト演算 sll srl sla 関係演算 = /= < <= 論理演算 and or nand abs & sra rol ror > >= nor xor xnor 注意: 演算順で結果が異なる場合文法エラー 例) signal A,B,C,Q: std_logic; Q<=A xor B xor C; --文法エラー 正しくは Q<=(A xor B) xor C; Q<=A xor (B xor C); 13 集合体 ()で囲まれ,カンマで区切られた要素の集合 signal EN:std_logic; signal A,B:std_logic_vector(3 downto 0); A<=(EN,EN,'0',EN); A<=(3=>EN,2=>EN,1=>'0',0=>EN); A<=EN & EN & '0' & EN; A<=(3 downto 0 =>EN); A<=EN & EN & EN & EN; B<=('0','0','0','1'); B<=(0=>'1',others=>'0'); B<="0001"; 14 アトリビュート (属性) 信号や変数に付加された値 シングルクオートにより,値を得る アトリビュート S'event S'stable 対象 信号 A'left A'right A'range A'length 配列型の信号, 変数,定数 意味 変化があったか 値 安定していたか true, false 最左ビットの位置 整数 最右ビットの位置 ビット幅の範囲 レンジ ビット幅 整数 例) signal A:std_logic_vector(15 downto 0); A'left 15 A'right 0 A'range 15 downto 0 A'length 16 15 A: process文を使わない組合せ回路 16 A:3つの信号代入文(1),(2) SUBST1.vhd SUBST2.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity SUBST1 is port(A0:in std_logic; A1:in std_logic; Z0:out std_logic; Z1:out std_logic); end SUBST1; entity SUBST2 is port(A0,A1:in std_logic; Z0:Z1:out std_logic); end SUBST2; architecture Behavioral of SUBST1 is begin Z0<=A0; Z1<=A1; end Behavioral; architecture Behavioral of SUBST2 is begin Z0<=A0; Z1<=A1; end Behavioral; 17 A: 3つの信号代入文(3) SUBST3.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity SUBST3 is port(A:in std_logic vector(1 downto 0); Z:out std_logic vector(1 downto 0)); end SUBST3; architecture Behavioral of SUBST3 is begin Z<=A; end Behavioral; 2 A(1:0) Z(1:0) 2 18 signal文 ~信号の宣言 signal 信号名:データタイプ(型) エンティティ宣言 アーキテクチャ宣言① library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; architecture Behavioral of SUBST is begin Z<=(A and B) or (not C); end Behavioral; entity SUBST is port(A,B,C:in std_logic; Z:out std_logic); end SUBST; アーキテクチャ宣言② architecture Behavioral of SUBST is signal X,Y:std_logic; begin 内部信号 X<= A and B; signal文 Y<= not C; Z<= X or Y; end Behavioral; 19 半加算器 ~構造による回路記述 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity HA is port(A,B:in std_logic; S,C:out std_logic); end HA; architecture Behavioral of HA is begin S<= A xor B; C<= A and B; end Behavioral; 20 半加算器 ~動作による回路記述 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity HA is port(A,B:in std_logic; S,C:out std_logic); end HA; architecture Behavioral of HA is signal SUM:std_logic_vector(1 downto 0); begin SUM<=('0' & A) + ('0' & B); S<= SUM(0); C<= SUM(1); end Behavioral; 連結演算子'&' ビット毎の信号代入 21 全加算器 ~構造による回路記述 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity FA is port(A,B,CI:in std_logic; S,CO:out std_logic); end FA; architecture Behavioral of FA is signal S_O,C_O,C_I:std_logic; begin S_O<= A xor B; C_O<= A and B; C_I<= CI and S_O; S<=CI xor S_O; CO<=C_I or C_O; end Behavioral; 22 全加算器 ~動作による回路記述 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity FA is port(A,B,CI:in std_logic; S,CO:out std_logic); end FA; architecture Behavioral of FA is signal SUM:std_logic_vector(1 downto 0); begin SUM<=('0' & A) + ('0' & B) + ('0' & CI); S<= SUM(0); CO<= SUM(1); end Behavioral; 23 加算回路 4 5 A 4 B C 右辺と左辺のビット幅が異なると文法エラー 例 C<=A+B; A,BとCのビット幅が異なる 符号付回路 (符号拡張) C<=(A(A'left) & A)+(B(B'left) & B); 符号なし回路 C<=('0' & A)+('0' & B); 24 ③: 階層記述 25 全加算器 階層記述 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity FA is port(A,B,CI:in std_logic; S,CO:out std_logic); end FA; architecture Behavioral of FA is component HA is port(A,B:in std_logic; S,C:out std_logic); end component; signal C1,C2,S1:std_logic; begin U1:HA port map(A,B,S1,C1); U2:HA port map(S1,CI,S,C2); CO<=C1 or C2; end Behavioral; 26 4ビット加算器 階層記述 エンティティ宣言 エンティティ宣言 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity ADD_4 is port(A,B:in std_logic_vector(3 downto 0); CI:in std_logic; Z:out std_logic_vector(3 downto 0); CO:out std_logic); end ADD_4; B(0) A(0) CI A S B CI CO B(1) A(1) C1 Z(0) A S B CI CO B(2) A(2) C2 Z(1) A S B CI CO B(3) A(3) C3 Z(2) A S B CI CO CO Z(3) 27 4ビット加算器 階層記述 アーキテクチャ宣言 アーキテクチャ宣言 architecture Behavioral of ADD_4 is component FA is port(A,B,CI:in std_logic; S,CO:out std_logic); end component; signal C1,C2,C3:std_logic; begin U3:FA port map(A(3),B(3),C3,Z(3),CO); U2:FA port map(A(2),B(2),C2,Z(2),C3); U1:FA port map(A(1),B(1),C1,Z(1),C2); U0:FA port map(A(0),B(0),CI,Z(0),C1); end Behavioral; 28 4ビットセレクタ ~階層構造による回路の記述~ 29 1ビットセレクタ ~構造による回路記述~ D0 Q D1 S S Q 0 D0 1 D1 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity SEL2TO1 is port(D0,D1,S:in std_logic; Q:out std_logic); end SEL2TO1; architecture RTL of SEL2TO1 is begin Q<=(D1 and S) or (D0 and (not S)); end RTL; 30 4ビットセレクタ コンポーネント:順番による接続 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; ライブラリ宣言 entity SEL4_CMP is port(DL,DH:in std_logic_vector(3 downto 0); SEL:in std_logic; DOUT:out std_logic_vector(3 downto 0)); end SEL4_CMP; エンティティ宣言 (入出力の定義) architecture RTL of SEL4_CMP is componet SEL2TO1 port(DO,DI,S:in std_logic; Q:out std_logic); begin S0:SEL2TO1 port map(DL(0),DH(0),SEL,DOUT(0)); S1:SEL2TO1 port map(DL(1),DH(1),SEL,DOUT(1)); S2:SEL2TO1 port map(DL(2),DH(2),SEL,DOUT(2)); S3:SEL2TO1 port map(DL(3),DH(3),SEL,DOUT(3)); end RTL; アーキテクチャ (構造,動作の記述) 順番による接続 31 4ビットセレクタ コンポーネント:名前による接続 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity SEL4 is port(DL,DH:in std_logic_vector(3 downto 0); SEL:in std_logic; DOUT:out std_logic_vector(3 downto 0)); end SEL4; architecture RTL of SEL4 is component SEL2TO1 port(D0,D1,S:in std_logic; Q:out std_logic); 名前による接続 end component; 定義側信号名=>接続信号名 begin S0:SEL2TO1 port map(D0=>DL(0),D1=>DH(0),S=>SEL,Q=>DOUT(0)); S1:SEL2TO1 port map(D0=>DL(1),D1=>DH(1),S=>SEL,Q=>DOUT(1)); S2:SEL2TO1 port map(D0=>DL(2),D1=>DH(2),S=>SEL,Q=>DOUT(2)); S3:SEL2TO1 port map(D0=>DL(3),D1=>DH(3),S=>SEL,Q=>DOUT(3)); 32 end RTL; 4ビットセレクタ ~動作による回路記述~ when文 ~条件付き信号代入文 信号名 <= 式1 when 条件式 else 式2; 条件式が真 ... 式1を代入 条件式が偽 ... 式2を代入 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity SEL4_IF is port(DL,DH:in std_logic_vector(3 downto 0); SEL:in std_logic; DOUT:out std_logic_vector(3 downto 0)); end SEL4_IF; architecture RTL of SEL4_IF is begin DOUT<=DL when SEL='0'else DH; end RTL; 注意:when文は 条件式や式1,2 として演算式を記 述できない プロセス文内では使用できない 33 ③: process文を使った組合せ回路 34 同時処理文と順次処理文 architecture ~ of ~ is ... begin 同時処理文 同時信号代入文 下位コンポーネント接続 プロセス文 when文 条件付き信号代入文 など end ~; 同時処理文:記述の順序にかかわらず,同時に 処理される architecture内に記述 順次処理文:記述順に処理される process文, procedure文内に記述 architecture ~ of ~ is ... begin ... process ... begin 順次処理文 順次信号代入文 変数代入文 if文 case when文 ループ文 など end process; 35 process文 [ラベル:] process [(センシティビティリスト)] 各種宣言 begin 順次処理文 end process [ラベル]; 記述例 (組合せ回路) 記述例 (順序回路) process(A,B) begin Q<=A+B; end process process(CK,RST) begin if RST='1' then Q<='0'; elsif CK'event and CK='1' then Q<=D; end if; 注意: end process; センシティビティリストに は,クロックと非同期リ セットのみ 注意: すべての入力をセンシ ティビティリストに加える 36 動作による回路の記述 ~if 文~ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity SEL4_IF is port(DL,DH:in std_logic_vector(3 downto 0); SEL:in std_logic; DOUT:out std_logic_vector(3 downto 0)); end SEL4_IF; architecture RTL of SEL4_IF is begin process(DL,DH,SEL) begin if (SEL='0') then DOUT<=DL; else DOUT<=DH; end if; end process; end RTL; -- process文 37 動作による回路の記述 ~case when文~ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity SEL4_CASEWHEN is port(DL,DH:in std_logic_vector(3 downto 0); SEL:in std_logic; DOUT:out std_logic_vector(3 downto 0)); end SEL4_CASEWHEN; architecture RTL of SEL4_CASEWHEN is begin process(DL,DH,SEL) begin -- process文 case SEL is when '0' => DOUT<=DL; when '1' => DOUT<=DH; when others => DOUT<"XXXX"; end case; end process; end RTL; 38 if文とcase when文 if 条件式 then 順次処理文 [elsif 条件式 then 順次処理文] [elsif 条件式 then 順次処理文] ... [else 順次処理文] end if; 記述例 process(DL,DH,SEL) begin if (SEL='0') then DOUT<=DL; else DOUT<=DH; end if; end process; case 式 is when 選択 [|選択|選択|...] =>順次処理文 when 選択 [|選択|選択|...] =>順次処理文 ... end case; 注意: case文内の式には演算式 記述例 を記述できない process(DL,DH,SEL) begin case SEL is when '0' => DOUT<=DL; when '1' => DOUT<=DH; when others => DOUT<="XXXX"; end case; end process; 定数 選択 定数 to 定数 定数 downto 定数 others 39 多数決回路 A B C Q 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 architecture RTL of MAJORITY is signal TMP: std_logic_vector (2 downto 0); begin TMP<=A & B & C; process(TMP) begin case TMP is when "000" => Q<='0'; when "001" => Q<='0'; when "010" => Q<='0'; when "011" => Q<='1'; when "100" => Q<='0'; when "101" => Q<='1'; when "110" => Q<='1'; when "111" => Q<='1'; when others => Q<='x'; end case; end process; end RTL; 40 プロセス文による組合せ回路 DIN (1) (0) DOUT (3) (2) (1) (0) DIN DOUT 00 0001 01 0010 10 0100 11 1000 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity DEC2TO4 is port(DIN:in std_logic_vector(1 downto 0); DOUT:out std_logic_vector(3 downto 0)); end DEC2TO4; architecture RTL of DEC2TO4 is begin process(DIN) begin case DIN is when "00" => DOUT<="0001"; when "01" => DOUT<="0010"; when "10" => DOUT<="0100"; when "11" => DOUT<="1000"; end case; end process; end RTL; 41 process文による順序回路の記述 42 D-FF ポジティブエッジトリガ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; D Q CK 注意: センシティビティビットには,D を含まない entity D_FF is port(CK,D:in std_logic; Q:out std_logic); end D_FF; architecture RTL of D_FF is begin process(CK) begin if (CK'event and CK='1') then Q<=D; end if; end process; end RTL; 43 同期リセット付 D_FF library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; D Q CK RST 注意: センシティビティビットには,D やRSTを含まない entity D_FF_RST is port(CK,RST,D:in std_logic; Q:out std_logic); end D_FF_RST; architecture RTL of D_FF_RST is begin process(CK) begin if (CK'event and CK='1') then if (RST='0') then Q<='0'; else Q<=D; end if; end if; end process; end RTL; 44 非同期リセット付 D-FF library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; D Q CK RST entity D_FF_RST is port(CK,RST,D:in std_logic; Q:out std_logic); end D_FF_RST; architecture RTL of D_FF_RST is begin process(CK,RST) begin if (RST='0') then Q<='0'; elsif (CK'event and CK='1') then Q<=D; end if; end process; end RTL; 45 SR_FF entity SR_FF is port(S,R,CK:in std_logic; Q:out std_logic); end SR_FF; S Q CK R architecture RTL of SR_FF is signal SR:std_logic_vector(1 down to 0); begin SR<=(S & R); process(CK) begin if (CK'event and CK='1') then case SR is when "01" => Q<='0'; when "10" => Q<='1'; when others => null; end case; end if; end process; end RTL; ライブラリ宣言は省略 46 JK_FF J entity JK_FF is port (CK,J,K:in std_logic; Q,Qnot:out std_logic); end JK_FF; Q architecture Behavioral of JK_FF is signal JK:std_logic_vector(1 downto 0); signal TMP:std_logic; CK K J K Q 0 0 Q 0 1 0 1 0 1 1 1 Q ライブラリ宣言は省略 begin JK<=J&K; process(CK) begin if(CK'event and CK='1') then case JK is when "01" => TMP<='0'; when "10" => TMP<='1'; when "11" => TMP<=not TMP; when others => null; end case; end if; end process; Q<=TMP; Qnot<=not TMP; end Behavioral; 47 4ビットシリアルインパラレルアウトシフトレジスタ entity SINPOUT4 is port(D,CK:in std_logic; RST:out std_logic; Q:out std_logic_vector(3 downto 0)); end SINPOUT4; architecture RTL of SINPOUT4 is signal WORK:std_logic_vector(3 downto 0); begin process(CK) begin if (RST='0') then WORK<="0000"; else if (CK'event and CK='1') then WORK(0) <= D; WORK(1) <= WORK(0); WORK(2) <= WORK(1); WORK(3) <= WORK(2); end if; end if; end process; Q<=WORK; end RTL; 以下,ライブラリ宣言は省略 注意 WORK(0) WORK(1) WORK(2) WORK(3) <= <= <= <= D; WORK(0); WORK(1); WORK(2); 48 4ビットカウンタ (リセット機能付き) 49 4ビットカウンタの構造記述 CNT4 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity CNT4 is port (CI:in std_logic; CO:out std_logic_vector(3 downto 0)); end CNT4; architecture Behavioral of CNT4 is signal Q:std_logic_vector(3 downto 0); signal Qnot:std_logic_vector(3 downto 0); signal S2,S3:std_logic; component JK_FF port (CK,J,K:in std_logic; Q,Qnot:out std_logic); end component; begin S2<=Q(0) and Q(1); S3<=S2 and Q(2); U0:JK_FF port map(CI,'1','1',Q(0),Qnot(0)); U1:JK_FF port map(CI,Q(0),Q(0),Q(1),Qnot(1)); U2:JK_FF port map(CI,S2,S2,Q(2),Qnot(2)); U3:JK_FF port map(CI,S3,S3,Q(3),Qnot(3)); CO(3)<=Q(3); CO(2)<=Q(2); CO(1)<=Q(1); CO(0)<=Q(0); end Behavioral; 50 カウンタ出力のLED表示 CNT7SEG entity CNT7SEG is port (CI:in std_logic; OUT7:out std_logic_vector(7 downto 0)); end CNT7SEG; architecture Behavioral of CNT7SEG is signal CO:std_logic_vector(3 downto 0); signal DIV:std_logic_vector(22 downto 0); signal DIVout:std_logic; component CNT4 is port (CI:in std_logic; CO:out std_logic_vector(3 downto 0)); end component; component SEG7DEC is port(inp : in std_logic_vector(3 downto 0); outp : out std_logic_vector(7 downto 0)); end component; begin DIVout<=DIV(1); process(CI) begin if CI'event and CI='1' then DIV<=DIV+1; end if; end process; U0:CNT4 port map(DIVout,CO); U1:SEG7DEC port map(CO,OUT7); end Behavioral; 51 4ビットカウンタ(リセット機能付き)の動作記述 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity CNT4 is port(CLK,RST:in std_logic; Q:out std_logic_vector(3 downto 0)); end CNT4; architecture RTL of CNT4 is signal Q_REG:std_logic_vector(3 downto 0); begin Q<=Q_REG; 繰り返し process(CLK,RST) if RST='1' then Q_REG<="0000"; elsif clk'event and CLK='1' then Q_REG<=Q_REG+"0001" end if; end process; end RTL; 内部信号の宣言 カウンタのリセット リセット信号の入力による, 非同期リセット クロックの立ち上がりの検出 カウントアップ Q<=Q+“0001”とは書けない のでQ_REGを宣言して使用 52 10進カウンタ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity COUNT10 is port(CLK,RST:in std_logic; Q:out std_logic_vector(3 downto 0)); end COUNT10; architecture RTL of COUNT10 is signal Q_REG:std_logic_vector(3 downto 0); begin Q<=Q_REG; process(CLK,RST) begin if RST='1' then Q_REG<="0000"; elsif CLK'event and CLK='1' then if Q_REG="1001" then Q_REG<="0000"; else Q_REG<=Q_REG + "0001"; endif; end if; end process; end RTL; 53 4ビットラッチ ~下位コンポーネント接続 entity LATCH4 is port(CLK,RST:in std_logic; D:in std_logic_vector(3 downto 0); Q:out std_logic_vector(3 downto0)); end LATCH4; architecture RTL of LATCH4 is component D_FF -- コンポーネント宣言 port(CK,RB,D:in std_logic; Q:out std_logic); end component; begin 順番による接続 DF0:D_FF port map(CLK,RST,D(0),Q(0); DF1:D_FF port map(CLK,RST,D(1),Q(1); DF2:D_FF port map(CK=>CLK,RB=>RST,D=>D(2),Q=>Q(2)); DF3:D_FF port map(CK=>CLK,RB=>RST,D=>D(3),Q=>Q(3)); end RTL; 名前による接続 インスタンス名:コンポーネント名 port map (ポートリスト); 54 ALU,アキュムレータ entity ALU_ACC is port(A:out std_logic_vector(15 downto 0); B:in std_logic_vector(15 downto 0); CND:in std_logic_vector(2 downto 0); CLK,E:in std_logic); end ALU_ACC; architecture Behavioral of ALU_ACC is signal ACC:std_logic_vector(15 downto 0); begin A<=ACC; process(CLK) begin if CLK'event and CLK='1' then if E='1' then case CND is when "000" => ACC<=(15 downto 0=>'0'); when "001" => ACC<=B; when "010" => ACC<=ACC+B; when "011" => ACC<=ACC-B; when "100" => ACC<=ACC and B; when "101" => ACC<=ACC or B; when "110" => ACC<=ACC xor B; when "111" => ACC<=not ACC; when others => null; end case; end if; end if; end process; end Behavioral; 55 state machine 56 JK-FFによる3進カウンタ (状態遷移図) J1 /01 00 01 /00 /10 K1 Q1 Q0 0 0 1 1 Q1 Q0 0 1 0 x 0 x 1 1 x 1 x x 0 1 K1=1 J1=Q0 10 J0 Q1 Q0 Q1 Q0 J1 K1 J0 K0 0 0 0 1 0 x 1 x 0 1 1 0 1 x x 1 1 0 0 0 x 1 0 x 1 1 x x x x x x K0 Q1 Q0 0 1 Q1 Q0 0 1 0 0 x x 1 x x 1 1 x J0=Q1 K0=1 57 JK-FFによる3進カウンタ (回路図とVHDL記述) library IEEE; use IEEE.STD_LOGIC_1164.ALL; U1 J CI Q CO(1) CK K Q U0 J Q CK K Q CO(0) entity COUNTER_SYNC_3 is port (CI:in std_logic; CO:out std_logic_vector(1 downto 0)); end COUNTER_SYNC_3; architecture Behavioral of COUNTER_SYNC_3 is signal Q:std_logic_vector(1 downto 0); signal Qnot:std_logic_vector(1 downto 0); component JK_FF port (CK,J,K:in std_logic; Q,Qnot:out std_logic); end component; begin U1:JK_FF port map(CI,Q(0), '1',Q(1),Qnot(1)); U0:JK_FF port map(CI,Qnot(1), '1',Q(0),Qnot(0)); CO(1)<=Q(1); CO(0)<=Q(0); end Behavioral; 58 ステートマシンの記述(1) 信号,定数の宣言 ステート生成回路 信号,定数の宣言 architecture RTL of TRAY_ENCDEC is signal CUR:std_logic_vector(1 downto 0); signal NXT:std_logic_vector(1 downto 0); constant CLOSED:std_logic_vector(1 downto 0):="00"; constant OPENING:std_logic_vector(1 downto 0):="01"; constant OPENED:std_logic_vector(1 downto 0):="10"; constant CLOSING:std_logic_vector(1 downto 0):="11"; constant UNKNOWN:std_logic_vector(1 downto 0):="XX"; 59 ステートマシンの記述(2) ステート生成回路 ステート生成回路 begin process(CUR,BUTTON,FINOPN,FINCLS) begin case CUR is when CLOSED => if BUTTON='1' then NXT<=OPENING; else NXT<=CLOSED; end if; when OPENING => if FINOPN='1' then NXT<=OPENED; else NXT<=OPENING; end if; when OPENED => if BUTTON='1' then NXT<=CLOSING; else NXT<=OPENED; end if; when CLOSING => if FINCLS='1' then NXT<=CLOSED; else NXT<=CLOSING; end if; when others => NXT<=UNKNOWN; end case; end process; end RTL; 60 ステートマシンの記述(3) ステートレジスタと出力回路 ステートレジスタ process(CLK,RST) begin if RST='1' then CUR<=CLOSED; elsif CLK'event and CLK='1' then CUR<=NXT; end if; end process; モータ制御出力 MOTOR<='1' when CUR=OPENING or CUR=CLOSING else '0'; DIR<='1' when CUR=OPENING else '0'; 61 課題1:半減算器 HS 下位からの借りを考慮しない減算 X-Y X Y B D X Y B (借り) D (差) 0 0 0 0 0 1 1 0 1 1 0 0 ① 上の真理値表を完成させよ ② DとBをXとYで表せ. ③ 半減算器の構造をVHDLで記述せよ. 62 課題2:全減算器 FS 下位からの借りを考慮した減算 X-Y-BI 表1 X BO Y BI D 図1 X Y BI BO (借り) D (差) 0 0 0 0 0 0 0 0 1 1 1 -1 0 1 0 1 1 -1 0 1 1 1 0 -2 1 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 -1 63 課題2:全減算器 FS 表2 図1の全減算器の真理値表は表1で与え られることを知り,以下の問いに答え よ X Y BI B1 D1 B2 BO D 0 0 0 0 0 0 1 -1 ① 図1の全減算器が半減算器を用いて 図2で表すことができることを, 表2の真理値表を完成させて確認 せよ ② 全減算器の構造を半減算器を用い てVHDLで記述せよ. 0 1 0 -1 0 1 1 -2 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 -1 図2 64 略解1 X B Y D = X Y B (借り) D (差) 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 ⊕ = 65 略解2 1= 1= ⊕ 2= 1 = 1+ 2 = 1⊕ X Y BI B1 D1 B2 BO D 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 -1 0 1 0 1 1 0 1 1 -1 0 1 1 1 1 0 1 0 -2 1 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 -1 66 ファンクション 67 ファンクション architecture RTL of SEL4 function SELECTOR(L,H:std_logic_vector; S:std_logic) return std_logic_vector is begin if S='0' then return L; else return H; end if; end SELECTOR; begin DOUT<=SELECTOR(DL,DH,SEL); end RTL; 関数の定義 L,H,S:仮引数 関数の呼出し DL,DH,SEL:実引数 DOUT<=SELECTOR(L=>DL,H=>DH,S=>SEL); 68 ファンクションによる組合せ回路 2to4デコーダ DEC 2 DIN 4 D DOUT DIN DOUT 00 0001 01 0010 10 0100 11 1000 entity DEC2TO4_FUNC is port(DIN:in std_logic_vector(1 downto 0); DOUT:out std_logic_vector(3 downto 0)); end DEC2TO4_FUNC; architecture RTL of DEC2TO4_FUNC is function DEC(D:std_logic_vector(1 downto 0)) return std_logic_vector is begin case D is when "00" => return "0001"; when "01" => return "0010"; when "10" => return "0100"; when "11" => return "1000"; when others => return "XXXX"; end case; enc DEC; begin DOUT<=DEC(DIN); end RTL; 69 符号付回路 70 符号付 オフセット/リミッタ回路 DIN+OFFSET 20 DOUT -20 DIN+OFFSET DOUT >20 20 <-20 -20 上記以外 DIN+OFFSET library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_signed.all; entity OFTLMT is port(DIN:in std_logic_vector(5 downto 0); OFFSET:in std_logic_vector(2 downto 0); DOUT:out std_logic_vector(5 down to ); end OFLMT; architecture RTL of OFTLMT is constant UP_LMT:std_logic_vector(5 downto 0) :="010100"; constant LOW_LMT:std_logic_vector(5 downto 0) :="101100"; signal ADDOUT:std_logic_vector(6 downto 0); begin ADDOUT<=(DIN(5) & DIN) + OFFSET; process(ADDOUT) begin if ADDOUT>UP_LMT then DOUT<=UP_LMT; elsif ADDOUT<LOW_LMT then DOUT<=LOW_LMT; else DOUT<=ADDOUT(5 downto 0); end if; end process; 71 end RTL;
© Copyright 2024