【順序回路とは】
順序回路とは、フリップフロップやラッチなどの値を保持する機能を持った
素子を含む回路のことを言います。
この順序回路を記述するVHDLは組合せ回路とは異なっています。その
特徴を簡単に言うと下記の3点になります。
(1) プロセス文のセンシティビティリストにはクロック信号しか記述せず
クロックに同期して動作すること。
(2) クロックのエッジ検出にIF文、またはwait until文 を使うこと
(3) 強制リセットを使うときにはセンシティビティリストにリセット信号を
記述すること。
【クロックのエッジ検出】
センシティビティリストに指定したクロック信号のエッジを検出するにはIF文
とwait until文の2つの方法があります。
(1) IF文による方法
IF文を使ってクロックのエッジ検出は event を使って下記のように記述
します。この場合にはセンシティビティリストにクロックの指定が必要です。
立上がりエッジの時
if (CLK' event and CLK='1') then
Q <= D;
end if;
立下りエッジの時
if (CLK' event and CLK='0') then
Q <= D;
end if;
注:このクロック動作のIF文の場合には、else 以降の記述は出来
ないので注意が必要です。
例 Dフリップフロップの記述例
センシティビティリストに
CLKの記述が必須
(2) wait until文による方法
wait until文を使ってエッジ検出を待つ場合には、検出を積極的に待つので
センシティビティリストにクロック信号を記述する必要はありません。
立上がりエッジの時
wait until CLK' event and CLK='1';
Q <= D;
立下りエッジの時
wait until CLK' event and CLK='0';
Q <= D;
例 Dフリップフロップの記述例
センシティビティリストに
CLKの記述不要
【強制リセットの記述方法】
強制リセットのような、非同期動作をさせる場合には、IF文での記述しか
出来ません。従って、クロックのエッジ検出にはIF文が一般的に使われて
います。
強制リセットの記述は具体的には下記のようにします。つまり、強制リセット
信号をセンシティビティリストに追加し、CLOCKより先にRESET信号の有無を
判定し、その後でクロックのエッジ検出をするようにします。
例 強制リセット付きDフリップフロップの記述例
RESETはクロックに非同期
で強制動作とするため
先に判定する
【カウンタの記述】
順序回路の代表的なものにカウンタがありますが、基本的なカウンタのVHDL
による記述例は下記のようになります。
例 単純な2進カウンタ
ここで内部信号を外部
に出力している。
(注)VHDLでは、外部出力信号は内部では使えないという制限があるため
内部で使う必要がある出力は一旦内部出力信号として扱い、最後に
内部信号を外部信号に代入して出力します。
例 単純な10進カウンタ
出力が9になったら次には
0に戻すという記述
ここで内部信号を外部信号に
代入している
【シフトレジスタの記述】
順序回路のもうひとつの代表例にシフトレジスタがあります。これの記述方法は
下記のようにいくつかの方法があります。
例 単純なシフトレジスタの記述例1
この例は信号を順次シフトして代入するという最も原理的な記述例です。
原理的ではありますが、記述式が多くなるので余り使われません。
例 単純なシフトレジスタの記述例2
この例は配列のスライスを使った例で、最も少ない式数で記述できるので
スマートです。特にビット数の多いシフトレジスタになった時にも行数は
変わらず宣言の部分だけ修正すれば使えます。
例 単純なシフトレジスタの記述例3
この例は、FOR文を使ったもので、例1の記述をFOR文で繰り返す
様にしたものです。