754 第 7 章 RTL 記述の注意点と高度な文法 この記述はそれほど繁雑でもないので , リスト 7.2 の記述よりもよいと言えるでしょ う . より確実な記述スタイルにするなら , すべての場合の if 文をこの形式で記述すべき です . しかし , シミュレーションのために ' X ' の伝播を考えて記述するなどということは , RTL で論理を記述するという観点からはすれてしまっています . また , だけ読みづらくなってしまいます . シミュレーションでの ' X ' の伝播の間題はこの他にもあり ( コラム 6 ) , ゲート・レベルでのシミュレーションを行わざるをえません . 現状では , においてゲート・レベルでのシミュレーションを行うようにして下さい . ス 2 フリップフロップ生成の制限 記述自体もそれ どちらにしても このことを念頭 RTL 記述から生成された回路では , レジスタの位置と個数は記述されたままの状態が 保持されます . もちろん , レジスタの生成といってもレジスタのセルを直接記述しなけれ はならないなどということはなく , レジスタを推定させる記述をします . 2.7 節でその方 法を紹介しました . こでは , さらにそのときの禁止事項について紹介しておきます . リスト 7.4 は一つのプロセス文内にレジスタ生成の記述が二つ存在する例です . この ような記述は禁止されています . ーっのプロセス文は一つのレジスタ生成の記述だけにす くリスト 7.4 > ーっのプロセス文に二つのレジスタ生成を記述した例 process(CLK1, CLK2) begin if(CLK1' event and CLKI=' 1 ' )then end i f : i f(CLK2' event and CLK2=' 1 ' ) then end i f , end process ; くリスト 7.5 > if 文のレジスタ記述に end process ; end i f , i f(CLK' event and CLK=' 1 ' ) then process (QK) begin eles 項を記述した例 process beg i n wait until CLK1'event and QKI=' 1 ' wai t unt ⅱ K2 ' event and K2 = ' 1 ' end process ; end i f ・ end i f , i f(CLK' event and CLk=' 1 ' ) then beg i n variable . std 」 ogic; process(CLK) くリスト 7.6 > 変数を信号に代入した例
〃 6 第 5 章サププログラム の数字を記述する代わりにします . "range" の他によく使用されるアトリピュートとして , A'Iength ーー範囲の長さ A'right A'left A'high A'low S'event 一番左の値 一番右の値 一番高い値 一番低い値 - 信号の値の変化 などがあります . 詳しくは 7.6 節と付録 B を参照して下さい . ファンクションに入力される信号は , 何も指定しないと "constant" としてコピーされ ます . 入力信号はファンクション内部で代入できないので通常は問題ありません . しかし , ' event ' などの信号状態を表すアトリピュートは ' signa ドにしか付きません . この場合にはパラメータの前に ignal ' を記述します . function CLK ー rise ー edge ( signal S : std ー logic) return boolean is 値を⑤の ' retur 心によって返していますが , 返される値は③で指示されたデータ・タイプ では入力信号 ' A ' , ' B ' のうち , 大きいはうの数が咒 mp ' に代入されています . ファンクション内部で計算された値は , return 文によって値を返します . ・出力パラメータ end process; end if; if(CLK_rise_edge) then process (CLK) begin end; return(CLK'event and CLK='I'); begin この "tmp" の リストの例
235 索 引 アルファベット順 abs access ・・ ACTIVE ・ after alias 新 . a ル・ and ・ archi tecture ・・ assert ・ attribute base BEHAVIOR ・・ bit ・・ bit vector ・ block ・ boolean ・ b0dy buffer ・ case : 文 ・・・ 37 , 45 , 46 , 173 character ・・ ・・・ 85 ・・・ 24 , 73 , 174 component ・ configuration ・・・ 73 , 166 , 174 ・・・ 73 , 81 , 95 , 112 , 116 , 126 , 175 constant ・・ CONV INTEGER ・・ ・・・ 88 , 107 CONV STD LOGIC VECTOR ・・ ・・・ 88 , 107 , 119 CONV UNSIGNED ・ ・・・ 119 else elsif ・ endfile entity ・・ ERROR ・・ event ・ exit ・ FAILURE ・・ file for for-loop 文 for-generate 文 function ・ ・・・ 40 ・・・ 162 ・・・ 18 , 175 ・・・ 105 ・・・ 54 , 116 , 186 ・・・ 159 , 178 ・・・ 44 ・・・ 182 ・・・ 186 ・・・ 79 , 104 , 106 , 112 ・・・ 170 ・・・ 21 , 95 ・・・ 21 , 23 , 44 ・・・ 21 , 170 ・・・ 99 , 182 ・・・ 105 , 171 ・・・ 99 , 163 , 171 ・・・ 105 ・・・ 161 , 176 , 182 ・・・ 51 , 173 , 174 ・・・ 37 , 50 , 68 , 177 ・・・ 68 , 159 , 176 ・・・ 111 , 180 回回国 ・・・ 185 ・・・ 187 ・・・ 22 , 53 , 85 , 161 , 164 ・・・ 85 , 108 , 161 , 164 ・・・ 172 ・・・ 22 , 41 , 53 , 85 , 164 ・・・ 112 , 178 ・・・ 19 , 20 , 62 , 178 ・・・ 104 , 176 , 177 ・・・ 176 ・・・ 184 ・・ 116 , 185 ・・・ 162 IEEE ・・ if 文 if-generate 文 inout ・ integer ・ last event ・・ last value ・・ left length library ・・ 100P 文 10W ・ LRM ・・ ・・・ 15 , 20 , 32 , 93 ・・・ 37 , 40 , 158 , 177 ・・・ 159 , 176 ・・・ 18 , 19 , 112 , 126 , 161 , 178 ・・・ 19 , 20 , 126 , 178 ・・・ 33 , 43 , 53 , 85 , 88 , 99 , 137 , 164 ・・・ 186 ・・・ 186 ・・・ 116 , 128 , 185 ・・・ 116 , 119 , 185 ・・・ 20 , 92 , 177 ・・・ 177 ・・・ 116 , 185 ・・・ 15 DELAYED disconnection downto ・・ don't care 出力 ・・・ 186 ・・・ 175 ・・・ 26 , 42 , 182 ・・・ 47 , 153
end i f , end i f ; end i f ; end process ; process(CLK 、 RESET) beg i n if(RESET = ' 1 ' ) then els i f(CLK' event and CLK ニ 6.1 くリスト 6.1 〉 FIFO の記述 ( つづき ) i f()P = ー 1 ) then FIFO の記述 739 ) then if(RD=' 0' and IN—EMPTY=' 0' ) then RP ← RP + 1 ; end process : end i f ; end i f ; end i f ; e ー se RP ← 0 ; IN_EMPTY ← ' 1 ' if(RESET = ' 1 ' ) then process(CLK, RESET) beg i n ⑧ "RP" ( 読み出しアドレス・カウンタ ) の記述 eIsif(CLK' event and CLK=' 1 ' ) then if((RP = WP-2 0 「 (RP=W-I and 粐 = 1 ) 0 「 ( = 袵 2 and = の ) and = ' 0 ' and 駅ゞ 1 ' ) then IN_EMPTY ← ' 1 ' elsi f( IN_EMPTY=' 1 ' and WR=' 0 ' ) then Ⅲ EMPTY ← end i f ; end i f ; end process ; p 「 ocess(CLK, 能 T ) beg i n if(RESET ニ ' 1 ' ) then Ⅲ FI.LL ← ' 0' elsi f(CLK' event and CLK=' 1 ' ) then if()P = 粐 and WR=' 0 ' and RD=' 1 ' ) then IN_FLLL ← ' 1 ' eIsif(lN_FLLL = ' 1 ' andRD = ' 0 ' )then IN_FIJLL く = ' 0 ' end i f ; end i f , end process , end BEHAVI OR , ⑨ "EMPTY" フラグ検出 用の記述 ⑩ " FUL びフラグ検出用の記述
幻 6 付録 C VHDL パッケー END CASE : END LWP,• RETURN resul t : END : FUNCTION To_UX01 BEGIN CASE b I S WHEN ' 0 ' WHEN ' 1 ' END CASE : END : edge detection ジ・ファイル = 〉 RETURN(' l' ) : = 〉 RETURN(' 0 ' ) : ( b : BIT ) RETURN UXOI IS FUNCTION rising_edge (SIGNAL s : std_ulogic) RETURN T,EAN IS END : (To_X01(s' LAST_VALUE) = ' 0 ' ) ) : RETURN ()' EVENT AND (To_X01(s) = ' 1 ' ) AND BEGIN FUNCTION falling_edge (SIGNAL s : std_ulogic) RETURN BWLEAN IS mR i IN s' RANGE LWP BEGIN FUNCTION I s_X ( s : std_ulogic_vector ) RETURN ー Obj ect contains an unknown END : (To_X01(s' LAST_VALUE) = ' 1 ' ) ) : RETURN ()' EVENT AND (To_X01(s) = ' 0 ' ) AND BEGIN BWLEAN IS
2.7 順序回路の記述 5 / くリスト 2.1 6 > 同期リセットを含んだ回路の記述 library IEEE. use IEEE. std 」 ogic ー 1164. all ; ent i ty ASYERST i s 「 t ( QK,RST,EN : in std 」 ogic, 0 : out std, 」 ogic); end ASYWRST ; archi tecture RTL of ASYPCRST is s i gnal Ul 、 : std 」 i c ; beg i n 0 ← , process (CLK) begin if(CLK' event and CLK=' 1 ' ) then i f(RST=' 0 ' ) then 引 sif ( 盟 = ' 1 つ then U2 ← not EN, e ー se ← not UI , end i f , end i f ; end process ; process (CLK) begin if(CLK' event and CLK=' 1 ' ) then i f(RST=' O' ) then UI ← ' 0 ' e ー se UI ← not UI , end i f , end i f : end process , end RTL く図 2.3 > 同期リセット付き回路 EN U3 U2 R ST U 1 CLK
定義済みアトリビュート一覧 4 → 'U' → 'U' → 'U' T'low T'high 786 付録 B 下限値 上限値 T'POS (X) T'VAL (X) T'SUCC(X) T'PRED (X) パラメータ ( X ) の位置番号 X の位置の値 X の位置番号より一つ大きい位置の値 X の位置番号より一つ小さい位置の値 T'LEFTOF(X) X より一つ左の位置の値 T'RIGHTOF(X) X より一つ右の位置の値 例 : subtype bar is std—logic; bar'base'left std—logic'low std—logic'right std—logic'left std—10gic'PRED ('Z') std—logic'SUCC ('Z') std—logic'POS ('Z') integer'low → integer'right → ー 2147485648 2147485647 → 'W' → ' 1 ' ・信号に付加されているアトリビュート S'DELAYEDC(T)] T 時間だけ遅らせた値 S'EVENT S'LAST EVENT S'LAST VALUE S'STABLE C(T)] S'QUIET C(T)] S'ACTIVE S にイベントが発生したかどうかを示す値 ( 発生 = TRUE) 最後のイベントが発生してからの経過時間 最後のイベントが発生する前の値 T 時間内にイベントが発生したかどうかを示す値 ( 発生 ="FALSE") T 時間内に信号値が静止していたかどうかを示す値 ( 静止 ="TRUE") S がアクテイプ状態であるかどうかを示す値
5 イ第 2 章プロセス文 クロックの立ち下がりエッジで動作するフリップフロップを生成させるには , ②の "CLK='I'" を "CLK= ℃ " にします . リスト 2.1 1 の記述のほか , リスト 2.12 の記述でもフリップフロップを生成させるこ とができます . リスト 2.12 の①のように , 今度はプロセス文のセンシテイピティ・リス トには何も記述しません . ②の "wait until" は , "CLK'event and CLK='I'" が真にな るまで実行を停止するという意味です . したがって , クロック・エッジの立ち上がりごと に入力データ 'D' は 'Q' に代入されることになります . これら二つの記述以外にもフリップフロップの動作を記述する方法はありますが , 論理 合成ツールによって実際にロジックを生成させるには , これら二つのうちのいすれかの記 述をする必要があります . フリップフロップを生成させる記述は , 論理合成ツールによっ て若干異なります . こで紹介している記述は , SYNOPSYS 社の論理合成ツールで要 求されるものです . 2.2 節で , 組み合わせ回路を生成させる場合には誤ってラッチ ( CLK が℃ ' または ' 1 ' の 時はスルー状態になる ) を生成させないように注意してくださいと述べましたが , 逆に if out std 」 ogic 0 port ( CLK,D, RESET : in std 」 ogic, entity DFFR is use IEEE. s す d 」 ogic 」 164. all ; library IEEE; くリスト 2.1 3 〉強制リセットの記述 end DFFR ; architectu 「 e RTL Of DFFR is beg in process (CLK, RESET) beg i n i f(RESET=' 1 ' ) then els i f(CLK ・ event and CLK=• 1 ・ ) then 0 ← D; end i f ; end process ; end RTL ①℃ LK" と "RESET" を記述
7.4 同時処理文ノ 57 ます . しかし , 記述が複雑になってくると生成されるロジック回路の面積や速度に差がで てきます . RTL 記述による設計では , 論理が合っていればどのように記述してもかまわ ないというわけではありません . 回路を図面入力する場合でも , RTL 記述による設計で も回路設計の本質は変わりません . ロジック回路が生成されたときの回路構造を意識して 己述するように注意してください . ス 4 同時処理文 ・ラベ ) レ 1.4 節で解説したようにコンポーネント・インスタンス文では , ラベルが必要になりま す . それと同じくすべての同時処理文にはラベルを付けることができます . ラベルは , 回 路中でユニーク ( 他の記述で変数名などに使っていない名前 ) でなければなりません ( リス ト 7.9 ) . ラベルはジェネレート文を除き , 動作に影響を及ほ、しません . 記述を見やすくするため , 一三ロ くリスト 7.9 > ラベルの記述 81 : FI.LL ← IN_FI.LL 82 : EFTY ← IN_EFTY 83 : DATAWT ← R ( ) PI : process(CLK) beg in ) then if(CLK' event and CLK = ' 1 ' if()R = ' 0 ・ and IN_FI.LL = ' 0 ' ) then R ( ) ← DATAIN; end i f : end i f ; end process ; P2: process(CLK, 託 T ) begin if(RESET = ' 1 ' ) then ) then eIsif(CLK' event and CLK = ' 1 ' i f(WR=' 0 ' and IN_FI.LL = ' 0 つ then i f()P = ー 1 ) then 粐← 0 ; 粐←粐十 1 ; ラベル名 e ー se end i f ; end i f : end i f , end process ;
S'LAST EVENT S'TRANSACTION 187 ( アクテイプ ="TRUE") 最後にアクテイプだったときからの経過時間 s がアクテイプになるごとに 0 と 1 を交互に繰り返す値 ・プロック , 工ンティティに付加されているアトリビュート B'BEHAVIOR B'STRUCTURE コンポーネント・インスタンス文が含まれているかどうか を示す値 ( 含む = ' TRUE つ その中のすべてのプロセス文 , 同時処理文がバッシプ ( 他 に影響を及ばさない不活性なもの ) であるかどうかを示 す値 ( パッシプ ="TRUE つ