論理回路設計
- 実習:VHDLによるデジタル回路設計 -
東京理科大学
基礎工学部電子応用工学科
【2016年度前期 集中講義】
講座の目的 実習を通して、専門分野の問題発見・解決の能力を修得する - LSI設計の基礎知識を得る - 言語:VHDLによる設計手法を実習する - EDAツールの操作を経験する - FPGAを搭載した評価ボードで動作を確認する目 次
1. 実習環境の説明
2. 課題1: 『4ビット加算器』
-
【参考資料】
EDAツールの付加情報
- VHDLの概要
- テストベンチの記述
3. 課題2: 『自分の名前を表示しよう』
4. 課題3: 『チャタリング防止回路』
5. 課題4: 『1分時計』
【参考資料】
集中講義の日程
1日目 2日目 3日目 4日目 6月18日(土) 2~5時限 6月25日(土) 2~5時限 7月02日(土) 2~5時限 7月09日(土) 3~5時限 【課題1】 加算器 - Quartus Ⅱの操作と 設計手順の習得 - 回路図入力 - シミュレーション - ピンアサイン - 実機での動作確認 【課題1】 加算器 - VHDLによる設計 →実機での動作確認 - VHDL文法の習得 - 回路図設計との比較 - テストベンチ & 追加仕様 【課題2】 名前の表示 【課題3】 チャタリング防止回路 【課題4】 1分時計 - VHDL文法の習得 - 設計の実践&動作確認 - 言語設計の理解 (実習で使用する環境)実習の内容
各課題を設計して、実機を使って動作を確認する。
1.課題を理解し、設計仕様にまとめる
→ 入力、出力、機能、性能を決める
→ 設計手法を選択する:
回路図入力/言語設計/両者の混在等→ 検証内容(シミュレーション内容等)を決める
2.選択した設計手法で、回路設計を行う
→ QuartusⅡ: 回路図入力/VHDL設計/両者の混在
→ ModelSim : VHDL設計
3.シミュレーションで、機能確認を行う
→ VHDLシミュレータ:ModelSimを使う
→ 波形入力 or テストベンチを使って実行する
4.評価ボード:DE0を使って、実機確認を行う
→ Quartus Ⅱで実行モジュールを作成する
実習の設計フロー
デザインエントリ
ダウンロード
コンパイル
端子割り当て
コンパイル
記述をチャックして、論理合成する FPGAの接続データ (実行モジュール)を作成する 実行モジュールをPCから FPGAに書き込む - ModelSim - QuartusⅡ - DE0デザインエントリ
コンパイル
- QuartusⅡシミュレーション
仕様に基づき、 回路を設計する 仕様に基づき、 回路を設計する 回路の動作を確認する設計エントリー: QuartusⅡ
【EDAツール】
- 回路図入力、VHDL入力、論理合成(Cyclone用)
VHDLシミュレータ: ModelSim
【EDAツール】
- VHDL入力 → 機能/論理シミュレーション
評価ボード:DE0の外観
7seg LED
スライド・スイッチ
ボタン・スイッチ
FPGA
(Altera)電源スイッチ
USB端子
1.搭載FPGA:
(Family)Cyclone Ⅲ
(name)EP3C16F484C6
[Package]
FBGA
(Fine pitch Ball Grid Array)[Pin count]
484
[speed grade]6
2.入力機能
1) ボタンスイッチ: 3個 (Button0~2)
・a接点スイッチ [← b接点スイッチとの違い]2) スライドスイッチ:10個 (SW0~SW9)
・上方にスライド(logic”1”)、下方にスライド(logic”0”)3.出力機能
- 7seg LED: 4個 (HEX0~3)
・アノードコモン型 [← カソードコモン型との違い] (- 液晶パネルを搭載することも可能)
4.実行モジュールのダウンロード
- USBケーブルを接続して、Quartus Ⅱから実行する
評価ボード:DE0の概要
[詳細は、授業HP上のマニュアル(英文)参照]評価ボード:DE0のブロック図
USB端子 FPGA 7seg LED ボタンスイッチ スライドスイッチDE0のボタンスイッチの動作
a接点: スイッチを押すと接点が繋がり電流が流れる a接点スイッチ push push 通常の入力信号: BS 反転入力信号: not BS A RST BDE0のスライドスイッチの動作
Logic “1” Logic “0” D2 E4 E3 H7 J7 G5 G4 H6 H5 J6 SW9 SW8 SW7 SW6 SW5 SW4 SW3 SW2 SW1 SW0 (PIN番号) (SW番号) 上方にスライド 下方にスライド 通常の入力信号: SS 反転入力信号: not SS =a b c e d f g dp
DE0の7seg LEDの動作
a b c d e f g dpHEX0
E11 F11 H12 H13 G12 F12 F13 D13 (PIN番号) (ピン名) 端子割り当て表 LED0[7] LED0[6] LED0[5] LED0[4] LED0[3] LED0[2] LED0[1] LED0[0] ⇐ ピンとPADの整合 - アノードコモン型 -7seg LEDの動作タイプ
[参考]端子割り当て
FPGAチップ - FPGAチップはパッケージングされている ⇒ PADはPINに接続されている - パッケージはボード上に実装されている ⇒ ボード上部品と接続されている(PAD=)PINから先の接続は変更できない
FPGAパッケージ FPGA- 入力信号は、決まったPINから入力する
- 出力信号は、決まったPINへ出力する
設計回路設計端子名 入出力 FPGAピン番号 備考
A Input PIN_H2 BUTTON0
B Input PIN_F1 BUTTON2
clk Input PIN_G21 クロック入力
EQUAL Input PIN_J6 SW0
reset Input PIN_G3 BUTTON1
LED0[7] Output PIN_E11 HEX0_a
LED0[6] Output PIN_F11 HEX0_b
LED0[5] Output PIN_H12 HEX0_c
LED0[4] Output PIN_H13 HEX0_d
LED0[3] Output PIN_G12 HEX0_e
LED0[2] Output PIN_F12 HEX0_f
LED0[1] Output PIN_F13 HEX0_g
LED0[0] Output PIN_D13 HEX0_dp
LED1[7] Output PIN_A13 HEX1_a
ピン割り当て表
2.課題1: 『4ビット加算器』
キー入力 検出回路 キー入力 保持回路 キー入力 検出回路 キー入力 保持回路 加算器 キー入力 検出回路 キー入力 保持回路 信号選 択 & LED 表示制 御 LED3 被加数 加数 -= -クリア LED2 LED1 5 4 4 8 8 8 LED0 8
『4ビット加算器』の設計回路
[課題]
と全体回路
全体回路 → FPGAへダウンロード - 全体回路は、設計回路と周辺回路から構成される - 周辺回路は、回路図シンボルとperipheral_DE0.vhdで準備されている - 設計回路と周辺回路を使って、全体回路を設計する 設計回路 周辺回路評価ボード:DE0を使って、4ビット加算器を設計する。
1.入力データ: ボタンスイッチを使って、押下回数を入力数とする。
Button0 : 被加数の入力。 HEX0へhex表示。 0~Fをトグルする。 Button2 : 加数の入力。 HEX3へhex表示。 0~Fをトグルする。 Button1 : リセッの入力。 button0とbutton2を同時にリセットする。2.出力データ: 加算結果を7segLEDに表示する。
加算結果は、hex表とする( 00~1E; 4ビット加算→5ビット) HEX0 : 加算結果の下位桁をhex表示する。 HEX1 : 加算結果の上位桁をhex表示する。 HEX2 : ”=”を表示する。 HEX3 : ”=”を表示する。3.モード切替: スライドスイッチを使って、入力/出力表示を切り替える。
SW0 : 0(入力モード): 被加数と加数を表示する。 1(出力モード): 加算結果を表示する。『4ビット加算器』の開発仕様
実習の進め方
【第1日目】 課題を回路図で設計して、実機(DE0)で評価する
- QuartusⅡ上で、課題を回路図で入力して設計する (テキスト: 5 ~ 42頁) - ModelSim上で、シミュレーションして、設計内容を確認する (テキスト: 43 ~ 65頁) - Quartus Ⅱ上で、実機用の回路図に編集して、実行モジュールを作成する (テキスト: 66 ~ 72頁) - 実行モジュール(*.sof)をDE0にダウンロードして、動作確認を行う (テキスト: 73 ~ 76頁)【第2日目】 課題をVHDLで再設計して、実機(DE0)で評価する
- QuartusⅡ上で、課題をVHDLで再設計する (テキスト: 77 ~ 97頁) - ModelSim上で、シミュレーションして、設計内容を確認する (テキスト: 98 ~ 99頁) - Quartus Ⅱ上で、実行モジュールを作成し、動作確認する(テキスト: 102~103頁) ⇒ 可能な限り、トップ回路もVHDLで設計する: ⇐ 記述例は、テキスト: 100 ~ 101頁参照 - 早く終わった学生は、次に進まず、追加仕様に挑戦する (テキスト: 104頁) (追加仕様例)入出力の16進表示を10進表示に変更する ・peripheral_DE0.vhdを理解し、何処を変更するか?『4ビット加算器』の設計内容
加算器のトップ回路
4ビット演算部
(周辺回路)Peripheral_DE0
Conversion_ascii
コンパイル
動作確認
実行 モジュールダウンロード
QuartusⅡ 波形エディタ テストベンチ [1日目]+
[2日目] 回路図記述 (VHDL記述) 回路図記述 (VHDL記述) (VHDL記述) (VHDL記述) VHDL記述 VHDL記述 (VHDL記述) VHDL記述 or VHDL記述 シミュレーションによる検証 シミュレーションパタンの作成 実機による検証 (変換) (変換) - 設計で用いる設計記述の組み合わせ - [図2-33~35]『4ビット加算器』の全体回路図
Sim用
DE0用
-VHDL記述は 図2-33~図2-35 -トップの記述は VHDL記述でもOKⅠ.開発仕様はそのままで、全モジュールをVHDL記述にする。
Ⅱ.LEDの16進表示を10進表示に変更する。
1.入力データ: HEX0,1 (被加数) HEX2,3(加数)
2.出力データ: HEX0,1(加算結果) HEX2,3(”=“)
Ⅲ.ビット拡張を行い、2桁(0~99)加算器にする
1.入力データ: ボタンスイッチを使って、押下回数を入力数とする。
Button0 : 被加数の入力。 HEX0~1へ10進表示。 0~99をトグルする。 Button2 : 加数の入力。 HEX2~3へ10進表示。 0~99をトグルする。 Button1 : リセッの入力。 button0とbutton2を同時にリセットする。2.出力データ: 加算結果を7segLEDに10進( 0~198)表示する。
HEX0~2 : 加算結果を10進表示する。 HEX3 : ”=”を表示する。3.モード切替: スライドスイッチを使って、入力/出力表示を切り替える。
SW0 : 0(入力モード): 被加数と加数を表示する。追加仕様後の開発仕様
全体回路のモジュール構成
adder4bit_top: トップモジュール
inst: peripheral_DE0:
周辺回路のモジュール
inst2: adder_4bit:
4bit加算器
inst: full_adder
inst1:full_adder
inst2:full_adder
inst3:half_adder
inst3: conversion_ascii:
LED0をasciiに変換
inst4: conversion_ascii:
LED1をasciiに変換
inst5: conversion_ascii:
LED2をasciiに変換
peripheral_DE0のモジュール構成
peripheral_DE0 : 周辺回路(入出力部分等)のモジュール
peripheral1: peripheral
; 入力信号周りの処理peri1: msec
; chattering信号の生成(2M×2=4M周期=約80ms)peri2: chatter
; 入力reset信号のチャタリング防止peri3: chatter
; 入力A信号のチャタリング防止peri4: chatter
; 入力B信号のチャタリング防止peri5: chatter
; 入力equal信号のチャタリング防止count1: count
: 入力A信号のカウント (4bit:0~F)count2: count
: 入力B信号のカウント (4bit:0~F)selec1: selec
: 表示信号を選択し、LED用信号の生成decoder0: decoder
: HEX0の入力信号へのデコードdecoder1: decoder
: HEX1の入力信号へのデコードdecoder2: decoder
: HEX2の入力信号へのデコードperipheral_DE0の回路図
- QurartusⅡのRTL ViewerのDump sho
t【参考資料】
QuartusⅡのプロジェクト・ディレクトリ
“file → open”後のポップアップ画面プロジェクト[ 4bit_vhdl ]をオープンした時のディレクトリ下のファイル一覧
・ファイル名と更新日時が正しいかを常にチェックする ・ファイル名(拡張子以外の部分)は、異なる名前にする → 古い版を保存したい場合は、”*_old1.vhd”のようにする ・複雑になった場合は、新しいプロジェクトを作って、別に管理するQuartusⅡのプロジェクトメンバー
現在のプロジェクトメンバーの一覧
・リストされているファイルを正しく管理する
→ 同名のモジュール名は避ける
QuartusⅡのプロジェクトメンバーの変更
1.オープンしているファイルをメンバーに追加する:
“Project → Add current file to Project”
2.プロジェクトディレクトリ下のファイルを使って変更する
“Project → Add/Remove files to Project”
QuartusⅡのプロジェクトへのファイルの持ち込み
プロジェクトをオープンした状態で“File → New” を選択すると”New“画面がポップアップされるので、 “VHDL File”を選択する
“VHDL File”選択後、
編集画面が表示されるので、
持ち込みたいVHDL記述をpasteし、 “Save As”で保存する
ModelSimのプロジェクト・ディレクトリ
プロジェクト・ディレクトリ下のファイル一覧 (プロジェクトメンバーの候補)
ModelSimのプロジェクト・メンバー
プロジェクト・メンバーの一覧
Project画面内で右クリック
- “Add to Project” を使って、変更する
ModelSimのプロジェクト・メンバーの変更
ModelSimのプロジェクトへのファイルの持ち込み
“File → Source → VHDL” の操作で 下記の編集ウィンドウが開くので、vhdl記述をpasteして、持ち込み、 “Save As”で保存する。
ModelSim: 入力信号の波形入力
4bit加算器の入力波形の概要
(テキストpp.58~) CLK: 周期 20us (01:duty50%) → 10240ms A : 周期 320ms (01:duty50%) → 10240ms ⇐ 16 x 2 回 B : 周期 20ms (01:duty50%) → 10240ms ⇐ 16 x16 x2 回 Resetの指定例: 0ms:1 → 1000ms:0 → 1200ms:1 Equalの指定例: 0ms:0 → 5120ms:1 CK (クロックを指定) A 0 1 B 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 reset Equal【重要】
0→1変化や、reset信号により、シミュレション結果に注意が必要
【注意】 ResetやEqualの入力方法は、テキストpp.130を見て下さいModelSim: 入力信号の保存
“File → Save Format”で下記画面をポップアップして、
プロジェクト・ディレクト下のフェイル名: wave.do にsaveする (“wave”は、任意でOK)
ModelSim: 保存した入力信号のロード
“File → Load → Macro file” をクリックすると、右記画面が ポップアップするので、
プロジェクト・ディレクト下に Saveしたフェイル名(wave.do) を選択して、loadする。
VHDLの歴史
- VHDL: VHSIC Hardware Description Language の略称
- 1981年 米国国防総省(国防高等研究計画局:DARPA
(Defense Advanced Research Projects Agency)のVHSIC委員会が提唱
・VHSIC: Very High Speed Integrated circuit・ICの大規模/高機能化に伴った、明確に仕様を記述する 仕様記述言語
- 1986年 Version 7.2 リリース
IEEEの標準化作業スタート
・VASG (VHDL Analysis & Standardization Group) 委員会
- 1987年 LRM(言語仕様書; Language Reference Manual ) 作成
IEEE Std 1076-1987として承認
- 1993年 IEEE 1164を採用: 9値のstd_logic
- その後 IEEE 1076-1993、 IEEE 1076-2000、 IEEE 1076-2002、
IEEE 1076-2008
(最新版)ハードウェア記述言語: HDL
- Hardware Description Language; HDL
- デジタル回路、特に集積回路を設計するためのコンピュータ言語
- ハードウェアの動作仕様を記述するための言語で、電子回路の
経時的動作と空間的構造を表現し、構文
(syntax)や意味
(semantics)は、
ハードウェアの基本的属性である時間や並行性を記述。
- 処理を検証するテストベンチ記述ができ、シミュレーションが可能。
- 論理合成が可能
- Verilog HDL と VHDL が、主要な言語 (IEEEで標準化を推進)
RTL (Register Transfer Level) とは?
・ レジスタ間の転送関係を 表現したレベル ・ 機能を、代入、if、case等で 表現したもの ゲートレベル とは? ・ ゲート回路やフリップフロップ等の 接続関係を表現したもの ( → 素子と等電位点の列挙 ) ・ ネットリストとも言う
論理
VHDLの基本構造①
回路記述: ・論理合成に適した記述をする ・回路の種類ごとに適した記述スタイルがある テストベンチ: ・文法を満たしていれば、どんな記述でもよい ・記述のテクニックを駆使できるVHDLの文法
回路記述
テストベンチ
ライブラリ記述
論理合成可能 論理合成不可 シミュレーション可能architecture
architecture
architecture
process C process B 一つの entityに 複数の architectureを 書けるlibrary …複数のライブラリ
use
entity ….1つ
port
一つの entityに複数の architectureを書ける 一つの architectureに複数のprocessを書けるVHDLの基本構造②
process A 一つの architectureに 複数のprocessを書けるVHDLの基本構造③
合成用の記述に使用するもの シミュレーション・テストベクタ記述に Library … Entity … port … Architecture …… この部分の信号割当ては、process文の外なのでSLSも イベントもない。 コンカレント(非同期, 即時代入, 即時信号割り当て)実行される。 - <= 非同期で即時,コンカレント信号代入, - 条件文 when-else, with-select(others文で全条件記述) - 反復文 generate Process … ()がない場合は,process文内の処理を永遠に継続 制御反復文 loop for loop while loop wait for wait on wait until Process (センシティビティー・リスト信号;:SLS) - <= SLSのイベントに同期し同時に信号代入 - := SLSのイベントに同期しシーケンシャルに信号代入 (:=の左辺は,variable文で定義した変数) - 条件文VHDLの基本構造④
- 階層化記述 -
Library …
Entity …
Architecture …
動作記述
構造記述
Configuration …
Library …
Entity …
port …
Architecture …
動作記述
構造記述
Library …
Entity …
port …
Architecture …
動作記述
構造記述
テストベンチ 設計回路のトップ階層 設計回路の下位階層46
全体構造と記述例
「パッケージ」の指定
entity エンティティ名 is
end エンティティ名;
architecture アーキテクチャ名 is
bigin
end アーキテクチャ名;
入出力ポート宣言
signal 他の宣言
VHDL本体
- 動作、機能の記述-- 半加算器の記述例
library IEEE;
use IEEE.std_logic_1164.all;
entity half_adder is
port(A,B: in std_logic;
S,CO: out std_logic);
end half_adder;
architecture RTL of half_adder is
signal sig1, sig2: std_logic;
begin
sig1 <= A nand B;
sig2 <= A or B;
CO <= not sig1;
S <= sig1 and sig2;
end RTL;
of エンティティ名
VHDL記述&コンパイル時の注意点
1.規約どおりに記述する
- 構文規則を覚えて、キーワードとパラメータを正確に記述する
・代入文の右辺と左辺でデータイプは同じでなければならない
signal s1: std_logic_vector(2 downto 0); signal n1: integer range 0 to;
× s1 <= 0 ⇒ ○ s1 <= “000”
《 Error (10517): VHDL type mismatch error at half_adder_bh.vhd(23): 》 《 std_logic type does not match integer literal 》
× n1 <= s1 ⇒ ○ n1 <= CONV_INTEGER(s1); ・サブプログラムの戻り値も同じデータタイプでなければならない ・std_logicの論理値は、9値である → 0、1、X、L、H、W、Z、U(uninitialize)、-(don’t care)
- “)”や”;”の数を間違えない
・()は必ず対になっている ・”;”は、必要な場所と必要ない場所を正確に把握する- 未定義の変数は使えない(必ず事前定義)
2.コンパル時のエラーは、しっかり読む
関数名
機能内容
std_logic_1164パッケージ内
To_stdlogicvector(A) bit_vectorからstd_logic_vectorへの変換 To_bitvector(A) std_logic_vectorからbit_vectorへの変換 To_stdlogic(A) bitからstd_logicへの変換 To_bit(A) std_logicからbitへの変換std_logic_arithパッケージ内
CONV_std_logic_vector(A、ビット幅) integer、unsigned、signedから std_logic_vectorへの変換 CONV_INTEGER(A) unsigned、signedからintegerへの変換std_logic_unsignedパッケージ内
CONV_INTEGER(A) std_logic_vectorからintegerへの変換『型の変換』の関数
半加算器の回路図とVHDL記述
VHDL記述(図2-8参照) [図2-2] 回路図入力(図2-1参照) O O -- 半加算器の記述例 library IEEE; use IEEE.std_logic_1164.all; entity half_adder is port(A,B: in std_logic; S,CO: out std_logic); end half_adder;architecture RTL of half_adder is signal sig1, sig2: std_logic; begin
sig1 <= A nand B; sig2 <= A or B; CO <= not sig1;
S <= sig1 and sig2; end RTL; 機能のゲート記述 A B S CO 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 architecture RTL of half_adder_bh is
signal AB : std_logic_vector (1 downto 0); begin
AB <= A & B; process(A,B) begin
if(AB=“00”) then S<='0'; CO<='0'; elsif(AB="01") then S<='1'; CO<='0'; elsif(AB="10") then S<='1'; CO<='0';
D-FFのVHDLの記述
R CLK D Q QB 0 - - 0 1 1 無し 0 変化無し 変化無し 1 無し 1 変化無し 変化無し 1 ↑ 0 0 1 1 ↑ 1 1 0 -- D-FF1 library ieee; use ieee.std_logic_1164.all; entity D_FF1 is port( R,D,CLK : in std_logic; Q,QB : out std_logic); end D_FF1; architecture RTL of D_FF1 is signal NODE : std_logic; begin Q <= NODE; QB <= not NODE; process(R,CLK) begin if (R = '0') then NODE <= '0';elsif (CLK 'event and CLK = '1') then NODE <= D; end if; end process; ライブラリ記述 エンティティ記述 アーキテクチャ
階層化記述例
A
C
B
X
Z
Y
L
library IEEE; use IEEE.std_logic_1164.all; entity X isport (A, B : in std_logic; C : out std_logic); end X; architecture RTL of X is component Y port( A : in std_logic; D : out std_logic); end component; component Z port( B, D : in std_logic; C : out std_logic); end component; signal L : std_logic; begin U0 : Y port map ( A => A, D => L ); U1 : Z port map ( D => L, B => B, C=> C ); end RTL; コンポネント インスタンス コンポーネント 宣言(定義) コンポーネント 宣言(定義)
[図2-16]
library IEEE;
use IEEE.std_logic_1164.all; entity full_adder is
port(A,B,CIN : in std_logic; S,CO: out std_logic); end full_adder;
architecture RTL of full_adder is component half_adder
port(A,B : in std_logic; S,CO: out std_logic); end component;
signal sig1, sig2, sig3 : std_logic; begin
H1: half_adder port map (A,B,sig2,sig1);
H2: half_adder port map (sig2, CIN, S, sig3); CO <= sig1 or sig3;
全加算器の回路図とVHDL記述
ライブラリ記述 エンティティ記述 アーキテクチャ コンポーネント宣言 コンポーネント呼び出し (コンポーネント・インスタンス) [図2-17]library IEEE;
use IEEE.std_logic_1164.all; entity M_BEHAVIOR is
port (SELS : in bit_vector(0 to 1);
A,B,C,D : in bit;
M : out bit); end;
architecture DSELS of M_BEHAVIOR is begin process(SELS,A,B,C,D) begin case SELS is when ”00” => M <= A; when ”01” => M <= B; when ”10” => M <= C; when others => M <= D; end case; end process;
case 文
M
SELS
D
A
B
C
if then else/elsif 文
library IEEE; use IEEE.std_logic_1164.all; entity S_BEHAVIOR is port(SELS: in bit_vector(0 to 1); A,B,C,D: in bit; M: out bit); end;architecture DSELS of S_BEHAVIOR is begin
process(SELS,A,B,C,D) begin
if (SELS = "00") then M <= A; elsif (SELS = "01") then M <= B; elsif (SELS = "10") then M <= C; else M <= D; end if; end process; end DSELS; library IEEE; use IEEE.std_logic_1164.all; entity N_BEHAVIOR is port(SELS: in bit_vector(0 to 1); A,B,C,D: in bit; M: out bit); end;
architecture DSELS of N_BEHAVIOR is begin process(SELS,A,B,C,D) begin if (SELS = “00”) then M <= A; if (SELS = "01") then M <= B; if (SELS = "10") then M <= C; else M <= D; end if; end if; end if; end process;
M
D
A
B
C
when else 文
entity J_BEHAVIOR is
port (A,B,SEL : in boolean; M : out boolean);
end;
architecture DSEL of J_BEHAVIOR is begin
M <= A when SEL else B; end DSEL;
M
A
B
SEL
entity K_BEHAVIOR isport (SELS : in bit_vector(0 to 1); A,B,C,D : in bit; M : out bit); end;
architecture DSELS of K_BEHAVIOR is begin M <= A when (SELS="00") else
B when (SELS="01") else
C when (SELS="10") else D ;
M
SELS
A
B
C
D
library IEEE;
use IEEE.std_logic_1164.all; entity M_BEHAVIOR is
port (SELS : in bit_vector(0 to 1); A,B,C,D : in bit; M : out bit); end;
architecture DSELS of M_BEHAVIOR begin
with SELS select M <=A when ”00”, B when ”01”, C when ”10”, D when ”11”; end DSELS;
with select 文
library IEEE; use IEEE.std_logic_1164.all; entity M_BEHAVIOR isport (SELS : in std_logic_vector(0 to 1); A,B,C,D : in bit; M : out bit);
end;
architecture DSELS of M_BEHAVIOR begin
with SELS select
M <= A when ”00”, B when ”01”, C when ”10”, D when ”11”; end DSELS; この記述を、 D when others;
M
SELS
D
A
B
C
この宣言のとき、 SELSは、9x9=81値となり,, 左の記述ではエラーシミュレーションとテストベンチ
シミュレーション: 設計した回路が正しく動作するかを検証するために、
実装前に、コンピュータ上でシミュレータを実行すること。
- 論理シミュレーション: (遅延を無限小として)論理動作のみ検証
- 遅延シミュレーション: 回路の遅延情報を考慮して動作を検証
◇ 設計した回路記述: VHDLファイル(DUT; Device Under Test)
◇ シミュレータ:
◇ テストベンチ: 必要な信号を生成したり、検証を効率よく行うための
結果表示などを記述したVHDLファイル。
論理合成しないので、効率良く記述することを優先。
クロック、リセット等 の生成 入力パタンの生成 設計した回路 (DUT) [論理合成可能] 結果表示等テストベンチ
テストベンチの構造
「パッケージ」の指定
entity エンティティ名 is
end エンティティ名;
architecture アーキテクチャ名 is
bigin
end アーキテクチャ名;
- DUTの宣言 - 入出力の宣言 - DUTの呼び出し - 波形記述configuration
コンフィグレーション名is
for アーキテクチャ名
end for;
end コンフィグレーション名;
ライブラリ記述 ポートリストの無いエンティティ記述 アーキテクチャ名 of エンティティ名 テストモジュール(DUT)のコンポーネント宣言 DUTの入出力信号宣言 整数の定義(クロック周期等) DUTの呼び出し宣言(インスタンス) 入力信号の入力波形記述 (期待値照合も可能) コンフィグレーション名を定義 → コンフィグレーション名 of エンティティ名 ⇓ このコンフィグレーション名でシミュレーターのテストベンチでの入力波形記述例
constant STEP: time := 100 ns ; begin
U0: COUNT4LD port map( CLK, RST, LD, D, Q ); -- 入力;CLK、RST、LD、D process begin -- クロックの記述
CLK <=‘0’; wait for STEP/2; -- STEP/2毎に“01”を繰り返す CLK <=‘1’; wait for STEP/2; -- 無限にループする
end process ; process begin
D <=“0000”; -- 入力Dに”0000”をセット wait for STEP; RST <=‘1’; -- 1クロック後、リセットをon wait for STEP; RST <=‘0’; -- 1クロック後、リセットをoff wait for STEP*20; -- 20クロック進める
D <=“1001”; LD <=‘1’; -- ロードをonして、Dに9をロード wait for STEP; LD <=‘0’; -- ロードをoff
wait for STEP*8; -- 8クロック進める
D <=“0110”; LD <=‘1’; -- ロードをonして、Dに6をロード wait for STEP; LD <=‘0’; -- ロードをoff
wait for STEP*12 ; -- 12クロック進める
assert false severity failure; -- シミュレーションの強制終了
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity CNT10 is port ( count_in, reset : in std_logic; count_up, dot : out std_logic; count_LED : out std_logic_vector(4 downto 0) );
end CNT10;
architecture RTL of CNT10 is
signal count10 : std_logic_vector(4 downto 0); signal count_sig : std_logic; begin
process(count_in,reset) begin
if reset = '1' then count10 <= "00000"; count_sig <= '0'; elsif (count_in'event and count_in='1') then
if (count10 = "01001") then count_sig <= '1'; count10 <= "00000"; else count_sig <= '0'; count10 <= count10 + '1';
end if; end if; end process; count_LED <= count10; count_up <= count_sig; dot <= '0';
10進カウンタのテストベンチ記述例①
DUT: CNT10
- アップ信号付10進カウンター10進カウンタのテストベンチ記述例②
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity CNT10_tb is end CNT10_tb; architecture SIM of CNT10_tb is component CNT10port ( count_in, reset : in std_logic; count_up, dot : out std_logic;
count_LED : out std_logic_vector(4 downto 0) ); end component;
signal count_in, reset : std_logic :='0' ; signal count_up, dot : std_logic;
signal count_LED : std_logic_vector(4 downto 0); constant STEP: time := 10 ms;
begin
DUT: CNT10 port map
(count_in, reset, count_up, dot, count_LED);
process begin
count_in <= '0'; wait for STEP/2 ; count_in <= '1'; wait for STEP/2 ; end process;
process begin
wait for STEP; reset <= '1'; wait for STEP; reset <= '0'; wait for STEP*20;
wait for STEP; reset <= '1'; wait for STEP; reset <= '0'; wait for STEP*30;
assert false severity failure; wait; end process; end SIM; configuration cfg_CNT10_tb of CNT10_tb is for SIM end for; end cfg_CNT10_tb; DUTのコンポーネント宣言 ポートリスト無しのエンティティ記述 信号名&クロック周期の定義 インスタンス名:DUTでテストモジュールをインスタンス 入力波形の記述 Duty:50%のクロック(周期10ms)を count_inに入力 2nd周期にreset←1 3rd周期にreset←0 20周期進める 23rd周期にreset←1 24th周期にreset←0 30周期進める 54周期後に強制終了 コンフィグレーション記述 ・コンフィグレーション名: cfg_CNT10_tb ・エンティティ名: CNT10_tb ・アーキテクチャ名: SIM
a b c e d f g dp
7seg_LEDの動作記述
a b c d e f g dpHEX0
E11 F11 H12 H13 G12 F12 F13 D13 LED0[7] LED0[6] LED0[5] LED0[4] LED0[3] LED0[2] LED0[1] LED0[0] 【7segLEDのデコードテーブル】 case led is when "00000" => seg<="00000011"; -- 0 when "00001" => seg<="10011111"; -- 1 when "00010" => seg<="00100101"; -- 2 when "00011" => seg<="00001101"; -- 3 when "00100" => seg<="10011001"; -- 4 when "00101" => seg<="01001001"; -- 5 when "00110" => seg<="01000001"; -- 6 when "00111" => seg<="00011011"; -- 7 when "01000" => seg<="00000001"; -- 8 when "01001" => seg<="00001001"; -- 9 when "01010" => seg<="00010001"; -- A when "01011" => seg<="11000001"; -- b when "01100" => seg<="01100011"; -- C when "01101" => seg<="10000101"; -- d when "01110" => seg<="01100001"; -- E when "01111" => seg<="01110001"; -- F when "10101" => seg<="11101101"; -- = when others => seg<="11111111";入力信号 出力信号: 7 downto 0
LED7segのテストベンチ記述例①
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity LED7seg is
port( dot : in std_logic;
led : in std_logic_vector(4 downto 0); seg : out std_logic_vector(7 downto 0)); end LED7seg; architecture RTL of LED7seg is begin process(led) begin if dot='0' then case led is when "00000" => seg<="00000011"; -- 0 when "00001" => seg<="10011111"; -- 1 when "00010" => seg<="00100101"; -- 2 when "00011" => seg<="00001101"; -- 3 when "00100" => seg<="10011001"; -- 4 when "00101" => seg<="01001001"; -- 5 when "00110" => seg<="01000001"; -- 6 when "00111" => seg<="00011011"; -- 7 when "01000" => seg<="00000001"; -- 8 when "01001" => seg<="00001001"; -- 9 when others => seg<="11111111";
else case led is when "00000" => seg<="00000010"; -- 0 when "00001" => seg<="10011110"; -- 1 when "00010" => seg<="00100100"; -- 2 when "00011" => seg<="00001100"; -- 3 when "00100" => seg<="10011000"; -- 4 when "00101" => seg<="01001000"; -- 5 when "00110" => seg<="01000000"; -- 6 when "00111" => seg<="00011010"; -- 7 when "01000" => seg<="00000000"; -- 8 when "01001" => seg<="00001000"; -- 9 when others => seg<="11111110";
end case; end if; end process;
DUT: LED7seg
- 7seg LEDのデコーダー - 入力は、binary (asciiコードではない) - ドット表示の有無で場合分けlibrary ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity LED7seg_tb is
end LED7seg_tb;
architecture SIM of LED7seg_tb is component LED7seg
port( dot : in std_logic;
led : in std_logic_vector(4 downto 0); seg : out std_logic_vector(7 downto 0)); end component;
signal dot : std_logic;
signal led : std_logic_vector(4 downto 0) :="01111"; signal seg : std_logic_vector(7 downto 0);
constant STEP: time := 1 us; begin
DUT: LED7seg port map (dot, led, seg);
end SIM;
configuration cfg_LED7seg_tb of LED7seg_tb is for SIM ポートリストの無いエンティティ記述 テストモジュール:LED7segのコンポーネント宣言 LED7segの入出力信号で定義する 定数を定義する LED7segをDUTとしてインスタンスする コンフィグレーションを定義する 入力信号の波形を定義する (- 出力波形を記述し期待値照合を行う) 波形記述 ライブラリ記述
LED7segのテストベンチ記述例②
constant STEP: time := 1 us; begin
DUT: LED7seg port map (dot, led, seg);
process begin
if led < "01111" then led <= led + '1'; else led <= "00000"; end if;
wait for STEP; end process; process begin
for I in 0 to 2 loop
dot <= '0'; wait for STEP*32; dot <= '1'; wait for STEP*32; end loop;
assert false severity failure; wait; ☆ LED7segの場合の入力波形の記述 入力信号は、dot(スカラー) と led(ベクトル) led(4 downto 0)の入力信号を生成する - “0000”~”01111”(0~15)を STEP(1us)単位で生成する - 無限に繰り返す dotの入力信号を生成する - “01”を32STEP毎に繰り返す - ループを3回繰り返した後、 assert文で強制終了する
LED7segのテストベンチ記述例③
3.課題2:
『自分の名前を表示させよう』
- 第3日目 -
0123456789_I_AM_TOKUYA_FUJIOKA.
自分の名前 M _ T O←・・
←・・
[各文字と各セグメントの表示は、 テキストpp111、112を参照][実現機能] 4個の7segLEDに、1秒毎に左に流れるように、0~9の数字を
表示させた後に、自分の名前をアルファベットで表示する。
[ボタン仕様]
Button0(stop): 動作の停止/再開
停止: 押下時点での表示をそのまま継続する 再開: 表示状態から次の表示を再開するButton1(reset): 初期状態に戻る(0表示から始める)
[LED表示]
HEX0 : 0123456789_I_am_(各人の名前をアルファベットで表示
HEX1/2/3 : -1/-2/-3秒遅れて、HEX0を同じ内容を表示
[モジュール構成]
- peripheral_moji: 準備されている。 ボタン動作に従って、1Hz周期の
カウント信号(0~63)が出力される: deco0~3[5_0]
- conversion_ascii: カウント信号をascii文字コードに変換
- moji_deco: ascii文字コードを7segLED信号に変換
『名前表示』の開発仕様
『名前表示』のモジュール構成
- 図2-43 実習課題概要 - ↓ 図2-48 ↓ 図2-49 (配付モジュール) clk stop reset deco0 0 1 2 3 4 5 6 7 8 9 ・・・ 62 63 deco1 63 0 1 2 3 4 5 6 7 8 ・・・ 61 62 deco2 62 63 0 1 2 3 4 5 6 7 ・・・ 60 61 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 _ I _ a m _ (ascii)実習の進め方
☆ 基本的には、テキストに従って(テキスト: 105 ~ 137頁)、
設計→実機確認を終了させる。
・ 各モジュールをVHDLで設計 → トップ回路の回路図作成 → (VHDL)シミュレーション → 実機確認☆ 課題1を全てVHDLで設計できた人は、実習の進め方を
以下の順序に変更する
⇐ こちらの方が好ましい ・ ModelSim上で設計(VHDL) → QuartusⅡで実機確認
[ Modelsim ] ⇐
新規プロジェクトを作成する
① conversion_ascii.vhd
(各自で記述内容が異なる)moji_deco.vhd
(全員の記述内容が同じ)を作設計する。
② moji_deco_top.vhd トップ回路をVHDLで設計する
③ シミュレーションを実行し、正しく機能しているか確認する
→ 可能な人は、テストベンチを作成して、simを実行して下さい[QuartusⅡ] ⇐
新規プロジェクトを作成する
④ 端子割り当て後、実機確認
課題2を早く終わった人は、
・テキストの手順の人 → 以下の内容で再設計する
・変更した手順の人
→ 以下の内容の実現していない部分を完了させる
☆ 手順変更&追加課題
1) 全てをVHDLで記述する ・トップレベル回路をVHDL記述し、コンパイル後、実機確認する 2) 全体の表示サイクルを変更する ・表示サイクル: (現在)64秒 → 32秒 [5ビット化] ← peripheral_moji.vhd の内部を変更する必要がある 3) テストベンチを作成して、シミュレーションを実行する(ModelSim環境下) ① 7segLEDデコーダ単体のテストベンチ作成し、 テストベンチの記述方法を習得する ⇐ 本資料の「テストベンチ」の項を参照[変更した手順の詳細]
『名前表示』のシミュレーション
1.シミュレーションのための工夫
1)チャタリングの周波数を変更: 50,000 → 100
[図2-69]
・シミュレーションではチャタリングは発生しない(削除しても良い)2)deco出力の周期を変更: 25,000,000 → 50
[図2-70] ・シミュレーション時間を短縮するため ・図中の50は49が良い ← 0~49: 50 ・実機用deco周期: 20ns×25,000,000×2 =1s ・Sim用deco周期 : 20ns×50×2=2000ns=2us2.シミュレーション時の確認内容
1)decoのカウント数に従って、所望の文字列が発生されているか?
2)カウント数が、asciiコードに正しく変換されているか?
3)7segLEDの信号が正しく生成されている?
4)resetが正しく動作しているか?
5)stop信号が正しく動作しているか?
・1回目押下:カウント停止 →(継続) 2回目押下:カウント再開『名前表示』のテストベンチ記述例
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity deco_top_tb is end deco_top_tb;architecture SIM of deco_top_tb is component deco_top
port(c,r,stop : in std_logic; LED0,LED1,LED2,LED3 :
out std_logic_vector (7 downto 0)); end component;
signal c, r, stop: std_logic := '1' ; signal LED0,LED1,LED2,LED3 :
std_logic_vector (7 downto 0); constant STEP: time := 20 ns ;
begin
U0: deco_top port map( c,r,stop,LED0,LED1,LED2,LED3 );
process begin
c <= '1'; wait for STEP/2; c <= '0'; wait for STEP/2; end process ;
process begin
wait for STEP*4000 ; stop <= '0'; wait for STEP*100 ; stop <= '1'; wait for STEP*900 ; stop <= '0'; wait for STEP*100 ; stop <= '1'; wait for STEP*1900 ; r <= '0'; wait for STEP*200 ; r <= '1'; wait for STEP*4800 ;
assert false severity failure; wait;
end process; end SIM;
configuration cfg_deco_top_tb of deco_top_tb is for SIM end for; clock生成 stop生成 reset生成
DUT: deco_top
- シミュレーション用回路『名前表示』のシミュレーション結果(1)
『名前表示』のシミュレーション結果(2)
『名前表示』のシミュレーション結果(3)
4.課題3:
『チャタリング防止回路』
図2-105 チャタリング防止回路配線例
チャタリング防止回路
○ 1入力 → 1入力 × 1入力 → 複数入力 チャタリング防止回路 - 手法1&手法2 チャタリング発生 ○ 0 1 2 3 4 5 6 7 ・・・ × 0 2 5 7 8 10 14 ・・・ 0 2 5 7 8 _ m ・・・チャタリング現象とサンプリング周波数
[図 2-60] 入力信号 高周波数 1 1 0 1 1 1 1 低周波数 中周波数 チャタリング発生 チャタリング発生 サンプリング 結果(手法1) サンプリング 結果(手法1) サンプリング 結果(手法2)☆ 基本的には、テキストに従って(テキスト: 138 ~ 148頁)、
設計→実機確認を終了させる。
・ 各モジュールをVHDLで設計 → トップ回路の回路図作成
→ (VHDL)シミュレーション → 実機確認
・HEX0にButton1の入力に合わせて、
文字列“0123456789_I_am_自分の名前”を表示させる
⇒
時間が無い場合は、手法1 or 2のどちらかを設計する
(モジュール構成) - chatter: “手法1”のチャタリング防止回路 prevention_of_chattering_kadai: “手法2”のチャタリング防止回路 - count_ex: Button1の押下回数をカウント - conversion_ascii: カウント数をasciiコードに変換 - moji_deco: ascii文字コードを7segLED信号に変換以上までが、
3日目に達成する目標
です。
実習の進め方
5.課題4: 『1分時計』
[実現機能] 1/100秒まで表示する1分時計を作る。60秒でトグルする。
(表示例) 12.34
[秒桁に、ドットを表示する][ボタン仕様]
Button0(reset): 初期状態に戻る(00.00秒表示に戻る)[LED表示]
HEX0 : 1/100秒 HEX1 : 1/10秒 HEX2 : 1秒 ← “ドット”を表示させる HEX3 : 10秒[モジュール構成]
- dividing: 50MHz(20ns)→100Hz(10ms)への分周回路。 - chatter: チャタリング防止回路(既設計。手法1、2どちらでも可) - count10_co: カウントアップ機能付き10進カウンタ - count6_co : カウントアップ機能付き6進カウンタ - conversion_ascii: asciiコードへ変換(既設計。 簡略化してもよい) - moji_deco: asciiコードを7segLED信号に変換((既設計。簡略化してもよい)『1分時計』の開発仕様
『1分時計』のトップ回路図
[入力] - CLK: 50Mhz(20ns) - 非同期reset [出力]1 2.
3
4
1/100単位 ドットを付ける 60秒で繰り返す 0.01秒の桁 0.1秒の桁 1秒の桁 10秒の桁 ドット表示付き 周期:10ms count10_co count10_co count10_co count6 conversion_ascii moji_deco conversion_ascii conversion_ascii conversion_ascii moji_deco moji_deco? moji_deco ドット表示カウンタ回路とその応用
CLK Q[2] D CLK Q D CLK Q D CLK Q ● ● ● ● ● Q[1] Q[0]+1
Q[0] Q[1] Q[2] Q CLK CLK周波数: n ⇐ 周波数: n/2 ⇐ 周波数: n/4 ⇐ 周波数: n/8 ⇐ カウント数 分周回路 10進 2進 15 1 1 1 1 14 1 1 1 0 13 1 1 0 1 12 1 1 0 0 11 1 0 1 1 10 1 0 1 0 9 1 0 0 1 8 1 0 0 0 7 0 1 1 1 6 0 1 1 0 5 0 1 0 1 4 0 1 0 0 3 0 0 1 1 2 0 0 1 0 1 0 0 0 1 0 0 0 0 0 ↑ n ↑ n ↑ n ↑ n☆ 基本的には、テキストに従って
(テキスト: 149 ~ 166頁)
、
設計→実機確認を終了させる。
・ 各モジュールをVHDLで設計 → トップ回路の回路図作成 → (VHDL)シミュレーション → 実機確認 ・ 実機動作を優先させる。 ←本講座のクリア目標
☆ VHDLで全て設計できるようになった人は、
実習の進め方を以下の順序に変更する
⇐ こちらの方が好ましい ・ VHDLでModelSim上で設計 → QuartusⅡで実機確認 ・ (可能であれば) テストベンチを作成し、シミュレーションする[ModelSim]
⇐ 新規プロジェクトを作成する ① 分周回路(dividing)をVHDLで設計: 50MHz → 100KHz へ分周 → Modelsimでシミュレーション ⇐ テストベンチ or 波形入力 ② カウントアップ機能付き10進カウンタ(count10_co)をVHDLで設計 → Modelsimでシミュレーション ⇐ テストベンチ or 波形入力 ③ 6進カウンター(count6)をVHDLで設計: カウントアップ機能は不要実習の進め方
実習の進め方 (続き)
[ModelSim]
(続き) ④ トップ回路をVHDLで設計し、全体シミュレーションを実行する ・シミュレーション時間を調整する →60 ms
⇐ 必須 - dividingを変更する : 100Hz(10ms) → 100,000Hz(10μs)に変更 ⇐ テキストの152頁(図2-110)を参照のこと ・チャタリング回路を調整する - トップ回路からchatterを削除する(コメント行にする) - chatterを変更する ⇐ テキストの125頁(図2-69)を参照のこと ・conversion_ascii、moji_decoは、前のプロジェクトから持ち込む ← そのまま使っても、必要な文字だけ(0~9)にスリム化しても良い
[QuartusⅡ]
⇐ 新規プロジェクトを作成する ① Modelsim から全てのソースを持ち込む ② dividing周波数、チャタリング防止回路(chatter)を仕様通りに戻す ・dividing周波数: 100Hz(10ms) ・チャタリング防止回路は、チャタリングが発生しないように設定する ← 準備されているものをそのまま使っても良い本講座のクリア目標
『1分時計』のテストベンチ記述例
process begin
CLK <= '1'; wait for STEP/2; CLK <= '0'; wait for STEP/2; end process ;
process begin
wait for STEP*10000 ; RST <= '1'; wait for step*1000 ; RST <= '0'; wait for STEP*3200000;
assert false severity failure; wait; end process; end SIM; configuration cfg_minute_top_tb of minute_top_tb is for SIM end for; end cfg_minute_top_tb; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity minute_top_tb is end minute_top_tb;
architecture SIM of minute_top_tb is component minute_top
port (clk, reset : in std_logic; LED0,LED1,LED2,LED3 :
out std_logic_vector(7 downto 0) ); end component;
signal CLK, RST : std_logic := '0' ; signal LED0,LED1,LED2,LED3 :
std_logic_vector (7 downto 0); constant STEP: time := 20 ns ;
begin
U0: minute_top port map
- 分周周波数: 10us → 60ms時計としてシミュレーション CLK生成 RST生成 200usで20usの幅 RST後、 64ms実行して、 強制終了 Sim継続時間
『1分時計』のシミュレーション結果①
『1分時計』のシミュレーション結果②
- 1秒の桁がカウントアップする時: 1215us(10us×100サイクル)
『1分時計』のシミュレーション結果③
- 時計が初期に戻る時: RST後60msで初期状態に戻る
IN A B C 《 配線遅延 》 《 セル遅延 》
遅 延
設計した回路には必ず遅延が存在する。
配線遅延: 配線の長さによる遅延
セル遅延: セル内部で発生する遅延
遅延 IN-A; ① < 遅延 IN-B; ② IN A B ③ ① ① ② ② ③D
CLK
Q
Q
セットアップ時間とホールド時間
入力信号 クロック セットアップ時間 ホールド時間セットアップ時間 ( Set up time ):
クロックのアクティブエッジ(立上りor立下がり)で、データを
読み込む為に必要なデータ
準備時間
ホールド時間 ( Hold time ):
クロックのアクティブエッジ(立上りor立下がり)で、データを
読み込む為に必要なデータ
保持時間
①配線遅延 ②セル遅延 F/F Q CLK Q F/F ① ② ① ② ① ② ①
FF間でクロックの1周期内でデータを正しく受け渡す条件:
クロック周期 > 前段FFのセル遅延
+ 配線遅延の合計(上図①)
+ セル遅延の合計(上図②))
+ 後段FFのセットアップ時間
同期回路の遅延計算
性能向上(高速動作)のための対策例:
・素子性能の向上(セル遅延、セットアップ時間の改善等)
・クリティカルパス(最大遅延パス)の改善
組み合わせ回路
出力がそのときの入力の状態のみで決まる回路
-出力が回路の以前の動作に依存しない、すなわち、情報を
記憶しない回路で、入力の組み合わせにより出力が決定される
主な組合せ回路 - マルチプレクサ(セクター回路) - デマルチプレクサ(分配回路) - デコーダ(復号化回路) - エンコーダ(符号化回路) - 演算回路(加算器等) - コンパレーター(一致検出回路) エンコーダ 0 1 2 3 4 5 6 7 8 9 23 22 21 20 2進出力 10進入力 Out SELS D A B C In D A B C マルチプレクサ順序回路
ある時刻 tの出力Y(t)が、入力X(t)と内部状態Q(t)に
依存する論理回路 Y(t)=
f
(X(t),Q(t))
⇒ 組合せ回路+レジスタ
-非同期式: 回路動作が任意の時刻に発生する入力変化と
その順序(状態)だけに依存する順序回路
-同期式: 回路動作がクロックに同期する順序回路
- 信号(0または1)を一時的に保持する回路 - タイミングを制御するクロック信号に同期して動作する(非同期もあり)■ ラッチ
クロック信号がアクティブである間、入力を出力にそのまま出力し、
クロック信号がインアクティブに変化する時の値を保持する回路
■ フリップフロップ(同期型)
クロック信号の立ち上がりまたは立ち下りの瞬間(エッジ)の
ラッチとフリップフロップ
レジスタ同士が、違うクロックで動作する → 回路全体が簡素化でき、クロック周期を気にせず設計できるが、僅かタイミング のずれでグリッジを発生させやすく、誤動作を起こしやすい。温度依存性も高い。 [利点」 軽い回路には手軽に使える。 必要な時にしかラッチクロックが起きないので費電流が少ない。 [欠点] 大規模回路では、予期せぬタイミングトラブルがいろいろな所で発生し、