FC2カウンター FPGAの部屋 2006年06月

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

南こうせつのコンサートに行ってきた

minami_kousetsu_060628.jpg

南こうせつのコンサートに奥さんに誘われて行ってきました。つくばのノバホールで今日の午後7時からでした。
会場に着いたら、同様の年配かそれ以上の人でいっぱいでした。ファンの年齢構成がわかりますね。
曲はかぐや姫時代の曲と新しい曲と混ぜたありました。トークも楽しく、楽しく過ごせましたよ。やはり生ギターのストリングスの響きが良いですね。久しぶりに聞いてうれしかったです。昔、ギターを買って”妹よ”を弾けるように練習したのを思い出しました。うまく弾けなかったでしたけど。。。
かぐや姫時代の曲は覚えているので、”妹よ”、”うちのお父さん”、”神田川”などなど。その後で知っているのは”夢一夜”、”夏の少女よ”でした。
またコンサートに行きたいです。今度はゲド戦記のテルーの歌の作曲の谷山弘子のコンサートに行きたいです。昔、大学の頃ですが、谷山弘子のコンサートに10回くらい行きました。

話は変わりますが、Spartan3E Starter KitのDDR SDRAMコントローラもISE8.1iでどうにかなりそうです。それはまた今度。。。
  1. 2006年06月28日 23:16 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan3E Starter KitのDDR SDRAMコントローラについての疑問2

"Spartan3E Starter KitのDDR SDRAMコントローラについての疑問"について調べていると、Spartan3Eのライブラリの説明書にFDDRCPE(ASYNC set/reset)とFDDRRSE(SYNC set/reset)がないことがわかった。
ODDR2を使ってgeneric mapでSYNCとASYNCを切り替えるのだそうだ。さらに入力もIDDR2があるようなのでこれを使うことにした。
ODDR2を使ったソースは以下のように修正した。
IOパッド出力の最後の3ステートバッファはIOBUFとして上位にインスタンスした。(INPUTもケアするため)

    -- Insantiate three-state DDR registers
    WRDATA_DDR_TRI_INST : for i in DDR_DATA_WIDTH-1 downto 0 generate
        WRDATA_DDR_TRI : ODDR2 generic map(
            SRTYPE => "SYNC"
        )port map(
            q => out_tri(i),
            d0 => dqs_reset_2d_dqtri(i/8), -- DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
            d1 => gnd,
            c0 => clk,
            c1 => clkx,
            ce => vcc,
            r => reset,
            s => not_dqs_enable_2d(i/8)
        );
    end generate WRDATA_DDR_TRI_INST;
    
    -- Instantiate Mask DDR registers
    WRDATA_DDR_MASK_INST : for i in DDR_DQS_DM_WIDTH-1 downto 0 generate
        WRDATA_DDR_MASK : ODDR2 generic map(
            SRTYPE => "ASYNC"
        )port map(
            q => ddr_dm(i),
            d0 => wrmask_2d(i),
            d1 => wrmask_3d_half(i),
            c0 => clk,
            c1 => clkx,
            ce => vcc,
            r => reset,
            s => gnd
        );
    end generate WRDATA_DDR_MASK_INST;


これでも最初と同様にエラーが出てしまった。
ためしに"WRDATA_DDR_TRI : ODDR2"のセットsを"s => gnd"に変更して、DQのすべてのDDRレジスタ(ODDR2もIDDR2も)のセット、リセットを同じにしたら"INTERNAL_ERROR"が出て終了してしまった。
しょうがないのでISE8.2が出るまで待ち状態とする。
  1. 2006年06月26日 12:33 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

剣道の試合

kendo_060625.jpg

今日は中学の娘の剣道の試合を応援に行った。
ある中学の体育館で行われたが写真は練習風景である。
試合結果は負けてしまったが、大分上達していたので一安心だ。後は気合、勝負強さが必要な様である。そういうキャラじゃないので仕方ないかもしれないが、勝つためにはそういうのがかけている気がする。
  1. 2006年06月25日 19:58 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan3E Starter KitのDDR SDRAMコントローラについての疑問

Spartan3E Starter KitのDDR SDRAMコントローラがISEでインプリメントできるところまで来たが、どうしてもMAPでエラーが出てしまう。DDR_DQのIO出力はDDRのデータと出力イネーブルを制御するのにDDRレジスタを使用している。そのうちの出力イネーブルを制御するDDRレジスタにエラーが出ているようだ。SET/RESETを統一してもエラーが出てしまう。
DDRtest_1_060624.png

Sprtan3EからVirtex2proにデバイスを変更するとインプリメントできる。
DDRtest_2_060624.png

IOBの出力レジスタの構成もFPGA Editorを見た限りでは同じに見えるのだがどうしてだろうか?
Virtex2proのデータパッド(DQ)のIOBを見てみると、思い通りに実装されている。
DDRtest_3_060624.png

ちなみに入力用DDRレジスタの下側(CLKの立下りで動作するレジスタ)が使われていないのはそっち側のデータを使用していないのでどっかで消されたようである。
もう少し調査が必要のようだ。アンサーで調べてみようと思う。

2006/6/25追記

Spartan3-1000でもやってみたがインプリメントできた。

DDR_DQ(DDR SDRAMのデータDQ)の出力DDRレジスタ関係のソースを次に示す。

    -- Instantiate Output DDR registers
    WRDATA_DDR_OUT_INST : for i in DDR_DATA_WIDTH-1 downto 0 generate
        WRDATA_DDR_OUT : FDDRCPE port map(
            q => ddr_out(i),
            d0 => wrdata_2d(i),
            d1 => wrdata_3d_half(i),
            c0 => clk,
            c1 => clkx,
            ce => dqs_enable_2d(i/8),
            clr => reset,
            pre => gnd
        );
    end generate WRDATA_DDR_OUT_INST;
    
    not_dqs_enable_2d <= not dqs_enable_2d;
    
    -- Insantiate three-state DDR registers
    WRDATA_DDR_TRI_INST : for i in DDR_DATA_WIDTH-1 downto 0 generate
        WRDATA_DDR_TRI : FDDRRSE port map(
            q => out_tri(i),
            d0 => dqs_reset_2d_dqtri(i/8), -- DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
            d1 => gnd,
            c0 => clk,
            c1 => clkx,
            ce => vcc,
            r => reset,
            s => not_dqs_enable_2d(i/8)
        );
    end generate WRDATA_DDR_TRI_INST;
    
    -- inferr the 3-State buffer
    process(out_tri, ddr_out) begin
        for i in DDR_DATA_WIDTH-1 downto 0 loop
            if out_tri(i) = '1' then
                ddr_dq(i) <= 'Z';
            elsif out_tri(i) = '0' then
                ddr_dq(i) <= ddr_out(i);
            end if;
        end loop;
    end process;


上のソースで"-- inferr the 3-State buffer"の部分をBUFTを使用するように以下のように修正したが他のエラーが出てしまった。

    -- inferr the 3-State buffer
    OBUFT_GEN : for i in DDR_DATA_WIDTH-1 downto 0 generate
        OBUFT_INST : OBUFT port map(
            o => ddr_dq(i),
            i => ddr_out(i),
            t => out_tri(i)
        );
    end generate OBUFT_GEN;


Spartan3Eはなぜだめなのだろうか?
Virtex2proやSpartan3と根本的に異なっているのだろうか?
何か情報を持っている方は教えてください。
  1. 2006年06月24日 22:14 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Virtex4のリージョナルバッファ(BUFIO、BUFR)

Virtex4のリージョナルバッファのBUFIO、BUFRをテストしてみようと思う。
リージョナルバッファは部分的な領域のクロックバッファのようなものだ。部分的なクロック領域はVitex2シリーズとは違ってCLB16個(IOB32個分)の高さ、チップの1/2の幅に固定されているそうです。
DDR SDRAMのDQS信号でデータをサンプルする方法2はVirtex2proチップでDQSをクロックとしたSRL16E(ルックアップテーブル)を使用してFIFOを構成してみた。その場合にクロックはローカル配線を使用しているので、場所によっては遅延が増えることが考えられる。注意してクロックの遅延が変わらないところにSRL16Eを配置しなければならないだろう。
これをVirtex4のBUFIO、BUFRでその領域にクロックを供給することにしようとする。それで以前の結果と比較してみる。
まずはソースを下に示す。

-- 8bit LUT FIFO 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- pragma translate off
library UNISIM;
use UNISIM.VComponents.all;
-- pragma translate on

entity lut_fifo is
    port (
        clk: IN std_logic;
        areset : in std_logic; -- async reset
        sreset : in std_logic; -- sync reset
        din: IN std_logic_vector(7 downto 0);
        wr_en: IN std_logic;
        rd_en: IN std_logic;
        dout: OUT std_logic_vector(7 downto 0);
        full: OUT std_logic;
        empty: OUT std_logic);
end lut_fifo;

architecture RTL of lut_fifo is
component SRL16E
    port (
        q : out std_logic;
        a0 : in std_logic;
        a1 : in std_logic;
        a2 : in std_logic;
        a3 : in std_logic;
        ce : in std_logic;
        clk : in std_logic;
        d : in std_logic
    );
END component;
component BUFIO
    port(
        o : out std_ulogic;
        i : in std_ulogic
    );
end component;
component BUFR
    generic(
        BUFR_DIVIDE : string := "BYPASS"
    );
    port(
        o : out std_ulogic;
        ce : in std_ulogic;
        clr : in std_ulogic;
        i : in std_ulogic
    );
end component;
        
signal addr : std_logic_vector(3 downto 0);
signal clk_bufio, clk_bufr : std_logic;
signal logic0, logic1 : std_logic;
begin
    logic0 <= '0';
    logic1 <= '1';
    
    bufio_inst : bufio port map(
        i => clk,
        o => clk_bufio
    );
    
    bufr_inst : bufr port map(
        o => clk_bufr,
        ce => logic1,
        clr => logic0,
        i => clk_bufio
    );
    
    DIST_FIFO_GEN : for i in 0 to 7 generate
        SRL16E_inst : SRL16E port map(
            q => dout(i),
            a0 => addr(0),
            a1 => addr(1),
            a2 => addr(2),
            a3 => addr(3),
            ce => wr_en,
            clk => clk_bufr,
            d => din(i)
        );
    end generate DIST_FIFO_GEN;
    
    empty <= '1' when addr=0 else '0';
    full <= '1' when addr=15 else '0';
    
    process(clk_bufr, areset) begin
        if areset='1' then
            addr <= (others => '0');
        elsif clk_bufr'event and clk_bufr='1' then
            if sreset='1' then
                addr <= (others => '0');
            elsif wr_en='1' and rd_en='0' then
                addr <= addr + 1;
            elsif wr_en='0' and rd_en='1' then
                addr <= addr - 1;
            end if; -- wr_en='1' and rd_en='1'の時はaddrはそのまま
        end if;
    end process;

end RTL;


まずは、SEのProcessesウインドウのUser Constraintsを展開してAssgin Package PinsをダブルクリックしてPACEを起動してピンをアサインしよう。
BUFIO_BUFR_4_060622.png

次にBUFRだけをBUFR_X0Y11にアサインする。

NET "areset"  LOC = "D16"  ;
#INST "bufio_inst" LOC = "BUFIO_X0Y11"  ;
INST "bufr_inst" LOC = "BUFR_X0Y11"  ;
NET "clk"  LOC = "D18"  ;
NET "din<0>"  LOC = "B17"  ;
NET "din<1>"  LOC = "A17"  ;
NET "din<2>"  LOC = "E17"  ;
NET "din<3>"  LOC = "F17"  ;
NET "din<4>"  LOC = "A18"  ;
NET "din<5>"  LOC = "A19"  ;
NET "din<6>"  LOC = "C18"  ;
NET "din<7>"  LOC = "C19"  ;
NET "dout<0>"  LOC = "D19"  ;
NET "dout<1>"  LOC = "F18"  ;
NET "dout<2>"  LOC = "E18"  ;
NET "dout<3>"  LOC = "B19"  ;
NET "dout<4>"  LOC = "A20"  ;
NET "dout<5>"  LOC = "H18"  ;
NET "dout<6>"  LOC = "J19"  ;
NET "dout<7>"  LOC = "B20"  ;
NET "empty"  LOC = "B21"  ;
NET "full"  LOC = "D20"  ;
NET "rd_en"  LOC = "C17"  ;
NET "sreset"  LOC = "H17"  ;
NET "wr_en"  LOC = "G17"  ;


これでインプリメントしてとりあえずFPGA Editorで見てみる。全体の回路を見渡せる位置にして、BUFRの出力ネット(clk_bufr)を赤で表示してみるとクロック専用ラインを使用しているのがわかる。
BUFIO_BUFR_2_060622.png

Virtex2proのものと比べてみよう。こっちのほうはクロックに遅延が入っているが、Virtex4はIDELAYで遅延を入れられるし、データの方を遅延することも出来るので、同様に比較する。下のがVirtex2proの時のクロック配線だ。
ddr_receive_2_060418.png

次に例によってTiming Analyzerで遅延を見てみよう。クロックのIOパッドからの遅延とデータのIOパッドからの遅延を見てみよう。
BUFIO_BUFR_1_060622.png

クロックのほうがバッファが2つ入っている分遅れている。うまく調整すればDQS(クロック)でデータを取れるだろう。Virtex4はデータをIDELAYで遅らせてFPGAの内部クロックでサンプルしても良いが、DQS(クロック)でデータをサンプルする方法でも安定しているようだ。
これをやっていて納得いかないことがある。BUFIOとBUFRを近くに配置しようとしていたが、配置するとエラーが出てしまう。UCFの#コメントアウトした部分がそうだ。(INST "bufio_inst" LOC = "BUFIO_X0Y11" ;)
BUFIO,BUFRの部分をFPGA Editorで見てみよう。
BUFIO_BUFR_3_060622.png

XC4LX25-11FF676の現在使用中のリージョンのリージョナルクロックのクロック入力はC18,C19とD18,D19だが、FPGA Editorで良く見てみるとC18,C19はX0Y11のBUFIO、D18,D19はX0Y10のBUFIOに行く配線しかないようだ。
やはりVirtex4のリージョナルクロックはちゃんと使えれば使い勝手が良いようだ。
  1. 2006年06月22日 20:32 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

これからの予定

これからの予定を決めようと思っている。
下にやりたいことを列挙すると。
1.Virtex4のお勉強
  1.1 リージョナルクロックリソース
  1.2 DCM、PMCD
  1.3 FIFO(特にFWFTモードのテスト、これが使えればうれしい)
  1.4 SERDES
2.Spartan3E Starter KitでDDR SDRAMを動作させたい。
 動的位相シフトでは制限があってうまく行かない可能性があるので、配線遅延やセットアップ時間を換算してIOB内の遅延素子を使ってデータを受けられるかどうかやってみたい。
3.VGAコントローラ
 DDR SDRAMが読み書きできるようになったら、VGAコントローラを作って、PicoBlazeでVGAに出力してみたい。
 DDR SDRAMは100MHz動作でVGAの1ドットクロックは40nsだから性能の1/8を使うことになる。実際はもっと帯域が必要だが問題ないだろう。

なかなか暇がないし、また余り大きい回路を作っていると、いやになってしまうのが難点だ。ModelSimを見るのがいや。。。という状況になってしまう。
平日はVirtex4のお勉強をして、休日にDDR SDRAMをやろうかなと思っている。気まぐれなのでどうなるかわからないが。。。

お仕事のほうも基板が出来てきたら電源を入れてテストとなるので忙しくなる。小さい基板のFPGAは大体OKだが、大きい基板のシミュレーションがまだうまく行っていない。32ビットバスから64ビットバスに変わったので変更したが、エンディアンを間違えてしまった。もともとホストPCがリトル・エンディアンで基板のプロセッサがビック・エンディアンなので間違えやすいのである。
  1. 2006年06月21日 12:29 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:7

息子の怪我

ゴールデンウィークに腰に怪我をした息子がまだ松葉杖が必要な状況だ。
下の娘が息子をおんぶした時に後ろに倒れてコンピュータ用椅子の足とがった部分に腰を強打してしまった。骨は折れていないそうだが、まだ歩けない。何しろまだ打った腰をさすっても痛いそうだ。
レントゲンはもちろんCT,MRIもやったが血腫が出来ているということで骨には異常はないそうである。
今日は小学校のキックベース大会が雨で流れて、体育館でどっちボール大会になったのだが、息子は松葉杖のため見学だった。
これでは、どこにも行けない。足の骨折の時よりもたちが悪いような気がする。
去年は足の骨折で運動会出来なかったが、今年は腰で運動会が出来ないかも。早く直ってくれることを祈る。
お灸とかもやってみたがだめなようだ。鍼もいいのかしら?
なるべく早く直ってほしい。
  1. 2006年06月18日 21:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:3

ModelSimでの全体シミュレーション

カテゴリのプリント基板の作成過程でいろいろ書いていた基板がそろそろできるようになったので、(といってもまだ部品が足りないものがある)シミュレーションに力を入れている。
Xilinx 社製FPGA を搭載したPCI ボードのシミュレーション2でもシミュレーションの方法を紹介したが、これプラス、イーサネットのスイッチハブみたいなのをつないでスイッチハブに7台つないだ状態でシミュレーションをしている。結構重いがいやになるほどシミュレーション時間がかかるわけでもない。(実はちょっとしたコツがあった。たいしたことではないと思うが。。。)
金曜日にバグがあったので、今日も少しデバックしていたが大体、金曜日のバグの内容はわかって修正した。
ModelSimのwaveウインドウを見ながらデバックしているが、さすがに2000本くらいsignalを入れてあるので、目的のsignalを探すのが大変だ。
まだまだ、確認しなければいけないところもあるのだ。
一部を紹介しようと思う。
M3_sim_060617.png

ピンクの枠がSDRAMの信号だ。黄色の枠がPowerPC603バスの信号。
最初の肌色(オレンジ)の矢印でPowerPC603バスから"12345678"というデータをアドレス"00000000"のSDRAMに書き込む。その部分が肌色(オレンジ)の箱の部分。
次の紫の箱がPowerPC603バスからの要求によってさっき書き込んだデータをSDRAMから読み出す部分、紫の矢印の部分でプロセッサに出力している。バスクロックは66MHz。

もう少し、PowerPC603バスについて説明しておくと、603バスはアドレス転送とデータ転送が独立で、順番は入れ替えることができない。信号は大体アクティブローである。
アドレス転送はPowerPCがアドレスを確定してTSをアサートする。FPGA側はaackを返す。これは2つまでキューに入れることができる。その際に属性を現すTSIZ,TT,TBSTも同時にドライブされる。TSIZの4はWORDアクセス、TTの02は書き込み、0Aは読み出しを表し、その際にTBSTが1なのでバーストはしない。(TSIZで決まってはいるのだが)
その後、DBGをアサートされると、データ転送が始まる。書き込みの場合はdata_busにデータを出力してTAがアサートされるのを待つ。読み出しの場合はTAのアサートされたクロックの立ち上がりでデータをサンプルする。
  1. 2006年06月17日 19:35 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Virtex4のIDELAY(VARIABLEモード)

Virtex4のIDELAY(VARIABLEモード)についてお勉強した。
今度はCEとINCがあるので外部ポートから入力することにした。CEが1でINCが1の時に遅延が増えて、CEが1でINCが0の時に遅延が減る。2クロックに1回増減するようだ。それを確かめてみよう。
まずはインプリメントして例によってFPGA Editorで見てみる。
Virtex4_IDELAY_V_1_060615.png

IOBDELAY_TYPEがVAERIABLEになっているのがわかる。
Timing Analyzerで見てみるとFIXEDの時と同様である。
Virtex4_IDELAY_V_3_060615.png

次にModelSimで論理シミュレーションをしてみた。テストベンチは上に示したが、CEとINCは1に固定してあるので、2クロックに一回遅延が増えている。
Virtex4_IDELAY_V_4_060615.png

下から5番目のi(入力)と4番目のo(出力)の位相がずれていくのがわかると思う。一番下はdelayの値で4725psから0psになるようだ。他は75psずつ増えている。これで位相シフトすればDDRデータを受けるのが簡単そうだ。FPGAのクロックに合うし。。。だんだんVirtex4ボードが欲しくなって来た。

そういえば1つVirtex4について気づいたことがある。それはチップのIOパッドの位置だ。V2proまではチップの4辺にIOパッドが散らばっていたが、V4では両脇と真ん中にIOパッドが配置されているようだ。V2proではチップの横になるべくデータバスを入れようとか考えていたが、その制限はなすことができるようだ。とはいっても関連する信号を近い位置に配置したほうが良いのは当然だろうけど。下にFPGA Editorで見たチップの真ん中に位置するIOパッドを使っている例と、フロアプランナーの一部を示す。チップの上にIOパッドがない。
Virtex4_IDELAY_V_2_060615.png

Virtex4_IDELAY_V_5_060615.png


最後にソースを下に示す。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- pragma translate off
library UNISIM;
use UNISIM.VComponents.all;
--pragma translate on


entity IDELAY_VARIABLE_TEST is
    Port (
        clk : in std_logic;
        indata : in  std_logic_vector(7 downto 0);
        idelay_ce : in std_logic;
        idelay_inc : in std_logic;
        q1 : out  std_logic_vector(7 downto 0);
        q2 : out  std_logic_vector(7 downto 0);
        rdy : out std_logic
    );
end IDELAY_VARIABLE_TEST;

architecture RTL of IDELAY_VARIABLE_TEST is
component IDELAY
  generic(
      IOBDELAY_TYPE  : string := "FIXED";
      IOBDELAY_VALUE : integer := 0
  );
  port(
      O      : out std_ulogic;

      C      : in  std_ulogic;
      CE     : in  std_ulogic;
      I      : in  std_ulogic;
      INC    : in  std_ulogic;
      RST    : in  std_ulogic
      );
end component;
component IDELAYCTRL
  port(
      RDY    : out std_ulogic;

      REFCLK    : in  std_ulogic;
      RST    : in  std_ulogic
  );
end component;
component IDDR
    generic(
        DDR_CLK_EDGE : string := "OPPOSITE_EDGE";
        INIT_Q1 : bit := '0';
        INIT_Q2 : bit := '0';
        SRTYPE : string := "SYNC"
    );
    port(
        Q1 : out std_ulogic;
        Q2 : out std_ulogic;
        C : in std_ulogic;
        CE : in std_ulogic;
        D : in std_ulogic;
        R : in std_ulogic;
        S : in std_ulogic
    );
end component;
    COMPONENT dcm133
    PORT(
        CLKIN_IN : IN std_logic;          
        CLKIN_IBUFG_OUT : OUT std_logic;
        CLK0_OUT : OUT std_logic;
        LOCKED_OUT : OUT std_logic
        );
    END COMPONENT;

signal logic0, logic1 : std_logic;
signal iddr_reset : std_logic;
signal locked_out, clk_out : std_logic;
signal delay_out : std_logic_vector(7 downto 0);
begin
    logic0 <= '0';
    logic1 <= '1';
    iddr_reset <= not locked_out;
    
    dcm133_inst : dcm133 port map(
        clkin_in => clk,
        clkin_ibufg_out => open,
        clk0_out => clk_out,
        locked_out => locked_out
    );
    
    IDDR_GEN : for i in 7 downto 0 generate
        IDELAY_inst : IDELAY 
        generic map(
            IOBDELAY_TYPE => "VARIABLE",
            IOBDELAY_VALUE => 0
        )
        port map(
            o => delay_out(i),
            i => indata(i),
            c => clk_out,
            ce => idelay_ce,
            inc => idelay_inc,
            rst => iddr_reset
        );
        
        IDDR_inst : IDDR generic map(
            DDR_CLK_EDGE => "SAME_EDGE_PIPELINED"
        )port map(
            Q1 => q1(i),
            Q2 => q2(i),
            C => clk_out,
            CE => logic1,
            D => delay_out(i),
            R => iddr_reset,
            S => logic0
        );
    end generate IDDR_GEN;
    
    IDELAYCTRL_inst : IDELAYCTRL port map(
        rdy => rdy,
        refclk => clk_out,
        rst => iddr_reset
    );

end RTL;


ついでにテストベンチも。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_TEXTIO.ALL;
USE STD.TEXTIO.ALL;

ENTITY IDELAY_VARIABLE_TEST_tb IS
END IDELAY_VARIABLE_TEST_tb;

ARCHITECTURE testbench_arch OF IDELAY_VARIABLE_TEST_tb IS

    COMPONENT IDELAY_VARIABLE_TEST
        PORT (
            clk : In std_logic;
            indata : In std_logic_vector(7 downto 0);
            idelay_ce : in std_logic;
            idelay_inc : in std_logic;
            q1 : Out std_logic_vector(7 downto 0);
            q2 : Out std_logic_vector(7 downto 0)
        );
    END COMPONENT;

    SIGNAL clk : std_logic := '0';
    SIGNAL indata : std_logic_vector(7 downto 0) := "00000000";
    SIGNAL q1 : std_logic_vector(7 downto 0) := "00000000";
    SIGNAL q2 : std_logic_vector(7 downto 0) := "00000000";
    signal idelay_ce : std_logic := '0';
    signal idelay_inc : std_logic := '0';

    constant PERIOD : time := 10 ns;
    constant DUTY_CYCLE : real := 0.5;
    constant OFFSET : time := 0 ns;

    BEGIN
        UUT : IDELAY_VARIABLE_TEST
        PORT MAP (
            clk => clk,
            indata => indata,
            idelay_ce => idelay_ce,
            idelay_inc => idelay_inc,
            q1 => q1,
            q2 => q2
        );

        PROCESS    -- clock process for clk
        BEGIN
            WAIT for OFFSET;
            CLOCK_LOOP : LOOP
                clk <= '0';
                WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
                clk <= '1';
                WAIT FOR (PERIOD * DUTY_CYCLE);
            END LOOP CLOCK_LOOP;
        END PROCESS;

        PROCESS begin
               wait for (PERIOD/4);
               DATA_LOOP : LOOP
                   wait for (PERIOD/2);
                   indata <= indata + 1;
                end loop;            
        END PROCESS;
        
        idelay_ce <= '1';
        idelay_inc <= '1';

    END testbench_arch;

  1. 2006年06月16日 19:10 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

FPGAのコンフィグ用FLASH ROMへの書き込みプログラム

うちらのいまのFPGAの搭載されたPCIボードは、FPGAのコンフィグデータを汎用FLASH ROMに入れてあり、電源ON時にCPLDで汎用FLASH ROMを制御してコンフィグデータをFPGAにロードしてからCPLDを切り離すようになっている。その後はFPGAにFLASH ROMがつながっているのでPCIからコンフィグデータをロードできるようになっている。(メモリマップされている)
そのPCIボードの新しいバージョンアップ版PCIボードを作っているが、汎用FLASH ROMを変更してある。
今日、CQ出版社、村上氏の2006年5月6日の日記を読んでいたら、ブートセクタが違っていてFLASH ROMへの書き込みがおかしくなったという記事を読んだ。
http://www.cqpub.co.jp/interface/editors/murakami/m0605.htm
まてよ。うちのボードも同じなのでは? PCI越しの書き込みソフトを書き換えないとだめだということがわかった。
良かった早いうちに気がついて、A氏に変更を依頼した。
  1. 2006年06月15日 22:56 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

コアジェネレータIP使用時のVHDLのModelSimシミュレーション

IDELAYのVARIABLEモードの前に、DCMをコアジェネレータで生成しときに論理シミュレーションをしようとしてはまってしまったので、そのことを書こうと思う。
IDELAYのVARIABLEモードをシミュレーションするためにISEにプロジェクトをつくり、シミュレーションもModelSimのVHDLを指定してある。下にプロジェクト プロパティを示す。
Sim_error_1_060615.png

DCMを使うためにコアジェネレータでDCMを追加した。(dcm133)
Behavioral SimulationをSource for:から選んでSimulate Behavioral ModelをダブルクリックしてModelSimでシミュレーションしたところ下のエラーが出た。
Sim_error_2_060615.png

.fdoの9行目がだめなようだ。.fdoを下に示す。

## NOTE: Do not edit this file.
## Autogenerated by ProjNav (creatfdo.tcl) on Thu Jun 15 18:34:07 東京 (標準時) 2006
##
vlib work
vlog "dcm133.v"
vcom -explicit -93 "IDELAY_VARIABLE_TEST.vhd"
vcom -explicit -93 "IDELAY_VARIABLE_TEST_tb.vhd"
vlog "C:/HDL/Xilinx/verilog/src/glbl.v"
vsim -t 1ps -L xilinxcorelib_ver -L unisims_ver -lib work IDELAY_VARIABLE_TEST_tb glbl
do {IDELAY_VARIABLE_TEST_tb.udo}
view wave
add wave *
add wave /glbl/GSR
view structure
view signals
run 1000ns


vsimの行を見るとxilinxcorelib_verとかVerilogのライブラリが参照されている。なぜだか調べてみるとSource for:でSynthesis/Implementationを選んで、dcm133のIPを選んだ。ProcessesペインのView HDL Sourceのプロパティを表示するとVerilogだった。
Sim_error_3_060615.png

これをVHDLに変更した。
Sim_error_4_060615.png

これでBehavioral SimulationをSource for:から選んでSimulate Behavioral ModelをダブルクリックしてModelSimでシミュレーションしたところOKとなった。
.fdoを下に示す。

## NOTE: Do not edit this file.
## Autogenerated by ProjNav (creatfdo.tcl) on Thu Jun 15 19:32:23 東京 (標準時) 2006
##
vlib work
vcom -explicit -93 "dcm133.vhd"
vcom -explicit -93 "IDELAY_VARIABLE_TEST.vhd"
vcom -explicit -93 "IDELAY_VARIABLE_TEST_tb.vhd"
vsim -t 1ps -lib work IDELAY_VARIABLE_TEST_tb
do {IDELAY_VARIABLE_TEST_tb.udo}
view wave
add wave *
view structure
view signals
run 1000ns


ちゃんとVHDLのDOファイルになった。
コアジェネレータで生成したIPはディフォルトでVerilogになるのか? いつもプロパティをVHDLにしなければVHDLでシミュレーションできないようである。
ディフォルトを変更できるオプションが見つからない。
  1. 2006年06月15日 18:58 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Virtex4のIDELAY(FIXEDモード)

次はVirtex4のIDELAYのお勉強をしようとおもう。IDELAYはILOGICブロック(IOブロック)のプログラマブル遅延エレメントで0から63までの遅延タップがある。
IDELAYのゼロホールド時間遅延モード(DEFAULTモード)は遅延が0なので飛ばして、固定遅延モード(FIXEDモード)をやってみようと思う。
DDR SDRAMに使えるようにIDELAYをインスタンスしてからIDDRをインスタンスする。クロックはコアジェネレータでDCMをインスタンスして使用している。IDELAYを固定遅延モード(FIXEDモード)で使用しているので、IDELAYCTRLをインスタンスしている。全ソースを下に示す。(遅延タップは31)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.

-- pragma translate off
library UNISIM;
use UNISIM.VComponents.all;
--pragma translate on

entity idelay_fixed_test is
    Port (
        clk : in std_logic;
        indata : in  std_logic_vector(7 downto 0);
        q1 : out  std_logic_vector(7 downto 0);
        q2 : out  std_logic_vector(7 downto 0);
        rdy : out std_logic
    );
end idelay_fixed_test;

architecture RTL of idelay_fixed_test is
component IDELAY
  generic(
      IOBDELAY_TYPE  : string := "FIXED";
      IOBDELAY_VALUE : integer := 0
  );
  port(
      O      : out std_ulogic;

      C      : in  std_ulogic;
      CE     : in  std_ulogic;
      I      : in  std_ulogic;
      INC    : in  std_ulogic;
      RST    : in  std_ulogic
      );
end component;
component IDELAYCTRL
  port(
      RDY    : out std_ulogic;

      REFCLK    : in  std_ulogic;
      RST    : in  std_ulogic
  );
end component;
component IDDR
    generic(
        DDR_CLK_EDGE : string := "OPPOSITE_EDGE";
        INIT_Q1 : bit := '0';
        INIT_Q2 : bit := '0';
        SRTYPE : string := "SYNC"
    );
    port(
        Q1 : out std_ulogic;
        Q2 : out std_ulogic;
        C : in std_ulogic;
        CE : in std_ulogic;
        D : in std_ulogic;
        R : in std_ulogic;
        S : in std_ulogic
    );
end component;
    COMPONENT dcm133
    PORT(
        CLKIN_IN : IN std_logic;          
        CLKIN_IBUFG_OUT : OUT std_logic;
        CLK0_OUT : OUT std_logic;
        LOCKED_OUT : OUT std_logic
        );
    END COMPONENT;

signal logic0, logic1 : std_logic;
signal iddr_reset : std_logic;
signal locked_out, clk_out : std_logic;
signal delay_out : std_logic_vector(7 downto 0);
begin
    logic0 <= '0';
    logic1 <= '1';
    iddr_reset <= not locked_out;
    
    dcm133_inst : dcm133 port map(
        clkin_in => clk,
        clkin_ibufg_out => open,
        clk0_out => clk_out,
        locked_out => locked_out
    );
    
    IDDR_GEN : for i in 7 downto 0 generate
        IDELAY_inst : IDELAY 
        generic map(
            IOBDELAY_TYPE => "FIXED",
            IOBDELAY_VALUE => 0
        )
        port map(
            o => delay_out(i),
            i => indata(i),
            c => logic0,
            ce => logic0,
            inc => logic0,
            rst => logic0
        );
        
        IDDR_inst : IDDR generic map(
            DDR_CLK_EDGE => "SAME_EDGE_PIPELINED"
        )port map(
            Q1 => q1(i),
            Q2 => q2(i),
            C => clk_out,
            CE => logic1,
            D => delay_out(i),
            R => iddr_reset,
            S => logic0
        );
    end generate IDDR_GEN;
    
    IDELAYCTRL_inst : IDELAYCTRL port map(
        rdy => rdy,
        refclk => clk_out,
        rst => iddr_reset
    );

end RTL;


どのようにILOGICがインスタンスされているか見てみよう。
FPGA Editorを起動してみてみる。
Virtex4_IDELAY_1_060612.png

黄色の矢印がIDELAYだ。IDDRをテストした時よりもこれが増えている。IOBDELAY_VALUE => 31というのがこの図からもわかる。
次にTiming AnalyzerでIDELAYの遅延を見てみよう。
Virtex4_IDELAY_VAL31_060612.png

ピンクのアンダーラインを引いたところがIDELAYの遅延だ。3.042ns遅延が挿入されている。
IOBDELAY_VALUE => 30にしてインプリメントし、同様にTiming AnalyzerでIDELAYの遅延を見てみる。
Virtex4_IDELAY_VAL30_060612.png

IDELAYの遅延は2.967nsで、先ほどの3.042nsと比べてみると0.075ns違っている。
試しにIOBDELAY_VALUE => 0にしてインプリメントして、同様にTiming AnalyzerでIDELAYの遅延を見てみた。
Virtex4_IDELAY_VAL0_060612.png

IDELAYの遅延は0.717nsだ。
IOBDELAY_VALUE => 30の遅延時間からIOBDELAY_VALUE => 0の遅延時間を引いて30で割ってみると、(2.967-0.717)/30=0.075(ns)。
Virtex4はSpartan3Eの遅延と違って値が1違うときっちり75ps違うようである。
これならば遅延素子として使いやすい。

ちなみにVirtex4ユーザーズガイドの321ページあたりにVHDLのインスタンスの書き方が載っている。そこではIDELAYプリミティブのCとRSTポートにクロックとリセットを入れる様に書いてある。その通りに書いたところなぜかMAPにERRORでけられた。ERRORメッセージを見たところCとRSTポートはGNDにしなければだめなようだ。ユーザーズガイドとISEが合わなくなっているようだ。今回は両方ともlogic0を入れてMAPを通した。
ユーザーズガイドの最新英語版をみても同じだったので、まだ直っていないようだ。早く直してもらいたいものだ。
  1. 2006年06月12日 23:00 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

ピアノのグレードテスト

今日は一番下の娘のピアノのグレードテストがあったので、土浦に行ってきた。2分くらいのテストのために往復1時間30分くらいかかけて車で行ってきた。
曲目は海の様子をフィーリングで引く題目とちょうちょだった。
まあまあに弾けたようだ。

お母さんは、お姉ちゃんの剣道の初段審査に行っている。受かれば7千円だっけかな? こういうことにもいろいろお金がかかる。

初段に受かったようだ。中学校の朝礼で表彰されるようだ。それが、いやだといっている。
  1. 2006年06月11日 11:36 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

DDR SDRAMコントローラ回路の途中経過

DDR SDRAMコントローラ回路は、以前Virtex2で作ってあった。
東京エレクトロンデバイスのDVIボードで83MHzではあるが、DDR SDRAMコントローラとして動作していたので、Virtex2では動作すると思われるのだが。。。
使っていたプリミティブがSpartan3Eではないものがあった。RAM64X1Dだ。これはVirtex2からしかないようだ。
Spartan3EにはRAM32X1Dしかないようなので変更した。
でもまだ。MAPで下のエラーを出してとまってしまう。
ERROR:MapLib:662 - Problem netlisting input design. Exiting...

ちょっとSpartan3Eに変換仕切れていないようだ。仕事でもModelSimやISEを使用して修正中なので、画面を家でも見るが飽きてきた。(混同してしまうし。。。)一応、ペンディングにしてVirtex4の勉強をすることにする。

2006/6/10
もう一度ライブラリガイドを見直してみたら、Sprtan3EにはRAM32X1Dもない様なのでRAM16X1Dに変更した。
これで大丈夫とインプリしたら、またMAPで”ERROR:LIT:421 - DCM symbol”で停止。調べてみたらSpartan3EではDCMの可変位相シフトが変更になっているそうだ。
http://www.xilinx.co.jp/xlnx/xil_ans_display.jsp?iLanguageID=2&iCountryID=2&getPagePath=23004
http://www.xilinx.co.jp/xlnx/xil_ans_display.jsp?iLanguageID=2&iCountryID=2&getPagePath=22414
上のアンサーによると、周波数は100MHzで周期は10nsなので、
MAX_STEPS = 20*(10-3) = 140ステップ。
FINE_SHIFT_RANGE_MIN = ±(140*20ps) = ±(2800ps) = ±(2.8ns)
FINE_SHIFT_RANGE_MAX = ±(140*40ps) = ±(5600ps) = ±(5.6ns)
となる。とてもMIN値の2.8nsでは可変シフト量が足りないので、だめである。±5nsは欲しい。MAX値ならば足りているが、このように100%の差があるということは遅延の誤差が100%あるということなのだろうか? 誤差が大きすぎないか?
とにかくMIN値では可変シフト量が足りない。
更に、アンサーにあるように動作周波数が低いほうがシフト量が多いとは、どのような遅延素子なのだろうか? ディレイラインではない?
ともかく、可変位相シフトでDQSの値を調べて、よく受かる位相シフト値に固定する方法は、動作周波数100MHzのSpartan3Eでは使えないようだ。

#やはり、チップやISEのバージョンを変えるといろいろトラップが仕掛けられているかも知れないという例だろう。
  1. 2006年06月10日 15:44 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Virtex4の入力用DDRレジスタ(IDDR)3

今度はIDDRをSAME_EDGE_PIPELINEDモードにしてみる。

IDDR_GEN : for i in 7 downto 0 generate
IDDR_inst : IDDR generic map(
DDR_CLK_EDGE => "SAME_EDGE_PIPELINED"
)port map(
Q1 => q1(i),
Q2 => q2(i),
C => clk_out,
CE => logic1,
D => indata(i),
R => iddr_reset,
S => logic0
);
end generate IDDR_GEN;


インプリメントしてFPGA Editorで見てみると、SAME_EDGEモードよりピンク矢印のレジスタが付加されている。
Virtex4_IDDR_8_060609.png

Timing AnalyzerでAnalyzeメニューからAgainst Auto Generated Design Constrains...で見てみると、SAME_EDGEモードと同様にセットアップ時間は同じだった。やはり、ピリオド制約は解析数が0で効いていなかった。
次にDDRのデータを入れて論理シミュレーションで確かめてみた。今度はSAME_EDGEモードと比べてq1が1クロック遅れているので、クロックの立ち上がりのデータと立下りのデータがそろっている。
Virtex4_IDDR_9_060609.png

これだと、DDRでサンプルしたクロックが異なるデータを自動的にそろえてくれるので便利だ。今までスライスのFFかシフトレジスタで受けなくてはならなかったから。。。
  1. 2006年06月10日 09:25 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

Virtex4の入力用DDRレジスタ(IDDR)2

今度はIDDRをSAME_EDGEモードにしてみる。
IOB内のレジスタがカスケードされるのでConstraint Editorでタイミング制約を入れてみる。

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;


VHDLファイルを書き換えてSAME_EDGEモードにする。

IDDR_GEN : for i in 7 downto 0 generate
IDDR_inst : IDDR generic map(
DDR_CLK_EDGE => "SAME_EDGE"
)port map(
Q1 => q1(i),
Q2 => q2(i),
C => clk_out,
CE => logic1,
D => indata(i),
R => iddr_reset,
S => logic0
);
end generate IDDR_GEN;


インプリメントしてFPGA Editorで見てみると、ピンク矢印のレジスタが付加されている。
Virtex4_IDDR_6_060609.png

Timing AnalyzerでAnalyzeメニューからAgainst Auto Generated Design Constrains...で見てみると、セットアップ時間は同じだった。ピリオド制約は解析数が0で効いていなかった。IOB内のカスケードされたレジスタには制約は効かないようだ。データシートで規定されているのだろう。
次にDDRのデータを入れて論理シミュレーションで確かめてみた。q1とq2が同じタイミングで出力されているが、q1が1Cを出力している時はq2は以前の1Bを出力している。
Virtex4_IDDR_7_060609.png

  1. 2006年06月09日 19:28 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

Virtex4の入力用DDRレジスタ(IDDR)1

Virtex4のお勉強をするに当たって入力用DDRレジスタ(IDDR)からやってみたいと思う。Virtex4の内のxc4vlx25-11FF676を使用する。(Virtex4の基板は持っていないので実際には確かめられない)
まずはIDDRをみると、3つのモードがあるようだ。そのうちのOPPOSITE_EDGEモードからやってみようと思う。これはVirtex2の入力用DDRと同一のモードだ。
8つのOPPOSITE_EDGEモードのIDDRをインスタンスして動作を見てみることにする。
クロックはDCMを通して供給する。


entity V4_IDDR_test is
Port ( clk : in STD_LOGIC;
indata : in std_logic_vector(7 downto 0);
q1 : out std_logic_vector(7 downto 0);
q2 : out std_logic_vector(7 downto 0));
end V4_IDDR_test;

.....

IDDR_GEN : for i in 7 downto 0 generate
IDDR_inst : IDDR generic map(
DDR_CLK_EDGE => "OPPOSITE_EDGE"
)port map(
Q1 => q1(i),
Q2 => q2(i),
C => clk_out,
CE => logic1,
D => indata(i),
R => iddr_reset,
S => logic0
);
end generate IDDR_GEN;


これをインプリメントしてFPGA Editorでindataパッドを見てみたのが下の図だ。Virtex2やVirtex2proと比べてIOBの中に入出力用DDRレジスタが入っていないで別になっているようだ。
(下の図はindataを1つしかインスタンスしていない時にキャプチャしたものである)
Virtex4_IDDR_1_060608.png

図1 indataのIOパッド付近の様子

図1で青いところが入力用のDDRレジスタが入っている箱である。中をダブルクリックして内部がどうなっているかを見てみる。
Virtex4_IDDR_2_060608.png

図2 入力用DDRレジスタ

図2を見ると上の2つのD-FFしか使用していない。Virtex2と同じだ。次に図1で赤い箱はIO標準だけを設定できるところのようだ。LVCMOS,LVTTL,LVDS,SSTL2などだ。
Virtex4_IDDR_3_060608.png

図3 IO標準の設定

ためしにDDRのデータを入れて論理シミュレーションで確かめてみると、図4の用にVirtex2と同様の波形になった。
Virtex4_IDDR_wave_060608.png

図4 OPPOSITE_EDGEモードのIDDRでのシミュレーション波形

まったくUCFを設定せずにISEツールにお任せでインプリメントした。Timing AnalyzerでAnalyzeメニューからAgainst Auto Generated Design Constrains...で見てみると、セットアップ時間は1.395ns、クロックからの出力時間は5.040nsのようだ。
下にセットアップ時間のTiming Analyzer結果を示す。
Virtex4_IDDR_4_060608.png

図5 セットアップ時間のTiming Analyzer結果

今度は比較するためにISEのBack-annotate Pin Locationsをダブルクリックして、今出来たインプリメントのIOピンのロケーションをUCFファイルにバックアノテーションした。出来たUCFファイルは下のようになる。

#PINLOCK_BEGIN

NET "indata<1>" LOC = "C19";
NET "indata<2>" LOC = "B19";
NET "indata<3>" LOC = "F18";
NET "q1<0>" LOC = "B20";
NET "indata<4>" LOC = "A19";
NET "q1<1>" LOC = "C18";
NET "indata<5>" LOC = "B17";
NET "q1<2>" LOC = "A20";
NET "indata<6>" LOC = "E20";
NET "q1<3>" LOC = "E18";
NET "indata<7>" LOC = "K18";
NET "q2<0>" LOC = "J19";
NET "q1<4>" LOC = "A18";
NET "q2<1>" LOC = "D19";
NET "q1<5>" LOC = "F17";
NET "q2<2>" LOC = "H18";
NET "q1<6>" LOC = "F20";
NET "q2<3>" LOC = "D18";
NET "q1<7>" LOC = "L19";
NET "q2<4>" LOC = "E17";
NET "q2<5>" LOC = "A17";
NET "q2<6>" LOC = "G20";
NET "q2<7>" LOC = "F22";
NET "clk" LOC = "AA14";
NET "indata<0>" LOC = "B21";
#PINLOCK_END


となった。
次は新たに増えたSAME_EDGEモードを試してみようと思う。
  1. 2006年06月08日 22:01 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

ダ・ヴィンチ・コードの映画を見てきた

今日は奥さんとダ・ヴィンチ・コードの映画を見てきた。
行く前にブログで評判を見ていったが、あまりいい評判は無かった。
でも、私は結構サスペンスとしては面白いのではないかと思った。敵がいろいろ出て来て、楽しめたと思う。
あまり書くとネタばれになると思うので、このくらいにする。
後は、ゲド戦記が見たい。
  1. 2006年06月07日 21:24 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

庭の花

庭の花の写真をとってみました。
最初はブラックベリーの花です。
hana_1_060604.jpg

次はゆりです。
hana_2_060604.jpg

次は何でしょう? うちの奥さんに聞いてみます。
hana_3_060604.jpg

次は矢車草です。
hana_4_060604.jpg

次はパンジーです。
hana_5_060604.jpg

いまはいろいろな花が咲いていますね。
ラズベリーは花が落ちたのかな?今年も結構食べられそうです。ブラックベリーもたくさん花が咲いているので、今年はジャムにできるでしょう?
  1. 2006年06月04日 19:14 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ISEでインプリメントの時に便利なフリーソフト

自分のメールやネットを見ているパソコンでISEを起動してインプリメントしていると、メールソフトやFirefoxの反応がとても遅くなって困っていた。
他のISE専用パソコンを用意できれば良いのだがそうも行かない。
そういうときに使えるフリーソフトを見つけた。
CPU使用率が高いプロセスの優先度を自動的に下げられる常駐型ソフト「Process Tamer」で窓の杜に記事がある。
これを使うとISEの優先順位を自動的に下げてくれるので、他のプロセスの反応も改善した。その代わりISEのインプリメントは長くかかるだろうが、それよりはメールソフトやFirefoxの反応が良いほうがうれしい。
ISEのインプリは数時間かかる場合もあるので、そのうちに終わっていれば良い。
ウィルスチェックもこれがあれば、バックグランドでやっていても大丈夫だった。多少は影響はあるが、よっぽどましである。
私はバルーンメッセージが邪魔なので、全部オフにしている。
  1. 2006年06月04日 06:12 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Spartan3E Starter KitでのDDR SDRAMコントローラのテスト

Spartan3E Starter KitでDDR SDRAMコントローラを作成中だ。
インプリメントファイルのトップはDDRtest.vhdで下のようなentiyだ。

entity DDRtest is
port(
clk : in std_logic;
reset : in std_logic;
lcd_d : inout std_logic_vector(7 downto 4);
lcd_rs : out std_logic;
lcd_rw : out std_logic;
lcd_e : out std_logic;
sf_ce0 : out std_logic;
rot_a : in std_logic;
rot_b : in std_logic;
rot_center : in std_logic;
btn_east : in std_logic; -- データ書き込み用
btn_west : in std_logic; -- データ読み出し用

sd_a : out std_logic_vector(12 downto 0);
sd_dq : inout std_logic_vector(15 downto 0);
sd_ba : out std_logic_vector(1 downto 0);
sd_ras : out std_logic;
sd_cas : out std_logic;
sd_we : out std_logic;
sd_udm : out std_logic;
sd_ldm : out std_logic;
sd_udqs : inout std_logic;
sd_ldqs : inout std_logic;
sd_cs : out std_logic;
sd_cke : out std_logic;
sd_ck_n : out std_logic;
sd_ck_p : out std_logic
);
end DDRtest;


上がクロックとリセット、LCD表示回路、ロータリエンコーダを使った値の入力用回路、データ書き込み用SW、データ読み込み用SW、下がDDR SDRAM用の信号だ。
いままでのロータリエンコーダの回路で書き込み値をセットして、データ書き込み用SWを押した時にDDR SDRAMへ書き込む。
データ読み込み用SWを押した時にDDR SDRAMからデータを読み込み、LCD表示回路の下の行に表示する。
アドレスはとりあえず0に固定の予定だ。
いまのところDDR SDRAMコントローラのコアジェネレータで生成したコアの移植がうまく行っていないのでインプリできていない。これを移植してインプリしてみる予定だ。
それと平行してシミュレーションの準備を進めている。
DDR SDRAMのモデルはVHDLのモデルがマイクロンのサイトにはないようだ。Verilogモデルしかない。ほとんどのメーカーでVerilogモデルしかない様である。唯一、Hynixセミコンダクタのページで発見した。
http://www.hynix.com/eng/02_products/01_dram/02_01_ddrsdram.jsp
メモリが512Mbitなので
http://www.hynix.com/datasheet/simo/new/DDR_PC_32Mx16_HY5DU121622A(L)T_VHDL(Rev0.1).zip
をダウンロードしてみた。しかし、すでにModelSimのコンパイル済みのライブラリでcomponent文が入っていないので、どう接続していいかわからない。
そこで他のメーカーでVHDLのソースつきDDR SDRAMモデルを探したが見つからない。
しょうがないのでHynixの256MbitのVHDLモデルをダウンロードしてみたらREADMEファイルにVHDLのコンポーネント文がついてきた。とりあえずこれを参考に512MbitのDDR SDRAMモデルとして使おうと思っている。だめだったら256MbitのVHDLモデルを使うことにする。

2006.06.04 : コンパイル済みのHynixの512MbitのVHDLモデルを使用してModelSim XE III 6.0dでシミュレーションを開始したら、リコンパイルしろといわれてしまってだめだった。
マイクロンから以前にダウンロードした128MbitのVHDLモデルを使おうと思っている。今のマイクロンのサイトにはVerilogのモデルしかないようだ。
  1. 2006年06月02日 21:56 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:2

PeggyのPSMファイル用KWDファイル

PeggyでPicoBlaze用アセンブラ.psmファイルを色分け表示する.kwdファイル(ac_psm.kwd)が一応できたので公開しようと思います。
いろいろ手抜きではありますが、味気ない一色よりも色分けされていたほうが良いと思います。
ファイルはここにあります。
これをac_psm.kwdという名前でProgram File\Anchor\shareフォルダの中にセーブしてください。
例によって保証はしませんので、自己責任でお使いください。
  1. 2006年06月01日 04:55 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0