カウンタのデコード

カウンタのデコード

 前回カウンタについて述べましたので、それと対となって使う事の多いデコーダについて解説します。

 「デコード」と「デコーダ」という言葉がありますが、数を取り出す事をデコードといい、その取り出す回路の事をデコーダといいます。なので、先輩との会話では「このカウンタのデコーダを設計して!」とか「ここのデコードが間違っている」というように使います。

 「デコード」という言葉には日本語があり、「復調」と訳されます。そして、その逆である「エンコード」(日本語:変調)という言葉もあります。

 「カウンタの復調回路」という使い方はしないのです。なぜだか不明ですけど。復調というと、どちらかといえば、暗号を元に戻すとか、何らかの加工された信号を元に戻す時に使います。それこそ変調の逆で復調があります。ラジオのように電波に乗せた音声を元に戻す時に使うのが復調です。

 という訳で、単に「デコード」と書いてしまうと、それは復調という意味を含んでしまうので、カウンタのデコードというタイトルにしました。

 カウンタはenableでON/OFFしたりして、とにかく数を数える回路なのですが、それには目的があって数を数える訳です。そして有限です。

 その有限度合いがカウンタのビット数です。ビット数が4ビットの時には0000~1111まで数えて、その次は5ビット目が無いので0000に戻ります。これは勝手に戻ります。

 このように4ビットであればちょうど0~15までの16個を数える訳で、それをデコードすれば、0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(hex)という事になります。この中から「8(hex)」の時に何かしたい。とか「a(hex)」の時に何かしたい。というときにデコーダ回路が必要になります。

 HDLでのデコーダは何も難しくありません。
VHDLであれば rcounter = x”a” と書けば良いですし
Verilogであれば rcounter == 4’ha と書けば良いだけです。

 しかし、実際にはロジックを作るとandやorの回路が複雑に生成される回路であるのがデコーダになります。

 10進数の”10″という値は一見「キレがいい」という感触になってしまいますが、デジタルの世界では2進数なので、2進数でキレがいい数がデコーダとしても回路が軽い傾向にあります。

 2進数でキレがいい。というのは2進数で表した時に0が多い数です。4ビットであれば、0001,0010,0100,1000(bin)です。4ビット程度なのでこんな感じですが、16ビットや32ビットをデコードする時にはかなり複雑度合いが違ってきます。したがって、デコーダは10進数で区切りよい数を選ぶのではなく、2進数で区切りの良い数にすることで、FPGAの回路が「軽く」なる事を覚えておいてください。

 特に、xx以上になったら0にする。というようなxx以上という時にベテランと初心者の差が出ます。「以上」とか「以下」という数を検出するのはデコーダに加えてコンパレータという回路になるのですが、この回路もロジック的には非常に複雑になります。

 先の4ビットを例にすると、キレの良い数である1000(bin)という数を用いてカウンタをゼロに戻す。というときには日本語で書くと「カウンタが8以上になったなら、0に戻す」という事になります。

 「8以上」というのは2進数でキレの良い数ですし、以上という事は9,10,11,12,13,14,15,16の時を含んでいます。この数値をバイナリで記述してみると、1000,1001,1010,1011,1100,1101,1110,1111になります。この時最上位ビット(MSB)が常に”1″であることに気が付くでしょうか? つまり最上位ビットが1の時は8以上という事です。これをHDLで書くと

VHDLであれば rcounter(3) = 1 と書けば良いですし
Verilogであれば rcounter(3) == 1’b1 と書けば良いという事になります。

 このように記述することで、デコーダは簡素化されるのです。したがって、カウンタを設計する時には、頭の中は常にバイナリ(または16進数)で数える習慣をつけると回路を節約できます。

 カウンタは最下位のビットから最上位のビットに向かってDFFが変化します。10進数で数える時も1の位が9になってから、10の位に繰り上げされます。これと同じように2進数でも下の桁から繰り上がって数を数えます。

 この繰り上がりには時間がかかります。時間と言っても最近のFPGAでは数psec~nsecです。それも下の桁から確定していきますので、上の桁に向かって行くにしたがって確定までの時間は長くなります。

 カウンタが回る際に、上の桁にいくほど確定に時間がかかるものですから、その数をデコードする回路はもっとバラバラになります。その様子を波形に示すと次のようになります。

 このように上の桁に行くにしたがって、「少し遅延」が累積されます。現在のFPGAで16ビット程度までのカウンタであれば、数十MHzでも問題はありませんが、数百MHzのクロックやカウンタが20ビットを超えるようになると、この少し遅延の累積が大きくなるので注意してください。この遅延はそのままデコーダの遅延に加算されます。最終的には1クロックの周期内に収まらなくなって、回路が破綻します。