モジュール名
mem_if
パラメータ
X_SIZE=512;
Y_SIZE=512;
SLICE=11;
ADDR_WIDTH=21; /* X:12bit(512x8word), Y:9bit */
X_WIDTH=9;
X_ADDR_WIDTH=12;
Y_WIDTH=9;
入力(おもに制御部から)
- clk
- init:オールクリア
- res_shift:参照画素右シフト命令
- can_shift:候補画素右シフト命令
- kaigyo:改行命令
入力(メモリモジュールから)
- ref_psb_in:メモリモジュールからの参照画素付属PSB
- can_psb_in:メモリモジュールからの候補画素付属PSB
- ref_data_in:メモリモジュールからの参照画素
- can_data_in:メモリモジュールからの候補画素
出力
- ref_addr:参照メモリモジュールへのアドレス
- ref_rden:参照メモリモジュールへのread_enable
- can_addr:候補メモリモジュールへのアドレス
- can_rden:候補メモリモジュールへのread_enable
- disparity
- ref_psb_out
- can_psb_out
- ref_data_out
- can_data_out
経緯
- そもそも当初は別のアドレス生成ブロックとFIFOを用いたバッファを使用する予定だった.
- 差分圧縮されているのでメモリから読み出す1wordのbit数と実際にSAD演算で使用する周期が異なるからである.
- メモリから読み出すbit数は,1~8bit(平均6bit).
- SAD演算の周期は,12clock.
- この場合のアドレス生成は単純で,単純に1行分の左端から連続して読み出すだけである.
- ただし,バッファに工夫が必要である.読み出して初めて次の画素のLSBを読み出したことに気づくことになる.従って,次の読み出し要求までこの画素データ(1bit分)を保持する必要がある.
- また,FIFOの記憶容量も問題となる.FIFOを実現する場合,RAMのスペースを確保することになる.1行が512画素ならば,最悪値として,512×8bit=4,096bitの容量を確保する必要がある.参照画素と候補画素の両方で必要なので,実際は8,192bit必要.
- そこで,バッファを用いない方式を検討する.
- 問題となる読み出し制御は,以下のようにして解決させる.
- 今までは,画素データとPSBは同期して(同一アドレスに)格納されていた.PSBが同期しているために読み出したら,次の画素だったということになる.
- そこで,PSBのみ1つ先のアドレスを読み出せば良い.しかし,そのためにはアドレスバスが2種類必要になってしまい,配線量削減の目的と矛盾してしまう.
- そこで,前提を見直し格納されるアドレスを1つずつずらすことにする.つまり,PSBの方を1つ手前のアドレスに格納する.(PSBのアドレス=画素データのアドレス-1)これで同一アドレスを使用できる.この場合,各行の左端画素に対応する先頭PSBは省略する.
- この前提の場合,画素データとPSB格納時に弊害が出ないか検討する必要はある.
動作
- 参照・候補メモリモジュールへのアドレスを生成する.
- ref_addrは,PSBメモリのアドレスも兼ねる.
- ただし,格納時にPSBメモリは1bitずれている.
- メモリモジュールから読み出した段階では,座標として扱えないので,各行の開始アドレスから1行文連続して読み出すしかない.
- 画素データの要求などは,復号後のバッファへおこなうことになる.
- initによって初期化をおこなう.0番地から読み込むためにrden=HIとする.
- can_shift=HIの場合,can_addrを1加算し,can_rden=HIとする.
- ref_shift=HIの場合,ref_addr, can_addrを1加算し,ref_rden, can_rden=HIとする.
- kaigyo=HIの場合,参照画素と候補画素の次の行の開始アドレスをセットし,ref_rden, can_rden=HIとする.
- rden=LOWとするタイミングは,メモリモジュールからのPSBが1となった時.ただし,アドレスは既に1加算されてしまっているので,アドレスは1つ前のアドレスに戻す.
- メモリモジュールからのデータは,rden=LOWにした後も出力される可能性があるので,rden=LOWの場合に強制的に0とするようにフィルタリングしている.
- 開始アドレス=512×8×行番号
使用例
使用モジュール
高速化の工夫
アドレスだけはパラレル転送する必要があるので内部的にもパラレルで保持・演算をおこなっている.
しかし,アドレスを1減算する処理を加えたとたんにFmaxが低下した.(380MHz→250MHz)
やはり,リプルキャリ接続の影響が出てしまうようだ.
そこで,1加算する前のアドレスを別のレジスタに保持させておいて,アドレスを1つ前に戻したい場合はそのレジスタの値を代入させることにする.
レジスタを余計に使用してしまうが速度には替えられない.
最終更新:2008年03月10日 15:56