vhdl実戦講座jte401/files/vhdl_2006.pdf3 1.0.0 本講座のねらい...

176
1 VHDL実戦講座 東京理科大スペシャル2006 V 2.02 176 ミカミ設計コンサルティング 三上廉司 E-MAIL<[email protected]> http://homepage3.nifty.com/western/ Science0612_TOP061_print.PPT 2006/11/27 A

Upload: others

Post on 17-Feb-2020

1 views

Category:

Documents


0 download

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

2

VHDL導入の基礎

Block 1 A_CFG

1

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

33

VHDL文法の骨組み

Block 2 HI1JKL VHDL 文法の最小構成データの型と演算子

コンカレントとシーケンシャル条件,制御文,

カウンタ(右上Pスライド)の項も参照のこと

2

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文で終了する.

84

回路接続記述と階層設計

Block 3 LN

3

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

各自でカルノ図から論理関数を簡単化してみる

102

カウンタクロックで動作させるために,

プロセス文を使用する.同期,非同期の記述,使用するカウンタの性格によって,回路特性がかなり変わる.

Block 4 P

4

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

119

7.2.6 ジョンソンの出力デコード法

2ビット・デコード. スタティックハザードフリー

P

120

7.2.7 ジョンソンの罠(トラップ)

同期式高速制御回路の最終解は,ジョンソン・ベースのシーケンサになるが,

HDLからは未定義状態に誤動作した場合の回路のフリーズ現象は見えない.

P

121

7.3.1 グレイ型の状態割当て

入れば一定遅延

非同期入力可能

全ビットデコード

スタハザなし

全状態使用可能

PLD/CPLDに適する

P

122

7.3.2 ワンホット型の状態割当て

一定遅延

同期入力

F/Fの無駄使い

デ スコ タ| ハド ザな なけ しれ  ば  

PLDと多レジスタ型 FPGAに適する

P

123

7.3.3 ジョンソン型の状態割当て

ASICに適する

P

非同期入力可能

スタハザなし

124

7.3.4 制御信号とイントリンシック・ハザード

システム・クロックに近接するタイミングの非同期入力

P

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

156

テストベンチシミュレーション対象回路との信号接続と入力テストベクタの

書き方

条件制御文(右上Kスライド)の項も参照のこと

Block 6 T

6

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,となる.

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を記述

呼出した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

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;

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

175

MEMO1

176

MEMO2