読者です 読者をやめる 読者になる 読者になる

Tech と Culture

テクノロジーとカルチャー

ハフマンデコードモジュール 5 デコードパート

デコード部分については以下のように変更しました。
decode1.jpg

decode3.jpg

後段の64画素メモリに書き込み可能になったら、スタンバイ状態からSymReqステートに移動します。
図中には64画素メモリは一つしかありませんが、実際には3つ置いてダブルバッファのように使用します。
2つではなく3つ使うのは、ランレングスで0が連続するときに実際に0を書き込むのではなくてとびとびに書き込みを行います。そのため後段に読み込まれた後に、前もって64要素全部に0を書き込んでおくためです。

DCTモジュールで64画素処理するのに約76クロックでした。
ハフマンデコード部分はキャッシュヒットし続けると仮定すると、ハフマンコードと数値一組につき3クロックです。64画素にいくつコードがあるかは画像に依存しますが、コードが10個しかなくても最低30クロックかかります。さらに64個の要素に0を書き込む64クロックを待っていると、DCT部分よりも、こちらの方が処理が重いことになります。
そこで少しでも軽くするためにメモリ3つのバッファにするつもりです。

SymReqステートでは、フェッチレジスタの先頭から8ビットをキャッシュメモリに送ります。
8ビットない場合は存在するビット分と前回のエントリで決めた符号を追加して送ります。その際に送ったビット数をreqbit_keepレジスタに保存しておきます。
次のSymCheckステートでは、キャッシュから値が出力されます。
キャッシュがヒットし、かつ続く数値ビット分のデータがフェッチレジスタに存在する場合はValOutステートに遷移します。
キャッシュがヒットしたが、続く数値ビット分のデータがフェッチレジスタに全部揃っていない場合はSymOKValNGステートに遷移し、フェッチレジスタにデータがフェッチされるのを待ちます。
reqbit_keep=8(キャッシュに8ビット送った)かつ、キャッシュがヒットしない場合は、9ビット以上のコードなのでSerialの処理に遷移します。
reqbit_keepが7以下、かつキャッシュがヒットしない場合は、reqbit_keep以上のコードだが、フェッチレジスタに足りていなかった事になりますので、SymNGに遷移して、フェッチレジスタにデータがフェッチされるのを待ちます。

このような設計によって、フェッチレジスタにデータが充分あり、ハフマンコードが8ビット以下のものが続く場合は、3ステートをクルクル回ってデータが出力されることになります。
大抵の画像は、8ビット以下のコードで大部分を占めると思われますので、たまにしかSerialルーチンは動かないと予想されます。

なーんか、結構複雑になってきたなぁ。。。 ふぅ。。。