RTL設計仕様
複雑な演算や制御を含む振る舞いは高位合成したくなりますが、このようなレベルであればRTLで十分でしょう。従ってVerilogで言うモジュールの要求を以下のようにブレークダウンします。これはLチカは要求であって実装可能な手段ではないため、実装可能な手段に分割することを意味します。
- 高速なクロックを分周し、目で見えるレベルの低速クロックとすること
- 低速クロックをカウントし、流れるパターンをひとつずつ表示すること
- 流れるパターンは14通りであるため、13を数えたら次は0とすること
- カウント値をデコードし、1つのLEDが点灯しているパターンとすること
1.の要求はNbitのカウンタで実装することができます。何ビットにするかは後程設計計算を行います。
2と3の要求は14進カウンタで実装することができます。一つの要求で一つのモジュールとは限りません。
4の要求はLEDデコーダとして実装することができます。以上でモジュール分割ができたことになります。
モジュール
名称: blink
インタフェース
次の表に、モジュール全体としてのインタフェース(入力及び出力)を示します。基本的にクロックとリセットが必要であり、後はどのLEDを点灯させるかを示す信号があるのみです。
表41.1
インタフェース信号名 |
インタフェース信号内容 |
CLK |
入力、100MHz |
XRST |
入力、リセット信号、負論理を想定 |
LED[7:0] |
出力、8bit、正論理、LEDへの出力信号 |
サブモジュール
(1) Nbitカウンタ
100MHzで点滅すると人間の目に見えないため、見える範囲にまでカウントします。最後の桁上げの際に次段のカウンタを1だけ増加させます。これにより元のクロックが$2^N$分周されることになります。
0からアップカウントし、Nbitの全てのビットが1になった場合に次段のカウンタイネーブルをtrueとします。
前記のように人間の目で見える範囲内に入れるためには、例えば周期を0.5secから1.0sec未満の範囲として以下の不等式を解くことになります。
\[
0.5\le \frac{2^N}{1e8} \lt 1.0
\]
この不等式が成立する整数解Nはただ一つであることが保証され、これを解くとN=25[bit]となります。これは非機能要求である性能要求による設計計算を実施し、仕様が決定したことになります。
(2)14進カウンタ
最右のLEDが点灯しているパターンから左にシフトし、さらに右に戻ってくるまでのパターンが以下の表に示すように14パターンあるため、14進カウンタを設けます。14進カウンタのイネーブルは前記Nbitカウンタからのカウンタイネーブルを接続します。
表41.2
カウント値 |
パターン |
0 |
8'b00000001 |
1 |
8'b00000010 |
2 |
8'b00000100 |
3 |
8'b00001000 |
4 |
8'b00010000 |
5 |
8'b00100000 |
6 |
8'b01000000 |
7 |
8'b10000000 |
8 |
8'b01000000 |
9 |
8'b00100000 |
10 |
8'b00010000 |
11 |
8'b00001000 |
12 |
8'b00000100 |
13 |
8'b00000010 |
(3)デコーダ
14進カウンタの出力はバイナリ出力のため、表41.2のビットパターンとなるようにデコーダを設けます。
今回の設計ではアップカウンタのみで構成しましたが、デコーダを倹約してアップダウンカウンタで構成することも可能です。結局のところ、設計とは新しいことを生み出すというよりも、実装できるレベルの小規模のサイズに分割し、そのトレードオフを最適化することにほかなりません。
前のブログ
次のブログ