手抜きDDRコントローラ

↑を瞬発力で実装中。
BL=8で、前半を下位16bit、後半を上位16bitに使うので、簡単に言えば容量は1/4になる。
まだWriteが無いので正しく動いてるのかどうかは微妙な線。静止画を表示していると言うことは、少なくとも同じアドレスを読み取ったときは同じデータを出力していることになる。
隙を見てwriteも入れる予定。。
ただ、今の画面モードでは50%程の帯域*1フレームバッファに喰うので、モノクロにしないとダメかもなぁ。。
あと、Spartan3のODDRは反転クロックがないと出力できないので、結局DCMを使って反転クロックも出力させている。
書き込みにも対応してみた。


必要以上にキレイに見えるけど、実際は15色なので。。

画面上にゴミが出てるのは、ブロックRAMの境目の処理が間違ってるから。blitterのバグかと思ってたけど、直接フレームバッファに書き込んでも出るので。。フレームバッファのバグであって、DMAC側のバグでは無いです。
そのうち、USBホストコントローラとUSBとTCP/IPのスタック付きで公開予定。Bluetoothは無しに。。
実装上困ったのは、書き込み時に1bitだけ化ける現象が発生したこと。結局1クロック分読み書きのタイミングをずらしたら上手く行った感じだけど、根拠レスのおまじないなのでもうちょっと検証が必要。
メモリコントローラやDMACを実装するときは大抵ストレステストツールを作っていて、

run 7
 pass 1
ERROR : [0C56]  31CFFF99 => 31CF7F99 (00008000)
ERROR2: [0C56]  31CFFF99 => 31CF7F99 (00008000)
ERROR3: [0C56]  31CFFF99 => 31CF7F99 (00008000)
ERROR : [0F55]  1583C948 => 15834948 (00008000)
ERROR2: [0F55]  1583C948 => 15834948 (00008000)
ERROR3: [0F55]  1583C948 => 15834948 (00008000)

乱数データを書き込んでランダムな順番で読み取り、データが変化していたらxorを取って報告という形。1bitだけの変化はxorが1とか2とか4とか8のような特徴的な値になるので見た目に直ぐ解る。
問題はこのツールをどこのメモリで動かすかという点で、最初の最初(つまり今回のようなケース)では、ホストPCからUART経由で直接RAMを触れるデバッグI/Fを用意して試す。CPUのコードをいきなり動かそうとすると、CPUが不味いのかメモリが不味いのか切り分けられないので問題が複雑になる。
同じアドレスを3回読んでいるのは、転送エラーかどうかを検出するため。UARTのエラーは、エコーバックテストで十分に調べているので多分問題ないだろう。と。。
正当には、この手のテストをする専用の回路を作れば良いんだろうけど、乱数を作り込むのが面倒なのでやってない。

*1:読み取り性能 : バスクロック100MHz、1ワードに10クロック。ワード消費は50/8MHz。