計数工学実験 / システム情報工学実験第一 ディジタル回路の基礎 ( 全 3 回 ) システム 8 研 三輪忍
参考資料 五島正裕 : ディジタル回路 ( 科目コード 400060) 講義資料 ( ググれば出てくる ) 高木直史 : 論理回路, 昭晃堂 Altera: Cyclone II FPGA スターター開発ボードリファレンス マニュアル Altera: Introduction to Quartus II ( 日本語版バージョン 4.2)
実験の目的 最近の計算機, あるいは, 複雑な制御を行う回路のほとんどはディジタル回路 本実験ではディジタル回路の作成を通して, その特性と設計 / 実装技術を習得する
実験の流れ 第 1 回 : 実験の説明と導入実験 第 2 回 : 組み合せ回路と順序回路 第 3 回 : 回路の高速化 1 週間以内にレポート提出
レポートに関して レポートの内容 この資料に記載されている課題 1~8 を全て行い, その内容を報告すること 提出方法 PDF 化したものを E-mail で提出 miwa@hal.ipc.i.u-tokyo.ac.jp 宛 Cc に sys-sub@keisu.t.u-tokyo.ac.jp を含めること 提出の際は Subject を ディジタル回路レポート 学籍番号 : 氏名 とすること
実験課題一覧 導入 課題 1:HDL による記述, コンパイル,FPGA ボードの使い方 組み合わせ回路の実現 課題 2: 全加算器 課題 3:3bit 加算器 ( リップル キャリー方式 ) 課題 4:2bit 乗算器 入出力 課題 5: やや複雑な外部出力 (7 セグ LED への表示 ) 順序回路の実現 課題 6:3bit カウンタ 回路の高速化 課題 7:3bit 加算器 ( 桁上げ先見方式 ) 課題 8:3bit 加算器 ( リップル キャリー方式のパイプライン化 ) 第 1 回 第 2 回 第 3 回
目次 ディジタル回路の基礎 論理回路の基礎 Verilog-HDL の基礎 Quartus II の使い方 実験課題 付録 :DE1 ピン番号一覧
ディジタル回路の基礎
ディジタル回路とは ディジタル信号を扱う電子回路 ディジタル信号 :1 or 0( 電位の高低に相当 ) 論理回路 : ディジタル回路の数学的モデル なぜディジタルか? ノイズに強い 物理的な信号に多少ノイズが含まれていてもディジタル信号としては同じ 設計が簡単 電位 アナログ回路設計は職人芸だが, ディジタル回路は誰でも作れる 1 0 アナログでは致命的だがディジタル信号としてみれば問題ない ノイズ時間
ディジタル回路の例 身近な例 CPU メモリ 簡単な例 加算器 カウンタ x i y i CPU メモリ c i+1 c i 全加算器 s i
ディジタル回路設計の流れ システム設計 どんなシステムにするか? システムの仕様策定 機能設計 システムを機能ブロックに分割し, 各ブロックの仕様を策定 RTL 設計 各機能ブロックの RTL(Register Transfer Level) を HDL(Hardware Description Language) を用いて記述 RTL: データ (Register) とそれに対する処理を記述したもの 論理設計 RTL 記述を論理回路へと変換 物理設計 論理回路をデバイスへマッピング
この実験の対象 システム設計 機能設計 RTL 設計 論理設計 課題として与える 実際に自分達で行う部分 CAD(Computer Aided Design) が自動的に行う 物理設計
課題の例 全加算器を作成せよ. ただし, 回路の入力はトグル スイッチを用いて与え, 出力は LED に表示させるものとする.
全加算器の論理回路 こういうものを設計 真理値表 x i x i y i c i s i c i+1 0 0 0 0 0 y i c i+1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 c i 回路図 s i 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1
実際には 回路図そのものを書くわけではない 使用する CAD ツールによっては直接書くこともあるが, この実験では書かない 回路を HDL(Hardware Description Language) を用いて記述 module full_adder (xin, yin, cin, sout, cout); input xin, yin, cin; output sout, cout; assign sout = (xin ^ yin) ^ cin; assign cout = (xin & yin) ((xin ^ yin) & cin); endmodule 1bit 全加算器の Verilog-HDL コード
実験で使用するデバイス FPGA(Field Programmable Gate Array) 製造後に構成を変更できる LSI 大学等での実験や少品種で廉価なハードウェアを作る場合に用いられる 使用する開発ボード :Altera 社 DE1 FPGA:Cyclone II( ロジック エレメント :18,752) 入出力 : トグル スイッチ,LED,7 セグ LED 等 ホスト PC との接続 :USB
( Cyclone II FPGA スターター開発ボードリファレンス マニュアル より )
開発ボードのブロック図 出力 出力 回路を構成するデバイス 入力 ( Cyclone II FPGA スターター開発ボードリファレンス マニュアル より ) 回路データの転送
開発ボードの使い方 1 HDL による回路設計 CAD ツール 2 記述したコードをコンパイルし, 回路の構成情報を生成 ホスト PC USB ポート 開発ボード 3 回路の構成情報を転送し FPGA にマッピング
論理回路の基礎
論理回路 ディジタル回路の数学的モデル 電位の高低を 1, 0 で表現 論理演算の組み合わせにより回路を記述
基本的な論理演算 AND x y NOT x 論理ゲート 論理ゲート z z 真理値表 x y z 0 0 0 0 1 0 1 0 0 1 1 1 真理値表 x z 0 1 1 0 OR x y XOR x y 論理ゲート 論理ゲート z z 真理値表 x y z 0 0 0 0 1 1 1 0 1 1 1 1 真理値表 x y z 0 0 0 0 1 1 1 0 1 1 1 0
論理回路の種類 組み合わせ回路 状態を持たない回路 入力から出力が一意に決まる例 ) 加算器, 乗算器 順序回路 状態を有する回路 出力は入力の系列に依存例 ) カウンタ
全加算器 加数 (x i ), 被加数 (y i ), 下位桁からの桁上げ (c i ) から加算結果 (s i ) と上位桁への桁上げ (c i+1 ) を計算する回路 真理値表 1 1 1 1 1 0 0 1 + 0 1 1 1 1 0 0 0 0 x i y i c i 回路図 c i+1 s i x i y i c i s i c i+1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1
リップル キャリー加算器 複数ビットからなる加数と被加数の加算を行う回路 全加算器をビット数分並べることで実現 x 2 y 2 c 2 x 1 y 1 c 1 x 0 y 0 c 0 =0 全加算器全加算器全加算器 c 3 s 2 c 2 s 1 c 1 s 0 3bit リップル キャリー加算器
カウンタ クロック入力のたびに出力を 1 増やす回路 出力は入力と状態 ( 今のカウント値 ) に依存 ( 順序回路 ) フリップ フロップ : 状態を記憶する回路 クロックに同期して入力された値を保持 0x1 3 3bit 加算器 3 3 フリップ フロップ clock
ハードウェアの遅延とスループット ハードウェア性能を決める 2 大要素 遅延 出力結果がでるまでに要する時間 1 次近似的には最長パスのゲート数で表現 入力出力回路 ( 時刻 t) ( 時刻 t+α) スループット α: 遅延 単位時間あたりの処理量 大量の入力系列を連続で処理する場合に重要な指標 入力回路出力入力回路出力入力回路出力スループットは2 倍
リップル キャリー加算器の遅延 とても大きい (AND + OR + XOR) 2 桁数が多くなると深刻 x 2 y 2 c 2 x 1 y 1 c 1 x 0 y 0 c 0 =0 c 3 s 2 c 2 s 1 c 1 s 0 3bit リップル キャリー加算器
桁上げ先見加算器 桁上げの有無を別の回路で計算することにより高速化 求めた桁上げと並列に配置された全加算器を用いて全ビットを一斉に計算 x 2 y 2 x 1 y 1 x 0 y 0 c 0 =0 x 2 y 2 x 1 y 1 x 0 y 0 c 2 c 1 桁上げ先見器 全加算器全加算器全加算器 c 3 s 2 c 2 s 1 c 1 s 0 3bit 桁上げ先見加算器
パイプライン化 要するに流れ作業 回路規模をあまり増やすことなくスループットを向上 x 2 y 2 c 2 x 1 y 1 c 1 x 0 y 0 c 0 =0 全加算器 3 全加算器 2 全加算器 1 a+b 1 2 3 c+d 1 2 3 e+f 1 2 3 c 3 s 2 c 2 s 1 c 1 s 0 フリップ フロップ パイプライン化された3bitリップル キャリー加算器 a+b, c+d, e+f を続けて行う場合
Verilog-HDL の基礎
Verilog-HDL とは HDL (Hardware Description Language) の一種 VHDL と並ぶ HDL の標準 HDL ディジタル回路を記述するための言語 複雑な回路の設計ともなると回路図を書くのが大変 RTL (Register Transfer Level) で簡潔に記述 文法は (C 言語などの ) プログラミング言語に近い 大きな違いは制御の流れ ( 各文は基本並列動作 )
Verilog-HDL の基本文法 module endmodule: モジュールを定義 input, output: モジュールの入力 / 出力端子 reg, wire: 内部配線がレジスタ or ただの配線 assign: 配線を接続 always @( イベント式 ) begin end: イベント式のイベントが発生した時に実行 if ( 条件式 ) begin end else begin end など
Verilog-HDL のコード例 1 全加算器のコード例 module full_adder (xin, yin, cin, sout, cout); input xin, yin, cin; output sout, cout; assign sout = (xin ^ yin) ^ cin; assign cout = (xin & yin) ((xin ^ yin) & cin); endmodule モジュールの宣言入出力を定義 所望の出力となるように配線を接続 2 つの assign 文は並列に評価される 2 つの出力を並列計算する回路になる
Verilog-HDL のコード例 2 カウンタのコード例 module counter (clock, reset, count); input clock, reset; output reg[0:2] count; always @(posedge clock or posedge reset) begin if (reset) begin count <= 3 b000; end else begin count <= count + 3 b001; end end endmodule 出力はレジスタ ( フリップ フロップに相当 ) リセット時はレジスタに 0 をセット レジスタをインクリメント クロック信号 or リセット信号の立ち上がりで動作
Quartus II の使い方
Quartus II Altera 社が提供している CAD ツール VHDL / Verilog-HDL による記述, コンパイル, シミュレーション機能を提供
Quartus II デザイン フロー 1HDL により回路を記述 2HDL を論理回路に変換 3 生成した回路に対し入出力ピンを割り当て 4 設計した回路が正しく動作するかを機能 / タイミング シミュレーションにより確認 ( この実験では行わない ) 5 回路を FPGA にマッピング ( Introduction to Quartus II より )
新規プロジェクトの開始 (1/3) マイドキュメント の下に 学籍番号 のディレクトリを作り, その中に Task# (# は課題番号 ) というディレクトリを作っておく. スタート メニューから Quartus II を起動 Create a New Project を選択
新規プロジェクトの開始 (2/3) プロジェクト ディレクトリとして先ほど作成したディレクトリを選択する. プロジェクト名は Task# としておく. Add Files は何も追加せずに Next
新規プロジェクトの開始 (3/3) Device family で Cyclone II, Available devices は EP2C20F484C7 を選択 Simulation に ModelSim- Altera, Format に Verilog HDL を選択 最後に確認画面が表示されたら Finish
& 新規デザインの開始 File -> New を選択 起動したウィンドウの中から Design Files -> Verilog HDL File を選択して OK をクリック 右の画面のようにテキスト エディタが開き, 回路を記述できるようになる 終わったら File -> Save All. z=x&y; テキスト エディタ
論理合成 (1/2) Assignments -> Settings を選択. 起動したウィンドウの General の項の Top-level entity を作成したモジュール名に変更 processing -> start compilation あるいは右上の赤で囲んだボタンをクリック
しばらく待って右下の画面が表示されればコンパイル完了 論理合成 (2/2) コンパイルに失敗した場合は下のウインドウにエラーの詳細が表示されるのでそれを元にデバッグを行う
コンパイルに成功すると設計した回路の情報を見ることができる 回路規模 ( 論理エレメント数とレジスタ数 ) 回路遅延 コンパイル後に表示される中央のウインドウの TimeQuest Timing Analyzer -> Multicorner Datasheet Report Summary -> Progagation Delay をクリック 入出力ピン間の遅延を nsec 単位で表示 合成結果の詳細
配置配線 Assignments -> Pin Planner 作成した回路に入出力ピンを割り当て Location をダブル クリックするとドロップ ダウン リストが表示されるのでその中から選択 ( 詳細は付録を参照 ) 割り当てが完了したら再度コンパイル
コンフィギュレーション 開発ボードの電源を投入 Tools -> Programmer 右下のウインドウが立ち上がったら start を実行 デバイスを認識していないのであれば Hardware Setup の Currently selected hardware を USB-Blaster に変更 右上のプログレス バーが 100% になれば完了 ( ボード上の 7 セグ LED が一瞬消えた後に 8888 になるはず )
実験課題
実験課題一覧 ( 再掲 ) 導入 課題 1:HDL による記述, コンパイル,FPGA ボードの使い方 組み合わせ回路の実現 課題 2: 全加算器 課題 3:3bit 加算器 ( リップル キャリー方式 ) 課題 4:2bit 乗算器 入出力 課題 5: やや複雑な外部出力 (7 セグ LED への表示 ) 順序回路の実現 課題 6:3bit カウンタ 回路の高速化 課題 7:3bit 加算器 ( 桁上げ先見方式 ) 課題 8:3bit 加算器 ( リップル キャリー方式のパイプライン化 ) 第 1 回 第 2 回 第 3 回
課題 1:HDL による記述, コンパイル, FPGA ボードの使い方 2 入力 AND ゲート 1 個からなる回路を作成し, その回路に全通りの入力 ( すなわち 00, 01, 10, 11 の 4 通り ) を与えた時の出力を観測し, AND ゲートとして正しく動作していることを確認せよ. ただし,AND ゲートの入力は開発ボード上のトグル スイッチを用いて与えるものとし, 出力は同ボード上の LED に表示させるものとする.
課題 2: 全加算器 全加算器を作成せよ. また, 作成した回路に全通りの入力を与え, その時の出力を観測することにより, 作成した回路が正しく動作することを確認せよ. ただし, 回路の入力はトグル スイッチを用いて与え, 出力は LED に表示させるものとする.
課題 3:3bit リップル キャリー加算器 課題 2 で作成した全加算器 3 つを用いて 3bit リップル キャリー加算器を作成せよ. また, 作成した回路に 8 通りの適当な入力を与え, その時の出力を観測することにより, 作成した回路が正しく動作することを確認せよ. ただし, 回路の入力はトグル スイッチを用いて与え, 出力は LED に表示させるものとする.
課題 4:2bit 乗算器 2bit 乗算器を作成せよ. また, 作成した回路に全通りの入力を与え, その出力を観測することにより, 作成した回路が正しく動作することを確認せよ. ただし, 回路の入力はトグル スイッチを用いて与え, 出力は LED に表示させるものとする.
課題 5: やや複雑な外部出力 (7 セグ LED への表示 ) 課題 3 で作成した 3bit リップル キャリー加算器の出力を 7 セグ LED へ表示するように変更せよ. 出力が 0~7 となる入力の組み合わせに対して加算を行い, 結果が正しく表示されることを確認せよ.
課題 6:3bit カウンタ クロック入力ごとに 0->1->2-> -> 7 のように 1 ずつ値が増加するカウンタを作成し, その動作を確認せよ. ただし, クロック入力はプッシュ ボタンから与えるものとし, 出力は 7 セグ LED に表示させるものとする.
課題 7:3bit 桁上げ先見加算器 3bit 桁上げ先見加算器を作成し, その動作を確認せよ. また, 課題 3 で作成したリップル キャリー加算器と回路遅延および回路規模 ( 論理エレメント数 ) を比較し, 優劣を示せ. ただし, 入力はトグル スイッチで与え, 出力は 7 セグ LED に表示させるものとする. 合成結果によっては 3bit 程度では回路遅延が減らないこともあるので, その場合は, 遅延が減らなくとも, 結果をレポートに記載した上で, 最長パス上のゲートの種類とゲート段数を比較すればよい. ビット数が増えた種類と段数がどう変化するかの考察があるとなおよい.
課題 8:3bit リップル キャリー加算器 のパイプライン化 課題 3 で作成したリップル キャリー加算器を 3 ステージのパイプライン処理を行うように変更し, その動作を確認せよ. また, 作成した回路の単位時間あたりの演算量 (1 秒間に 3bit 加算が何回行えるか ) を求め, パイプライン化を行う前の演算量と比較せよ. ただし, 加数と被加数はトグル スイッチ, クロック入力はプッシュ ボタンにより与え, 出力は 7 セグ LED に表示させるものとする. ヒント : 単位時間あたりの演算量は,1 回の 3bit 加算に要する時間が分かれば求めることができる.1 回の 3bit 加算に要する時間は ( パイプライン化前の ) リップル キャリー加算器の場合は, 回路の遅延を測ればわかる. パイプライン化した場合については各自で考えること. 課題 7 と同様, 合成結果によっては 3bit 程度ではパイプライン化してもサイクルあたりの遅延は変わらないこともある. その場合は, パイプライン化前のリップル キャリー加算器の遅延が, パイプライン化によってサイクルあたり 1/3 になったと仮定し, パイプライン化後の回路の単位時間あたりの演算量を計算せよ.
付録 :DE1 ピン番号一覧
トグル スイッチ トグル スイッチは下がっている状態が Low, 上がっている状態が High ( Introduction to Quartus II より )
赤色 LED LED は出力が High の時にランプが点灯 ( Introduction to Quartus II より )
プッシュ ボタン プッシュ ボタンはデフォルト High 状態. 押下すると Low に下がり, 手を放すと High に戻る ( Introduction to Quartus II より )
7 セグ LED 7 セグ LED は出力が Low の時にランプが点灯 ( Introduction to Quartus II より )