ノ 26 第 5 章サププログラム 5.6 プロシージャ文 ・入出力パラメータ プロシージャ文は , ファンクション文と異なり返り値がないので return 文がありませ ん . そのかわりとしてパラメータ・リストに入出力の設定をします . リスト 5.8 の① , ②では " DIN ' , ' S ' は入力に , ' DOUT ' は出力に設定されています . この時 , 何も指定しないと入力心は ' constant ' として , 出力 ' ou じと入出力 ' inout " は "variable" としてコピーされます . プロシージャ文が終了すると , プロシージャ内で代入された出力および入出力が呼び出 し側の信号または変数にコピーされます . このとき , 入出力のパラメータに何も指定しな いと変数 ' variable ' になってしまい , 変数にしか値を代入できません . 呼び出し側で出 くリスト 5.7 > ピット長可変グレイ・コード・カウンタの記述 library IEEE; use IEEE. std 」 ogic—1164. all ; use WO 「 k. my—pac. a Ⅱ・ ent i ty is generic( K port ( CLK, T in std 」 ogic; i ntege 「 ① ' K' の値てビット長を変える COUNT : out std 」 ogic_vector(K-I 面柵 to の end GREYCOI.NT a 「 chi tecture RTL Of is signal COI-.NT Ⅲ : std 」 ogic—vector(K-1 downto の : begin COINT ← COI-NT. 」 N, process(CLK, 能 T ) beg i n if(RESET=' 1 ' ) then COI-NT Ⅲ← (others= 〉 ,0, ) ; eIsif(QK' event and CLK=' 1 ' ) then COINT Ⅲ← A Ⅵ ( CO 」 N ) : end i f , ②グレイ・ファンクションの呼び出し end process ; end RTL;
734 第 6 章 VHDL による回路設計 き込み , " RD " が℃ ' であれはクロックの立ち上がりエッジでデータを出力します . ASIC 内部でこの FIFO を使用する場合は , その他の回路が同期式で動作しているので , こでは , 同期式で FIFO を組み立て FIFO も同期式を用いるほうが多くなっています . てみます . ・回路構成 図 6.2 に同期式 FIFO の入出力を示します . 入力データ "DATA 工 N" と出力デー く図 6.2 〉同期式 FIFO の入出力 タ DATAIN 入力データ ( 可変 ) 書き込み信号 読み出し信号 CLK クロック信号 同期型 FIFO DATAOUT 出力デ - タ ( 可変 ) FULL 満杯検出信号 E M PTY 空検出信号 く図 6.3 〉同期式 FIFO のプロック図 DATA I N WR RD RAM K ビット ビット長 K WP 書き込みカウンタ RP 読み出しカウンタ SELECT DATAOUT K ビット ワード長ル IN—FULL IN-EMPTY FULL EMPTY
5.3 可変長デコーダ / 工ンコーダ 5.3 可変長テコーダ / 工ンコーダ ・デコーダの記述 2.4 節で case 文 , if 文を使用したデコーダ / ェンコーダの記述例を紹介しました . 7 ノ 9 本節 では , ピット長可変デコーダ / ェンコーダをファンクション文を使用して記述します . リスト 5.3 の①がデコーダの記述です . 2.4 節の記述例は負論理で書かれており , デコ ード・ピットのみ℃ ' を出力していますが , この記述は正論理で , デコード・ビットのみ ' 1 ' を出力するようにしています . デコーダの出力は , 入力のピット長の 2 のべき乗が出力のビット長になります . ②で変 数町 MP " は入力信号 ' A ' の範囲をアトリヒ、ユート "A'length" によって宣言しています . ③ では②で宣言した " TMP " のすべてのピットに℃ ' を代入し , その後デコード値のビットの みを④で ' 1 ' に書き直して出力しています . ・エンコーダの記述 リスト 5.3 の⑤がプライオリティ・エンコーダの記述です . この記述はデコーダと同し く正論理で書かれています . 2.4 節ではプライオリティ・エンコーダを " if ー elsif " を使用し て記述していますが , こでは lsif ' ' を使用する代わりに for -100P 文を使用してピット 長可変に対応しています . VHDL では現在のところ 10g 関数はサポートされていません . そのため , デコーダで は出力ピット長を 2 のべき乗 ' * いで記述しましたが , 工ンコーダでは出力のビット長を パラメータ 'K' として入力しています . ⑥ではループ変数 'I' をタイプ変換関数℃ ONV UNSIGED" で "unsigned" に変換し , それからタイプ変換で "std_logic—vector" に変 換して出力しています . これはタイプ変換関数 "CONV-STD—LOGIC—VECTOR" で tt"std—logic—vector" が符号付きなのか , 符号無しなのかわからないためです . ⑥の return 文では , "A ( 工 ) = ' 1 " ならはこのファンクション文を終了し , 値を返すよう に記述しています . 入力信号 ' A ' のすべてのピットが℃ ' の場合は , この for-loop 文を最後 まで実行して⑦に移ります . ループ変数 'I' は for ー 10 叩文内部でしか使用できないので , ⑦では 'I' のかわりにアトリビュード A ' righ じによって A の一番右側のビット位置を取り 出しています . デコーダ / ェンコーダのように何度も繰り返し使用するような回路は , サププログラム でビット長可変にして定義しておくと便利です . しかし , サププログラム内部では , 信号
705 < = transport 値 after 時間を表す式 ; ( 伝播遅延 ) A く = transport ℃ ' after 2 ns; 信号 信号が配線を通ることで遅れるような場合には , 4.7 スタティック RAM のモデル化 この伝播遅延を使用します . ・アサート文 ( セットアップ / ホールド時間のチェック ) ⑥で ' WR " 信号の立ち上がりエッジによって書き込みが行われる際 , は入力信号 ' D 工 N " の値がある一定期間 , 確定していなければなりません . ンをする際 , もしこの期間に ' DIN ' の値が変化した場合にはワーニング・メッセージを出 力する必要があります . シミュレーーショ この RAM モデル シミュレータはそこで実行を停止します . "severity" レベルを設定しない場合には URE " は特別禁止事項という意味になります . 通常 , "ERROR" や "FAILURE" の場合 , という意味になり , "WARNING" は重要注意事項 , "ERROR" は禁止事項 , "FAIL "severity" は , そのメッセージの重要度をあらわします . ' NOTE " であれは参考まで アサート文は条件が ' FALSE " の場合 , メッセージを出力します . レベル : NOTE, WARNING, ERROR, FAILURE assert 条件 [ report 出力メッセージ ] [ severity レベル ] れています . VHDL では , このメッセージ出力をさせるためのコマンドとしてアサート文が用意さ WR CS DIN く図 4.8 〉 RAM への書き込みタイミング 書き込み セットアップホールド
58 第 2 章プロセス文 カ 'B', ℃ ' にはフリップフロップ U2 の出力 'U' が入力されています . このセルに 'U' が 2 本入力されると , 他の入力がどんな値であっても出力は 'U' になってしまいます . "U3" の出力が 'U' であれは・フリップフロップ "U2" の出力は 'U' になり , いつまでたっても変 化しないためシミュレーションできなくなります . もちろん , この現象は常に発生するわけではありません . また , 使用する ASIC のセル 構造にも依存します . しかし , 逆に同期リセットで必ず値が確定できるという保証はあり ません . このため , 回路の初期リセット信号は , 非同期セット端子かリセット端子に入力 するのが一般的です .
48 第 2 章プロセス文 及は、しません . それに対してリスト 2.6 では , ' others " の前にすべての入力が記載されていません . この場合 , 論理合成ツールは出力信号 'Y' が℃ ' を出力しても ' 1 ' を出力してもよいと考え て回路を簡略化します ( don ' t care 出力 ). 入力信号 "INPUT" の各ビットが同時に二つ以 上℃ ' になることはないと考えれば , 'Y' の値には何を代入してもよいということになり ます . また , シミュレーションでは同時に二つ以上が℃ ' になれば , 出力信号 ' Y ' は不定 'X' になるので , 不正入力があるかどうかをチェックすることができます . リスト 2.6 の①を , when others = > Y < = ” 111 ” と書き換えると図 2.2 の回路が生成されます . リスト 2.6 で生成された回路図にくらべ てかなり大規模な回路になっているのがわかると思います . このように不要なケースでの く表 2.4 > プライオリティ・エンコーダ、の真理値表 カ 出力 入力側の・一 ' は don ' tcare ( 1 でも 0 でも構わない ) を意味する く表 2.5 > 100P 文の書式 [ ラベル : ] for ループ変数 in 不連続範囲 100P く順次処理文 > end 100P [ ラベル ] ; [ ラベル : ] while 条件 100P く順次処理文 > end 100P [ ラベル ] ; 100P 文内部では next [ ラベル ] Cwhen 条件 ] : 現行回をスキップ exit [ ラベル ] Cwhen 条件 ] : ループの外に抜けるが使用可能 入
6.2 ステート・マシン 7 イ もっと複雑なステート・マシンを記述する必要がありますが , こでは動作を説明するた めに単純化していると考えてください . 複雑なステート・マシンでは , その状態遷移の考 え方で回路の性能が大幅に変わってきます . 設計者はステート・マシンを自由に構成する ことができる反面 , そのできは・えが間われてしまいます . 最近では , この状態遷移図を図面入力し , その図面から直接 VHDL 記述を出力するツ ールも販売されています . 複雑なステート・マシンを設計するには , このようなツールを 利用すると便利です . ・ムーア型ステート・マシン ーリ型ステート・マシンは一つの状態に対し , 入力信号の条件で出力信号をいくつで も記述できます . それに対してムーア型ステート・マシンは , ーっの状態に対して一つの 出力しか持ちません . 図 6.9 および表 6.2 は , 図 6.8 のミーリ型ステート・マシンをム ーア型ステート・マシンに書き直したものです . こでは話を簡単にするため , 乗算 "MUL" と 16 ビット演算 " DAD ' ' のみを考えます . ムーア型の状態遷移図では , 出力をその状態の中に記述します . ーリ型では "MUL" が入力されたときも ' DAD " が入力されたときも同し状態 " ADC ' に進みました . しかし , ムーア型では次の状態での ' ' D 〇 NE 出力と NST ー OUT " 出力の値が異なるため , それぞ れ別の状態 " ADC ' , DAD " に進みます . "MUL" の演算も COUNT = 7 のときの "SRF" で "DONE" が異なる値を出力するため , 別の状態 " SRF " , " FRF " に進みます . このため , ーリ型で三つだった状態の数が , ムーア型では五つに増えています . この ように , 同し機能をステート・マシンで実現させる場合 , ムーア型はミ リ型にくらべて く表 6.2 〉 ALU ( ムーア型ステート・マシン ) の状態遷移表 現状態 次状態 入力 出力 (INST_IN) DONE INST_OUT MUL ADC ADD DAD DAD others 爪灯 COUNT/=6 SRF COUNT=6 FRF 爪灯 ADC 爪灯 0 ADC SRF 0 DAD SRF FRF ADC ADC ADC 1 よ 0 1 よ
第 7 章 RTL 記述の注意点と高度な文法 756 す . "FOUT" は , ' B = ' 1 ' " ならは ' 1 ' を出力し , そうでなければ℃ ' を出力します . しかし , この記述では他の出力信号と入力条件を合わせるため , "A = ' 1 ' ' の場合や ℃ = ' 1 ' ' の場合の出力も記述しなけれはなりません . このため , ' FOUT " の出力に余分な 論理を付け加えてしまいます . この記述は , リスト 7.8 のように三つのプロセス文に分けたはうがよいでしよう . "DOUT" と " EOUT " は入力条件が同しなので同しプロセス文で記述します . "FOUT" は 入力条件が ' B ' の場合のみを記述します . こうすることにより , "FOUT" によけいな論理 が付け加わってしまうことを防いでいます . 実際には , リスト 7.7 とリスト 7.8 は記述が単純なので , 同じロジック回路を生成し くリスト 7.8 > 複数のプロセス文に分けた例 library IEEE; use IEEE. std 」 ic ー 1164. all ; entity EX2 is po 「 t ( ん B, C 、 Z Ⅵ N i n std 」 og i c ; EO 町 , FO 町 , 町 : out std 」 ogic); end EX2 ; arch i tecture RTL of EX2 is beg i n process ( A,ZIN,YIN ) begin if(A=' 1 ' ) then EOUT ← Z Ⅲ ; e ー se ← ' 0 ' EWT ←Ⅵ N ; end i f : end process , p 「 ocess ( B ) begin if(B=' 1 ' ) t hen e ー se FOIJT ← ' 0 ' end i f ; end process ; process ( A, B,C ) begin if(A=' 1 ・ and B='I' and C ゞ 1 ' ) then e ー se end i f , end RTL DO し T YI E 0 U T ZI GOUT FOUT
6.2 ステート・マシンノ 4 ノ 図 6.5 は K = 4,W = 6 のときのシミュレーション波形です . 書き込みを続けると FULL 状態に , そこから読み出しを続けると空状態になり , 内部カウンタの値が停止しているの がわかると思います . ただし , この記述では既存の RAM ( ゲートアレイ , スタンダード・セルに組み込まれ ているもの , あるいは外付けの RAM) を使用せす , フリップフロップを使用しているの で , 大規模なものは現実的ではありません . 6.2 ステート・マシン ・状態遷移図 その出力が現在の入力だけでは決まらす , 過去の出力と入力の状態と順序によって決ま る回路のことをステート・マシンと呼びます . したがって広い意味では 1 個のフリップフ ロップでもステート・マシンと呼ぶことができます . もちろん , カウンタは立派なステー ト・マシンです . しかし一般的にはカウンタなどは順序回路と呼ぶのが適切で , ステー ト・マシンという呼び方はあまりされません . 普通 , ステート・マシンと言うと順序回路をコントロールする複雑な回路を指します . ステート・マシンを考える場合 , 状態遷移図あるいは状態遷移表を用います . ロジック回 路設計者は , この状態遷移図や状態遷移表を考え , そこから回路を生成する手法そのもの をステート・マシン設計と呼んでいます . 図 6.6 は単純な 8 進同期カウンタの状態遷移図です . 状態遷移図は , く図 6.5 > RTL 記述でのシミュレーション波形 このように各状 0 /FIFO_TEST/CLK FIFO_TEST ′ RESET 下『 0 TEST/WR 下 0 TEST,RO FIFO_TEST'OATAINP.O) fFIFO_TEST!OATAOUT(3:O) /FIFO_TEST/FULL / 日 FO TEST ′ EMPTY 下『 0 TEST/UI,WP 下 0 TEST"UI!RP 0 0 5 4 0 2 E F 2 : 信号は不定 図中の 5 という数字には意味はない ・ FULL が出されている間は , データは不定 有効て , その後は不定 ・読み出したデータはクロック 1 周期分のみが
2.4 case 文の記述 4 / 場合は値の順番がなく , すべてが並列に処理されます . したがって , 1 度 ' whe 心項に記 述した値を , そのあとで再び使用すると文法工ラーになってしまいます . 値が重複しない ように注意してください . また , すべての場合を記述しないと文法工ラーになります . リスト 2.5 の③の "others" は , 残りすべての場合という意味になります . 場合 , "when" 項で "INDATA" のとりうる値のすべてを記述していますが , 略できません . この記述の この行は省 なせかというと , "INDATA" は "std_logic" のべクタ・タイプ "std_logic_vector" な ので , ℃ ' , ' 1 ' の値のほかに 'X', 'Z', 'U' などの値をもっています . これらの値はロジッ ク回路生成のための意味はありませんが , case 文ではこれらすべての場合を記述しなけ ればなりません . ただ , すべての場合を記述することはたいへんなので , この記述のよう に "others" で対応します . ' 1 ' , ℃ ' 以外の値が入力されるということなので出力は不定 'X' ( ' 1 ' , ℃ ' か解からない ) を記述します . 出力値が同しになる条件があるときは , 表 2.3 に示すとおり 1 ' を使用して記述を省略 することができます . また , 同じ出力値が入力値の値で連続して続く場合には咒 0 ' ' が利 用できます . ・ don't care 出力 リスト 2.6 は , ヾイナリ・デシマル・エンコーダの記述例です . ェンコーダは , デコー ダとは逆に NPUT " の 2 進数から 10 進数に変換します . ①の thers " での不定 ' X ' の代入は , リスト 2.5 の代入とは意味合いが異なります . リスト 2.5 では "others" の 前に想定されるすべての入力が記載されているので , ロジック回路生成にはなにも影響を く図 2.2 〉 don't care を使用しない場合に合成される回路 ひ第リ T ー引