時計を作成するため、 1Hz のクロックを作成してそれを 1秒 ・ 1分 ・ 1時間 のカウンタのクロックとして使用していました。そのイメージ図がこちらです。

しかしそれは、非同期設計となってしまうため信頼性が低い回路になってしまいます。ではどうやって 1秒 を作り出すのだろう・・・?

 

最も信頼性の高い単一クロック同期回路は、デザイン内の全フリップフロップに同じクロックを供給する事です。

そうすると、すべてのフリップフロップも 1MHz のクロックが入ることになります。1秒 ごとに信号を入れるには・・・クロックイネーブルの信号を使えそうです。カウント・イネーブルがハイになったときのみカウントアップさせるような回路を組めば同期設計で 1秒 が作り出せる!

 

しかし、 1秒 に一度ハイになるということは 1秒 を数えなければならないです。1MHz ということは 1 周期あたり 1/1000000 秒なので、1000000周期数えてその時だけハイになる信号を作ればよいということが分かります。

そこで先輩に頂いたアドバイスが、「欲しい信号は何?じゃあそれに使える信号は?使える信号を使ってどうやって希望の信号を出すの?」このように問いかけられました。

 

1. 欲しい信号は 1秒 に一度ハイになる信号。

2. 使える信号は、 1MHz クロックと 1000000 回数える 20bit カウンタの出力。

3. 希望信号を作り出すためには、 1000000 = 20’b11110001010001000 の信号を・・・

あ! 20bit カウンタの各 bit の AND をとればできる!

 

この 3 つのステップを踏むだけで結構簡単に考えることができました。絵を描きながら考えるとよりわかりやすかったです。

今まではバス信号が、単なるシリアル信号の集合体でしかなく、個々の信号に着目する点が抜けていました。

 

希望信号と使える信号の 2 つに注目してみることで簡単に考えられることができました。

みなさんが行き詰まった際にはこのような考え方をしていることが理解できて少し「エンジニアっぽいな」と思いました(笑)