同期設計の方法

同期設計の方法

 FPGAは同期設計するのが基本。というのは本ブログでも解説していますが、言葉でわかっていても、なかなか同期設計の本質がつかめない。という話をよく聞きます。

 初心者のうちは、同期設計を心掛けるよりも、与えられたクロックでのみ設計する。という方向の方が近道かも知れません。

 FPGAは高速線路のグローバル信号領域とロジックセル領域に分かれており、グローバル信号の周りにロジックセルが配置されるような構造になっています。

 ロジックセルとロジックセルの間には内部配線用のスイッチマトリクスが配置されており、LCとLBを接続したり、グローバル信号と接続したり柔軟な変更が可能になっています。

 このようにエンジニアが設計した回路はLCとスイッチマトリクス、グローバル信号などに割り当てられますが。それに対し、クロック信号はFPGAに入力されて、PLLを通ったり、クロックセレクタを通るなどして、グローバル信号として配置されます。

 グローバル信号は本数が限られています。通常は4本程度で、高級なFPGAでも10本程度です。したがって、グローバル信号に割り当てられる可能性の高いクロックの種類を増やすと、すぐにグローバル信号が足りなくなる。という事になります。

 そして、クロック信号をグローバル信号として扱わなかった場合、クロックはLCに割り当てられてしまいます。これは、とても不都合な事が起こります。本来、クロック信号はすべてのロジック回路に最短かつ高速に割り当てられるべき信号ですが、LCやスイッチマトリクスを通過してしまうと、そこで遅延が生じます。しかも、回路を変更するたびに、割り当てが変化するため、動作検証が非常にやりにくくなります。

 つまり、クロック信号は不変であってほしい信号であり、最短・最速でFPGAの隅々に配置したい信号という事になります。

 同期設計というのは、このクロック信号に同期した回路設計をする。という事です。ただし、クロック信号を20本も30本も使って各々のクロックに同期させても意味がありません。FPGAにはそれほどクロック信号を割り当てられませんから、数本のクロックで設計する。という意味が含まれています。

 では、どのようにして数本のクロックですべてを設計するのかといえば、限られたクロックで動作を間引く。というテクニックを使います。

 一般的には、ある程度高いクロックを使って、必要な速度の間引きを行います。たとえば、2MHzのスピードが必要な回路と3MHzのスピードが必要な回路があった場合、最小公倍数である6MHzのクロックを使います。そして、すべての回路に6MHzでクロックを供給します。2MHzの回路は3回に1回。3MHzの回路は2回に1回動作するように設計します。このようにすることで、回路の全部を6MHzで設計したことになり、グローバルクロックも6MHzになります。

 このような動作をするにはフリップフロップのイネーブル機能を使います。イネーブルは、DFFのクロックを有効・無効にする機能で、イネーブルがLowの時にはクロックは無効になり、DFFは前の状態を保持します。回路図で示すと次のようになります。

 VHDLでは次のように記述します。

process (clock,nreset) begin
	if nreset = '0' then
		rDFF <= '0';
	elsif clock' event and clock = '1' then
		if (enable = '1') then
			rDFF<= indata;
		end if;
	end if;
end process;

 5行目に示したif文がイネーブルの記述です。このif文はelsif clock’ event and clock = ‘1’ thenの中に入っていますので、クロック立ち上がりエッジかつenable=’1’の時になります。クロック同期でイネーブル信号がHiの時にindataをrDFFに記憶する。という事になります。enable=’0’1の時には前の状態を保持します。

 このようにして、DFFのイネーブル機能を使って動作をON/OFFすることで入力クロックとは異なるレートで回路を動作させるのが同期回路設計になります。

 イネーブル信号はどのように作るのか。というのが、設計者の技量になるわけですが、一般的にはカウンターを使います。そのカウンターも最小公倍数であるクロックから作るので、すべてが同期して動作することになります。

 6MHz clockと3MHz enable、2MHz enableの関係をタイミング図で示すと次のようになります。3MHz enableも2MHz enableも6MHzから生成しているので、同期しているのがわかります。

 このようにenable信号を生成してDFFを間引き動作することで、FPGAのクロックは6MHzが供給されるが、回路動作は3MHzや2MHzが混在している。という回路設計ができます。