Hatena::ブログ(Diary)

月夜見的な技術日記 このページをアンテナに追加 RSSフィード

2009-05-17

メモリ(SRAM)操作のテクニック

SRAMにカメラからの画像を書き込みつつ、ディスプレイ表示用の画像を読みだす場合。

両方ともピクセルクロックは25MHzでSRAMの応答が10ns(W/R)

すると50MHzで1クロック以内に処理が可能だからメモリは50MHzで動作可能。

時系列でみると

 50MHz - WRWRWRWR....

※W:書き込みデータ

※R:読み出しデータ

というタイミングでデータを読み書きしなければカメラ画像を書き込みつつディスプレイ画像を読みだすことができない。

しかし、WriteSignal(OE、WE)の変更が多くなりタイミングが複雑になる。

そこでFIFOを入れる。

 Camera --> FIFO --> Memory

 Disp. <-- FIFO <-- Memory

カメラからの入力データとディスプレイへの出力データは25MHzでFIFOからもれなく処理していく。

しかし、実際のメモリへのアクセスは1ラインで2分割し

 |------R------|------W------| 1Line

とすれば、最大1/2ラインの遅れでWriteSignalの切り替え回数を大幅に減らすことができる。

切り替え回数が少なければハザードも起こりにくい。


ちなみにWriteSignalは50MHzをさらに逓倍した100MHzで生成すれば同期をとりつつ細かい時間遅延を再現できる。

2009-01-23

range と length と subtype

signal の指定は range と length を使うと便利。

信号の宣言

signal s_addr0 : std_logic_vector(17 downto 0);
signal s_addr1 : std_logic_vector(17 downto 0);
signal s_addr2 : std_logic_vector(17 downto 0);

信号の宣言(range)

signal s_addr0 : std_logic_vector(17 downto 0);
signal s_addr1 : std_logic_vector(addr0'range);
signal s_addr2 : std_logic_vector(addr0'range);

こうすると、s_addr0 のバス幅を変えるだけですべてのバス幅が変わる。

アドレスやデータなど幅が統一な場合に使える。

この場合は、addr0'range = 17 downto 0 に変換される。

信号の宣言(subtype)

subtype ADDR_BUS is std_logic_vector(17 downto 0);
signal s_addr0 : ADDR_BUS;
signal s_addr1 : ADDR_BUS;
signal s_addr2 : ADDR_BUS;

C言語で言うところの typedef に相当。

自分の分かりやすい名前で型を定義できる。

一括変更も簡単。


length

バス幅を返す。

使い方は下記のような感じ。

signal s_addr0 : std_logic_vector (17 downto 0);
-----
s_addr0 <= conv_std_logic_vector(count/5 + 128, s_addr0'length);

conv_std_logic_vector(i,l) は第一引数i に integer の数値、

第二引数l に 変換後のバス幅を入れることで 幅l の std_logic_vector型 に

変換をしてくれる。

この場合は s_addr0'length = 18 に変換される。

こうすると、バス幅が変わった時に修正する必要がなくなる。


そんな感じ。

2009-01-19

クロック周りのエラー

ISE10.1より、クロックの配置配線する際に CLOCK_DEDICATED_ROUTE 制約を追加しないとエラーが出る。

クロックかどうかはたぶん論理合成ツールが rising_edgefalling_edge を使っている信号を判別してるんじゃないかと推測。

エラー内容

ERROR:Place:1018 - A clock IOB / clock component pair have been found
 that are not placed at an optimal clock IOB / clock site pair.

いろいろやったところ、どうも process文 にクロックとして使用した場合は

以下のように制約を追加してやる必要がありそう。

設定例(*.ucf):

NET "CAM_PCLK" CLOCK_DEDICATED_ROUTE = FALSE ;

それにしてもエラーが途中で切れて表示されるのをは何とかしてほしい。

せめて、Summary の方だけでも折り返していいから複数行表示とかしてほしい。


参考リンク

http://www.xilinx.com/itp/xilinx10j/books/docs/cgd/cgd.pdf