vhdl実戦講座jte401/files/vhdl_2006.pdf3 1.0.0 本講座のねらい...
TRANSCRIPT
1
VHDL実戦講座東京理科大スペシャル2006
V 2.02 176
ミカミ設計コンサルティング三上廉司
E-MAIL<[email protected]>http://homepage3.nifty.com/western/
Science0612_TOP061_print.PPT 2006/11/27
A
3
1.0.0 本講座のねらい
本講座は,東京理科大において過去に実施したセミナーのフィードバックと要望などを検討し特別に構成されたものである.
基礎理論を重視するあまり,時として実際の設計から乖離しがちな大学の講座を補追する目的で作成した.設計者の視点に立って回路設計の目的,すなわち回路システムの仕様記述,方式検証,シミュレーション,記述回路の合成可能性の視点からVHDL文法系を再構築し最適化を試みた.就職後の企業での実戦設計も意識している.
よって効果的に言語の本質と特徴を理解し,これを短期間に習得し速やかに実務に役立てることを目的としている.よって必要不可欠の記述からはじめ,随時必要な回路設計を解説するが,冗長不要なる文法は明快に切り捨てている.解説にあたっては,実回路と設計に対応させながら理解のしやすさに極力配慮した.習得成果を最優先にしたので一般のVHDLの講座とは異なるが同等の他講座の再受講や補足を要さぬことを期している.
A
4
1.0.1 実用に即して記述文法系を再構築して学習
よいこのための
VHDL
ミカミ出版
厳選した文法
典型的な実回路群ハードウェア設計のノウハウ
VHDLのポイント
VHDLのポイント
厳選した文法で、実回路に即応した記述を設計ノウハウを交えながら再構築して学習する。
A
5
1.1.1 導入部コンテンツ
• ディジタル・コンバージェンスアナログでないとできない回路とディジタル化されていく回路
エネルギー伝達と情報伝達、制御、信号処理、
ディジタルとアナログの境界インターフェース
交流理論とスイッチング理論、
連続と離散
• ソフトウェアとハードウェア アルゴリズムの実現、プロセッサとエンジン
ソフトウェア言語とハードウェア記述言語
• ハードウェア記述言語設計対象の表現の3ドメイン
ビヘービア、ストラクチャー、フィジカル
アルゴリズム表記とトポロジー表記
VHDL記述の二つの側面
設計自動化とシミュレーション
合成可能な記述と合成不能な記述
C
6
1.2.1 ディジタル・コンバージェンス• ディジタル処理化の波
アナログでないとできない回路とディジタル化されていく回路について考える
• エネルギー伝達と情報伝達、制御、信号処理エネルギーの伝送と信号(情報)の伝送に分離して考える
従来のアナログ回路は、信号(情報)の伝送とエネルギー伝送が同時に行われている。
例:電話のメタルライン:収容局からの給電、音声信号伝送
FTTHにより、信号(情報)のみの伝送に変わる
例:L/C (HPF/LPF)フィルター
A/D -> Digital Signal Processing -> D/A に置き換わる
• ディジタルとアナログの境界インターフェース電源、A/D、 D/A、 高速シリアルインターフェース、高周波の無線技術等が
キー・テクノロジー
• アナログ問題を(連続量を)ディジタルで(離散的に) 解く交流理論、数式をアルゴリズム化する。
低速でかまわない処理は、プロセッサによるソフトウェア処理
高速処理の場合は、アルゴリズムをハードウェアでエンジン化
速度と回路規模の100倍原則 (ハードウェア対ソフトウェア)
C
7
1.3.1ソフトウェアとハードウェアアルゴリズムの実現
• プロセッサとエンジン汎用のハードウェアにアルゴリズムをソフトウェアで実行
エンジン:アルゴリズムをそのまま実行する専用ハードウェア
FPGAの登場により、エンジンをコンフィギャブルに実現
ハードウェアもソフトウェア的にプログラマブル化
• アルゴリズム、ハードウェア記述言語の理想ソフトウェア処理、ハードウェア処理を意識せずに記述
試作前に仕様の記述と整合性検証、方式(システム設計)の評価検証
個別のシステム構成モジュールを自在に、ソフトウェア処理と
ハードウェア処理に割り当て、処理速度(性能)と回路規模(コスト)のトレードオフを最適化
言語による記述から、トップダウンで設計を自動化
人間が行う作業は、仕様の記述、検証用のテスト・ベクタの記述、
システムの分割、トレードオフの決定
• アルゴリズム、ハードウェア記述言語の実際すべてをカバーできる理想的な言語はない。
ソフトウェアから進化した言語系は、逐次処理が原則
ハードウェアから進化した言語系は、並列処理が原則
VHDLはその両者の考え方を持つ(シーケンシャルとコンカレント)
C
8
2.1.1ハードウェア記述言語-総論
• ソフトウェア言語との相違
• HDLとHLL• 言語の抽象性レベルとドメイン
• 言語の役割
• 検証とシミュレーション
• 記述自体の検証
• 方式の検証
• 方式(整合性レベル)検証、
• 回路動作の検証
• テストベンチ、スティミュラスの記述
• 設計自動化
• VHDLの文法と記述
• VHDL習得のコツ
F
9
2.1.2 ソフトウェア言語との相違
• ソフトウェア言語
ソフトウェア言語は、チューリング・マシン(ノイマン・マシン)が前提、インストラクション・ドリブン(命令駆動)方式で成り立つので、記述はシーケンシャルに実行、処理を順序で記述する。
これをアルゴリズム、あるいはBehavior (動作)記述という
設計自動化(合成)の場合は、HDLに対してHLL (High Level Language)という場合もある。
• HDL (Hardware Description Language)これに対してHDLは、並列動作のハードウェアを記述
HDLの記述は、回路の接続情報の表現
回路の接続情報のことを、ネットリストあるいは
トポロジーという場合もある
VHDLは、基本的にHDLに属する言語であるが、厳密な仕様のもとに、アルゴリズム(シーケンシャル)記述も可能である。
ソフトウェア言語では、並列動作の
ハードウェアの記述ができない
F
10
2.1.3 HDLとHLL
• HDL (Hardware Description Language)– ハードウェアの仕様を記述する言語
– インスタンス(使用部品、マクロ)とトポロジー(接続、ネット)でハード構造を表現– 抽象度を上げるとHLLに近づく– コンカレント(並列または同時実行)処理が主体– VHDLでは、シーケンシャル処理(アルゴリズム的記述)を一部包括(variable 等)
Yチャート上ではStructural Representation
• HLL (High Level Language)– ハードウェアを特定しない、ビヘービア・レベルの抽象度の高い記述、アルゴリズムによる表現
– シーケンシャル記述が主体
Yチャート上ではBehavioral Representation
F
11
2.1.4 HDLの例
• ハードウェアの構造の記述① s <= a xor b; ② c <= a and b; ③ a <= not i;記述の順番は無関係(①②③の順番を入れ替えても内容に変わりはない).インスタンス(実在するコンポーネント,HAやインバータ)間の信号のトポロジー(接続)が式で表現されている。下記の記述でも同じ
③ a <= not i;② c <= a and b; ① s <= a xor b; ハードウェアの構造記述
コンカレント(並列)処理
StructuralRepresentation
F
i HAab
cs
12
• Y = (a * b) + c + d*(e+f) 関数の実行順序① y1 := a * b; ② y2 := e + f; ③ y3 := d * y2;④ y4 := y1 + y3;⑤ Y := c + y4;
順番どおりに実行しないと正しい結果が得られない
ビヘービアの記述シーケンシャル処理
BehavioralRepresentation
2.1.5 HLLの例 F
13
2.1.6 HLLからのさまざまな回路解
• Y = (a * b) + c + d*(e+f) = a*b + c + d*e + d*f
動作記述からの回路化
• 高速な回路 並列化
乗算回路
a
bc
ef
レジスタ
d
1シーケンサ
加算回路
データセレクタ
データセレクタ
Y
abc
Y
乗
dedf
乗
乗
加
加加
• 回路を 減らした例
シーケンシャル化
乗 加
F
14
2.2.1 言語の抽象性レベルとドメイン
記述対象を三つのドメインに分けて考える(Y チャート)Behavior Representation は、動作表現
たとえば、加算器は Y <= A + B;
Structural Representation は、構造表現
たとえば半加算器と全加算器によるリプル・
アダー等に構造を具体化
(コンポーネントとその接続情報)
Physical Representation は、実装表現
加算器を構成する個別のコンポーネントの
物理的な位置とそれらの具体的な配線路の
表現(コンポーネントの配置位置情報と,配線経路情報)
F
ADD4
FA HAORHA
HA
FA HAORHA
FA HAORHA
ADD4BC31
AB Y
AB Y
15
2.2.2 設計仕様の三表現
Performance Specifications
Algorithms
Systems
CPU,Memories
ALUs,MUXs,Regs
Differential Equations
Boolean Equations
Register Transfer Level
Gates,F/Fs
Transistors
Placement & Routings
Cells
Clusters
Physical Partitions
Floor Plans
Y チャートデザインを、3つのドメインに分けて
考える
BehavioralRepresentation
StructuralRepresentation
Physical Representation
F
16
Circuit
Logic
Functional
Algorithmic
Architectural
Performance Specifications
Algorithms
Systems
CPU,Memories
ALUs,MUXs,Regs
Differential
Boolean
R.T.L
Gates,F/Fs
Transistors
Placement & Routings
Cells
Clusters
Physical Partitions
Floor Plans
内周から外周に向かうほど抽象性が高くなる
BehavioralRepresentation
StructuralRepresentation
Physical Representation
2.2.3 設計仕様の抽象性 F
17
Circuit
Logic
Function
AlgorithmArchitecture
BehavioralRepresentation
Physical Representation
StructuralRepresentation
Refinement
Compilation
Synthesis
System Level Synthesis
Logic Synthesis
Behavior Synthesis
BehaviorからStructuralへの変換をSynthesis
(合成)という
Physical への変換をCompilation
(配置配線)という
2.2.4 シンセシス(合成)とコンパイル F
18
2.3.1 設計自動化とシミュレーション
HDL/Behavior
Simulation
Design Synthesis,Compilation
機能、タイミングシミュレーション
記述の整合性検証
設計自動化
こちらは楽 こちらはたいへん
概念の世界 実物を作る世界
方式の評価検証
F
HDL/Behavior記述からの2つの展開
19
HDL/Behavior
実回路実回路を合成できないHDL記述領域
HDLで記述が困難な
実回路領域
抽象的・アルゴリズム的
具象的・ハードウェア的
記述可能記述可能合成可能合成可能領域領域
記述・合成可能領域の実態は文法全体の 5-10%
2.3.2 HDLの記述性と合成可能性問題F
20
2.3.3 検証とシミュレーション
3.5.1 記述の検証
シミュレータの言語パーサーで構文解析、記述の誤りチェック
3.5.2 方式の検証
VHDLで対象とテストベクタを記述、シミュレーションを実施して、テスト・ベクタに対して予期したとおりの動作が方式的に得られるかを検証
3.5.3 機能レベル検証
VHDLで設計対象ハードウェア機能と入力のテストベクタを記述、シミュレーションを実施して、入力のテスト・ベクタに対してハードウェアが予期したとおりに機能するかを検証、このあとは、論理合成とコンパイルで設計自動化工程に入る
3.5.4 回路動作の検証
設計自動化工程終了後、具体的な配線遅延データをもとにタイミング・シミュレーションを実施する。
F
21
2.3.4 シミュレーションの要素
• 対象回路の記述ソース
• テスト・ベクタ
• シミュレーション・ライブラり
機能と仮想遅延データ
(予め用意されている)
• 実遅延データ
(配置配線終了後にできる - SDF等)
.VHD
.VHD
.LIB
シミュレータ機能
シミュレーション結果
タイミングシミュレーション
結果
F
.SDF
22
2.3.5 HDL文法と記述
• 対象回路のソース記述用文法– 対象回路の方式検証の場合は、制約なしでHDLのすべての文法を用いて
記述ができる.
– インプリメント時はアルゴリズム記述の部分を、ソフトウェア処理にする場合は再度使用するソフトウェア言語に変換するか、書き直さなければいけない。
– 実際の回路にする場合は、合成可能な記述にしておくか、さもなければ合成可能なように書き直しをしないといけない.
• テスト・ベクタ用文法– HDLでは、フレキシブルなテストベンチを構成できるが、最初は回路の
入力スティミュラス(信号)の記述から覚えると理解しやすい.
• 回路合成用文法– 合成可能な記述をピックアップして覚えるのがコツ.
• 実際の回路に即した書き方の型を覚える– 記述しても回路を合成できない場合がある.
• ライブラリ用文法– ライブラリ化して設計資産を蓄積する.
文法書からそのまま入ると挫折しやすい
F
23
HDL/Behavior
実回路実回路を合成できないHDL記述領域
HDLで記述が困難な
実回路領域
抽象的・アルゴリズム的
具象的・ハードウェア的
記述可能記述可能合成可能合成可能領域領域
実際の回路に対応させながら、この部分から覚える(文法全体の 5-10%)
2.3.6 HDL習得のコツ
常にその記述が合成可能なのかを意識すること
テストベンチやモデル記述に必要なものを
最低限ピックアップ
する
F
24
3.1.1 VHDLの素性
• 言語は目的を持ってその仕様が設計される– アルゴリズムの記述用の言語
– シミュレーション用の言語
– 合成、コンパイル用の言語
• VHDLの生い立ちについて– 米国防総省Adaの仇討ち? ….納入用LSIの仕様記述に強制力
– シミュレーションや合成は想定せず,厳密かつ拡張性に富む
– この厳密さが使いにくさに拡張がわかりにくさの根源
• VHDLの使途– 大学の演習用,プロセッサ・アーキテクチャ設計演習
– 大規模VLSIの設計方式の検証とシミュレーション
• VHDLの拡張– ライブラリ拡張 IEEE_1164(1991年)以降,9値Std_logic型が使用可
能
– 各ツールメーカーが拡張ライブラリを供給
– 合成,シミュレーション・メーカーが追対応.– 文法や各社拡張関数の合成可能性,シミュレーション可能性の点で
は互換性が完全ではない
– 言語仕様や型が非常に厳密なので、記述ミスが発生しやすい
G
25
3.1.2 VHDLの使われ方
(納入)仕様さえ記述できればよい
アーキテクチャの(方式)検証
VHDL大文法
VLSI仕様の記述
ASIC/FPGA論理回路
設計のソース
回路が記述できなければいけない。記述から合成できなければいけない。シミュレーションもできなければいけない。 最高?の枕
G
記述ソースがシミュレーションできなければいけない
26
3.1.3 VHDLと実回路との乖離
一般にVHDLは難解で習得に多くの時間を要するとされているが、言語全体をマスターしても.....
• 実回路をすべて記述しきれるわけではない。
• すべてのVHDL記述から、必ず回路が合成で きるとはかぎらない。
必ず記述が可能で、かつ合成可能な回路は、モジュール単位での、一層クロック動作の
完全同期式回路と考えておけばよい。
G
合成不能な記述例• After 文による遅延の設定• 初期値の設定
• 複合クロック信号
• 制約なしの loops• Text I/O (File types)• Access types• Real type (浮動小数点)
27
3.1.4 最低限必要な記述文法を選別
VHDL大文法
マーク
よく使う
試験に出る?
必須
400年に三回使うその他の文法
合成できない記述
まずはここからスタートしよう
ターゲットは全体の5%
よいこのための
VHDL
ミカミ出版
G
VHDL言語系習得の要点
1.VHDL構成要素の骨格を理解2.VHDL言語系特有の構造と手法を理解
3.最低限必要な記述文法を選別4.予約語と非予約語の区別5.記述の型を回路対応で整理する6.凝った記述をしない
ここ大事
28
3.1.5 VHDL言語習得のアプローチ
1.使用するデータの型を最低限必要なものに制限
2.基本的な演算子群と優先順序をセットで覚える
論理演算,算術演算,関係演算群で分類
演算子ごとに使える型が違うので注意
(演算子を使用するためには型変換が必要)3.データの型一致のテクニック
型変換関数と演算子オーバーロード
4.process文の概念
5.コンカレントとシーケンシャル処理
signal文variable文に対応させて覚える
6.各種の条件,制御文
条件,制御文は使用できる場所とのセットで覚える
7.記述は徹底してモジュール・ベースで行う
8.シミュレーション用のテストベンチの記述法
G
29
1.回路全体と、構成各モジュールの入出力
2.モジュールの機能記述 (機能記述-回路モデル)3.各モジュール間の接続 (構造記述-ネットリスト)
モジュール単位でVHDL記述する。
L
ライブラリ
データ型
11
3.2.1 VHDL構成要素と回路構成要素
回路入出力1
回路入出力 1
Module CINPUT
OUTPUT
Sub Mod.C”
Sub Mod.C’
階層化Sub Mod.C’
階層化Sub Mod.C’’
ModuleD
ModuleB
ModuleA
3
3
3
3
3 3
モジュール機能の記述
演算子、関数、制御文
2
30
3.2.2 VHDL構成要素の骨格
1.回路全体と、構成各モジュールの入出力– ライブラリ
– データの型
– 回路入出力
– シミュレーション用テスト・ベクタ(テストベンチ)
2.モジュールの機能記述 (機能記述-回路モデル)– 割り当て演算子と機能表現演算子
– 機能表現とアルゴリズム表現
– 関数
– 制御文
3.各モジュール間の接続 (構造記述-ネットリスト)– 階層設計のルール
トポロジー表現ともいいます。
コンポーネントともいいます。
G
31
3.2.3 記述の型を回路からの対応で覚える
1.システム記述
入出力、クロック系、パイプライン
2.階層/モジュール定義とネットワーク接続
3.回路の記述
3.1コンビネーション回路
エンコーダー・デコーダー
3.2データ・パス回路
演算、比較、シフト
3.3順序回路
カウンターとステート・マシン
4.制御文
まずはこれら機能に対応する記述をVHDL文法から
選択して覚える。
シミュレーションに必要
G
32VHDL予約語一覧
abs, access, after, alias, all, and, architecture, array, assert, attribute,begin, block, body, buffer, bus, case, component, configulation, constant, disconnect, downto, else, elsif, end, entity, exit, file, for, function,generate, generic, guarded, if, impure, in, inertial, inout, is, label, library, linkage, literal, loop, map, mod,nand, new, next, nor, not, null, of, on, open, or, others, out, package, port, postponed, procedure, process, pure, range, record, register, reject, rem, report, return, rol, ror, select, severity, shared, signal, sla, sll, sra, srl, subtype, then, to, transport, type, unaffected, units, until, use, variable, wait, when, while, with,xnor, xor
VHDLは、区別なしだが
予約語は小文字で、ユーザー定義識別子は
大文字で書くのがコツ。
3.2.4 予約語と非予約語の区別
修得開始時の意外なネックは、予約語と非予約語の区別に慣れないことから発生する。
言語系を調べてみると、予約語は、区別なし非予約語は、区別有
のケースが多い大文字小文字の使い分けは,
流儀があるので,各自できめてよい.
G
34
4.1.1 VHDL文法構造の最小構成
library
architecture
entity port (......)
... end
begin ...
使用するライブラリを宣言する部分標準ライブラリやユーザー定義のライブラリをuse文で記述
回路の入出力信号と、そのデータの型を宣言する部分この記述には,port文を使用する.
回路の機能や動作を記述する部分begin で始まり,endで終わる.
Entity 内に複数のアーキテクチャ文も書ける(モジュール化,
階層化ができる).
use ...
-- に続くのはコメント文
HC1
35
4.1.2 entity と architecture
entity
architecture
entity INVMOD is port(INVIN : in std_logic;
INVOUT : out std_logic);end;
architecture INVERTER of INVMOD isbegin
INVOUT <= not INVIN; end INVERTER; entity (回路全体)
architecture (回路の中身)
INVIN INVOUTportport
INVMOD
Portのモードは3つ双方向は,inout
回路の入出力
回路の中身
library ieee;use ieee.std_logic_1164.all;library
データ型にstd_logicを使用しているので、Library文でieee.std_logic_1164を使用宣言
HC1
36
4.1.3 VHDLの記述例ポート(入出力端子)名とモードタイプ(型)宣言
論理機能の記述not:論理否定演算子
(インバータ・モデル)
<= はコンカレント代入文.後で詳説.右辺の値を左辺に即時代入.
library ieee;use ieee.std_logic_1164.all;
entity INVMOD isport(INVIN: in std_logic;
INVOUT: out std_logic);end; -- の後はコメント文
architecture INVERTER of INVMOD isbegin
INVOUT <= not INVIN;end INVERTER;
HC1
library
architecture
entity
use
begin
end
end
port
37
4.1.4文法の最小構成のまとめ
• library 文…使用ライブラリを宣言. lirary Ieee;は必須
– use 文でパッケージを宣言
» シミュレーション,合成用に各種のパッケージを記述する
• entity 文…回路名を宣言.entity は,対象回路のひとつのまとまり
– port 文..回路の入出力を宣言
» ポート名,{ポート名,….,}:モードタイプ;と列記
» モードタイプは3つ in, out, inout
• architecture 文…回路の機能を記述,いくつのアーキテクチャ文があってもよい.個々のアーキテクチャを連結したり階層化することができる.
ポイント:VHDLでは,さまざまな文があるが,
文法の構造のどこで使用できるかに注意して覚えること
H
38
4.1.5 各文の構造的な関係
architecture
architecture architecture
process C
process B process A
H
一つの entitiyに複数の architectureを書ける
library …複数のライブラリuse entitiy ….一つ
port
一つの architectureに複数のprocessを書ける
一つの entitiyに複数の architectureを書ける一つの architectureに複数のprocessを書ける
39
5.1.1 データの種類-オブジェクト・クラス
• signal 信号宣言 グローバルpackage, entity, architecture で使用
• constant 定数宣言 グローバルpackage, entity, architecture, process, function, procedure で使用
• variable 変数宣言 ローカルprocess, function, procedure で使用変数の場合の割り当て演算子は,:= を使用する.process 文中で使用する点に注意する.
それぞれの宣言文が使用できる場所に注意する.宣言した信号が実在信号かどうかに注意する.
実在信号ならば,対応する回路ノードが存在する.
I1
40
データ型•• std_logicstd_logic (IEEE 1164), bit•• std_logic_vector std_logic_vector (IEEE1164), bit_vector•• Integer (Integer (整数型整数型 3232ビット迄ビット迄))• boolean (真-true,偽-false)• real (10進 floating point)• enumerated type (列記型)
• character• string• physical (time, current, etc.)• arrays (single- and multi-dimensional, constrained or
unconstrained)• records• access types (pointers)• file types
まず上の三つの型を覚える
5.1.2データの型と演算子
bitは,0/1 の2値を持つstd_logicは論理値をIeee.std_logic_1164
パッケージで9値に拡張_vectorは,そのベクトル型
ユーザー定義で型を拡張できる.-type,subtype 宣言文を使用する.
I1
41
5.1.3 三つのデータ型から覚える
• std_logic型だけが,
実回路対応の9つの値を持ち,
シミュレーションと合成の
双方が可能である
• std_logic, std_logic_vector9値 (‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-’) (注:1ビットはシングルクオート
‘1’,’0’ ,ベクトルは,ダブルクオート“1100”,“00XX”を使う,bit型も同様の表記)
論理の記述に使用できる型 (注:算術演算には使えない☆)
• integer(整数型)算術演算に使用できる型
U:初期値 ー:ドントケア
Z:ハイ・インピーダンス
0:通常の0 L:弱い0 1:通常の1 H:弱い1 X:不定 W:弱い不定
ビット幅定義の書式std_logic_vector(3 downto 0)
std_logic_vector(0 to 3)数値範囲定義の書式
Integer range 0 to 255合成可能にするためにレンジを指定しておく
☆オーバーロードという拡張で使用可能にもできる
I1
42
Std_logic_vector, bit_vector の連接演算
a : std_logic_vector(0 to 4),b : std_logic_vector(0 to 1);
a & b a(0),a(1),a(2),a(3),a(4),b(0),b(1);
c : std_logic_vector(0 to 7);
c(2 to 5) c(2),c(3),c(4),c(5);
std_logic_vector(M downto N) ,M ≧ Nのときでも同様可
5.1.4 ベクトル型の連接演算とビット指定I1
43
5.1.5 ストレングス概念(信号強度)
True / False あるいは、
1 / 0 ,H /L という二値では実回路でシミュレーションで不定が多くなり実用性が落ちるので信号強度という概念を導入してある.
• std_logic, std_logic_vector9値 (‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-’)
U:初期値 ー:ドントケア
Z:ハイ・インピーダンス
0:通常の0 L:弱い0 1:通常の1 H:弱い1 X:不定 W:弱い不定
Hと0が衝突.強度で0と決定する
Rを強度変換と
モデリング
R
0
1拡張値の場合
H
00
R
Pull Up
0
1
X ..0?/1?
二値の場合
1
0
I1
44
実際には、まず’event を覚える.信号値の変化があると,真(true)なければ偽(false)を返す
例 if (CLK'event and CLK = '1‘) then (注 括弧はなくてもかまわないが,誤りを防ぐために,あえて括っている.CLKはクロック入力)
5.1.6 属性 - attribute既定義アトリビュート
data types, signals, blocks, architectures, events, などで,状態によって戻り値を返してくるもの
例:’event
ベンダ定義アトリビュート
各ツール・ベンダーが個別に定義したもの合成目的に使用されることが多い
ユーザー定義アトリビュート
可能だがあまり使われない
I1
45
6.1.1 VHDL演算子
論理演算子
and, or, nand, nor, xor, not (bit,boolean,std_logicに使用可)
関係演算子
=, /=, <>, <=, >= (全データ型に使用可.幅違いは下位が有効)算術演算子
+, -, *, /, **, abs, mod, rem (整数型に使用可.)加,減,乗,除,べき,絶対値,モジュロ,剰余
シフト・ローテイト演算子
sll,srl,sla,sra,rol,ror s-shift,r-rotate,l-left,r-right,l-logical,a-arithmetic(一次元配列型に使用可)
Concatenation operators& (,,,) (array型に使用可)
I1
46
6.1.2 演算子の優先順序
1.論理演算子(and,or,nand,nor,xor)
2.関係演算子(=,/=,<,>,<=,>=)
3.加減算演算子,&(+,-,&(配列))
4.正負の符号演算子(+,-)
5.乗除算演算子(*,/,mod,rem)
6.特殊(not,**,abs)
高い 低い
算術演算
論理演算
関係演算
I1
47
6.1.3 データ型と型の不一致問題
ModuleA
ModuleB
a (integer)
b (boolean)演算や接続
c (real)
ErrorError
• すべての信号はデータ型を持つ
• すべての信号はセットになった多ビット型構造を持つ
• データ型によって使用できる演算子が異なる
• 特定のデータ型の信号で他のデータ型の信号をドライブ
するとエラーになる
• データ型は、ユーザーによって拡張できる
I1
48
6.1.4 データ型と使用できる演算子
論理演算子
and, or, nand, nor, xor, not
関係演算子
=, /=, <>, <=, >=,算術演算子
+, -, *, /, **, abs, mod, rem
(処理系により,オーバーロードによりXを○にもできる.また型変換を容易にする関数が用意されている場合もある.)
std_logic,std_logic_vector integer
I1
49
library ieee;use ieee.std_logic_1164.all;
entity ADD4_ERR is
port(DIN_A,DIN_B: in std_logic_vector(3 downto 0);
DOUT: out std_logic_vector(3 downto 0));end;
architecture OPR_ERR of ADD4_OR isbegin
DOUT <= DIN_A + DIN_B;end OPR_ERR;
6.1.5 演算子とデータ型不適合
Error
Std_logic_vector型の変数同士の算術加算はエラーとなる.たとえば,論理値“10HZ”+”W1Z0”の算術加算を考えてみればよい.
I1
50
6.1.6 データ型一致のテクニック
ModuleA
ModuleB
a std_logic
• モジュール間信号のデータ型を一種類に統一する
std_logic,std_logic_vector等• 他のデータ型での演算や記述が必要な場合
std_logicから型変換型変換をして処理する
(ローカル変数のvariableを使用)
オーバーロードオーバーロードを利用する
• 処理が終了した後は,元のデータ型に戻しておく
b std_logicy std_logic算術演算
等
c std_logic_vector
Module C
オーバーロードは、オーバーライド
ともいう.
I1
51
6.2.1 局所的なデータ型変換のテクニック
std_logicstd_logic,...vector
算術演算等
std_logic_vector
Module Cstd_logicではできない処理
integer型の結果Qを
COUNT(std_logic_vector型)に再代入
process文中でローカル変数Qをvariableで宣言
std_logic_vector型の
外部信号DATAをinteger型のQに代入
integer同士で
算術演算
integerinteger
integer
architecture UP_CNT of COUNTER isbegin
process(CLK,RST) variable Q: integer range 0 to 255;
beginif (RST='1') then
Q := 0;else
if (CLK'event and CLK = '1‘) then if (LD='1') then
Q := CONV_INTEGER(DATA);else
Q := Q + 1;end if;
end if;end if;
COUNT <= CONV_StdLogicVector(8,Q);end process;
end UP_CNT;
1
1
32
2
3
44
1Q +
CONV_INTEGER, CONV_StdLogicVector は型変換関数
I1C6A
52
6.2.2 型変換とvariable文library ieee;use ieee.std_logic_1164.all;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity COUNTER is
port( CLK,RST,LD: in std_logic;DATA: in std_logic_vector(7 downto 0);COUNT: out std_logic_vector(7 downto 0));
end COUNTER;
architecture BEHAVIOR of COUNTER isBegin
process(CLK,RST) -- Counter with RST as asynchronous resetvariable Q: integer range 0 to 255;
I1C6A
variable文で整数型変数Qを宣言Qはprocess文中でのみローカルに使用
RSTで非同期リセット
53
6.2.3 データ型変換関数begin
if (RST='1') thenQ := 0;
elseif (CLK'event and CLK = '1’) then
if (LD='1') then
Q := CONV_Integer(DATA);else
Q := Q + 1;end if;
end if;end if;
COUNT <= CONV_Std_Logic_Vector(8,Q);end process;
end BEHAVIOR;
DATA(std_logic_vector型)をinteger型変数Qに型変換して代入
integer型変数QをCOUNT(Std_logic_vector型)に
ビット幅を指定し,型変換再代入
I1C6A
54
library ieee;use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;(use ieee.std_logic_signed.all;)
entity ADD4_OL is
port(DIN_A,DIN_B: in std_logic_vector(3 downto 0);
DOUT: out std_logic_vector(3 downto 0));end;
architecture OPS_OL of ADD4_OR isbegin
DOUT <= DIN_A + DIN_B;end OPS_OL;
6.3.1 オーバーロードによる解決法
std_logic_vector型で
算術演算子使用可能
拡張ライブラリ関数を使用する場合は,
use IEEE.std_logic_arith.all;とパッケージの使用宣言し,符号なし演算の場合は,
use IEEE.std_logic_unsigned.all;符号つき演算の場合は,
use IEEE.std_logic_signed.all;と書く.他社の合成ツールや
シミュレータを使用する場合は,それぞれのツールでライブラリの
互換性を確認.
I1
55
library IEEE;use IEEE.std_logic_1164.all;
use ieee.std_logic_arith.all; --(オーバーロード定義のライブラリ使用)use IEEE.STD_LOGIC_UNSIGNED.ALL;entity COUNTER is
port( CLK,RST,LD: in std_logic;DATA : in std_logic_vector(7 downto 0), COUNT : inout std_logic_vector(7 downto 0));
end COUNTER;
6.3.2 オーバーロードによる解決法
architecture BEHAVIOR of COUNTER isbegin
process(CLK,RST) -- asynchronous resetbegin
if (RST='1') thenCOUNT <= "00000000";
elseif (CLK'event and CLK = '1‘) then
if (LD='1') thenelse
COUNT <= COUNT + 1; end if;
end if;end if;
end process;end BEHAVIOR;
I1C6B
COUNTは<=の右辺(代入側)にも使用するので inoutoutだと右辺側には使用不可
std_logic_vector型で算術演算子”+“使用可能
56
6.3.3 標準型変換関数の例• Std_Logic_1164パッケージ内
To_StdLogicVector(bit_vector型のデータ) :std_logic_vectorに変換To_bitvector (std_loic_vector型のデータ) :bit_vectorに変換To_StdLogic(bit型のデータ) :std_logicに変換To_bit(std_logic型のデータ) :bitに変換
• Std_Logic_Arithパッケージ内CONV_STD_LOGIC_VECTOR(引数,ビット幅)
引数:integer,unsigned,signed :std_logic_vectorに変換CONV_INTEGER (引数)
引数:unsigned,signed :integerに変換
• Std_Logic_Unsignedパッケージ内CONV_INTEGER (std_loic_vector型のデータ):integerに変換
サポート関数は,各ツールのieeeライブラリ内を参照
I1
57
もともとVHDLは,実際のシミュレーションや回路の設計自動化を考慮していませんでした.しかしその後,順次言語を拡張してきました. 拡張によって登場したStd_Logic_Vectorというデータの型はシミュレーションなどで実際の回路動作を表現するのには好都合なのですが他のデータの型との演算や記述で不整合を起こします.これを回避するための記述はとても長く複雑なものになります.
各EDAメーカーツールは,言語の記述性を向上させるさせる目的で拡張した関数を作ったり演算子のオーバーライドができるようにライブラリを提供しています.
VHDLで記述する場合には,たとえばシミュレーション・ソフトウェアが用意しているライブラリや記述例を使用した場合,そこからシミュレーションをすることはできますが,実際に回路に合成する場合,合成ツールがその関数や記述をサポートしていない場合がありますので注意が必要です.
また回路設計用に合成ツールを使用する場合は,そのツールが回路を合成するための独自の記述や関数を拡張している場合があります.その場合は,それをサポートするライブラリがシミュレータ側に用意されていないとシミュレーションができません.
かといって,どのツールにでもかけられるようにVHDLの標準文法だけで記述することは,設計に使用する場合は,とても骨が折れて現実的ではありません.
FPGA/ASICなどを設計する場合は,合成ができないと話になりませんから合成ツールの記述や拡張関数を使用することになります.そしてそれに対応したライブラリが用意されているシミュレータを使用します.ライブラリはソースで用意されているので最新版をシミュレータでコンパイルしてから使用します.
6.3.4 ソースの互換性I1
58
6.4.1 コンカレントとシーケンシャル概念
begin
end
statement
ConcurrentConcurrent
statement
statement
begin
end
SequentialSequential
statement
statement
statement
J
59
6.4.2 process文の場所と意味
library…use…….
entitiy…. port…… architecture……..
architecture……
process….Y := B;
(:=は,上から順に代入)
process……..
}library,entityはひとつ
architectureはentity内に複数あってもよい
processはarchitecture内に複数あってもよい
Y <= A; --ここでの信号割り当てはprocessの外だからコンカレント(まったくの非同期)
Y <= A; --ここでの信号割り当ては
processの中だからセンシティビティーリストのイベント発生によって実行.
( <= は同時に代入 )
J
60
6.4.3 architecture文のコンカレント記述
library ieee;use ieee.std_logic_1164.all;
entity INVMOD isport(INVIN: in std_logic;
INVOUT: out std_logic);end;
architecture INVERTER of INVMOD isbegin
INVOUT <= not INVIN;end INVERTER;
entity
INVMOD
architecture
INVIN INVOUTport port
コンカレントとは、単純な信号結線
右辺の信号変化がただちに左辺に評価,代入される.
割り当て演算子<=は,
コンカレントでは,右辺の信号を,いつでも,ただちに左辺に伝播
JC1
61
6.4.4 プロセス記述文
architecture アーキテクチャ名 of エンティティ名 isbeginプロセス名: process(SENSITIVITY_LIST)beginシーケンシャル文…シーケンシャル文;シーケンシャル文;
.
.end process;
end アーキテクチャ名;
SENSITIVITY_LISTセンシティビティ・リストには,
信号名を列記する.この信号に変化(イベント)が生じるたびに
シーケンシャル・ステートメントが最下行まで一度だけ逐次処理される。
処理が終了すると最上行に戻り次の信号変化を待つ.
process文が()を持たないときは,
そのプロセスを永久に繰り返す.センシティビティー・リスト信号に変化(イベント)がないときには,
何もしない(右辺信号が変化しても).
プロセス名のラベルは,オプションですが,複数のプロセスがある場合には,識別のために必ずプロセス名をつける.
J
62
6.4.5プロセス文とシーケンシャル記述library ieee;use ieee.std_logic_1164.all;
entity INVMOD isport(INVIN: in std_logic;
INVOUT: out std_logic);end;
architecture INVERTER of INVMOD isbegin
INVOUT <= not INVIN;
end INVERTER;
library ieee;use ieee.std_logic_1164.all;
entity INVMOD isport(INVIN: in std_logic;
INVOUT: out std_logic);end;
architecture INVERTER of INVMOD isbegin
CONC : process (INVIN)begin
INVOUT <= not INVIN;end process;
end INVERTER;
process文を
使用しない記述(コンカレント)
process文を
使用した記述(シーケンシャル)
この例の場合は同じ回路動作記述(どうしてか考えてみること)
JC1A
63
6.4.6 コンカレントとシーケンシャル代入library ieee;use ieee.std_logic_1164.all;
entity INVMOD isport(INVIN: in std_logic;
INVOUT: out std_logic);end;
architecture BEHAVIOR of INVMOD isbegin
変数 <= 右辺の式;end BEHAVIOR;
右辺の式中の変数のいずれかが,変化したときに新しい値が即時に左辺
に代入される.代入は右辺式中の変数の変化で即時に起こる.
library ieee;use ieee.std_logic_1164.all;
entity INVMOD isport(INVIN, ENA: in std_logic;
INVOUT: out std_logic);end;architecture BEHAVIOR of INVMOD isbegin
CONC : process (ENA)begin
変数 <= 右辺の式;end process;
end BEHAVIOR;
センシティビリティー・リストに
記載された信号が変化したとき,process文が実行される.代入は右辺の式の信号の変化では
起きない.
process文を
使用しない記述
process文を
使用した記述
JC1A
64
6.4.7 オブジェクト・クラス
• signal 信号宣言 グローバルpackage, entity, architecture で使用
• constant 定数宣言 グローバルpackage, entity, architecture, process, function, procedure で使用
• variable 変数宣言 ローカルprocess, function, procedure で使用変数の場合の割り当て演算子は,:= を使用する.process 文中で使用する点に注意する.
それぞれの宣言文が使用できる場所に注意する.宣言した信号が実在信号かどうかに注意する.
実在信号ならば,対応する回路ノードが存在する.
J
65
architecture VARS of SIGVAR isbegin
REG: process(DATA)variable A, B: integer;
beginA := DATA;B := A;A := 15;
Q <= B;end process;
end VARS;
architecture SIGS of SIGVAR issignal A, B: integer;
begin
REG: process(DATA)begin
A <= DATA;B <= A;A <= 15;
Q <= B;end process;
end SIGS;
さてQの値は
?
さてQの値は
?
Q!=DATA Q=DATA
6.4.8 コンカレントとシーケンシャル処理
左は同時処理のため A にDATAと15が衝突してエラーになる
J
66
6.4.8コンカレントとシーケンシャル記述
Concurrentsignalprocess(SENSITIVE LIST)
<=
Sequential
process(SENSITIVE LIST)variable:=
DATAA
signalsignal valiable
valiableprocess文内の式の
代入を同時に行う
記述の順に処理される
この信号に変化(イベント)が生じるたびに
ステートメントが最下行まで一度だけ逐次処理される。
処理が終了すると最上行に戻り次の信号変化を待つ
15B Q
DATA A
QBA
A15ここで衝突
1
2
3
J
67
library IEEE;use IEEE.std_logic_1164.all;
entity SIGVAR isport (DATA: in integer range 0 to 255;
Q : out integer range 0 to 255); end;
architecture SIGS of SIGVAR issignal A, B: integer;
beginREG: process(DATA)
beginA <= DATA;B <= A;A <= 15;
Q <= B;end process;
end SIGS;
6.4.10 signal文とvariable文の使い方library IEEE;use IEEE.std_logic_1164.all;
entity SIGVAR isport (DATA: in integer range 0 to 255;
Q : out integer range 0 to 255); end;
architecture VARS of SIGVAR isbegin
REG: process(DATA)
variable A, B: integer;begin
A := DATA;B := A;A := 15;
Q <= B;end process;
end VARS;
signal文は、architecture文中で使用される.
process文中には書かない.
variable文は、process文中で使用される.
signalはここでは宣言できない
variableはここでは宣言できない
J
68
6.5.1 条件、制御文のポイント
1.各種の条件、制御文
制御文ごとに使用できる場所が異なる
process文の中でしか使用できないものを分けて覚える.if, case, function, for loop, while loop, wait for, wait on, wait until,さらに合成可能なもの,テストベクタ用とに分けて覚える.
2.コンカレントとシーケンシャルに注意する. 特に割り当て演算子とsignal,variableに着目.3.全条件定義原則に注意する. std_logicは、9つの値を持つ.
elseのない文など,全条件記述には,others文を使用.4.アルゴリズム記述では、合成可能性に注意.シーケンシャル処理のvariableは、実在信号ではない.実在信号扱いは、port文とsignal文で宣言されたもの.
KC5A
69
6.5.2 条件/制御/反復文の場所と意味
合成用の記述に使用するもの(回路の合成が可能な記述)
シミュレーション・テストベクタ記述に使用するもの(合成困難,不能)
KC5A
entitiy…. port…
architecture……ここでの信号割り当てはprocessの外だからSLSもイベントもない.コンカレント(まったくの非同期, 即時代入, 即時信号割り当て)
process…()がない場合は,process文内処理を永遠に継続
<= 非同期で即時,コンカレント信号代入, 条件文 when-else, with-select(others文で全条件記述)反復文 generate
制御反復文loopfor loopwhile loopwait forwait onwait until
process(センシティビティー・リスト信号:SLS)
<= SLSのイベントに同期し同時に信号代入:= SLSのイベントに同期しシーケンシャルに信号代入
(:=の左辺は,variable文で定義した変数)条件文case文, if文, if-then-elsif文
70
6.5.3 条件・制御文
architecture文内で使用するもの
条件文
• when 文 when-else • with 文 with-select others文で全条件記述
反復文
• generate 文
process文内で使用するもの
条件文
• case 文 case文は全部の場合を記述すること
• if 文 if-then-else,-elsif,-endif 反復文 ループレンジ指定
– while loop while文での条件が成立する間ループを繰り返す
– Infinite(無限) loop exit文に続く条件が成立するまで無限にループを継続
どの目的に使用されるのかを考えてみること
1.回路の記述用2.回路の合成用3.方式の検証用4.テストベクタ
記述用
KC5A
71
6.5.4 when else 条件つき信号割当
--WHEN ELSE STATEMENT 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
MBA
SEL
SEL -> M 真 -> A
それ以外-> B
コンカレント条件記述
M := A when..とは書けない:= はprocess文中,かつ
左辺はvariable
when othersは不要
port文定義の信号はsignal扱い
KC5A
72
--WITH STATEMENTentity K_BEHAVIOR is
port (SELS : in bit_vector(0 to 1);A,B,C,D : in bit; M : out bit);
architecture DSELS of K_BEHAVIOR isbegin
M <= A when (SELS="00") elseB when (SELS="01") elseC when (SELS="10") elseD ;
end DSELS;
MBA
SELS
CD
6.5.3 when else 選択信号割当
elseの後にデリミタなし
これは長い一行の文
KC5A
コンカレント条件記述
when othersは不要
73
--WITH STATEMENTentity L_BEHAVIOR is
port (SELS : in bit_vector(0 to 1);A,B,C,D : in bit; M : out bit);
end;architecture DSELS of L_BEHAVIOR isbegin
with SELS selectM <= A when ”00”,
B when ”01”,C when ”10”,
D when others;end DSELS
6.5.4 with select 選択信号割当
条件値の後は,カンマで区切る
条件包括もれを防ぐため,others文を使用する
KC5A
コンカレント条件記述
MBA
SELS
CD
74
--WITH STATEMENTentity 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_BEHAVIORbegin
with SELS selectM <= A when ”00”,
B when ”01”,C when ”10”,D when ”11”;
end DSELS
6.5.5 条件記述もれに注意
--WITH STATEMENTentity M_BEHAVIOR is
port (SELS : in std_logic_vector(0 to 1);A,B,C,D : in bit; M : out bit);
end;architecture DSELS of M_BEHAVIOR isbegin
with SELS selectM <= A when ”00”,
B when ”01”,C when ”10”,D when ”11”;
end DSELS
この記述では、全部の条件を網羅しておりOK
このデータ型では、SELSは9値x9値=81条件となり,エラー
右の記述でも処理系によっては,合成時にエラーにならない
こともある
全81とおり中4とおりしか
記述してない
KC5A
コンカレント条件記述
75
library IEEE;use IEEE.std_logic_1164.all;
entity U_BEHAVIOR isport(DATA_A: in bit_vector(0 to 15);
DATA_B: in bit_vector(0 to 7);M: out bit_vector(0 to 7));
end;architecture AND_SFT of U_BEHAVIOR isbegin
SFTAND: for I in 0 to 7 generateM(I) <= DATA_A(I+8) and DATA_B(I);
end generate;end SFTAND;
6.5.6 generate 文
ラベルをつける
A0-A15
B0-B7 DA8-A15
B0-B7M0-M7
ループレンジは,定数で指定する.
loop文を使いたいが,process 文外では,
loop文は使用できない
KC5A
76
条件包括もれを防ぐため,others文を使用する
entity M_BEHAVIOR isport (SELS : in bit_vector(0 to 1);
A,B,C,D : in bit; M : out bit);end;architecture DSELS of M_BEHAVIOR isbegin
process(SELS,A,B,C,D)begin
case SELS iswhen ”00” =>
M <= A;when ”01” =>
M <= B;when ”10” =>
M <= C;when others =>
M <= D;endcase;
end process;end DSELS;
6.5.7 case 選択信号割当
デリミタは,セミコロン
=> M <=A;と一行でも書ける
K
process文中で使用
C5A
MBA
SELS
CD
77
entity N_BEHAVIOR isport(SELS: in bit_vector(0 to 1);
A,B,C,D: in bit; M: out bit);end;architecture DSELS of N_BEHAVIOR isbegin
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;
end DSELS;
6.5.8 if 条件信号割当で記述した場合
if…条件文…処理…
条件文が真のとき処理を行いそれ以外の場合は何もしない
ifの深いネスティングは,
記述を誤りやすいので深いものはelsifを使う
KC5A
process文中で使用
MBA
SELS
CD
78
entity S_BEHAVIOR isport(SELS: in bit_vector(0 to 1);
A,B,C,D: in bit; M: out bit);end;architecture DSELS of S_BEHAVIOR isbegin
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;
elseM <= D;
end if;end process;
end DSELS;
6.5.9 if then elsif 条件文
注意
elseifではない
if…条件文…処理…elsif…条件文…処理…elsif…条件文…処理…elsif…条件文…処理…
条件文を順に評価して真のとき処理を行う.if のネスティング
よりも見通しがいい
KC5A
process文中で使用
79
library IEEE;use IEEE.std_logic_1164.all;entity V_BEHAVIOR is
port(DATA_A: in bit_vector(0 to 15);DATA_B: in bit_vector(0 to 7);M: out bit_vector(0 to 7));
end;architecture AND_SFT of V_BEHAVIOR isbegin
SFTAND: process (DATA_A,DATA_B)begin
for I in 0 to 7 loop M(I) <= DATA_A(I+8) and DATA_B(I);
end loop;end process;
end SFTAND;
6.5.10 for ループ
ラベルをつける
テストベンチ記述でよく使用する.for loop のexit 脱出は,後述.かならず合成するためには,ループレンジを定数指定
ループレンジは、定数で指定する。
A0-A15
B0-B7 DA8-A15
B0-B7M0-M7
KC5A
process文中で使用
80
architecture WHILE_LOOP of EXAMPLE isbegin
. . .process(. . .)begin
. . .
while (CONDITION) loop. . .
end loop;. . .
end process;. . .
end WHILE_LOOP;
注意while文によるループはテストベンチ記述で,よく使用されるが,
記述から回路を合成させる場合には,合成系によっては
サポートがなく回路化できないことがある.
6.5.11 while ループ
loop文はexit文で終了しloop文の特定くり返しは
next文で終了する.
while文での条件が
成立する間ループを繰り返す
K
process文中で使用
81
architecture INFINITE_LOOP of EXAPLE isbegin
. . .process(. . .)
. . .loop
. . .
exit when (CONDITION);end loop;
end process;. . .
end INFINITE_LOOP;
6.5.12 infinite(無限)ループ
警告infiniteループは合成できない.
loop文はexit文で終了しloop文の特定くり返しは
next文で終了する.
exit文に続く条件が成立するまで,無限にループを継続
K
process文中で使用
82
6.5.13 for loop のネスティングとexit
process (A)
beginLOOP1 : for I in 1 to 255 loop 処理STATEMENT LOOP1;LOOP2 : for J in 0 to 255 loop
処理STATEMENT IN LOOP2;exit; -- LOOP2 (J) からの脱出
exit; -- LOOP 1 (I)からの脱出end loop;
--end loop;end process;
テストベンチ例文
K
beginUUT : ADD4Bport map( A => AIN, B => BIN,Y => YOUT, COUT => CARRY );
processbegin
AIN <= "0000";BIN <= "0000";--CIN <= '0';stop <= '0';for I in 0 to 255 loopBIN <= "0000";for J in 0 to 255 loop
wait for CYCLE;BIN <= BIN + '1';
end loop;AIN <= AIN + '1';
end loop;stop <= '1';wait;
end process;
ファイルの書き出し write, writeline
2LOOP1
LOOP2
ループレンジ( I, J の値) は定数を入力すること
83
6.5.14 loop 制御の exit と next process (A)
constant max : integer := 65536; variable i, SUM: integer;begin
i := 0;SUM :=0; SUM_INT : while (i <= 65536) loop
i := i + 1;SUM := SUM +1;
exit when ( i = 255);end loop SUM_INT;end process;
process (A) constant max : integer := 65536;
variable i, SUM : integer;begin
i := 0; SUM_INT : while (i <= 65535) loop
i = i + 1;next when ( i = 255);SUM := SUM +1;
end loop SUM_INT;end process;
i = 255SUM = 255
i = 255SUM = 254
T
loop文はexit文で終了しloop文の特定くり返しは
next文で終了する.
85
Module C
6.6.1 機能記述と構造記述
HDLは,モジュール単位の機能記述と
それらの接続を定義する構造記述からなる
INPUT
OUTPUT
個別VHDLモジュールのソースはエディタで書いてもいいが,VHDLのトポロジー(接続)記述は,書きづらく間違いやすい
モジュール間の接続の記述はCADから自動生成ができる.
Sub Mod.C”
Sub Mod.C’
階層化Sub Mod.C’
階層化Sub Mod.C’’
ModuleD
ModuleB
ModuleA
モジュール単位でVHDL記述する。
L
86
6.6.2 component 文---
使用するモジュール(機能ブロック、パーツ)名をcomponent文で宣言 し,port文で、その入出力モード(入出力ピン)を定義する
component AND2MODport ( ANDINA : in std_logic;
ANDINB : in std_logic;ANDOUT : out std_logic );
end component;
パーツや、モジュール(構成要素)のことを
インスタンスという.
2
2パーツの宣言 LC4
INVMODINVIN INVOUT
I_3
I_1
INVMODINVIN INVOUT
I_2
ANDINAAND2MOD
ANDINBANDOUT
DINA
DOUT
DINB
87
6.6.3 port map 文---ラベル(例 I_3) をつけcomponent文で宣言したモジュールのピン名に,信号の対応づけを行う
ピンに信号線(ネット)をつなぐと考えれば分かりやすいラベルは,モジュールのパーツ番号と考えればわかりやすい
beginI_3 : AND2MOD
port map ( ANDINA => N_2, ANDINB => N_1, ANDOUT => DOUT );
ここのネットが N_2
これが回路図のパーツ番号.同じ名前の
モジュール部品を複数使うことがあるので,パーツ番号で識別.VHDLではラベルになる.
ラベル
3
3
信号の対応付け(接続) LC4
ここのネットが N_1
INVMODINVIN INVOUT
I_3
I_1
INVMODINVIN INVOUT
I_2
ANDINAAND2MOD
ANDINBANDOUT
DINA
DOUT
DINB
88
beginI_3 : AND2MOD
port map ( ANDINA => N_2, ANDINB =>N_1, ANDOUT => DOUT );I_2 : INVMOD
port map ( INVIN => DINB, INVOUT => N_1 );I_1 : INVMOD
port map ( INVIN => DINA, INVOUT => N_2 );end BEHAVIOR;
6.6.4 同一階層内連結記述
library ieee;--library generics;use ieee.std_logic_1164.all;--use generics.components.all;
entity INB5TOP isport ( DINA : in std_logic;
DINB : in std_logic;DOUT : out std_logic );
end INB5TOP;
architecture BEHAVIOR of INB5TOP is
signal N_1 : std_logic;
signal N_2 : std_logic;
component AND2MODport ( ANDINA : in std_logic;
ANDINB : in std_logic;ANDOUT : out std_logic );
end component;
component INVMODport ( INVIN : in std_logic;
INVOUT : out std_logic );end component;
12
3
エンティティー
ノード信号とパーツの宣言
信号の対応付け(接続)
LC4
89
INVMODINVIN INVOUT
I_3
I_1
INVMODINVIN INVOUT
I_2
ANDINAAND2MOD
ANDINBANDOUT
DINA
DOUT
DINB
6.6.5 複数モジュールの接続記述-1/3
entity INB5TOP isport ( DINA : in std_logic;
DINB : in std_logic;DOUT : out std_logic );
end INB5TOP;
entity と入出力のport記述
library ieee;--library generics;use ieee.std_logic_1164.all;--use generics.components.all;
1
LC4
90
architecture BEHAVIOR of INB5TOP is
signal N_1 : std_logic;
signal N_2 : std_logic; component AND2MOD
port ( ANDINA : in std_logic;ANDINB : in std_logic;ANDOUT : out std_logic );
end component;
component INVMODport ( INVIN : in std_logic;
INVOUT : out std_logic );end component;
6.6.6 複数モジュールの接続記述-2/3
component文で定義したモジュールのport文による
入出力モードと型定義
重要component文では、
個別モジュールへの接続情報を定義
signal文による
内部信号定義 2
INVMODINVIN INVOUT
I_3
I_1
INVMODINVIN INVOUTI_2
ANDINAAND2MOD
ANDINBANDOUT
DINA
DOUT
DINB
ここのネットが N_1ここのネットが N_2
LC4
91
6.6.7 複数モジュールの接続記述-3/3
個々のモジュールの入出力portをネットに対して接続(=>演算子によるコンカレント信号割当て)
beginI_3 : AND2MOD
port map ( ANDINA => N_2, ANDINB => N_1 , ANDOUT => DOUT );I_2 : INVMOD
port map ( INVIN => DINB, INVOUT => N_1 );I_1 : INVMOD
port map ( INVIN => DINA, INVOUT => N_2 );end BEHAVIOR;
3
LC4
INVMODINVIN INVOUT
I_3
I_1
INVMODINVIN INVOUTI_2
ANDINAAND2MOD
ANDINBANDOUT
DINA
DOUT
DINB
N_2
N_1
92
function Std2int (BV : in std_logic_vector) return NATURAL isvariable INT_VAL : NATURAL range 0 to 2**BV'length - 1 := 0;
beginINT_VAL := 0;for I in BV‘range loop
INT_VAL := INT_VAL * 2;if BV(I) = '1' then
INT_VAL := INT_VAL + 1;end if;
end loop;return INT_VAL;
end Std2int;
6.6.8 function 文function 文で論理機能(関数)を定義する.関数機能は,関数の引き数が入力となり一つの出力(結果)が戻り値として表される.
Function
Std2int
function FUNCTION_NAME ( ARG1, ARG2 : in std_logic, ) return std_logic is------ ;
begin ------ ;
return 式;end FUNCTION_NAME;
関数名引数
引数のモード引数
引数のデータ型
戻り値のデータ型
Q := Std2int(DATA);DATA にstd_logic_vector の引数を与えると integerに変換して戻り値を返す
DATA 戻り値データの型変換用関数Std2intのソース(例)
CONV_INTEGER と同じ機能の関数
L
93
6.7.1 階層設計と構造記述
ADD4回路は4ビットのリプルキャリ加算器で,下位にFA(全加算器)とHA(半加算器)をもつ.
FAはHA(半加算器)のキャリー同士をOR接続して作っている
4階層のVHDL記述例であるが,同じ機能記述HA.FAを異階層間で使いまわしている.
ADD4TB (テストベンチ)
ADD4 (最上位回路)
FA HAORHA
FA HAORHA
FA HAORHA
HA
HA
HA
FA
ADD4
ADD4TB
FA
FA
ORHA
最上位ADD4TBは,
シミュレーション用
テストベンチで下位に
ADD4回路を接続
LC30
94
6.7.2 階層の重複呼出し記述
entity FA isPort ( A,B,CI : in STD_LOGIC;
SUM,CO : out STD_LOGIC);end FA;
architecture Behavior of FA is
signal NODE1, NODE2, NODE3 : std_logic;
component HAport (X,Y : in STD_LOGIC;
S,C : out STD_LOGIC);end component;
beginHA1 : HA port map(X =>A, Y => B, S =>NODE1, C =>NODE2);
HA2 : HA port map(X =>NODE1, Y => CI, S => SUM, C =>NODE3);
CO <= NODE2 or NODE3; end Behavior;
AB
CI
COOR
HA2X
Y S
CSUM
HA1X
Y S
C
NODE1
NODE2
NODE3
entity HA is
Port ( X,Y : in STD_LOGIC;
S,C : out STD_LOGIC);
end HA;
architecture Behavior of HA isbegin
S <= X xor Y;
C <= X and Y;
同一機能のHAを複数
使用する場合,異なるラベル名で接続情報を記述して識別する.
機能記述したHA.VHDソースは一つでよい.必要な個数が生成される.
L
HA
ADD4
ADD4TB
FAFA
ORHA2
FAAB
SUM
CO
CIHA1X
Y S
C
C30
95
6.7.3 ADD4の記述と階層呼出しlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ADD4 isport ( A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);Y : out STD_LOGIC_VECTOR (3 downto 0);COUT : out STD_LOGIC);
end ADD4;
architecture Behavior of ADD4 issignal C1, C2, C3 : std_logic;
component HAport (X,Y : in STD_LOGIC;
S,C : out STD_LOGIC);end component;
component FAport (A, B, CI : in STD_LOGIC;SUM,CO : out STD_LOGIC);
end component;
beginHA0 : HA port map(X => A(0) , Y => B(0) , S => Y(0) ,C => C1);FA1 : FA port map(A => A(1), B => B(1), CI => C1, SUM => Y(1) , CO => C2);FA2 : FA port map(A => A(2), B => B(2), CI => C2, SUM => Y(2) , CO => C3);FA3 : FA port map(A => A(3), B => B(3), CI => C3, SUM => Y(3) , CO => COUT);
end Behavior;
ADD4のVHDL階層記述
デバイスへのインプリメントは,最上位階層のADD4から合成をかけます.
L
COUT
HA0
FA3
ADD4
ADD4TB
FA2
FA1
C1
C2
C3
C30
96
6.7.4 最上位テストベンチLIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.numeric_std.ALL;
ENTITY testbench ISEND testbench;
ARCHITECTURE behavioral OF testbench IS
-- Component DeclarationCOMPONENT ADD4PORT(
COUT : OUT std_logic;A, B : IN std_logic_vector(3 downto 0); Y : OUT std_logic_vector(3 downto 0)
);END COMPONENT;
SIGNAL CARRY : std_logic;SIGNAL AIN, BIN, YOUT : std_logic_vector(3 downto 0);
BEGIN-- Component Instantiation
uut: ADD4 PORT MAP(A => AIN, B => BIN,Y => YOUT, COUT => CARRY );
-- Test Bench Statements
-- Test Bench Statementstb : PROCESSBEGIN
AIN <= "0000";BIN <= "0000";
wait for 100 ns; AIN <= "0000";BIN <= "1010";
wait for 100 ns;AIN <= "0111";BIN <= "0111";
wait for 100 ns; AIN <= "1111";BIN <= "1111";
wait for 100 ns;AIN <= "0101";BIN <= "1010";
wait; -- will wait foreverEND PROCESS tb;
END;
シミュレーション時はテストベンチが最上位階層になる.
LC30
97
6.8.1 トライステート(その1)
entity P_BEHAVIOR isport(ENA: in std_logic;
A: in std_logic; O: out std_logic);end;
architecture ENABL of P_BEHAVIOR isbegin
O <= A when (ENA='1') else 'Z';end ENABL;
ENA
A O
ここのデータ型
• std_logic, std_logic_vector9値 (‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-’)
NC5A
98
entity Q_BEHAVIOR isport(ENA: in std_logic;
A,B: in std_logic; O: out std_logic);end;
architecture ENABLS of Q_BEHAVIORbegin
O <= A when (ENA='1') else 'Z';O <= B when (ENA='0') else 'Z';
end ENABLS;
A
B
O
ENA
6.8.2 トライステート(その2)
ここのデータ型
回路的には要注意
NC5A
99
6.8.3 内部トライステート
内部トライステートは,バスコンテンションが発生するので,データ・セレクタにするのが基本.インプリメント素材が
マクロセルレベルで完全なタイミング合わせをしている場合には使用可能なので,調べて使うこと.
A
B
O
ENA
NC5A
100
6.9.1 真理値表とドント・ケア記述
CASE 文は,全部の場合を記述する必要がある.未定義は don’t CARE
にすると論理が縮小される.
entity T_BEHAVIOR isport(INDATA: in std_logic_vector(3 downto 0);
OUTDATA: out std_logic_vector(3 downto 0));end;architecture DONT_CARE of T_BEHAVIOR isbegin
process(INDATA)begin
case INDATA is when b"0000" => OUTDATA <= "0001";when b"1000" => OUTDATA <= "0010";when b"1100" => OUTDATA <= "0011";when b"1110" => OUTDATA <= "0100";when b"1111" => OUTDATA <= "0101";when others => OUTDATA <= "XXXX";
end case;end process;
end DONT_CARE;
don’t care
NC5A
101
6.9.2 真理値表とドント・ケア回路規模
0
1
0
0
0
0
0
1 1
0
11
0
1
1
000
回路サイズが小さくなる
0
1
0
0
0
0
0
1 1
0 0
1
1
0
0
0
回路サイズが大きくなる
0
1
0
0
0
0
0
1 1
0
XX
0
1
1
0
ABCD
XX
NC5A
各自でカルノ図から論理関数を簡単化してみる
103
7.1.1 カウンタの特性
• カウンタは,クロックで動作する.同期カウンタと非同期カウンタがある.
• カウンタには,フィルド・コードとアンフィルド・コードのカウンタがある.
• カウンタは種類によって回路規模と動作速度が異なる.
• カウンタは,4つのモードを持つSTART,STOP,SET(PRESET),RESET(CLEAR)この4タイプの入力とクロックが入力となる.
• 入力信号は,同期信号と非同期信号がある.カウンタの種類によって入力信号の同期,非同期扱いが異なる.
• カウンタの値はデコードされる.デコードされた信号は,他の回路に入力される.この信号にハザードが乗るかどうかに注意する.
P
104
7.1.2 カウンタのポイント
入力信号
出力信号
カウンタの種類によって特性が大きく異なる
F/F
F/F
F/F
F/F駆動回路
Q0-QN
デコード回路
D Q
D Q
D Q
同期,非同期制御信号
クロック
未定義状態は?非同期で制御できるか?ハザードがあるか?
回路規模は?遅延は?
回路規模,遅延と動作速度は?
P
105
7.1.3 カウンタの性格一覧
アン
フィルド
アン
フィルド
アン
フィルド
フィルド
フィルド
コード
(状態)
小
速
小
速
中
中
大
遅
中
中
規模
速度
設計
難易度
制御
入力
デコードハザード
出力
デコード
容易同期有全ビット
回路大
バイナリ
中程度同期有多ビット
回路中
LFSR
難非同期可
無2ビット
回路小
ジョンソン
容易同期無1ビット
回路無
ワンホット
中程度非同期可
無全ビット
回路大
グレイ
P
106
7.1.4 コード(状態数)
• フィルド・コード・カウンタ– 2^(F/F数)の状態をすべて持つ,未定義状態のはまりこみが無い.
– 例:バイナリ・カウンタ,4ビットで16状態,0から15まで,カウントできる.
• アンフィルド・コード・カウンタ– 2^(F/Fの数)の状態をすべては持たない,未定義状態のはまりこみの可能性がある.
– 例:ジョンソン・カウンタ,通常動作モードは4ビットで8状態,裏の動作モードが8状態あり,誤動作で裏の動作モードに入ると抜けられなくなる.裏の動作モードから抜けられるような回路を付加する必要がある.
回路規模と動作速度• 回路規模とは,F/Fを駆動する前段のロジックの多さで,これが大きく
なるとクロックを上げにくくなり,動作速度が低下しやすい.ここではすべてクロックに同期する同期式カウンタを前提にしている.
P
107
7.1.5 バイナリカウンタの記述(オーバーロード版)library ieee;use ieee.std_logic.1164.all;use ieee.std_logic_arith.all;use ieee.std_.unsigned.all;entity COUNT8N is
port(CLK, RESET, CLEAR : in std_logic;
COUT:out std_logic_vector(2 downto 0));
end COUNT8N;architecture BEHAVIOR of COUNT8N is
signal D : std_logic_vector(2 downto 0);begin
process (CLK, RESET, CLEAR)begin
if RESET = ‘0’ then D <= “000”;
elsif (CLK ='1' and CLK'event = '1') thenif (CLEAR = ‘1’ ) then
D <= "000";else
D <= D + '1';end if;
end if;
end process;
COUT <= D;end BEHAVIOR;
process文の外でsignal Dを定義.
この変数Dに対して
動作を記述.
process文を出てから変数Dを出力
COUTに代入.
演算子オーバーロードを使ってカウンタの
インクリメントを記述
CLK=‘1’記述の前にRESET があるので,
非同期リセット
port文にあるのはCOUT. Dはない.
どうしてDを定義するのか?
<=の右辺にある信号名は,
出力ポートに使用できないため.(inoutタイプで
ないと両辺に記述できない)
CLK=‘1’記述の後にCLEAR があるので,
同期クリア
PC8B
108
7.1.6 プリローダブルアップダウンカウンタの記述(型変換版) -1/2
型変換関数の使用
COMV_INTEGER(引数) std_logic_vector型をintger型に変換
CONV_STD_LOGIC_VECTOR(引数1,引数2)intger型をstd_logiv_vector型に変換
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity COUNT12D isPort ( CLK,RESET,CLEAR,LOAD,UD : in std_logic;
DIN : in std_logic_vector (7 downto 0);DOUT : out std_logic_vector (7 downto 0));
end COUNT12D;
architecture BEHAVIOR of COUNT12D is-- 内部信号宣言
signal DINC : integer range 0 to 11;signal D : integer range 0 to 11;
beginDINC <= CONV_INTEGER(DIN);DOUT <= CONV_STD_LOGIC_VECTOR(D,8);
このあと process 文に続く
PC8C
109
process(CLK,RESET)begin
if(RESET=‘0’)then -- RESETで非同期リセット,ifでクロックの前に優先記述
D <= 0;elsif(CLK‘event and CLK=’1‘)then -- クロックの記述,以降は同期動作
if(CLEAR=‘1’)then -- クロックの記述後なので,同期クリア
D <= 0;elsif(LOAD=‘1’)then -- 同期データロード
D <= DINC;elsif(UD=‘1’)then -- UD(アップダウン) が‘1’でUPカウント
if(D=11)then -- 最大 カウントを11に設定
D <= 0;else
D <= D + 1; -- アップカウント
end if;elsif(UD=‘0’)then -- UD(アップダウン) が‘0’でDOWNカウント
if(D=0)thenD <= 11; -- 最大 カウントを11に設定
elseD <= D - 1; -- ダウンカウント
end if;end if;
end if;end process;
end BEHAVIOR;
7.1.7 プリローダブルアップダウンカウンタ(型変換版) -2/2
算術演算
算術演算
PC8C
110
7.1.8 出力のデコードとハザード
• カウンタの出力は,デコードして使用するが,このとき何ビットをデコードするかで,デコード回路の大きさが決まってくる.少ないほど回路は小さく速く有利
• デコードしたときにスタティック・ハザードが出るカウンタと出ないカウンタがある.一度に2ビット以上変化するカウンタでは,スタティック・ハザードに注意する必要がある.
同期,非同期制御入力• カウンタの動作を変える場合は,外部からクロック同期で制御入力を与えるが,イントリンシック・ハザードが発生しない場合は,非同期が可能.1ビットしか変化しない遷移動作のところでは,非同期入力が可能
P
111
7.1.9 スタティック・ハザードの原理P
バイナリ・カウンタの出力変化
太矢印 ->の変化時にハザードが発生
3ビットバイナリ・カウンタ出力のカルノ図化 4ビットバイナリ・カウンタ出力のカルノ図化
112
7.1.10 状態割当てとスタティック・ハザードP
バイナリカウンタの場合
同時に変化する入力信号を一つにする.
カウンタの出力をデコードするときに注意する.
同時に2入力が変化する場合には
スタティックハザードが発生する
可能性がある.
バイナリ・カウンタ
Q1+Q2 とデコードしたときのハザード
Q1*Q2 とデコードしたときのハザード
スタティック 1 ハザード
スタティック 0 ハザード
Q1+Q2
Q1*Q2
Q0
Q1
Q3
Q2
Q1+Q2
Q1*Q2
Q1
Q2
Q
Q
113
• 非同期リセット,同期クリアは,VHDLで記述可能だが,実装する素子では,ハードウェアにリソースを持たないことがある.その場合は合成ができない.
– 非同期リセット
• カウンタの記述でD <= D+1 があるが,定義されたビット幅を超えた場合どうなるか.エラーになるのか?
– エラーにはならずに,未定義のビットに桁上がりしたぶんが無視される.(合成ツールとシミュレータで対応が違うこともある.)
• 未定義状態に関しては,シミュレータはエラーもワーニングも出さない.カウンタのデコード時のハザードも同様.
– 合成ツールやDRCでは,ワーニングを出すものもある.これらをどう扱うかは設計者の裁量と責任範囲,ツールのせいにはできない.意図的にハザードを使う非同期設計もあるが,動作保証はない.
7.1.11 VHDL記述と検証,合成の実際P
114
7.2.1 ジョンソンカウンタの記述--------------------------------------------------------------------------------------- Module Name: Jonson4.vhd – Behavior Version 1.00 -------------------------------------------------------------------------------------library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity JONSON4 isport ( CLK : in STD_LOGIC;
QOUT : out STD_LOGIC_VECTOR (3 downto 0));end JONSON4;
architecture BEHAVIOR of JONSON4 is
signal Q : std_logic_vector (3 downto 0);begin
process (CLK)
begin if (CLK = '1' and CLK'event)
then Q(2 downto 0) <= Q(3 downto 1);Q(3) <= not Q(0);
end if;end process;
QOUT <= Q;end BEHAVIOR;
Q3 Q2 Q1 Q0
Q(3) Q(2) Q(1) Q(0)
Q(3) Q(2) Q(1) Q(0)
not
PC23
115
7.2.2 ジョンソンカウンタの合成例
FPGAに合成,配置配線させた例FPGAのF/F出力には,反転Qがない.他のセルブロックを使用すると遅延時間が大きくなるので,合成,マッピングおよび配置配線ツールでは,自動的に最適化している.Q3に関しては,FDRプリミティブを使用して,DをVCCに固定し,Q0の出力をR(リセット)ラインに入力するようなインプリメントがされている.
合成や配置配線工程では,記述と等価的な回路が生成されるが,記述当初に意図したものとは異なる結果に回路が生成されている場合がある.
センシティブな回路の場合,合成,配置配線の結果を注意して見ておく必要がある.
Q0
Q1
Q2
Q3
XILINX Spartan3 / ISE 8.2
PC23
116
7.2.3 テストベンチの記述-- JONSON4TB.VHD TestBench for JONSON4 -- Renji Mikami September 26th.,2006LIBRARY ieee;
USE ieee.std_logic_1164.ALL;USE ieee.numeric_std.ALL;
ENTITY testbench ISEND testbench;
ARCHITECTURE behavior OF testbench IS SIGNAL CLK : std_logic;SIGNAL QOUT : std_logic_vector(3 downto 0);
COMPONENT jonson4PORT(
CLK : IN std_logic;--QOUT : IN std_logic_vector(3 downto 0); QOUT : OUT std_logic_vector(3 downto 0));
END COMPONENT;
1
4
2 3
BEGIN-- Component Instantiation
uut: jonson4 PORT MAP(CLK => CLK,QOUT => QOUT
);-- Test Bench Statements
tb : PROCESSBEGIN
CLK <='1';wait for 100 ns; CLK <='0';wait for 100 ns;
END PROCESS tb;END;
1
34
32
Sensitivity listに信号がないので,以下を繰り返す
CLK を‘1’ にする
CLK を‘0’ にする
100 ns 待つ
PC23
117
7.2.4 機能シミュレーションの結果
クロックに同期してジョンソン・カウンタが動作している.
機能シミュレーションのためクロックの立ち上がりと出力は,遅延がなく同時に
表示されている.
ジョンソン・カウンタの特長として,常に出力が1ビットしか変化しない点に着目する.
PC23
118
7.2.5 レイアウト後のタイミングシミュレーション
合成,マッピング,レイアウトを実施後,実遅延時間をもとに,タイミング・シミュレーションを実施する
データ・ラインの遅延時間が多いと,クロックを落とさないとデータが抜けてしまう.
最も遅延の多いデータ・ラインをクリティカル・パスといい,システムの最高動作周波数は,その遅延に依存する.
PC23
125
ステートマシンステートマシン設計では、
合成、制御可能な記述をRTLの型で覚えるloop記述で特定状態に止め置き,入力条件でloopから出る記述では
うまく回路化ができない.シーケンサ設計はシビアなもの
Block 5 Q
5
126
• ステートマシンは,どこで使われるか• デジタル回路は,ひとまとめにせず,三つの回路機能に明瞭に分けて設計する.
– データ・パス (多ビットのデータを処理,変換する回路)– コントロール・ロジック (制御回路)– グリューロジック(Glue = 糊, 回路間インターフェース
• データ・パスを高速化は,パイプライン化– 高速化は,パイプライン段数を増やして対応– 垂れ流しパイプライン(乱れないパイプライン,設計は容易)– 乱れるパイプライン(パイプライン・ハザード発生を制御する.)– パイプライン制御は,高速の同期シーケンサで行う.1クロック動作のためこの速度の限界がパイプラインの限界速度に影響する.データ・ラインの遅延を最小にし,出力はハザード・フリーにする.このシーケンサは,ステートマシンである.
8.1.1 ステートマシンについて Q
127
8.1.2 データ・パスとパイプライン
演算処理処理遅延 50ns
入力
出力入力 データの入出力は,50nsピリオド
5段パイプの例,データの入出力は,10nsピリオド,最初のデータが出るのは50ns後,パイプライン・ハザード発生時も最大50nsデータが得られるまでの待ち(遅延)時間のことをレイテンシという.
演算1段
10ns
入力
出力
演算2段
10ns
演算3段
10ns
演算4段
10ns
演算5段
10ns
高速コントロール・ロジック(ステートマシン) で制御
入力
STATUSCOND
Q
128
8.1.3 パイプラインの架け(乗り)替え
IN
実際は,処理機能の異なるパイプラインが複数本配置され,データは各パイプラインを行き来する.パイプラインの途中が空になると効率が悪化する.パイプラインの各段は,クロックによる同期動作をしているので,任意のパイプラインの任意の段のデータを相互に自由に交換できれば,あらゆるパイプラインが設計できる.この制御を行うのがシーケンサである.
高速コントロール・ロジック(ステートマシン) で制御
OUT
REG/MEM
演算パイプ As1 As3As2 As4
Ms1 Ms3Ms2 Ms4
Fs1
Ds1
Fs2
Ds2
Q
129
8.1.4 VHDLソースの自動生成の例
状態遷移図入力ツールや
フローチャート・ツールで
入力後、ツール上でデバッグ
してからエラーのない
VHDLソースを生成
するツールもある.
状態遷移をグラフィックス入力すれば,VHDLソースを自動生成する
ステートマシンの性能とは,最高動作速度,制御入力を非同期で入れられるか,出力にスタティック・ハザードが乗るかの三点
Q
130
-- E:¥SCD21¥VHDL¥STATE2.VHD-- VHDL code created by VSS StateCAD v2.10b-- Fri Jul 19 15:18:47 1996LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY STATE2 ISPORT (CLK,CLEAR,GO_A: IN std_logic);
END;
ARCHITECTURE BEHAVIOR OF STATE2 ISTYPE type_sreg IS (STATE0,STATE1);SIGNAL sreg, next_sreg : type_sreg;
BEGINPROCESS (CLK)BEGIN
IF CLK='1' AND CLK'event THENsreg <= next_sreg;
END IF;END PROCESS;
PROCESS (sreg,CLEAR,GO_A)
8.1.5 自動生成 VHDLPROCESS (sreg,CLEAR,GO_A)BEGIN
next_sreg<=STATE0;
IF ( CLEAR='1' ) THENnext_sreg<=STATE0;
ELSECASE sreg IS
WHEN STATE0 =>IF ( GO_A='1' ) THEN
next_sreg<=STATE0;END IF;IF ( GO_A='0' ) THEN
next_sreg<=STATE1;END IF;
WHEN STATE1 =>IF ( GO_A='0' ) THEN
next_sreg<=STATE1;END IF;IF ( GO_A='1' ) THEN
next_sreg<=STATE0;END IF;
WHEN OTHERS =>END CASE;
END IF;END PROCESS;
END BEHAVIOR;
入力信号(遷移条件)
レジスタ(状態)
遷移の記述
自動生成ツールの出力例動作するが性能の予測は可能か?
Q
131
8.2.1 ステートマシンの三要件
状態A出力A
状態B出力B
状態C出力C
遷移条件_1
遷移条件_2
遷移条件_3
1.状態(ステート)2.出力(状態出力)3.状態遷移条件
三動作 GO(次に進む)STOP(停止)JUMP(跳ぶ)
ステートマシンの要件は3つあり,これらは,Behaviorで記述でき.
回路を自動生成できる.要件を定義し,三動作の記述法を習得すればよい.
Q
132
8.2.2 ステートマシンのポイント
• 状態を保持するレジスタの出力をそのまま制御出力にする場合は,この出力はデコードしていないのでスタティックハザードは乗らない.しかし状態数が多くなりがちで,回路規模が大きくなりがちで,最大動作周波数が上げにくく,遷移条件としての外部入力を非同期で入れることができないので,同期化する必要がある.
• 状態保持レジスタの出力をデコードして制御出力にする場合は,この出力はスタティックハザードが乗ることがあるので,レジスタの値の動き方とデコードの仕方を工夫すること.この方法だと状態数を少なくできるので,回路規模が小さく,最大動作周波数が上げやすくなる.遷移路を工夫すると遷移条件としての外部入力を非同期で入れることができる.
• 記法ではレジスタ値をシンボリックにしておき,ステート・マシンの記法を理解する.実回路の特性や性能は,このレジスタ値で大きく変わる.合成ツールのパラメータで設定することもできる.
• シーケンサの性能や特性が状態の割り当てと出力デコードで大きく変わるので,シンボリックな変数で記述しておき,Constant文で,具体的な数値を代入できるような記述をすると,設計自由度も向上する.
Q
133
8.2.3 ステートマシン記法
C:状態割り当ても出力デコドもすべて数値定義する.
定義数値次第で制御入力の同期,非同期,出力ハザードの有無が変わる.
A:状態割り当てをワンホットに決める.
制御入力は同期にする.
出力はハザードなし.
具体数値の状態割り当て
B:自動状態割り当てのため,ツールに依存する.
制御入力は同期にする.
出力はハザードありと見る.ー
シンボリックなままの状態割り当て
状態レジスタをデコードして制御出力として使用
状態レジスタの出力をそのまま制御出力として使用
Q
134
8.2.4 4状態ステートマシン
F/F
Q0-QN
出力信号
デコIド回路
駆動回路
F/F
F/F
状態レジスタ値
STATE_OUT
デコード出力値
SM_OUT
..
状態 S0出力0
状態 SB出力B
状態 SA出力A
状態 SC出力C
CTRL_IN
CTRL_IN
CTRL_IN
CTRL_IN
CTRL_IN
RST
CTRL_IN
Q
135
8.3.1 A:状態レジスタをそのまま出力する記法
状態 S0状態/出力 000
状態 SB状態/出力 010
状態 SA状態/出力 001
状態 SC状態/出力 100
CTRL_IN
CTRL_IN
CTRL_IN
CTRL_IN
CTRL_IN
RST
CTRL_IN
初期化/GO/STOP
2分岐
GO/STOP
無条件遷移
初期化条件
F/F
Q0-QN
駆動回路
F/F
F/F..
STATE_OUT
QC15
136
8.3.2 STATE415.VHD-1/3 (入出力,定数定義)library IEEE;use IEEE.std_logic_1164.all;
package TYPEDEF issubtype Nibble is std_logic_vector (3 downto 0);
end;-- Entity and port definition --
library IEEE;use IEEE.std_logic_1164.all;use work.TYPEDEF.all;
entity STATE415 isport (CLK, RST : in std_logic;
CTRL_IN : in std_logic;STATE_OUT : out Nibble);
end STATE415;-- Architecture of entity --
architecture BEHAVIOR of STATE415 is
signal CURRENT_STATE : Nibble;constant S0 : Nibble := "1000";constant SA : Nibble := "0001";constant SB : Nibble := "0010";constant SC : Nibble := "0100";
Package 文でNibbleという4ビット型を定義した例
Port文で入出力信号の記述
STATE_OUTは状態保持レジスタの値
Nibbleの代わりに以下のように書いても同じstd_logic_vector(3 downto 0)
Constant文でデータの型と定数値定義
QC15
137
8.3.3 STATE415.VHD-2/3 (遷移路記述)
beginprocess(CLK,RST)begin
if RST = '1' thenCURRENT_STATE <= S0;
elsif rising_edge(CLK) then
case CURRENT_STATE iswhen S0 =>
if CTRL_IN = '0' thenCURRENT_STATE <= SA;
else CURRENT_STATE <= S0;
end if;when SA =>
if CTRL_IN = '0' thenCURRENT_STATE <= SB;
else CURRENT_STATE <= SC;end if;
現在の状態にかかわりなくRST入力でS0に遷移(リセット)
Rising_edge(引数)は信号の立ち上がり関数CLK’event and (CLK=‘1’)と同じに使える
S0,SAの場合の状態遷移記述
記述は,case文ではじまり,when文で各状態における遷
移条件とその場合の遷移先を記述する.CURRENT_STATE(現在の状態を表す変数)に遷移先の値(定数)を代入する記法.
QC15
138
8.3.4 STATE415.VHD - 3/3 (遷移路と状態出力)when SB =>
if CTRL_IN = '0' thenCURRENT_STATE <= SC;
else CURRENT_STATE <= SB;
end if;when SC =>
CURRENT_STATE <= S0;when others =>
CURRENT_STATE <= S0;end case;
end if; -- clocked / reset logicend process;
STATE_OUT <= CURRENT_STATE;end BEHAVIOR;
SB,SC の場合の状態遷移記述
記述はend case文で終わる.When othersは未定義状態に入
った場合を考慮して習慣的に記述する.ここではSO に遷移さ
せる記述にしてある.
Process文の外で,port文で定義した出力信号STATE_OUTに
CURRENT_STATE値をコンカレントに代入.
これでレジスタ値が出力につながる.
QC15
139
8.4.1 シンボリック・ステートマシン
• 状態割り当てに具体的なレジスタ値を指定せず,ステート・マシンの記法を理解する.実回路の特性や性能は,このレジスタ値で大きく変わる.合成ツールのパラメータで設定することもできる.
• 遷移記述部の出力に関してもシンボリックな記法にしておき,定数宣言部で具体的な出力値を指定し,出力値の変更が容易にできるようにしておく.
• 上記の柔軟性のある記述のためにsignal, (process内はvariableで書くこともできる) 変数と定数 constant 文を使用している.
• 状態の定義部分,入出力の信号記述,各状態からの,GO-STOP-JUMP制御をcase – when文で書く方法がわかればよい
• 特性や性能を特定しやすくするために後の項で,シンボリック変数に具体的に数値を設定する.
Q
140
8.4.2 C:状態レジスタをデコード出力する記法VHDLC17/STATE417 状態は定数指定
状態 S0出力 1000
状態 SB出力 0010
状態 SA出力 0001
状態 SC出力 0100
CTRL_IN
CTRL_IN
CTRL_IN
CTRL_IN
CTRL_IN
RST
CTRL_IN
F/F
Q0-QN
駆動回路
F/F
F/F..
出力信号
デコIド回路
デコード出力値
SM_OUT
状態レジスタ値はtype文でシンボリッ
クに記述する.実際の状態値設定は合成ツールで(自動また
は手動)行う.
QC17
141
8.4.3 STATE416.VHD-1/3 (入出力,定数定義)library IEEE;use IEEE.std_logic_1164.all;
package TYPEDEF issubtype Nibble is std_logic_vector (3 downto 0);
end;-- Entity and port definition --
library IEEE;use IEEE.std_logic_1164.all;use work.TYPEDEF.all;
entity STATE416 isport (CLK, RST : in std_logic;
CTRL_IN : in std_logic;SM_OUT : out Nibble);
end STATE416;-- Architecture of entity --
architecture BEHAVIOR of STATE415 is
type STATE_TYPE is (S0, SA, SB, SC);signal CURRENT_STATE : State_type;
constant S0_OUT : Nibble := "1000";constant SA_OUT : Nibble := "0001";constant SB_OUT : Nibble := "0010";constant SC_OUT : Nibble := "0100";
SM_OUTはデコード出力
Constant文でデータの型と出力値定義
type文でS0,SA,SB,SCを列挙し,シンボリックな状態定数を設定する
QC16
142
8.4.4 STATE416.VHD-2/3 (遷移路記述)beginprocess(CLK,RST)begin
if RST = '1' thenCURRENT_STATE <= S0;SM_OUT <= S0_OUT;
elsif rising_edge(CLK) then
case CURRENT_STATE iswhen S0 =>
if CTRL_IN = '0' thenCURRENT_STATE <= SA;SM_OUT <= SA_OUT;
else CURRENT_STATE <= S0;SM_OUT <= S0_OUT;
end if;when SA =>
if CTRL_IN = '0' thenCURRENT_STATE <= SB;SM_OUT <= SB_OUT;
else CURRENT_STATE <= SC;SM_OUT <= SC_OUT;
end if;
現在の状態にかかわらずRST入力でS0に遷移(リセット)
Rising_edge(引数)は信号の立ち上がり関数CLK’event and (CLK=‘1’)と同じに使える
S0,SAの場合の状態遷移記述
記述は,case文ではじまり,when文で各状態における遷移条件と
その場合の遷移先を記述するが,CURRENT_STATE(現在の状態を表す変数)に遷移先の値(定数)を代入すると同時に,SM_OUTに定数(SA_OUT,SB_OUT,SC_OUT)を代入
する.
S0 状態時にはSM_OUTにS0_OUT(定数)を出力
このページの記述は状態割当ステートマシン417でも同じ
QC16
143
8.4.5 STATE416.VHD - 3/3 (遷移路と状態出力)when SB =>
if CTRL_IN = '0' thenCURRENT_STATE <= SC;SM_OUT <= SC_OUT;
else CURRENT_STATE <= SB;SM_OUT <= SB_OUT;
end if;when SC =>
CURRENT_STATE <= S0;SM_OUT <= S0_OUT;
when others =>CURRENT_STATE <= S0;SM_OUT <= S0_OUT;
end case;end if; -- clocked / reset logic
end process;
end BEHAVIOR;
SB,SC の場合の状態遷移記述
記述はend case文で終わる.When othersは未定義状態に入った
場合を考慮して習慣的に記述する.ここではSO に遷移させる記述にし
てある.
CURRENT_STATE(現在の状態を表す変数)に遷移先の値(定数)を代入すると同時に,SM_OUTに定数(SA_OUT,SB_OUT,SC_OUT)を代入
する.
When文の中で逐次port文で定義した出力信号SM_OUTに定数出力を代入しているので,process文外で,
出力する値を代入する必要がない.
このページの記述は状態割当ステートマシン417でも同じ
QC16
144
8.5.1 状態割当ステートマシン
• 状態割り当てに具体的なレジスタ値を設定するステート・マシンの記法を理解する.実回路の特性や性能を,このレジスタ値の設定でコントロールできる.
• 遷移記述部の出力に関しても具体的な出力値を指定し,実回路の特製や性能をコントロールできるようにする.
• 記述に柔軟性を持たせるためにsignal, (process内はvariableで書くこともできる) 変数と定数 constant 文で状態割り当てと出力を記述後容易に変更できるようにしている.
Q
145
8.5.2 C:状態レジスタをデコード出力する記法状態は定数設定
状態S0:”00”出力 1000
状態SB:”11”出力 0010
状態SA:”10”出力 0001
状態SC:”10”出力 0100
CTRL_IN
CTRL_IN
CTRL_IN
CTRL_IN
CTRL_IN
RST
CTRL_IN
F/F
Q0-QN
駆動回路
F/F
F/F..
出力信号
デコIド回路
デコード出力値
SM_OUT状態レジスタ値はconstant文で具体的に定数設定する.性能機能をコントロールし易くなる.
状態割当を1ビット変化(ジョンソン)にしてあるので,
太線の遷移路では制御入力を非同期で入れられかつデコード出力にスタティックハザードがない.
QC17
146
8.5.3 STATE417.VHD-1/3 (入出力,定数定義)library IEEE;use IEEE.std_logic_1164.all;
package TYPEDEF issubtype Nibble is std_logic_vector (3 downto 0);subtype Doublebits is std_logic_vector (1 downto 0);
end;
library IEEE;use IEEE.std_logic_1164.all;use work.TYPEDEF.all;
entity STATE417 isport (CLK, RST : in std_logic;
CTRL_IN : in std_logic;SM_OUT : out Nibble);
end STATE417;
architecture BEHAVIOR of STATE417 is
signal CURRENT_STATE : Doublebits;constant S0 : Doublebits := "00";constant SA : Doublebits := "10";constant SB : Doublebits := "11";constant SC : Doublebits := "01";
signal STATE_OUT : Nibble;constant S0_OUT : Nibble := "1000";constant SA_OUT : Nibble := "0001";constant SB_OUT : Nibble := "0010";constant SC_OUT : Nibble := "0100";
SM_OUTはデコード出力
package 文でDoublebitsという2ビット型を定義
constant 文でCURRENT_STATEに代入する2ビットの状態値定数を定義
constant 文でSTATE_OUTに代入する4ビットの出力定数を定義
QC17
147
8.5.4 STATE417.VHD-2/3 (遷移路記述)begin
process(CLK,RST)begin
if RST = '1' thenCURRENT_STATE <= S0;SM_OUT <= S0_OUT;
elsif rising_edge(CLK) then
case CURRENT_STATE iswhen S0 =>
if CTRL_IN = '0' thenCURRENT_STATE <= SA;SM_OUT <= SA_OUT;
else CURRENT_STATE <= S0;SM_OUT <= S0_OUT;
end if;when SA =>
if CTRL_IN = '0' thenCURRENT_STATE <= SB;SM_OUT <= SB_OUT;
else CURRENT_STATE <= SC;SM_OUT <= SC_OUT;
end if;
現在の状態にかかわらずRST入力でS0に遷移(リセット)
Rising_edge(引数)は信号の立ち上がり関数CLK’event and (CLK=‘1’)と同じに使える
S0,SAの場合の状態遷移記述
記述は,case文ではじまり,when文で各状態における遷移条件と
その場合の遷移先を記述するが,CURRENT_STATE(現在の状態を表す変数)に遷移先の値(定数)を代入すると同時に,SM_OUTに定数(SA_OUT,SB_OUT,SC_OUT)を代入
する.
S0 状態時にはSM_OUTにS0_OUT(定数)を出力
このページの記述はシンボリックステートマシン416と同じ
QC17
148
8.5.5 STATE417.VHD - 3/3 (遷移路と状態出力)when SB =>
if CTRL_IN = '0' thenCURRENT_STATE <= SC;SM_OUT <= SC_OUT;
else CURRENT_STATE <= SB;SM_OUT <= SB_OUT;
end if;when SC =>
CURRENT_STATE <= S0;SM_OUT <= S0_OUT;
when others =>CURRENT_STATE <= S0;SM_OUT <= S0_OUT;
end case;end if; -- clocked / reset logic
end process;
end BEHAVIOR;
SB,SC の場合の状態遷移記述
記述はend case文で終わる.When othersは未定義状態に入った場合
を考慮して習慣的に記述する.ここではSO に遷移させる記述にしてある.
CURRENT_STATE(現在の状態を表す変数)に遷移先の値(定数)を代入すると同時に,SM_OUTに定数(SA_OUT,SB_OUT,SC_OUT)を代入す
る.
When文の中で逐次port文で定義した出力信号SM_OUTに定数出力を代入しているので,process文外で,
出力する値を代入する必要がない.
このページの記述はシンボリックステートマシン416と同じ
QC17
149
8.6.1 RTL 記述レベル
Circuit
Logic
FunctionAlgorithm
Architecture
Behavioral
Physical
Structural
Compilation
Synthesis
System Level Synthesis
Logic Synthesis
Behavior Synthesis
Boolean
R.T.L
Argorithms
この間で多様な記述レベルが
ある
Q
150
8.6.2 ステートマシンとHDL記述レベル
F/FF/F
F/F
F/F駆動回路
Q0-QN
デコード回路
RTLFunction
Behavior
RTL
入力信号
出力信号
抽象度
実際の回路解
回路方式によって性能が大きく異なる
Q
151
ステートマシンの三要素
• レジスタの状態割当
• 遷移条件と遷移路の決定
• 出力のデコード
ポイント
• 状態の宣言は、enumerated型を使用。type STATES is (S0,S1,S2,S3); (状態は自動エンコードされる。)
• 気持ちが悪いときは、具体的に指定。type STATES is (S0,S1);
attribute enum_encoding: string;attribute enum_encoding of STATES: type is “00,10,11,10’;
8.6.3 ステートマシンのBehavior記述
記述が困難な割に制御性は弱い。ソースの自動生成ツールを使用も
考慮する。
Q
152
8.6.4 ムーア・マシン
STATEREGISTER
STATEREGISTER
DECODEDECODE
OUTPUT
CLOCK
IN
入力にノイズ混入
同期化された出力
ノイズ伝播なし設計自由度は低いが回路の安定度が高い
Q
153
8.6.5 ミレイ・マシン
STATEREGISTER
STATEREGISTER
DECODEDECODE
OUTPUT
CLOCK
IN
IN
出力にはノイズ伝播
出力にはノイズ伝播
入力にノイズ混入 同期化された出力
入力にノイズ混入
設計自由度は高いが回路の安定度は低い
Q
154
8.6.6 ステートマシンで性能を出す記述
F/FF/F
F/F
F/F駆動回路
Q0-QN
デコード回路
全体をBehaviorでは書かない1
2 ステートマシン部分とデコーダー部分を分けて書く
状態割当てを考慮して書く
デコードをよく考えて書く
3
4
Q
155
8.6.7 任意のステートマシンを作る
110111101100
010011001000
110111101100
010011001000
カルノ図を描くと隣りあう数値は,
1ビットしか変化しないので,隣に
だけ移動する遷移路を作ると,
一度に1ビットしか変化しない
ステートマシンを作ることができる.
この状態値の変化をVHDL記述する.これで,遷移路上で非同期でGO/STOPをかけられデコードしてもスタティック・
ハザードが発生しないステートマシンが
できる.
この遷移路ではハザード・フリーでジャンプもできる
Q
157
9.1.1 シミュレーションのフロー
シミュレーション対象回路ファイル
入力テストベクタファイル(テストベンチ)
• VHDLでは、回路ファイルもテストベンチ・ファイルも同じ拡張子• テストベンチからcomponent文で対象回路を呼び出しport map 文で信号を接続する.port map(CLK => VCLK, RESET => VRESET,CLEAR => VCLEAR, COUT => VCOUT);
[信号名は一致していても構わない. port map(CLK => CLK, RESET => RESET,…);]• テストベクタは,テストベンチ内に記入するか外部ファイルから読み込む• 設計ツールではテストベンチのテンプレートを自動生成する機能がある.
componentport map (CLK => VCLK,RESET => VRESET…..)
シミュレIタ
.lib
ライブラリ
シミュレーション結果
ファイル
CLK, RESET..
Invtop.vhd
Invtoptb.vhdVCLK, VRESET..
port map
外部ファイル
T
158
9.1.2 テストベンチのテンプレート-- VHDL Test Bench Template By R.M -- October 25 2006library ieee;use ieee.std_logic_1164.ALL;
entity TESTBENCH is end TESTBENCH;
architecture BEHAVIORAL of TESTBENCH iscomponent INVTOPport ( DIN : in std_logic;
DOUT : out std_logic );end component;
signal VDIN : std_logic;signal VDOUT : std_logic;
beginUUT : INVTOP
port map ( DIN => VDIN, DOUT => VDOUT );
-- *** Test vector Section TB : processbegin
………..end process;
-- *** Test vector Sectionend BEHAVIORAL;
テストベンチは,実体のない仮想回路なのでentitiy部は空欄となる.endの後のTESTBENCHは省略可能.(endだけでよい)
テストベクタの記述部
signal文でテストベンチで使用する信号と型を宣言
component文でシミュレーション対象回路を記述port文でシミュレーション対象回路の入出力とデータの型を宣言
port map文でテストベンチと対象回路の入出力をつなぐ(マッピングする)
UUTはラベル名Unit Under Testの意味
TC1B
ベクタ用信号名をとsignal 定義信号名は同じでもよい.signal DIN : std_logic; としたらport map ( DIN => DIN,となる.
ベクタ用信号名とsignal 定義信号名は同じでもよい.signal DIN : std_logic; としたらport map ( DIN => DIN,となる.
1
2
3
159
9.1.3 対象回路とテストベンチ
library IEEE;use IEEE.std_logic_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity count8n isport ( CLK : in std_logic;
RESET : in std_logic;CLEAR : in std_logic;COUT : out std_logic_vector (2 downto 0));
end count8n;architecture BEHAVIORAL of COUNT8N issignal D : std_logic_vector (2 downto 0);
beginprocess (CLK, RESET, CLEAR)..
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY count8ntb_vhd ISEND count8ntb_vhd;
ARCHITECTURE behavior OF count8ntb_vhd IS -- Component Declaration for the Unit Under Test (UUT)
component count8nport(
CLK : in std_logic;RESET : in std_logic;CLEAR : ni std_logic; COUT : out std_logic_vector(2 downto 0));
end component;--Inputs
SIGNAL VCLK : std_logic := '0';SIGNAL VRESET : std_logic := '0';SIGNAL VCLEAR : std_logic := '0';
--Outputs
SIGNAL VCOUT : std_logic_vector(2 downto 0);BEGIN
-- Instantiate the Unit Under Test (UUT)
UUT: count8n port map(CLK => VCLK, RESET => VRESET,
CLEAR => VCLEAR, COUT => VCOUT);p_clock : process
.
.
シミュレーション対象回路
テストベンチ
TC8B
component文で
シミュレーション回路の entityを記述
1
呼出したentityの実信号定義
2
ベクタ用信号をsignal定義
3
port map文で
実信号とベクタ用信号を接続
4
160
9.1.4 テンプレートにテストベクタ追加begin
UUT : INVTOPport map ( DIN => VDIN, DOUT => VDOUT );
-- *** Test Bench – Test vector Section TB : processbegin VDIN <= '0'; wait for 20 ns; VDIN <= '1'; wait for 15 ns; VDIN <= '0'; wait for 5 ns; VDIN <= '1'; wait for 10 ns;end process;
-- *** End – Test vector Section ***end BEHAVIOR;
TBは,processを識別するラベル名 Test Benchの意味
DINが複数ビットの場合は,DIN <= “0000”のようにダブル・クォーテーション“ ”nsは,予約語なので空白が必要 10ns
0 20 30 40 5010VDIN
5 ns20 ns 10 ns15 ns
TC1B
161
9.2.1 Inertial Delayuse work.std_logic_1164.all;entity BUFFER is
port( A : in std_ulogic;B : out std_ulogic);
end BUFFER;
architecture INERTL_DELAY of BUFFER isbegin
B <= A after 10 ns;end INERTL_DELAY;
0 20 30 40 50 6010
A
B
このパルスは伝搬しない
Inertial Delay(慣性遅延) 遅延値より短いパルスは
伝搬しない.(ゲート遅延等)
記述式
信号 <= 値 after 時間
T
162
9.2.2 Transport Delay
use work.std_logic_1164.all;entity BUFFER is
port( A : in std_ulogic;B : out std_ulogic);
end BUFFER;
architecture TRANS_DELAY of BUFFER isbegin
B <= transport A after 10 ns;end TRANS_DELAY;
Transport Delay(伝搬遅延) 遅延値に依存せず,全ての遅延が伝搬.
(信号が配線によって
遅延する場合等)
記述式
信号 <= transport 値 after 時間
0 20 30 40 50 6010
A
B
このパルスは伝搬する。
T
163
9.3.1 wait 文と時間の予約語wait for 文
wait for 50 ns; -- 50 ns待つ
wait until 文wait until ENABLE = ‘1’; -- ENABLE が1になるまで待つ
wait on 文wait on A,B,E;
-- wait の後は、センシティビリティーリスト -- A, Bまたは E のイベント(信号変化)があるまで待つ
T
ns は予約語なので、50ns と書くとエラーになる50 ns と離して書く
164
9.3.2 for loop のネスティングとexit
process (A)
beginLOOP1 : for I in 1 to 255 loop 処理STATEMENT LOOP1;LOOP2 : for J in 0 to 255 loop
処理STATEMENT IN LOOP2;exit; -- LOOP2 (J) からの脱出
exit; -- LOOP 1 (I)からの脱出end loop;
--end loop;end process;
T
例文参照 9.4.3
beginUUT : ADD4Bport map( A => AIN, B => BIN,Y => YOUT, COUT => CARRY );
processbegin
AIN <= "0000";BIN <= "0000";--CIN <= '0';stop <= '0';for I in 0 to 255 loopBIN <= "0000";for J in 0 to 255 loop
wait for CYCLE;BIN <= BIN + '1';
end loop;AIN <= AIN + '1';
end loop;stop <= '1';wait;
end process;
ファイルの書き出し write, writeline
2LOOP1
LOOP2
ループレンジ( I, J の値) は定数を入力すること
165
9.3.3 assert 文P_CLK: process
beginCLK <= ‘1’; --最初の状態が1wait for 40 NS; CLK <= ‘0’; -- 40ns 後に0 wait for 60 NS;
assert (NOW <= 4000 ns)report" Simulation Completed" severity ERROR;end process P_CLK; -- P_CLKはプロセスのくくりがわかるので書いておく
assert (条件) が偽のときreport “出力メッセージ”severity 違反レベル
NOTE, WARNING, ERROR, FAILURE
クロックのプロセスにAssert 文を書くと
コントロールしやすい
T
例文参照 9.4.6
166
9.3.4 複数のプロセスの記述P_CLK: processbegin
CLK <= '1';wait for 20 ns;
CLK <= '0';wait for 20 ns;
assert (NOW <= 4000 ns)report" Simulation Completed" severity ERROR;
end process P_CLK;
P_TEST: processbegin
RST <= '1'; -- Reset Registerwait for 40 ns;
RST <= '0';LD <= '1';DATA <= "00000000";
wait for 40 ns;LD <= '0';DATA <= "00001111";
wait for 500 ns;LD <= '1';DATA <= "00001111";
wait for 40 ns;LD <= '0';DATA <= "00000000";
wait for 500 ns; end process P_TEST;
end BEHAVIOR;
P_CLK ラベルでクロックの記述を行う. process 文の後にセンシテ
ィビリティ・リストがないので,process 文内を無限に繰り返す
P_TEST ラベルでテスト・ベクタ
の記述を行う.
T
167
9.4.1 パターンファイルの生成と読込み• 回路検証のためのテストベクタを記述には膨大な時間を要する
• 機能等価で抽象性の高いモデル作成しこの出力をファイル化して,検証対象回路のテストベクタとして使用する
T
ADD4BTBFR (テストベンチ) シミュレーション対象:4階層の
リプル加算回路
ADD4BC31
ADD4と同一
機能の動作記述
ADD4BTBGEN C31
出力をファイル化するテストベンチ
port mapcomponent
ADD4(最上位回路)
FA HAORHA
HA
FA HAORHA
FA HAORHA
port mapcomponent
入力パターンファイル.
input_pat4
出力パターンファイル
expect_pat4
シミュレIタ
writeline文
writeline文
シミュレIタ
結果
照合
readline文
readline文
ファイルの書き出し write, writeline
ファイルの読み込み read, readline
168
9.4.2 テストベクタ・ファイル生成
階層設計の項で取り上げた
リプルアダーを動作記述で
一行で記述してある.
この記述のAとBに入力
パターンをループで与え
Yの出力をファイルに書き出す.
この書き出したファイルを
期待値として検証回路の
出力と照合する.
T
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ADD4B isPort ( A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);Y : out STD_LOGIC_VECTOR (3 downto 0);COUT : out STD_LOGIC);
end ADD4B;architecture Behavior of ADD4B is
beginY <= A + B;
COUT <= '1' when (A = "1111" and B = "1111") else '0';
end Behavior;
ADD4BC31ADD4と同一
機能の動作記述
C31
入力パターンファイル.
input_pat4
A, B出力パターンファイル
expect_pat4
ファイルの書き出し write, writeline
169
9.4.3 ファイル書き出しのテストベンチT
use std.textio.all;use ieee.std_logic_textio.all;entity FILEGEN isend FILEGEN;architecture BEHAVIORAL of FILEGEN is
component ADD4Bport( A,B : in std_logic_vector(3 downto 0);
Y : out std_logic_vector(3 downto 0);COUT : out std_logic );
end component;constant CYCLE : time := 100 ns;constant DELAY : time := 10 ns;constant SKEW : time := CYCLE - DELAY;
signal AIN,BIN : std_logic_vector(3 downto 0);signal YOUT : std_logic_vector(3 downto 0);signal CARRY : std_logic;signal stop : std_logic :='0';
file INPUT_PAT : text is out "INPUT_PAT4.txt";file OUTPUT_PAT : text is out EXPECTED_PAT4.txt";
beginUUT : ADD4Bport map( A => AIN, B => BIN,Y => YOUT, COUT => CARRY );
processbegin
AIN <= "0000";BIN <= "0000";--CIN <= '0';stop <= '0';for I in 0 to 255 loopBIN <= "0000";for J in 0 to 255 loop
wait for CYCLE;BIN <= BIN + '1';
end loop;AIN <= AIN + '1';
end loop;stop <= '1';wait;
end process;
processvariable LI,LO : line;
beginwait for SKEW;write (LI,AIN ,right,5);write (LI,BIN ,right,5);writeline (INPUT_PAT,LI);write (LO,YOUT ,left,11);write (LO,CARRY,right,2);writeline (OUTPUT_PAT,LO);wait for DELAY;if(stop='1')then
wait;end if;
end process;end BEHAVIORAL;
ADD4BTBGEN C31
出力をファイル化するテストベンチ
C31
ファイルの書き出し write, writeline
1
2
3
170
use std.textio.all;use ieee.std_logic_textio.all;entity FILEGEN is….Architecture……
component ADD4B…..signal stop : std_logic :='0';
file INPUT_PAT : text is out "INPUT_PAT4.txt";file OUTPUT_PAT : text is out “EXPECTED_PAT4.txt";
processvariable LI, LO : line;
begin………………..write (LI, AIN ,right,5);write (LI, BIN ,right,5);writeline( INPUT_PAT, LI);
write(LO, YOUT, left, 11);write(LO,CARRY,right, 2);writeline(OUTPUT_PAT, LO);……
end process
9.4.4 数値文字列の書き出し記述T
ファイル読書きのための textio記述
ファイルと書き出しバッファの設定
出力ファイル名書き出しはout
LI, LO 書き出し変数の宣言
… LOにYOUTの値を“左詰めで”書き出す.文字枠は11字分確保
…. LOにCARRYの値を“右詰めで”書き出す.文字枠は2字分確保
0001 01 2 3 4 5 6 7 8 9 10 11 1 2
LO
write
writeline….. OUTPUT_PATにLoを一行書き出す
EXPECTED_PAT4.txt OUTPUT_PAT LO YOUT,CARYwritewritelinefile out
C31
ADD4BTBGEN C31
171
9.4.5 生成ファイルのテストベンチ読込み
生成されたファイルを
read とrearline文で
読み出しテストベクタと
して使用する.
期待値照合ができる.
T
ADD4BTBFR (テストベンチ)
結果
シミュレIタ
照合ADD4(最上位回路)
FA HAORHA
HA
FA HAORHA
FA HAORHA
シミュレーション対象4階層のリプル加算回路
port mapcomponent
readline文
readline文
C32
入力パターンファイル.
input_pat4
出力パターンファイル
expect_pat4
OUTPUT_PAT
readとreadline文の記述法は,write とwriteline文と同様
0001 01 2 3 4 5 6 7 8 9 10 11 1 2
LO
172
9.4.6 テストパターン読み込み T
ADD4BTBFR (テストベンチ)
…use std.textio.all;use ieee.std_logic_textio.all;..entity ….architecture……
component ADD4port( A…..
constant CYCLE : time := 100 ns;constant DELAY : time := 10 ns;…..signal AIN, BIN, YOUT: std_logic_vector(3 downto 0);
signal CARRY : std_logic;
file INPUT_PATTERN : text is in "INPUT_PAT4.txt";file EXPECTED_PATTERN : text is in "EXPECTED_PAT.txt";
beginUUT : ADD4port map( A => AIN, B => BIN, Y => YOUT, COUT => CARRY );
processvariable AIN_V, BIN_V, YOUT_V
: std_logic_vector(3 downto 0);variable CARRY_V : std_logic;
variable LI, LE : line;begin
for I in 0 to 65535 loopreadline (INPUT_PATTERN, LI );
read (LI, AIN_V);read (LI, BIN_V);AIN <= AIN_V;BIN <= BIN_V;wait for SKEW;
--readline (EXPECTED_PATTERN, LE);--read (LE, YOUT_V );--read (LE, CARRY_V);assert (YOUT =YOUT_V ) report "error Y " severity error;assert (CARRY=CARRY_V) report "error COUT" severity error;
1
2
…wait for DELAY;end loop;wait;
end process;end BEHAVIORAL;
3
C32
INPUT_PAT4.txtからLIに一行読出しreadで1データずつ読み出しA_IN, B_INに入力する.
--期待値照合の場合
173
use std.textio.all;use ieee.std_logic_textio.all;..entity ….architecture……
component ADD4port( A…..
signal AIN, BIN, YOUT…..file INPUT_PATTERN : text is in "INPUT_PAT4.txt";file EXPECTED_PATTERN : text is in "EXPECTED_PAT.txt";
beginUUT : ADD4 port map( A => AIN, B => BIN, …..
processvariable AIN_V, BIN_V, YOUT_V …
variable LI, LE : line;begin
………….readline (INPUT_PATTERN, LI );
read (LI, AIN_V);read (LI, BIN_V);AIN <= AIN_V;BIN <= BIN_V;wait for SKEW;
…………………end process;end BEHAVIORAL;
9.4.7 数値文字列の読込み記述T
ファイル読書きのための textio記述
ファイルと読込みバッファの設定
入力ファイル名読込みはin
LI, LE 読み変数の宣言
read readline
INPUT_PATTERNにLIを一行読込む
C31
ADD4BTBGEN C31
INPUT_PAT4.txt INPUT_PATTERN LI AIN_V, BIN_Vreadreadlinefile in
入力パターンファイル.
input_pat4
1 2 3 4 5 6 7 8 9
0000 0000LI
B_INの値A_INの値LI の最初の値をAIN_V,次をB_INVに読込む.続いてこれらをcomponent のAIN,BINに入力
174
Mikami ConsultingFPGA/ASIC/HDL System Design / Education
2006年 11月 27日
三上廉司 (みかみれんじ)Phone 080-5422-2503FAX 020-4624-7585 東京都品川区豊町 [email protected]://homepage3.nifty.com/western/
本資料の著作権は左記に帰属します
Z