2010-04-01から1ヶ月間の記事一覧
AMBAのアドレスは以下のようにしました。 とりあえず、これで頭の中での設計は一旦終了。実際のコーディングに入ります。 C言語でワークメモリのウェイトを表現して検証するのが面倒くさいので、直接RTL書こうかと思っていたのだけど、これぐらいの規模にな…
デコードパートのステートマシンは以下のようにしました。 条件が書かれていない部分は、他の矢印の条件以外すべての意味です。
デコードしたRunlengthの値分だけアドレスを飛ばして、値を書き込んでいきます。 そのためのカウンターは以下のようにしました。 また、このカウンタの値によって、Huffman Cache mem や Serial Huffval mem で出てきた符号(DC/AC, id)を決定します。
ここまで考えてきて、今更ながらシリアルと呼んでいるものを16個作って比較器の出力でどれか一つ選ぶハードウェアが一番シンプルで高速なように思えてきました。。。。。。まあ、けど、いろいろ考えていると際限がないので、とりあえず今のまま設計します。 …
内部レジスタの演算と、シフト量演算部分は以下のようにしました。Huffman cache -> シフト量演算 -> -> シフタ -> sign_extention -> メモリ のパスが一番重そうな気がします。。。ここで出てくるレジスタ信号はステートマシンの遷移の判断にも使用されます…
シフターは、32bitならまじめにコーディングしても結構良いものができるような気もしますが、FPGAリソースに詳しくないので以下のように乗算器を用いて構成しようと思います。乗算器ハードを使ってくれれば高速になるかと思ってやっていますが、実際のところ…
シリアル処理部分の回路は以下のようにしました。 基本的にIJGのハフマンデコードの所で調べた、Huffval[code + offset[k]] という演算を行います。 serialcheckステートで、9,10,11,.....とフェッチレジスタから持ってくるデータ量を増やしながら、Maxvalue…
デコード部分については以下のように変更しました。 後段の64画素メモリに書き込み可能になったら、スタンバイ状態からSymReqステートに移動します。 図中には64画素メモリは一つしかありませんが、実際には3つ置いてダブルバッファのように使用します。 2つ…
シリアルに順にチェックしていくルーチンも、それほどクロック数を必要としないみたいなので、IJGと同じくキャッシュは8bitにしようと思います。IJGでは、8bitでキャッシュにヒットしなかった場合とバッファに8bit未満のデータしかない場合にシリアルチェッ…
むむむ、Cache memoryは、AC,DC2種類づつあってあまりにもでかくなる。16bit Cacheをやめて n bit cacheにしたときに、nよりも少ないビットしかフェッチレジスタに無いときキャッシュアクセスでは間違った値が出てくる。 根本的に作り直す必要がある?勘違い…
fetch partは以下のようにしました。 bytefetch ステートでフェッチレジスタに余裕があれば、8bit毎フェッチします。 FIFOにデータが無い場合は、Memwait ステートでメモリ要素が0でなくなるまで待機します。 データにFFが出てきた時は次の値を読まないと解…
AHBインターフェース部分は以下のようにします。 FIFO自体は2port memoryで実現します。かつて、ycc-rgb変換モジュールで設計したものと同じです。 AHBアドレスは、ハフマンコード用のアドレス範囲に書き込みがあれば、アドレスの値に関わらず、FIFOに順番に…
ハフマンデコードモジュール全体像は以下のようなものにしました。 AHBからFIFOにデータを入れるところまでのAHB interfaceと、 32bit fetch registerのデータが24bit以下になった時に8bitづつ供給していく fetch part と、fetch registerの値からハフマンデ…