...

2 - Xilinx

by user

on
Category: Documents
9

views

Report

Comments

Transcript

2 - Xilinx
ザイリンクス CPLD での ABEL の使用
XAPP075(バージョン 1.0 )
アプリケーション・ノート
概要
このアプリケーション・ノートでは、ABEL言語の基本概要を紹介し、
ザイリンクスCPLDに固有な機能を使用するためのABEL使用
方法の例を示します。
ザイリンクス・ファミリ
XC9500 、XC7300
はじめに
ABEL 言語の構造
ABEL( Advanced Boolean Expression Language )は、
ザイリンクスのフィッタ・ソフトウェアと組み合わせて、
ザイリンクス
CPLD のデザインに対して入力、
シミュレーション、
インプリメン
ABEL
テーション用のビヘイビア開発環境を提供します。
さらに、
はプログラマブル・ロジック・デバイス向けに特別に開発されてい
るため、
ザイリンクスCPLDアーキテクチャをサポートする幾つか
の特別な機能を提供しています。
ABELデザインは複数のモジュールから構成されています。各
および
モジュールには少なくとも1セットの宣言とロジック記述、
オプションのテスト・ベクタのセットが含まれています。ABEL 6の
階層化された機能を使用すると、多くのデザインは 1 つのモ
ジュール内で定義することができますが、
複数モジュールのデザ
デザインを定義する際に
インも定義することができます。図1に、
必要なコードの各セクションを示します。
Header
MODULE swap
TITLE ‘Bus Swap‘
// inputs
a35..a0
pin; “A bus
b35..b0
pin; “B bus
Declarations
// outputs
out1
pin istype’com’;
out2
pin istype ‘com’;
// variables
a_bus
= [a35..a0];
b_bus
= [b35..b0];
Logic Descriptions
Test Vectors
End Statement
equations
out1 = a_bus == 24;
out2 = b_bus == 24;
test_vectors ([a_bus, b_bus] -> [out1, out2]);
[20 , 20] -> [0 , 0];
[24 , 24] -> [1 , 1];
END
図 1: ABEL のモジュール構造
XAPP075 January, 1997 (Version 1.0)
2-41
2
ザイリンクスCPLD での ABEL の使用
“Declaring a 5-bit array of nodes
Count4..Count0 node istype ‘reg’;
ヘッダ・セクション
モジュール名は、
キーワードModuleにより指定されます。オプ
ションTitleをモジュール名の後ろに使用してデザインを更に詳
またはダブル・ス
しく指定することもできます。ダブル・クォート
(" )
を使用してコメントを記入することもできます。各モ
ラッシュ
(//)
ジュール定義の終わりにキーワードEndを使用してデザインの終
わりを指定します。
例:
MODULE mydesign
TITLE ‘version 1 of mydesign’
“Additionally, comments can be added using
“the double quote
// or the double slash
END
宣言セクション
宣言は、
定数、
信号、
セット
(集合)の定義に使用され、
ABELが
直接サポートしていないデバイス固有の機能を制御するために、
propertyステートメントをフィッタに渡します。宣言セクションには
次に示すような様々な要素が含まれています。
• 定数―定数は定数名に値を割り当てることにより宣言され
ます。
• 入力ピン―型を持たない pin キーワードで指定されます。
• 出力ピン―pinキーワードで指定され、istypeキーワードを使
用してレジスタ付回路または組み合わせ回路にすることがで
きます。
“Declaring a set to reference all 5-bits
Counter = [Count4..Count0];
“Property statements
xepld PROPERTY ‘fast on’;
“Sets all outputs
“to fast slew.
宣言セクション内では、定数とセットを定義する順序は意味を
持っていることに注意してください。例えば、定数Xが定数Yを
用いて定義されている場合は、定数 Yを先に定義する必要が
あります。
ロジック記述セクション
ロジック記述セクションでは、
デザインの機能を定義します。デザ
インの機能は、論理式、
真理値表、
状態遷移図の3つの方法を
使用して定義することができます。論理式は、
カウンタやマルチ
プレクサのような規則的なパターンを持つデザインに対して便利
7セグメントLEDデコーダのような規則的な
です。真理値表は、
パターンを持たないデザインに対して便利です。状態遷移図は、
複雑なステート・マシンを持つデザインに対して効果的です。
宣言セクションに続いて、デザイン・セクションがキーワードの
またはState_Diagramの後ろ
Equations、Truth_Table、
から開 始されます 。シーケンシャル・ロジックを使 用 する
State_Diagramと真理値表には、
クロック信号を定義する論
理式セクションが付いている必要があります。
これらのキーワード
は 3 つのデザイン方法の間で切換を行うときに、使用する必要
があります。
• ノードすなわち埋込ロジック―nodeキーワードで指定され、
istypeキーワードを使用してレジスタ付回路または組み合わ
論理式
せ回路にすることができます。
論理式によるデザイン入力は、
基本的には割り当てステートメン
と
トで構成されています。組み合わせロジックの割り当て式
(=)
を使用するシーケンシャル・ロジック
(レジスタ付
遅延演算子
(:= )
を使用す
きロジック)の割り当て式があります。遅延演算子(:=)
る全てのシーケンシャル・ロジック
(レジスタ付きロジック)の論理
式は、
エッジ・
トリガのフリップフロップとしてインプリメントされたよ
うに動作します。
したがって、信号名には対応したクロックが存
在する必要があります。
ドット拡張子.clkを使用してこのクロック
を指定します。
• 信号の配列―信号名の後ろに数値とダブル・ピリオド
(..)
を
付けて宣言します。
• セット
(集合)―長い冗長な信号を簡単な参照で置き換える
ことにより、ABELコードの読み書きを判り易くするために宣
言します。
さらに、
このセットに対して実行される上位レベル
のオペレーションを使用すると、
非常に強力で複雑なデザイ
ンを迅速に定義することができます。
例:
例:
“Declaring constants
On = 1;
Off = 0;
my_registered_node := my_input;
my_registered_node.clk = my_clk;
これは、次のようにドット拡張子を付けて同じロジックを記述する
ことと理論的には同じことです。
“Declaring input pins
my_input, my_clk pin;
“Declaring output pins
my_combinatorial_output pin istype ‘com’;
my_registered_ouput
pin istype ‘reg’;
“Declaring nodes
my_combinatorial_node
my_registered_node
2-42
node isypte ‘com’;
node istype ‘reg’;
my_registered_node.d = my_input;
my_registered_node.clk = my_clk;
論理式を使用してデザインを定義することは、
他の言語を使用
してプログラミングを行うことに似ています。ただし、
論理式の構
文はシーケンシャルに評価されるのではなく、パラレルに評価さ
れる点は異なっています。次のような例では、
論理式の記述順
序はプログラミング言語の場合だけしか意味を持ちません。
XAPP075 (Version 1.0)
ABELでは、全ての論理式が並行して評価されるため、記述さ
れる順序は意味を持ちません。
例えば、C 言語のような通常のプログラミング言語では、次の
コードは、
x = x + 1;
total = total +x;
次のコードと意味が異なります。
total = total + x;
x = x+1;
しかし、ABEL では、
次のコードは、
x := x+1;
total := total + x;
次のコードと同じ意味を持ちます。
total := total + x;
x := x + 1;
デジタル・ロジック内で、情報をシーケンシャルに処理するために
":="を使用して割り当
は、
レジスタが使用されます。前の例では、
てが実行されていることに注意してください。
これは、xまたは
totalが実際に値を変えるためには、
レジスタに立ち上がりエッジ
のクロック信号が入力される必要があることを意味します。この
デザインのインプリメンテーションは次のようになります
(説明の便
宜上、行番号を付けてあります)。
1 MODULE example1
2
3 my_clock pin;
4 x7..x0 node istype 'reg';
5 total7..total0 pin istype 'reg';
6
7 x = [x7..x0];
8 total = [total7..total0];
9
10 @carry 4;“Limit the carry chain to
“4-bits
11
12 EQUATIONS“Signals the beginning of
“an equation section
13 [x, total].clk = my_clock;
“ Set the clock signals for
“ registers to my_clock
14
15 x := x+1; “This will implement an
“counter counting by 1
16 total := total + x;
“Note this is an adder that
“uses the @carry directive
“to implement the 8 bit
“adder with two 4-bit adders
17
18 TEST_VECTORS ([my_clock] -> [x, total])
19
20
21
22
23
24
25
26
27
28
[.C.]
[.C.]
[.C.]
[.C.]
[.C.]
[.C.]
[.C.]
->
->
->
->
->
->
->
[
[
[
[
[
[
[
1
2
3
4
5
6
7
,
,
,
,
,
,
,
0];
1];
3];
6];
10];
15];
21];
END
このデザインの先頭ではモジュール名が定義されています(全
ABELデザインに対して)。モジュール名に続いて、モジュール
クロック入力が定義されていま
の宣言があります。3 行目では、
す。4 行目では、x に対する情報を含むノードが 8ビット・レジスタ
として宣言されています。5 行目には、8ビット・レジスタである
totalに対する出力ピンが宣言されています。7 行目と8 行目で
は、8ビットを1つの変数名に名前を変えてあり、分かり易く迅速
に論理式を記述できるようにしてあります。10行目はABELコン
パイラに対する指令語であり、
加算器のルックアヘッド・キャリ・
チェーンを 4 ビットに制限しています。12 行目では、EQUATIONSキーワードが宣言セクションの終わりとロジック記述の開
始を表しています。
各レジスタは対応するクロックを持つ必要があり、
このデザインで
13 行目で xレジスタとtotalレジスタが入力 myclock でク
は、
ロック駆動されることを指定しています。15 行目と16 行目の実
際のロジック割り当てにより、
myclockがHighになったときの
レジスタの動作が指定されています。立ち上がりクロック・エッジ
(クロックの後)
はx(クロックの前)+ 1の値を取得します。
で、x
は total(クロックの前)+ x(クロック
また total(クロックの後)
このコードで記述される回路
の前)の値を取得します。図 2 に、
のブロック図を示します。
1
Incrementer
>
X7..X0
my_clock
Adder
> total7..total0
図 2: ブロック図
XAPP075 (Version 1.0)
2-43
2
ザイリンクスCPLD での ABEL の使用
テスト・ベクタ
関係演算子
テスト・ベクタもこのデザインの終わりに記述されています。これ
らのテスト・ベクタは各立ち上がりクロック信号に対する出力の
期待値を表し、
デザインを検証する際に非常に有効です。テス
ト・ベクタはJEDECプログラミング・ファイルにも含まれています。
このファイルは、X C 9 5 0 0 ファミリで J T A G ポートを介して
INTEST 動作を実行する際に使用できます。
条件式のブール値を生成するときには関係演算子も使用され
ます。関係演算子はアドレス・デコーダの中で使用される比較演
算 を 行うときに は 便 利 で す 。関 係 演 算 子 は 条 件 式
と組み合わせて使用しま
(when...then...elseステートメント)
す。条件式を使用すると、
制御信号を使用して構成要素をつく
る作業を容易にすることができます。
例えば、
演算子を次のように使用します。
ドット拡張子
“Using the logical OR operator.
my_reg_output := my_input # my_reg_node;
my_reg_output.clk = my_clock;
デザイン・インプリメンテーションの詳
図 3に示すドット拡張子は、
細な制御を可能にします。.APや.ARのようなドット拡張子は、
フリップフロップに対する非同期プリセットと非同期リセットを指定
するときに使用します。その他の一般的なドット拡張子には出力
イネーブルの指定に使用する .OE や双方向信号に使用する
.PINがあります。サポート中の全ドット拡張子については、
ご使
用中のABEL のバージョンに対応するドキュメントを参照してく
ださい。
“Using the arithmetic operator
sum := a + b;
sum.clk = my_clock;
“Using the relational operators with
“conditional equations
WHEN (a != b) THEN
c := my_input;
ELSE
c := my_reg_node;
c.clk = my_clock;
.OE
.AP
S
.D or .T
.CLK
D/T Q
>
R
.AR
.Q or .FB
.PIN
図 3:ABEL で直接サポートされているドット拡張子
論理演算
論理演算子を使用すると、
信号の論理演算が可能になり、
信号
とセットに対して適用することができます。セットに対して使用す
る場合はビット毎に適用され、
セットは同一サイズである必要があ
ります。
表 1 に演算子を示します。.
算術演算
セットに対して算術演算子と関係演算子を使用すると、
加算器、
カウンタ、
コンパレータを迅速に生成することができます。加算器
やマグニチュード・コンパレータのような大規模な算術演算機能
では、
キャリ・ルックアヘッド信号をインプリメントするために非常に
ビット幅の大きい論理式を生成します。
これらのルックアヘッド・
キャリ論 理式の幅を制御するために、コンパイラ指令 語の
@carryを使用することができます。例えば、@carry 4はキャ
したがって、8ビット加算器は
リ・チェーンを4ビットに制限します。
2個の4ビット加算器としてインプリメントされます。各加算器は自
分の4ビットに対してキャリ・ルックアヘッドをパラレルに実行しま
す。ただし、
キャリ信号は上位桁の加算器へカスケード接続され
る下位 4 ビットから生成されます。通常、3 または 4 のキャリ・
チェーン長がスピードと集積度の間での最適値になります。
2-44
条件式を使用すると、関係演算の結果に応じて所定の割り当
てを実行することができます。前の例では、aが b に等しくない
cにはmy_inputが割り当てられます。その他の場
場合には、
c には my_registered_node に格納されている値
合には、
が割り当てられます。複数の割り当てを行うには、
それ等を{ }シ
ンボルで囲みます。
elseステートメントは必ず条件式に含める必要はありません。条
1回に1 つずつ指定できますが、
全
件が複数存在する場合は、
ての場合を網羅していることを確認する必要があります。そうし
ないと、
デザイン内で予期しない動作が発生することがありま
す。
例:
“Using multiple WHEN without ELSE
“statements, the description of a mux
“is done by conditionally setting Output
“to Data_A or Data_B. Note the {} are used
“to make multiple assignments for each
“conditional.
Output2.clk = myclock;
WHEN (select == 0) THEN
{Output = Data_A;
Output2 := ValueA;}
WHEN (select == 1) THEN
{Output = Data_B;
Output2 := ValueB;}
WHEN (select == 2) THEN
{Output = Data_C;
Output2 := ValueC;}
“Note, select may also equal 3 and not
“defining the behavior for 3 will make
“the condition a don’t care.
XAPP075 (Version 1.0)
表 1: ABEL の演算子
Logical
Arithmetic
Relational
&
AND
-
Twos complement
==
Equal
#
OR
A-B
Subtraction
!=
Not equal
!
NOT
A+B
Addition
<
Less than
$
XOR
<<
Shift left
<=
Less than or equal
>>
Shift right
真理値表の使用
真理値表を使用するデザイン入力は、入力信号定義と対応す
る出力信号定義から構成されています。出力信号はシーケン
シャル・ロジックまたは組み合わせロジックとすることができます。
真理値表は、7セグメントLEDデコーダのような不規則なパター
ンを持つデザインに対しては便利です。
真理値表の先頭は、
全入力信号と全出力信号を定義するヘッ
ダです。-> 記号で指定される変化は組み合わせロジックの変
:> 記号はシーケンシャル・ロジックの変化を指定します。
化で、
シーケンシャル・ロジックの真理値表には、
レジスタに対するクロッ
ク入力を指定するクロック式を含める必要があります。
例:
>
Greater than
>=
Greater than or equal
と同じフォーマットで入力され、
この入力作業を容易にするため
.C. 、
に特別な信号が定義されています。最も一般的なものは、
.Z. 、.X. の 3 つです。.C. 信号は、論理値 Low から論理値
Highになり、
その後に Low に戻るクロックを表します。この信
・ベクタを入力する
号は、
各クロック・パルスに対して3個のテスト
.X.
よりは便利です。.Z. 信号はスリーステート信号を表すときに、
信号は don't care 信号を表すときに、
それぞれ使用します。
don't care 信号は入力と出力に使用することができます。
状態図の使用
状態図は、読み易く管理の容易なコードを生成する傾向があり
ます。状態図を使用してデザインを生成する際は次のステップ
が使用されます。
“Syntax for defining a truth table
TRUTH_TABLE ([ my_input ] ->
[my_combinatorial output] :>
[my_registered_output])
1. 状態ビットを宣言します。
“A mux described with a truth table
4. 論理式を使用してステート・マシンのクロック信号を定義しま
2. 状態ビットのセット名を宣言します。
3. 各状態に値を割り当てます。
す。
EQUATIONS
“Note that we define the clock
“with an equation first.
Output.clk = my_clock;
“Then, we specify the truth table input
“and outputs.
TRUTH_TABLE
([select]:> [ Output ])
[ 0 ] :> [ Data_A ];
“If select is 0,then Output gets Data_A
[ 1 ] :> [ Data_B ];
“If select is 1, then Output gets Data_B
テスト・ベクタの入力
テスト・ベクタは、
ロジック記述に対する機能テストを実行するた
めにオプションとして追加することができます。XC9500ファミリで
このファイルは、
システム
は、JEDECファイルに含まれています。
内で物理デバイスの機能をテストするためのJTAG INTEST機
能の中で使用することもできます。
TEST_VECTORSキーワードは前のセクションの終わりとテ
スト・ベクタの開始を表します。テスト・ベクタはデザインを機能的
にシミュレートする際に使用できます。テスト・ベクタは真理値表
XAPP075 (Version 1.0)
5. ステップ 2 で定義した名前を使用して状態遷移を定義しま
す。
状態ビットの宣言、
およびこれらの状態ビットを使用した各状態
の表現では、前述のセットと定数宣言を使用します。状態ビット
と状態を定義した後に、
クロック信号とその他の制御ロジックを
指定する論理式セクションが必要です。STATE_DIAGRAM
キーワードを使用して、割り当ておよびこれらの各状態に対する
状態遷移を指定します。無条件状態遷移を指定するときは、
GOTOステートメントを使用します。条件付き状態遷移を指定
するときは、IF...THEN... ELSEステートメントを使用します。
これは論理式セクションで使用するWHEN...THEN... ELSEと異なっていることに注意してください。
例:
module traf
title ‘Traffic Light Controler’
“ A controller is needed to control the
“ timing of a traffic light.
2-45
2
ザイリンクスCPLD での ABEL の使用
“
“
“
“
“
“
The green light should be lit for thirty
seconds. Then a yellow light for two
seconds, and a red light for
thirty seconds We then repeat the entire
cycle. This design must run on a clock
which has a period of 1 sec.
Counter := Counter + 1;
ELSE goto STOP with
Counter := Counter + 1;
“clock in with a period of 1 second.
clk
pin;
state STOP:
IF (Counter < 30) then STOP with
Counter := Counter + 1;
ELSE goto GO with
Counter := 1;
“reset to determine initial state.
reset
pin;
test_vectors
([clk,reset] -> [red, yellow, green])
“Declare some nodes for a counter.
Count4..Count0 node istype ‘reg’;
Counter = [Count4..Count0];
“Step 1. Declare the state bits.
“These bits are also our outputs
“in this example...
red
pin istype ‘reg’;
yellow
pin istype ‘reg’;
green
pin istype ‘reg’;
“Step 2. Declare a name for the set of
“state bits.
“Step 3. Assign a unique value for the
“for each state.
Light =
[green, yellow, red];
GO =
[ 1,
0,
0 ];
CAUTION = [ 0,
1,
0 ];
STOP =
[ 0,
0,
1 ];
Equations
“Step 4. Set up the clock and reset lines
“for the state machine.
green.ap
= reset;
red.ar
= reset;
yellow.ar
= reset;
Counter.ar = reset;
Counter.clk = clk;
[green, yellow, red].clk = clk;
“Step 5. Define the state transitions
“using the name defined in step 2.
State_Diagram Light
state GO:
IF (Counter < 30) then GO with
Counter := Counter + 1;
ELSE goto CAUTION with
Counter := Counter + 1;
[0,1]
->
[0,0,1];
[.c., 0]
@repeat 29
{[.c., 0]
->
[0,0,1];
->
[0,0,1];}
[.c., 0]
[.c., 0]
->
->
[0,1,0];
[0,1,0];
[.c., 0]
@repeat 29
{[.c., 0]
->
[1,0,0];
->
[1,0,0];}
[.c., 0]
@repeat 29
{[.c., 0]
->
[0,0,1];
->
[0,0,1];}
[.c., 0]
[.c., 0]
->
->
[0,1,0];
[0,1,0];
[.c., 0]
@repeat 29
{[.c., 0]
->
[1,0,0];
->
[1,0,0];}
end
状態図に対する割り当ては、
2 つの方法で可能です。状態の
割り当てが組み合わせ回路として行われる場合は、
出力は状
態ビットからデコードされます。これにより最終デザインの集積度
が向上しますが、遅延が追加されてしまいます。図4に示すよう
に、
現在の状態のデコードでは1段のロジックを追加して所望の
出力を作ります。例えば、次のようになります。
zero_state:
output1 = 0;
GOTO one_state;
one_state:
output1 = 1;
GOTO zero_state;
state CAUTION:
IF (Counter != 0) then CAUTION with
2-46
XAPP075 (Version 1.0)
fast
State
Bits
Address
!ads
Next State
Decode
Output Signal
Decode
D Q
>
出力デコーダは所要積項数を最小にしますが、
tCO が大きくなります。
図 4:現在の状態のデコード
信号がレジスタ型として宣言される場合は、
次の状態の決定中
に、同時に出力がデコードされ、次のクロック・エッジで変化しま
これをABELを
す。このインプリメンテーションを図5に示します。
使用してインプリメントするときは、
状態図の中でwithステートメ
ントを使用します。
例:
State
Bits
Next State
Decode
Output
Decode
D Q
>
D Q Signal
>
次状態デコーダの重複により所要積項数が増えますが、
t COは小さくなります。
図 5:次の状態のデコード
Property ステートメントの使用
ABEL は元々 PLD 用に開発されましたが、デバイス固有の機
能でABELが直接サポートしていないものがまだあります。代わ
ABEL は property ステートメントを提供して、デバイス固
りに、
有のコマンドをフィッタ・ソフトウェアに渡せるようにしています。
propertyステートメントは宣言セクション内に配置しておく必要
があります。
これらのpropertyステートメントを使用すると、ユー
ザは次の制御を行うことができます。
•
•
•
•
•
xepld property ‘fast on’;
“all pins have fast slew rate
xepld property ‘fast on x1 x2’;
“ only x1 and x2 are fast
“ the remaining pins are slew limited
logic_opt
one_state :
GOTO zero_state
with output1 := 0;
Next State
Decode
とする信号の方が少ない場合は、
属性の後ろに個々にこれらを
リストすることができます。その場合、
残りの信号はスルー・レート
を制限したものになります。
あるいは、
スルー・レートを制限した信
号の方が少ない場合は、
これらの信号をリストすることもできま
す。
xepld property ‘fast off x1 x2’;
“only x1 and x2 are slew limited
“the remaining pins are fast
zero_state :
GOTO one_state
with output1 := 1;
Address
!ads
fast 属性は出力スルー・レートを制御します。各デザイン内で
fast属性は1回しか使用できません。高速スルー・レートを必要
logic_opt属性を使用すると、ユーザはフィッタにより実行され
るロジックの最適化を制御することができるようになります。この
属性は、圧縮するとデザインが非常に大きくなってしまうような
ノードを選択して、
それらに対して使用する必要があります。
xepld property ‘logic_opt off’;
“Preserves all combinatorial nodes
xepld property ‘logic_opt off x1’;
“preserve x1 and collapse other nodes to
fitter limits
minimize
この minimize 属性は論理式に対するブール式の最小化の
適用を禁止する際に使用し、基本的には、
組み合わせロジック
内の冗長積項の削除を禁止する際に使用します。
xepld property ‘minimize off x1 x2’;
“keep redundant product terms for x1 & x2
partition
このpartition属性は、
ロジックに特定の配置が必要な場合に
使用します。
xepld property ‘partition fb1 x1 x2’;
“place the functions of x1 and x2 in
“function block 1
スルー・レート
ロジックの最適化
ロジックの配置
xepld property ‘partition fb1_2 x1’;
“place the function x1 in
“function block 1, macrocell 2
消費電力の設定
プリロード値
pwr
このpwr属性は、
個々のマクロセルに対する消費電力の設定
を制御します。
XAPP075 (Version 1.0)
2-47
2
ザイリンクスCPLD での ABEL の使用
xepld property ‘pwr low’;
“places all macrocells in low power mode
“Define my sets
Data = [D7..D0];
xepld property ‘pwr low x1 x2’
“places x1 and x2 in low power mode
“the remaining in STD power mode
Equations;
Data.oe = !write; “3-State the data lines
“when writing to register
Data.clk = myclock;
xepld property ‘pwr std x1 x2’
“places x1 and x2 in STD power mode
“the remaining in low power mode
.prld
この.prld属性は、パワーアップ時のレジスタ初期状態を制御し
ABELは使用しない
ます。
この属性はフィッタに渡されるだけで、
ため、
プリロード値はテスト・ベクタに関係しないことに注意してく
ださい。デフォルトのプリロード値は、全ての XC9500レジスタに
したがって、
値1を必要とするレジスタのみを指定
対して0です。
するだけで済みます。
例:
xepld property ‘equation x1.prld = VCC’;
“preload register x1 to a 1
WHEN (write==1) THEN Data := Data.pin;
“When we are writing to the part, read the
“data pins and save in data register.
ELSE
Data := Data;
“Else, drive the data pins with the value
“saved in the register so we can read it
“back.
end;
ラッチ
ラッチは2つの方法でインプリメントすることができます。最初の
latch_outputがフリップフロップの非同期セットと非同
例では、
期リセットを使用してラッチをインプリメントしています。
module ltest1
デザイン例
以下の例は幾つかの基本的かつ特定なデザイン原理を紹介
するものです。
input,le
latch_output
pin;
pin istype ‘reg’;
equations
双方向ピン
この例では、ABEL 内での双方向信号の指定方法を示しま
す。双方向信号は、
幾つかの種類のデバイスでバスを使用する
場合に使用されます。バスには、
通常、
ある種の制御信号が関
係し、
同時に1個のデバイスしかバスを駆動できないようにして
います。この例では、
マイクロプロセッサのような外部ソースが
あるい
データ・ピンD7∼D0に対してデータを入力中か否かを、
はCPLDがデータを外部リソースに出力するためにD7∼D0を
駆動中であるか否かを入力ピンwriteを使用して制御していま
す。
module bidi;
“This design will take a value from the
“pins D7..D0 and store it in a Register
“when the signal, write, is high. When
“write goes low, it will output the
“saved value at pins D7..D0
“inputs
write
myclock
pin;
pin;
“Bi-directional signal also has a register
“associated with it.
D7..D0
pin istype ‘reg’;
2-48
latch_output.ap = input & le;
latch_output.ar = !input & le;
latch_output.clk = 0; “Clock must be
“grounded
latch_output.d = 0; “D-input must be
“grounded
test_vectors
([input,
[latch_output])
[0,0] ->
[1,0] ->
[0,1] ->
[1,1] ->
[1,0] ->
[0,1] ->
le] ->
[0];
[0];
[0];
[1];
[1];
[0];
end;
ラッチは、
フィードバック・パスとグリッチに対応するための冗長な
積項を使用して、組み合わせロジックによりインプリメントするこ
ともできます。
この場合は次のコードが必要になります。
MODULE comlatch;
le
input
latch_out
pin;
pin;
pin istype ‘com,retain’;
XAPP075 (Version 1.0)
// The ABEL compiler will retain redundant
// logic for the latch_out output
// because they have the RETAIN attribute.
// However, the MINIMIZE OFF property
//statement is required to instruct the
// Xilinx fitter to also retain the
// redundant logic.
xepld property ‘minimize off latch_out’;
“ The fitter will retain redundant logic
“ for these nodes
EQUATIONS;
#
“
#
“
latch_out = input & le
“ latch is transparent high
latch_out & !le
latch data on falling edge of le
latch_out & input;
Redundant product term
TEST_VECTORS
([ le, input]
[1 , 0 ]
[1 , 1 ]
[0 , 1 ]
[0 , 0 ]
[1 , 0 ]
[0 , 0 ]
[0 , 1 ]
->
->
->
->
->
->
->
->
[latch_out]);
[
0 ]; “ transparent
[
1 ]; “ transparent
[
1 ]; “ latch a 1
[
1 ]; “ change input
[
0 ]; “ transparent
[
0 ]; “ latch a 0
[
0 ]; “ change data
END; “ All modules must have an END statement
カウンタ
カウンタは、
メモリ・インターフェイス、
遅延状態の発生、簡単なス
テート・マシンなどのような様々なアプリケーションで使用されま
す。
この例では、
カウント・イネーブルを持つローダブル・アップ /
ダウンカウンタの生成方法を示します。
Equations
@carry 4;
Counter.clk = myclk;
WHEN (!Load & Count_Enable &
THEN Counter := Counter
else
WHEN (!Load & Count_Enable &
THEN Counter := Counter
else
WHEN (Load)
THEN Counter := Input;
else
Counter := Counter
end;
UpDown)
+ 1
!UpDown)
- 1
マルチプレクサ
マルチプレクサは、
デザインのデータ・フローを制御する際に使用
16ビットの4 対1レジスタ付マルチプレクサ
します。次の例では、
のインプリメント方法を示します。
module mux2
A15..A0
B15..B0
C15..C0
D15..D0
Q15..Q0
Sel1..Sel0
clk
Output
DataA =
DataB =
DataC =
DataD =
Select
pin; “ Inputs
pin; “ Inputs
pin; “ Inputs
pin; “ Inputs
pin istype ‘reg’; “ Output
pin;
pin;
= [Q20..Q0];
[A20..A0];
[B20..B0];
[C20..C0];
[D20..D0];
= [Sel1..Sel0];
Equations
Output.clk = clk;
module counter
“32-bit Up/Down counter with parallel load
“and enable
“Outputs
Q31..Q0
“Inputs
D31..D0
Load
Count_Enable
UpDown
myclk
WHEN
else
else
else
Select == 0 THEN Output := DataA
WHEN Select == 1 THEN Output := DataB
WHEN Select == 2 THEN Output := DataC
Output := DataD;
end
pin istype ‘reg’;
まとめ
pin;
pin;
pin;
pin;
pin;
Counter = [Q31..Q0];
Input
= [D31..D0];
XAPP075 (Version 1.0)
“ Load Cmd
“ Count Cmd
“ Up/Down Cmd
“ Clock
ABELを使用すると、複雑なビヘイビア・デザインを容易にインプ
リメントでき、
シミュレーションが実行できます。
さらに、ABEL の
propertyステートメントを使用すると、デバイスに固有な機能を
容易にアクセスすることができます。ABELは簡単でかつ強力
なソフトウェア・ツールであり、設計者に X C 7 3 0 0 デザインと
XC9500デザインを開発する効率良い言語を提供します。
2-49
2
ザイリンクスCPLD での ABEL の使用
2-50
XAPP075 (Version 1.0)
Fly UP