HDLでRAMの一面からもう一面へコピーする話

その昔のお話。HDLでRAMからデータを読み出して云々していた頃。
あ、そもそもRAMといっても、いろいろ種類がありますが、シンプルにアドレスと値だけここでは取り上げます。
f:id:hideack:20080616213533p:image
どの様な内容だったかというと…。
画像の処理だったか忘れてしまいましたが、RAMが2面あって、そこに次の様なコピーをする処理が必要になった。というとき。
あ、でも、こうやって正方形にできたってことは画像処理だったのかなぁ。
簡単のため、4×4の情報、16アドレスのRAMで考えます。
f:id:hideack:20080616213535p:image
で、コピーをするときにはRAMのアドレスを指定する必要があるので、この場合、コピー元のアドレスは単純に4ビットのカウンタを用意してアドレスに指定してやればよい。
f:id:hideack:20080616213534p:image
問題は、書き出すときのRAMの指定でありまして。

0x0 → 0x4 → 0x8 → 0xc → 0x1 → 0x5 …

てな具合の動きをさせてやらなければならない。
読むアドレスと書くときのアドレスは次の様な関係な訳です。
f:id:hideack:20080616213530p:image
このとき、書き込み先のRAMのアドレスは、例えばソフト書くとき配列の引数の様に考えれば、

int baseram[16];  // 読み込み元RAMのイメージ
int destram[16];  // 書き込み先RAMのイメージ
int address;
for(int i=0; i<16; i++){
address = (i * 4) % 15;
destram[address] = baseram[i];   // コピー
}

といった形で書けるが、これをVHDLで書くときは、単純にこうしてやればよい…。
コピー元のアドレスを作るためのカウンタが、

signal COUNTER : std_logic_vector(3 downto 0);

といった感じで構成されていれば、書き込み先にアドレスをビット連結して次の様にすればよい。

signal WRADRS : std_logic_vector(4 downto 0);
-- 中略
WRADRS = COUNTER(1 downto 0) & COUNTER(3 downto 2);  -- ココ!

図に書くとこの様な感じ。
f:id:hideack:20080616213532p:image
ビットの並びを変えるだけで、書き込み先のアドレスも簡単に構成できる訳です。
初めて教わったときには、目から鱗がボロボロこぼれた記憶がある。

よく考えると、そりゃそうさ。なのだけど。
気づいたり教わったときの感動は忘れない様に。ということで、長いエントリーでした。

(Visited 3 times, 1 visits today)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です