第 4 回 VHDL 演習 2 プロセス文とステートマシン プロセス文を用いるステートマシンの記述について学ぶ 回路 6 バイナリカウンタ (Fig.4-1) バイナリカウンタを設計し, クロック信号に同期して動作する同期式回路の動作を学ぶ ⅰ) リスト 4-1 のコードを理解してから, コンパイル, ダウンロードする ⅱ) 実験基板上のディップスイッチを用いて, 発生するクロック周波数を 1Hz に指定する SW12(RESET) が の入力となる LED の出力からカウンタの動作を確認せよ ( 情報科学実習 Ⅱ デジタルシステムの開発 の課題 7 とは,VHDL コードが若干異なる ) リスト 4-1 バイナリカウンタ library IEEE; entity B_CNT is port(,: in std_logic; Q: out std_logic_vector(3 downto 0) ); end B_CNT; architecture Behavioral of B_CNT is signal CNT: std_logic_vector(3 downto 0); Q <= not CNT; process(,) if = '0' then CNT <= (others => '0'); if 'event and = '1' then if CNT = 1111 then CNT <= 0000 ; CNT <= CNT +1; end Behavioral; std_logic_vector 型への全て同じ値の代入 std_logic_vector 型の信号に全て同じ値を代入したい場合, 以下の様に記述する 信号名 <= (others=> 値 ); 記述を再利用する際など, ビット幅が変化しても記述を変化させずに 0 を示す値などを代入することができる 同期式回路の記述クロック信号の立ち上がり時に動作する回路は,process 文の中で以下の様に記述する if クロック信号 event and クロック信号 = 1 then クロック信号立ち上がり時の動作を記述する文 ; クロックの立ち下り時に動作する場合は 1 を 0 とする クロック周波数の指定実験基盤では, 基板上のディップスイッチで発生するクロック周波数を変更することができる 周波数 1Hz の場合 SW3,SW4 を OFF, それ以外を ON if then 構文 4-Bit Register 4 Q[3:0] if 条件 then 条件成立の時の処理 条件不成立の時の処理 ; end if ; 二者択一の条件判断処理に使う Increment Fig4-1 バイナリカウンタ if then 構文その 2 if 条件 1 then 条件 1 成立の時の処理 ; elsif 条件 2 条件 2 成立の時の処理 ; elsif 条件 3 条件 3 成立の時の処理 ; elsif 条件 n 条件 n 成立の時の処理 ; 条件 1~n 全て不成立の時の処理 ; end if ; elsif(+if)e が無いことに注意 マイクロプロセッサとインタフェース講義資料 4-1
回路 7 レジスタ ( 同期イネーブル及び非同期リセット付 ) 入力データを保持するのに用いる記憶素子 使用用途として, マイクロプロセッサ内部で演算や実行状態の保持に用いられる Fig4-2 のレジスタは, クロック信号の立ち上がり時かつ 信号が 1 のときに外部からの 1 ビットデータ R をレジスタ内部に取り込み, 後続のデータが取り込まれるまでレジスタ内部状態を保持する 表 4-1 レジスタの状態遷移表 R S T C L K E N Q 0 0 1 0 Q 1 1 R 1 以外 Q R Register Q Fig4-2 レジスタ リスト 4-2 レジスタの VHDL コード library IEEE; entity Register is port(,, R, : in std_logic; Q : out std_logic ); end Register; architecture Behavioral of Register is process(,) if = 0 then Q<= 0 ; elsif event and = 1 then if = 1 then Q<=R; Q<=Q; end Behavioral; クロック信号 の立ち上がり時に 信号が 1 であれば, 外部信号 R を取り込み, そうでなければ取り込んだ値を保持する! 4-2 マイクロプロセッサとインタフェース講義資料
演習 1 リスト 4-3 に示す VHDL コードが示すハードウェアの回路図を完成させよ リスト 4-3 演習 4 のハードウェア library IEEE; entity Hard is port ( : in std_logic; : in std_logic; : in std_logic; D : in std_logic; SEL: in std_logic; Q0, Q1, Q2, Q3 : out std_logic); end Hard; architecture Behavioral of Hard is signal din, e, f, g, h, i : std_logic; process(,) -- register0 if ='0' then e<='0'; elsif 'event and ='1' then if ='1' then e<=din; e<=e; process(,) -- register1 if ='0' then f<='0'; elsif 'event and ='1' then if ='1' then f<=e; f<=f; 続く process(,) -- register2 if ='0' then g<='0'; elsif 'event and ='1' then if ='1' then g<=f; g<=g; process(,) -- register3 if ='0' then h<='0'; elsif 'event and ='1' then if ='1' then h<=g; h<=h; process(sel,d,i) -- multiplexer if SEL='1' then din <= D; din <= i; i <= h; Q0 <= e; Q1 <= f; Q2 <= g; Q3 <= h; end Behavioral; D マルチプレクサ din SEL i R Q Register0 e f g R Q R Q R Q Register1 Register2 Register3 h Fig4-3 演習 1 の回路 ( 未完成 ) Q0 Q1 Q2 Q3 マイクロプロセッサとインタフェース講義資料 4-3
ちょっと複雑なステートマシン ステートマシン ( 状態遷移回路 ) は, 外部信号によって内部の状態が遷移する順序回路である マイ クロプロセッサ等の各種デジタルシステムに搭載されている制御回路はステートマシンで実現される 回路 8 ステートマシンを用いた 2 ビットのアップダウンカウンタ リスト 4-4 ステートマシンを用いた 2 ビットのアップダウンカウンタの VHDL コード library IEEE; これを操作してアップ / ダウン entity State_cnt is カウントを切り替える port (, UP_DOWN : in std_logic; end State_cnt; CNT : out std_logic_vector(1 downto 0) ); architecture RTL of State_cnt is signal sel : std_logic_vector(1 downto 0); signal state : std_logic_vector(1 downto 0); process() if 'event and ='1' then case state is when "00" => if UP_DOWN='1' then state <="01"; state <="11"; when "01" => if UP_DOWN='1' then state <="10"; state <="00"; when "10" => if UP_DOWN='1' then state <="11"; state <="01"; when "11" => if UP_DOWN='1' then state <="00"; state <="10"; when others => end case; state <="00"; 状態の値を保持するステートレジスタ ステートマシンの記述 sel<= state; process(sel) case sel is when "00" => CNT<="00"; when "01" => CNT <="01"; when "10" => CNT <="10"; when "11" => CNT <="11"; when others=> CNT <="00"; end case; end RTL; UP_DOWN='1' UP_DOWN='0' UP_DOWN='0' UP_DOWN='0' UP_DOWN='0' 00 01 10 CNT=0 を出力 UP_DOWN='1' CNT=1 を出力 UP_DOWN='1' 状態に従って CNT に信号を出力する デコーダ CNT=2 を出力 UP_DOWN='1' 11 CNT=3 を出力 Fig4-4 リスト 4-4 の状態遷移図 4-4 マイクロプロセッサとインタフェース講義資料
演習 2 Fig.4-5 はタイマーシステムの構成図である このタイマーシステムは,1~8 までの数字キーを押し て時間を設定した後 START ボタンを押すとカウントダウンが行われ残り時間が 7 セグメント LED に表示 される 設定時間が経過するとスピーカからアラーム音が鳴る アラーム音は 10 回断続的に鳴るか STOP ボタンを押すかで, 鳴り止む その後再度数字キーにより時間を設定後,START ボタンを押せばタイマ ー機能が同様に繰り返される また, ボタンを押すと全ての機能動作がリセットされる 6 7 8 3 4 5 1 2 START クロック生成回路 数字キー VAL 制御回路 (State_timer) TIMER 7-SEG LED Decoder STOP Fig.4-5 タイマーシステム START STOP START STOP ALARM_ Fig.4-6 タイマーシステムの内部構成 Fig.4-6 はタイマーシステムの内部構成である その中の制御回路 (State_timer) は周辺回路全体の制 御を行う この制御回路を実現するためにステートマシン導入し,VHDL により設計した 制御回路の VHDL コードをリスト 4-5 に示す タイマーの入出力信号の説明 : 外部から入力する基準クロック信号 [ 入力,1ビット] VAL: 数字キーインタフェースからの設置値入力 [ 入力,3ビット] START: タイマーのスタートボタン入力 [ 入力,1ビット] STOP: タイマーのストップボタン入力 [ 入力,1ビット] : タイマーのリセットボタン入力 [ 入力,1ビット] TIMER: タイマー表示出力 [ 出力,4ビット] ALARM_: アラーム許可信号 [ 出力,1ビット] ( スピーカ回路はALARM_=1 で鳴るように設計されている ) マイクロプロセッサとインタフェース講義資料 4-5
リスト 4-5 制御回路の VHDL コード Library IEEE; entity State_timer is Port ( : in std_logic; : in std_logic; START : in std_logic; STOP end State_timer; : in std_logic; VAL : in std_logic_vector(2 downto 0); TIMER : out std_logic_vector(3 downto 0); ALARM_ : out std_logic); architecture Behavioral of State_timer is process(,) signal state : std_logic_vector(1 downto 0); signal t_cnt_en : std_logic; signal t_cnt : std_logic_vector(2 downto 0); signal a_cnt_en : std_logic; signal a_cnt : std_logic_vector(3 downto 0); signal rd_en : std_logic; if ='1' then state<=(others=>'0'); elsif 'event and ='1' then case state is when "00" => if START='1' then state<="01"; when "01" => state<="00"; if t_cnt="000" then when "10" => state<="10"; state<="01"; if STOP='1' then when "11" => state<="00"; state<="11"; if STOP='1' or a_cnt="1001" then state<="00"; state<="10"; when others => end case; state<="00"; process(,rd_en,val) if rd_en='1' then t_cnt<=val; elsif 'event and ='1' then if t_cnt_en='1' then if t_cnt="000" then t_cnt<=t_cnt; t_cnt<=t_cnt-'1'; t_cnt<=t_cnt; rd_en <= '1' when state="00" '0'; t_cnt_en<='1' when state="01" '0'; TIMER <=t_cnt; process(,) if ='1' then a_cnt<= (others=>'0'); elsif 'event and ='1' then if a_cnt_en = '1' then if a_cnt = "1001" then a_cnt <= (others=>'0'); a_cnt <= a_cnt+'1'; a_cnt <= a_cnt; a_cnt_en <='1' when state="11" '0'; ALARM_<='1' when state="10" '0'; end Behavioral; 4-6 マイクロプロセッサとインタフェース講義資料
リスト 4-5 について ここで使われているステートマシンの状態遷移図を Fig.4-4 を参考にし,01,10 などのステー トを付け加えて完成してください また 各ステートは何を意味するかも書きなさい リスト 4-5 の状態遷移図 = 1 00 START= 0 START= 1 各ステートの意味 ステート 00 タイマー時間入力 タイマーの設定時間を数字キーから入力し,START ボタンが押されてタイマーが動作するのを待つ ステート 01 タイマー動作 タイマーが動作し 設定した時間になるまでカウンタがカウントダウンを行い, その時の値が TIMER 信号を通じて 7 セグメント LED に表示される ステート 10 アラーム音 ON タイマーの設定時間が経過し スピーカからアラーム音を鳴らすためにスピーカ駆動信号 ARARM_ を 1 にしてスピーカへ出力し アラームを鳴らす また STOP 信号が 押された ( 1 になった ) 時アラーム音を鳴らすのをやめてタイマー時間乳慮おく状態へ戻る ステート 11 アラーム音 OFF 今まで ON になっていたアラーム音を OFF にする このときアラーム音が断続的に 10 回鳴るか STOP 信号が押された ( 1 になった ) 時タイマー時間入力状態へ戻る マイクロプロセッサとインタフェース講義資料 4-7
演習問題の解答例 リスト 4-5 の状態遷移図 = 1 00 START= 0 01 START= 1 t_cnt= 000 t_cnt 000 STOP= 1 STOP= 0 and a_cnt 1001 STOP= 1 or a_cnt= 1001 10 11 STOP= 0 各ステートの意味 ステート 00 タイマー時間入力タイマーの設定時間を数字キーから入力し,START ボタンが押されてタイマーが動作するのを待つ ステート 01 タイマー動作 タイマーが動作し 設定した時間になるまでカウンタがカウントダウンを行い, その時の値が TIMER 信号を通じて 7 セグメント LED に表示される ステート 10 アラーム音 ON タイマーの設定時間が経過し スピーカからアラーム音を鳴らすためにスピーカ駆動信号 ARARM_ を 1 にしてスピーカへ出力し アラームを鳴らす また STOP 信号が 押された ( 1 になった ) 時アラーム音を鳴らすのをやめてタイマー時間入力状態へ戻る ステート 11 アラーム音 OFF 今まで ON になっていたアラーム音を OFF にする このときアラーム音が断続的に 10 回鳴るか STOP 信号が押された ( 1 になった ) 時タイマー時間入力状態へ戻る 4-8 マイクロプロセッサとインタフェース講義資料