FC2カウンター FPGAの部屋 2007年11月
fc2ブログ

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

FPGAの部屋

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

ISERDESのNETWORKINGモードのbitslip

ついでなので、ISERDESのNETWORKINGモードのbitslipモードをテストしてみる。”ISERDESのお勉強の続きのその後2”から、わざとDDRのデータをずらして、bitslipを使用してビットの位置を合わせてみた。
テストベンチだけ変えたので、テストベンチはこれ。

`default_nettype none
`timescale 1ps/1ps
module serial_parallel_converter_tb;
    reg Din = 1'b0;
    reg clk_in = 1'b0;
    reg rst = 1'b1; // reset
     reg bitslip = 1'b1; // bitslip mode
    reg enable = 1'b0;
    wire [9:0] recv_data;
    wire [9:0] q_out;
    
    wire [9:0] para10bits;
    wire outbit;
    integer i;
    
    parameter PERIOD = 5000; // 5ns, 200MHz
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;

    initial    // Clock process for clk
    begin
        #OFFSET;
        forever
        begin
            clk_in = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) clk_in = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end
    
    serial_parallel_converter UUT (
        .Din(Din),
        .clk_in(clk_in),
        .rst(rst),
        .bitslip(bitslip),
        .enable(enable),
        .recv_data(recv_data),
        .q_out(q_out)
    );
    
    initial begin // 10bitを出力
        #100000;    // GSRリセットを待つ
        #(PERIOD);
        rst = 1'b0;
        #(PERIOD);
        enable = 1'b1;
        
        @(posedge UUT.clkdiv); // clkdivの立ち上がりまでWait
         #(PERIOD); // 1clk_inの半分の時間を進める
        #(PERIOD/4);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        #100000
        $stop;
    end
    
    task Out10bits;
        input [9:0] para10bits;
        integer i;
        begin
            for (i=0; i<10; i=i+1)
                Out1bit(para10bits[9-i]);
        end
    endtask
    
    task Out1bit;
        input outbit;
        begin
            Din = outbit;
            #(PERIOD/2);
        end
    endtask
    
    initial begin // データがあってから7つ数えてbitslipを0に。
    // 10'b01_0100_1010の1つ前の立ち上がりでbitslipを0にする必要がある
        @(posedge UUT.clkdiv);
        while (recv_data != 10'b01_0100_1010) 
            @(posedge UUT.clkdiv);
    
        for (i=0; i<10; i=i+1) begin
            @(posedge UUT.clkdiv);
            if (i==7) begin
                #1000;
                bitslip = 1'b0;
            end
        end
    end
    
endmodule
`default_nettype wire


これをシミュレーションするとこうなる。
ISERDES_bitslip_071130.png

rstが上がる前から、bitslipはずーと1で、最初に14ah(10_0100_1010)になってからclkdivの立ち上がりごとにiをカウントしていって7になったときに、bitslipを0にして、ビットの入れ替えをやめる。こうすれば14ah(10_0100_1010)をキープできる。
ネットワークのデータは最初のパターンがわかっていれば、こうしてビットの位置の同期を取ればよいのだろうと思う。
  1. 2007年11月30日 21:33 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

ISERDESのお勉強の続きのその後2

ISERDESのお勉強の続きで1:10のDDRのISERDESをインプリメントしてみたが、今度はシミュレーションをしてみた。ISERDESの1:8のSDRのタイミングチャートがユーザーズマニュアルにあったが、このタイミングチャートだとすると、今やっている1:10のDDRのタイミングと合わない気がするが、とりあえずBitslipを使ってみたので、記録しておく。
どうやら、DDRはCEが1になったclkdivの立ち上がりと同時のclk_inや次のclk_inの立下りからではなく、次のclk_inの立ち上がりからシリアルーパラレル変換するようだ。タイミングを調整して、このタイミングにあわせる。
この前のISERDESのVerilogファイルはこのように変更した。

`default_nettype none
`timescale 1ps/1ps
module serial_parallel_converter (
    Din,
    clk_in,                       
    rst,
    bitslip,
    enable,
    recv_data,
    q_out
);
    input  Din;
    input  clk_in;
    input  rst;
    input bitslip;
    input enable;
    output [9:0] recv_data;
    output [9:0] q_out;
    wire    Din;
    wire    clk_in;
    wire    rst;
    wire    bitslip;
    wire    enable;
    wire    [9:0] recv_data;
    wire    [9:0] q_out;
    wire   iserdes_clkout;
    wire   iobclk;
    wire   clkdiv;
    wire   shiftdata1;
    wire   shiftdata2;
    wire [9:0] data_internal;
    reg    [9:0] data;
    
    // Instantiate ISERDES for forwarded clock
     ISERDES fwd_clk (
         .O(iserdes_clkout),
         .Q1(), 
         .Q2(), 
         .Q3(), 
         .Q4(), 
         .Q5(), 
         .Q6(), 
         .SHIFTOUT1(), 
         .SHIFTOUT2(),
         .BITSLIP(1'b0),
         .CE1(1'b1), 
         .CE2(1'b1),
         .CLK(iobclk),
         .CLKDIV(clkdiv),
         .D(clk_in),
         .DLYCE(1'b0),
         .DLYINC(1'b0),
         .DLYRST(1'b0),
         .OCLK(1'b0), 
         .REV(1'b0),  
         .SHIFTIN1(1'b0), 
         .SHIFTIN2(1'b0),
         .SR(rst)
      );
    defparam fwd_clk.BITSLIP_ENABLE  =  "TRUE"; 
    defparam fwd_clk.DATA_RATE =  "DDR";
    defparam fwd_clk.DATA_WIDTH =  4;   
    defparam fwd_clk.INTERFACE_TYPE =  "NETWORKING"; 
    defparam fwd_clk.IOBDELAY =  "NONE"; 
    defparam fwd_clk.IOBDELAY_TYPE =  "DEFAULT"; 
    defparam fwd_clk.IOBDELAY_VALUE = 0; 
    defparam fwd_clk.NUM_CE = 1; 
    defparam fwd_clk.SERDES_MODE =  "MASTER"; 
    
    // Instantiate Master ISERDES for data channel
    // 1:10 Deserialization Factor
    ISERDES data_chan_master (
        .O(), 
        .Q1(data_internal[0]),
        .Q2(data_internal[1]),
        .Q3(data_internal[2]), 
        .Q4(data_internal[3]),
        .Q5(data_internal[4]),
        .Q6(data_internal[5]),
        .SHIFTOUT1(shiftdata1),
        .SHIFTOUT2(shiftdata2),
        .BITSLIP(bitslip),
        .CE1(enable), 
        .CE2(1'b1),
        .CLK(iobclk),
        .CLKDIV(clkdiv),
        .D(Din), 
        .DLYCE(1'b0),
        .DLYINC(1'b0),
        .DLYRST(1'b0),
        .OCLK(1'b0), 
        .REV(1'b0),
        .SHIFTIN1(1'b0), 
        .SHIFTIN2(1'b0),
        .SR(rst)
    );
    defparam data_chan_master.BITSLIP_ENABLE =  "TRUE"; 
    defparam data_chan_master.DATA_RATE =  "DDR";
    defparam data_chan_master.DATA_WIDTH =  10;   
    defparam data_chan_master.INTERFACE_TYPE =  "NETWORKING";         
    defparam data_chan_master.IOBDELAY =  "NONE";                 
    defparam data_chan_master.IOBDELAY_TYPE =  "DEFAULT";         
    defparam data_chan_master.IOBDELAY_VALUE =  0;                
    defparam data_chan_master.NUM_CE =  1;                        
    defparam data_chan_master.SERDES_MODE =  "MASTER"; 
    //
    // Instantiate Slave ISERDES for data channel
    // 1:10 Deserialization Factor

    ISERDES data_chan_slave (
        .O(), 
        .Q1(), 
        .Q2(), 
        .Q3(data_internal[6]),
        .Q4(data_internal[7]),
        .Q5(data_internal[8]),
        .Q6(data_internal[9]),
        .SHIFTOUT1(), 
        .SHIFTOUT2(),
        .BITSLIP(bitslip),
        .CE1(enable), 
        .CE2(1'b1),
        .CLK(iobclk),
        .CLKDIV(clkdiv),
        .D(1'b0), 
        .DLYCE(1'b0),
        .DLYINC(1'b0),
        .DLYRST(1'b0),
        .OCLK(1'b0), 
        .REV(1'b0),
        .SHIFTIN1(shiftdata1), 
        .SHIFTIN2(shiftdata2),
        .SR(rst)
    );
    defparam data_chan_slave.BITSLIP_ENABLE =  "TRUE"; 
    defparam data_chan_slave.DATA_RATE =  "DDR";
    defparam data_chan_slave.DATA_WIDTH =  10;   
    defparam data_chan_slave.INIT_Q1  =  1'b0;   
    defparam data_chan_slave.INIT_Q2  =  1'b0;   
    defparam data_chan_slave.INIT_Q3  =  1'b0;        
    defparam data_chan_slave.INIT_Q4  =  1'b0;   
    defparam data_chan_slave.INTERFACE_TYPE  =  "NETWORKING";         
    defparam data_chan_slave.IOBDELAY  =  "NONE";                 
    defparam data_chan_slave.IOBDELAY_TYPE  =  "DEFAULT";         
    defparam data_chan_slave.IOBDELAY_VALUE  =  0;                
    defparam data_chan_slave.NUM_CE  =  1;                        
    defparam data_chan_slave.SERDES_MODE  =  "SLAVE";             
    defparam data_chan_slave.SRVAL_Q1  =  1'b0;                   
    defparam data_chan_slave.SRVAL_Q2  =  1'b0;                   
    defparam data_chan_slave.SRVAL_Q3  =  1'b0;                   
    defparam data_chan_slave.SRVAL_Q4  =  1'b0;
    //
    BUFIO bufio1 (
        .O(iobclk),
         .I(iserdes_clkout)
                 );
    // To get a 1:10 deserialization factor in DDR mode, 
    // set the clock divide factor to "5"
    BUFR bufr1 (
        .O(clkdiv),
        .CE(1'b1),
        .CLR(1'b0),
        .I(iobclk)
    );
    defparam bufr1.BUFR_DIVIDE  =  "5";
    
    always @(posedge rst, posedge clkdiv) begin

        if (rst)
            data <= 0;
        else
            data <= data_internal;
    end
    assign q_out = data;
    assign recv_data = data_internal;
endmodule
    


次にテストベンチ。

`default_nettype none
`timescale 1ps/1ps
module serial_parallel_converter_tb;
    reg Din = 1'b0;
    reg clk_in = 1'b0;
    reg rst = 1'b1; // reset
//     reg bitslip = 1'b1; // bitslip mode
    reg enable = 1'b0;
    wire [9:0] recv_data;
    wire [9:0] q_out;
    
    wire [9:0] para10bits;
    wire outbit;
    integer j;
    
    parameter PERIOD = 5000; // 5ns, 200MHz
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;

    initial    // Clock process for clk
    begin
        #OFFSET;
        forever
        begin
            clk_in = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) clk_in = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end
    
    serial_parallel_converter UUT (
        .Din(Din),
        .clk_in(clk_in),
        .rst(rst),
        .bitslip(1'b0),
        .enable(enable),
        .recv_data(recv_data),
        .q_out(q_out)
    );
    
    initial begin // 10bitを出力
        #100000;    // GSRリセットを待つ
        #(PERIOD);
        rst = 1'b0;
        #(PERIOD);
        enable = 1'b1;
        
        @(posedge UUT.clkdiv); // clkdivの立ち上がりまでWait
        #(PERIOD/2); // 1clk_inの半分の時間を進める
        #(PERIOD/4);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b01_0100_1010);
        Out10bits(10'b10_0101_1011);
        #100000
        $stop;
    end
    
    task Out10bits;
        input [9:0] para10bits;
        integer i;
        begin
            for (i=0; i<10; i=i+1)
                Out1bit(para10bits[9-i]);
        end
    endtask
    
    task Out1bit;
        input outbit;
        begin
            Din = outbit;
            #(PERIOD/2);
        end
    endtask
    
//     always @* begin // q_outが10'b01_0100_1010の1つ前の10'b10_1001_0100になったらbitslipを0にする
//         if (recv_data == 10'b10_1001_0100)
//             bitslip = 1'b0;
//     end
    
    
endmodule
`default_nettype wire


最終的にbitslipは使用しなかったが、クロックと送ってきたビット列が合わずにワード同期が取れない場合は、bitslipを最初1にして、ビット列を移動することができる。そのときに、送ったデータと同一になったらbitslipを0にしてビット列の移動を止めれよいが、ISERDESのQ出力は1段多くラッチされているので、1つ手前でbitslip信号を0にしないと行き過ぎてしまう。
シミュレーションすると下のようになる。
ISERDES_1_10_071129.png

rstが0になって、enable(CE1)がclkdivの前でアサートされたクロックエッジの次のclk_inの立ち上がりエッジからデータ(Din)をサンプルするようだ。
サンプルされたデータはclkdivでラッチされて、次のclkdivの立ち上がりで出力([9:0]data_internal)されるようだ。
これでNETWORKINGモードでは、うまく行ったようだ。ずーと同じタイミングでデータ転送されればこれでOKだと思う。もしビット列が間違っていても、あらかじめ参照パターンがわかっていれば、bitslipを使って必要なだけビット列を入れ換えれば良い。
だが、DDRの受信の場合は、必ずしもそのタイミングに合うというわけではないので、bitslipでビット列を入れ替えるのは難しい。さらにclkdivは、clk_in(DQS)が途中で止まってしまうので、DQSから分周して作るのは難しいと思う。そこで、グローバルクロックから入れたらどうだろうと思っている。
さらに、DDR2-SDRAMコントローラのアプリケーションノートはMEMORYモードで使用しているので、検証してみたい。
  1. 2007年11月29日 20:54 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

ISERDESのお勉強の続きのその後

”ISERDESのお勉強の続き1”で書いたVerilogコードはシミュレーションで動作しないことがわかったので、11月27日に修正した。
ISERDESの属性のNTERFACE_TYPE = "MEMORY";にしておくと、OCLKにクロックを入れないと動作しないようだ。よって、INTERFACE_TYPE = "NETWORKING"; に修正した。このままだとMAPでエラーが出るので、BITSLIP_ENABLE = "TRUE"; に修正した。もう”ISERDESのお勉強の続き1”は修正してある。
シミュレーションで気がついたが、ビット列の並びが合わない。これはCE1,CE2ともイネーブルだし、同期を取っていないので、当たり前といえばあたり前田とおもう。(古いギャグですみません。クラッカーですね)
これが"NETWORKING"ということなんだろうと思う。ちょうど都合がいいので、bitslipを使用して同期を取ろうと思ってやってみている。大体同期が取れそうだ。
DDR2-SDRAMのリードデータを受けるときにも、このような感じでも良いと思うのだが、”XAPP721 - ISERDES と OSERDES を使用した高性能 DDR2 SDRAM インターフェイスのデータ キャプチャ (日本語版) (PDF)”を見ると NTERFACE_TYPE = "MEMORY"; で使ってOCLKにクロックを入れて使っているようだ。やはり、もう少しISERDESの研究が必要のようだ。
それにしても、ISERDESとOSERDESの情報が少ない。ブロック図、タイミングチャートがユーザーズマニュアルにもない。どこかに情報があるのだろうか? 情報があるのを知っている方は、よろしければ教えてください。

2007/11/29 追記:ISERDESの1:8のSDRのタイミングチャートがユーザーズマニュアルにあったが、このタイミングチャートだとすると、今やっている1:10のDDRのタイミングと合わない気がする。1:8のSDRで正しいかどうかを検証したほうが良いかもしれない。とりあえず、今日くらいに現状をブログに書こうと思う。
  1. 2007年11月28日 08:27 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

XilinxデバイスのVerilogシミュレーション時の注意点(glbl.v)

XilinxデバイスのVerilogシミュレーション時には、glbl.vをコンパイルする必要がある。glbl.v モジュールは、デザインのグローバル セット/リセット信号とグローバル トライステート信号を接続するそうである。
今回のシミュレーションでは、グローバル セット/リセット信号が100ns アサートされているのを忘れてしまい、何の変化もないと誤解してしまった。
XilinxデバイスのVerilogシミュレーション時には、intialから100ns waitしてから、信号を変化させる必要がある。
こんな感じ。

`timescale 1ps/1ps

...........

    initial begin // 10bitを出力
        #100000;    // GSRリセットを待つ
        #(PERIOD*2);
        rst = 1'b0;


今日の教訓でした。
  1. 2007年11月26日 21:13 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0

Xilinxのライブラリをコンパイルする場合の注意(`default_nettype wire)

私は、Verilogを書くときにwire宣言をしないとエラーにするために、Verilogコードの最初に必ず`default_nettype noneを書くが、この設定で、ほかの暗黙のwire宣言を使っているその他のVerilogコードをコンパイルするとエラーになってしまう。
そのためにテストベンチの最後に必ず`default_nettype wireを書いておく。

endmodule
`default_nettype wire


なお、ModelSimでは、コンパイル済みのライブラリを使っているので、こう書く必要はないが、Veritakではライブラリもコンパイルしているので、必要のようだ。ということはVeritakはライブラリのVerilogファイルのコンパイルは最後ということになるのかな?
  1. 2007年11月26日 06:20 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:2

車決定

皆さん、いろいろ情報を頂いてありがとうございました。
やはりステップワゴンに決定しました。
ノアは2列目シートの真ん中が硬くて長く座っていられません。3列目をたたんで、スキー用品を中に積んでスキーに行っているので、2列目シートに3人乗れないとだめなので落ちました。
セレナは、非常に良かったのですが、モデルチェンジが近く、現在生産終了となっていて希望の車種が手に入らないので、残念ながらだめでした。
とにかく、早く手に入る車でないと。。。つくばでは車がないととても不便です。
ステップワゴンは、2列目に3人、十分に乗れます。結局これに決定しました。さらに最小回転半径が小さいので、道が極端に狭いうちのようなところでも大丈夫そうです。
3社とも試乗したのですが、ノアはCVTでスムーズなのですが、減速の時にかな?ちょっとCVTの違和感が少しありました。ステップワゴンは従来のATですので、素直に運転できました。コーナリングも足がしまっていていい感じです。バックもしやすいですね。エスティマ・ルシーダよりも小さいのでやりやすいのでしょう。セレナは本当にスムーズな出足です。さすがCVT。でも直角コーナーでアクセルオンの時に、トルクの出方がスムーズすぎるのでしょうか?少しふくらんでしまいました。
CVTは本当にスムーズですが、エンジンの回転数が上がって、車速が上がる感じがあまりないので、なんか違和感を感じるところがあります。運転していると慣れるとは思いますが。。。で、結局総合的にステップワゴンになりました。皆さんお騒がせしました。
ATはCVTに比べて、燃費が心配ですが、エコランで対応したいと思います。
昨日は自転車で(車がないので)ディーラーに見に行ったのですが、ステップワゴンに自転車を積ませてもらいまして、楽につめることもわかりました。
今日は、車の色を決めるために実車をいろいろなところに見に行って、色を決定して契約する予定です。

FPGAの方はISERDESのシミュレーションをやろうと思っている。ISERDESの中身がどうなっているかのブロック図が見つからないのだが、Xilinxのアプリケーションノート”ISERDES と OSERDES を使用した高性能DDR2 SDRAM インターフェイスのデータキャプチャ”をみるとOCLKにクロックを入れないとだめなように見える。それでテストベンチを作って、シミュレーションしてすることにした。Veritakでシミュレーションを試みているのだが、J:\Xilinx92i\verilog\src\unisims\ISERDES.v(125)::Error: bitslip_in :Implicit Net はdefault_net==noneにより禁止されています。
などと出てしまってシミュレーションが今のところできていない。設定がおかしいのかもしれないので、一回ModelSimでも確かめてみる予定だ。


(追記)`default_nettype wireをテストベンチの最後に追加したら、コンパイルできました。たっくさん、ありがとうございました。前も同じところでつまづきましたか?そうでしたらどうもすみません。ディーラーにいってきます~。
後で調べてもう一度間違えないように備忘録(ブログか。。。)に書いておきます。それでもやっちゃいますが。。。
  1. 2007年11月25日 06:48 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:6

車購入予定

急遽、車を購入予定です。車をネットで調査しているため、FPGAをやる意欲がなくなってしまっています。車を決定するまで、ちょっとFPGAはお休みです。
トヨタのノアがいいか? それとも日産のセレナか? はたまたホンダのステップワゴンか?
うちは中学生がいるため、自転車が乗る車が1台ほしいので、できれば自転車が乗る車というと、このくらいになってしまいます。普通は家族5人なので、スキーに行くときには3列目があると便利だしということで、この辺ですかね?
新車も良いけど、においが嫌いだし、来るのに時間がかかるし、中古車は、すぐに乗れるけど、色とかを言い出すと探すのが大変ということで迷っています。
とりあえず、今度の休みに奥さんと一緒にデーラーと中古車屋を回ってこようと思っています。
  1. 2007年11月22日 04:51 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:8

燃料漏れ

私は12年物の車、エスティマ・ルシーダに乗っています。
とりあえず、調子が悪いわけでもなく気に入っているんですが、最近どうも灯油くさいなと思っていました。昨日、車の下を見ると何か漏れています。やはり、くさい。。。
至急、ガソリンスタンドで見てもらったら、軽油が漏れているそうです。運転席の下辺りにエンジンがあるんですが、そこに軽油がたまっていました。ガソリンスタンドの人の話によると、軽油は高圧がかかっているところがあるので、爆発する可能性もあるそうです。ということは、運転席の下からだから、私は火達磨。。。がたがた、ぶるぶる。。。怖い。。。
至急、トヨタに連絡を取って、修理依頼しましたが、もう廃車にしたほうが良いかな?
となると何買おう? 急遽、金が必要か???
  1. 2007年11月21日 06:01 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:9

メモリを2GBにしたときに休止状態にならない

今使っているパソコンはCeleron 1.7GHzの古いパソコンだ。メモリは1GBだった。
ISE使って、Timing AnalyzerやFPGA Editor、Floorplannerを同時に起動することがあるし、ブログ書くためにPixiaを起動すると、メモリ使用量が軽く1GBを超えてしまい、極端に遅くなっていた。パソコンを買い換えようかと思ったが、移行が面倒くさいので、メモリを買うことにした。
早速、パソコン工房のネットショップで1GBのDDR400を注文。2日ほで着たので、つけてみた。
そうすると、快適、快適、ISE使って、Timing AnalyzerとFPGA Editor同時にあげても遅くならない。やはり、パソコンはメモリ搭載量ですね。。。しかし、DDR2は安いのに、DDRは高いのはどういうことか?なんか納得いかない。。。
喜んで使っていたのだが、休止状態にしようとしたら、リソースが足りないよ。と表示が出て休止状態にならない。。。こまった、休止状態にならないと、今までやったことを全部終了して寝ないといけない。。。これは困る。
早速、ネットで調べると、弁護士梅村陽一郎の部屋さんの2GBのメモリと休止状態失敗がヒット、マイクロソフトのページでパッチを配っているとのこと。
早速、ダウンロード、インストールしました。無事、休止状態にすることができました。良かった。。。
  1. 2007年11月20日 05:12 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:3

ISERDESのお勉強の続き2

ISERDESのお勉強の続き1の続き。

制約したタイミングが表示されるところから。
(注:ISEに Timinig Analyzer や Floorplan Editor が統合されているはVirtex4やVirtex5、Spartan3Aのデバイスのみです。その他は、 Timinig Analyzer 単体起動、 Floorplan Editor は起動しないようです)
Soucesウインドウの"TS_clkdiv = PERIOD TIMEGRP "clkdiv" TS_clk_in *5 HIGH 40%"を展開して、data_0からdata_9までの10種類のパスを開こう。そのうちのdata_1をクリックして、右に表示すると、clkdivについてのトータルの遅延は3.193 nsだった。
ISERDES_Verilog_5_071117.png

さらに、data_internal<1>をクリックして、Floorplan Editorを立ち上げてみよう。
チップ全体が表示されるので、アイコンの上の列の左から5番目、Zoom to Selected をクリックして、配線をズームする。
ISERDES_Verilog_6_071117.png

そうすると上のように表示される。
さらに、ピンクの四角で囲ったToggle Visibility of Routiing アイコンをクリックし、その右のアイコンも下の図と同様にクリックしよう。
ISERDES_Verilog_7_071117.png

今度はすべての配線が水色の線で見えているはずだ。下の図と同様に見えると思う。
カーソルを配線にポイントすると、配線遅延がポップアップされる。clkdivの配線遅延は0.567 nsだ。
ISERDES_Verilog_8_071117.png

Toggle Simplified and Actial Views をクリックして、Actial Viewにしてみよう、いままでのViewはSimplified Viewだろうと思う。下の図はもうすでにActial Viewになっている。Actial Viewにするとだいぶ様子が変わってしまう。
さらにズームすると、ちょうどFPGA Editorで見ているように表示されている。Simplified Viewの配線の見た目の長さは当てにならないのかもしれない?
ISERDES_Verilog_9_071117.png

今度はclk_inのタイミングが解析されていないのが気になるので、clk_inポートからISERDESクロック入力ポートまでの遅延とDinポートからISERDESのD入力ポートの遅延の差を比べてみようと思う。
まずはISEのTiming Constarnts Analysis Report 1のタブをクリックして、Timinig Analyzerに戻そう。
AnalyzeメニューからAgainst Use Specified Pathsを選んで、その下のby Defining Endpoins... をクリック。
ISERDES_Verilog_10_071117.png

Analyze against Use Specified Paths by Defining Endp...ダイアログが開くので、Padsを展開してclk_inをSourcesの>ボタンをクリックして、Resourceに追加する。
ISERDES_Verilog_11_071117.png

Netsを展開して、iobclkをクリックして、Destinationsの>ボタンをクリックして、Resoucesに追加する。
ISERDES_Verilog_12_071117.png

そうしたら、OKボタンをクリックする。これでclk_in入力からiobclkネットまでの遅延が算出できる。下の図のように、1.994ns だった。
ISERDES_Verilog_13_071117.png

同様に、Din入力から、Din_IBUFネットまでの遅延を測る。Tisdck Dがなんだか、いまいちわからないがdata_chan_masterの入力遅延だろうか? それを入れても1.358ns だ。
ISERDES_Verilog_14_071117.png

結局、Dinよりもclk_inの方が遅延が大きいので、DDR2-SDRAMのDQとDQSに割り当てたときには、その辺の遅延関係も考慮しなければならないだろう。これだとDQSでデータを取っても大丈夫かもしれないがリードの時のイネーブルを作るのが難しそうだ。今度はグローバルクロックをISERDESのクロックに入れたときどうなるかを調べて見ようと思う。
また、DQSをグローバルクロックの位相と同じになるように遅延させて、その遅延させたDQSでサンプルできるように、DQを遅延調整しても良いかな?
  1. 2007年11月19日 20:44 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

つくば科学フェスティバル

今日は、下の娘を連れて、つくば科学フェスティバルに行ってきた。
tukuba_kagaku_1_071118.jpg

いろいろ見てきました。
最初に息子のところに行って、浮沈子をもらってきました。
特に印象に残ったのは、霧箱の実験で、ランタンの芯をアルコール飽和蒸気中において、下からドライアイスで冷やして、暗いところで横から光を当てる実験でした。なんと、これで放射線が見えるそうです。アルファ線、ベータ線が見えるそうです。やってみたら、本当に良く霧になった軌跡が見えました。写真のピンク矢印のあたりを見ると白い軌跡が薄ぼんやりだが見える。それが放射線の軌跡だそうだ。肉眼だと良く見えた。
tukuba_kagaku_2_071118.jpg

いろいろやらせてもらった後で、3階に行くと生物ひろばというのがあった。最初のところにカブトガニが。。。すごい、本物かな?
tukuba_kagaku_3_071118.jpg

最後に、今日の戦利品、机に載っている左から、風船を使ったホバークラフト、地面の液状化現象の実験(ペットボトル)、ペットボトルを使った浮沈子、色とりどりの人工いくら、放射線を見る霧箱、糸を布でこすることによって鶏の声を出す紙コップ、木の葉のパウチっ子。
tukuba_kagaku_4_071118.jpg
  1. 2007年11月18日 20:06 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

つくばチャレンジ、マイクロマウス大会

tukuba_challenge_1_071118.jpg
昨日は、ブログにコメントを頂いているやまちゅうさんとお会いして、一緒につくばチャレンジマイクロマウス大会を見学してきた。
つくばにはペデストリアンという歩行者・自転車専用道路がある。つくばチャレンジは、そこで、ロボットを走らせるという企画だ。走行距離は1Kmと、すごーく長い。
予選を通過した11台(?でしたっけ)のロボットが出走した。途中で人間の手を借りないと道に復帰できないロボットが多かったようだった。下の写真のセグウェイを使ったロボットも途中でリタイアだったようだったが、参考記録ということでゴールまで走りきったようだ。(やまちゅうさん、補足や間違っているところがありましたら、お願いします)
セグウェイすごいですね。バランスが良くて、姿勢が揺るがない。ほしいけど、80万 140万円位するみたいだし、公道は走れないし。。。
tukuba_challenge_2_071118.jpg

その間もやまちゅうさんといろいろなお話をさせていただいて、とても楽しかった。
その後、食事をしてから、近くのマイクロマウス大会を見に行った。
micro_mouse_1_071118.jpg

マウスの動きが面白かった。フレッシュマンクラスはゴールできるマウスが少なかったが、エキスパートクラスはすごかった。斜め移動もできるマウスもあって、7秒くらいでゴールしているマウスもあった。すごい速い。小さいマウスのほうが有利だと思った。
見ているとやってみたくなった。少し調べてみよう。
この辺で、やまちゅうさんとお別れして、息子が部活の関係でスタッフとしてやっているつくば科学フェスティバルへ行った。(やまちゅうさん、いろいろお話できてありがとうございました。楽しかったです。私はお酒飲まないのですが、この近辺の方たちだけでも忘年会じゃないですけど、そんな会ができたら良いなと思っています)
結構盛況だった。今日、下の娘と行く予定だ。息子も今日もやっているしね。。。
  1. 2007年11月18日 08:54 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:3

ISERDESのお勉強の続き1

Virtex4搭載SUZAKU-VでDDR2-SDRAMコントローラを自作する準備として、Virtex4のISERDES, OSERDESをもう一度勉強することにした。
まずは、Virtex4ユーザーズガイド日本語版UG070(v1.4)を読んで勉強することにした。読んでは見たが良くわからないので、例によってサンプルをインプリメントしてチップ内を眺めてみることにした。ユーザーズマニュアルの356ページのビ ッ ト 幅拡張用の Verilog インステンシエーションテンプレートをやってみることにした。これは1:10のISERDESの例だ。
このままインプリメントすると、出力データが外に出ていないので、インプリメントするとなくなってしまう。そこで、D-FFを通して外に出力されるように変更した。(取り合えずということで、次にやるときには、分散RAMの非同期FIFOをつけると思う)
書き換えた部分だけを下に示す。

module serial_parallel_converter (
    Din,
    clk_in,                       
    rst,
    q_out
);
...
    output [9:0] q_out;
...
    reg    [9:0] data;
...
    always @(posedge rst, posedge clkdiv) begin
        if (rst)
            data <= 0;
        else
            data <= data_internal;
    end
    assign q_out = data;
endmodule


もう1つUCFはclk_inの周期を5ns、つまり200MHzに設定してみた。

NET "clk_in" TNM_NET = "clk_in";
TIMESPEC "TS_clk_in" = PERIOD "clk_in" 5 ns HIGH 50 %;


これでインプリメントしてTiming Analyzerで見てみたが、clkdvを使っているはずのdataまでのパスが5nsで解析されていた。これはおかしい。少なくとも// synthesis BUFR_DIVIDE of bufr1 is "5";は効いていないんじゃないだろうかということで、defparamに変更してみた。
次にソースを全部示す。

`default_nettype none
`timescale 1ps/1ps
module serial_parallel_converter (
    Din,
    clk_in,                       
    rst,
    q_out
);
    input  Din;
    input  clk_in;
    input  rst;
    output [9:0] q_out;
    wire    Din;
    wire    clk_in;
    wire    rst;
    wire    [9:0] q_out;
    wire   iserdes_clkout;
    wire   iobclk;
    wire   clkdiv;
    wire   shiftdata1;
    wire   shiftdata2;
    wire [9:0] data_internal;
    reg    [9:0] data;
    
    // Instantiate ISERDES for forwarded clock
     ISERDES fwd_clk (
         .O(iserdes_clkout),
         .Q1(), 
         .Q2(), 
         .Q3(), 
         .Q4(), 
         .Q5(), 
         .Q6(), 
         .SHIFTOUT1(), 
         .SHIFTOUT2(),
         .BITSLIP(1'b0),
         .CE1(1'b1), 
         .CE2(1'b1),
         .CLK(iobclk),
         .CLKDIV(clkdiv),
         .D(clk_in),
         .DLYCE(1'b0),
         .DLYINC(1'b0),
         .DLYRST(1'b0),
         .OCLK(1'b0), 
         .REV(1'b0),  
         .SHIFTIN1(1'b0), 
         .SHIFTIN2(1'b0),
         .SR(rst)
      );
    defparam fwd_clk.BITSLIP_ENABLE  =  "TRUE"; 
    defparam fwd_clk.DATA_RATE =  "DDR";
    defparam fwd_clk.DATA_WIDTH =  4;   
    defparam fwd_clk.INTERFACE_TYPE =  "NETWORKING"; 
    defparam fwd_clk.IOBDELAY =  "NONE"; 
    defparam fwd_clk.IOBDELAY_TYPE =  "DEFAULT"; 
    defparam fwd_clk.IOBDELAY_VALUE = 0; 
    defparam fwd_clk.NUM_CE = 1; 
    defparam fwd_clk.SERDES_MODE =  "MASTER"; 
    
    // Instantiate Master ISERDES for data channel
    // 1:10 Deserialization Factor
    ISERDES data_chan_master (
        .O(), 
        .Q1(data_internal[0]),
        .Q2(data_internal[1]),
        .Q3(data_internal[2]), 
        .Q4(data_internal[3]),
        .Q5(data_internal[4]),
        .Q6(data_internal[5]),
        .SHIFTOUT1(shiftdata1),
        .SHIFTOUT2(shiftdata2),
        .BITSLIP(1'b0),
        .CE1(1'b1), 
        .CE2(1'b1),
        .CLK(iobclk),
        .CLKDIV(clkdiv),
        .D(Din), 
        .DLYCE(1'b0),
        .DLYINC(1'b0),
        .DLYRST(1'b0),
        .OCLK(1'b0), 
        .REV(1'b0),
        .SHIFTIN1(1'b0), 
        .SHIFTIN2(1'b0),
        .SR(rst)
    );
    defparam data_chan_master.BITSLIP_ENABLE =  "TRUE"; 
    defparam data_chan_master.DATA_RATE =  "DDR";
    defparam data_chan_master.DATA_WIDTH =  10;   
    defparam data_chan_master.INTERFACE_TYPE =  "NETWORKING";         
    defparam data_chan_master.IOBDELAY =  "NONE";                 
    defparam data_chan_master.IOBDELAY_TYPE =  "DEFAULT";         
    defparam data_chan_master.IOBDELAY_VALUE =  0;                
    defparam data_chan_master.NUM_CE =  1;                        
    defparam data_chan_master.SERDES_MODE =  "MASTER"; 
    //
    // Instantiate Slave ISERDES for data channel
    // 1:10 Deserialization Factor
    ISERDES data_chan_slave (
        .O(), 
        .Q1(), 
        .Q2(), 
        .Q3(data_internal[6]),
        .Q4(data_internal[7]),
        .Q5(data_internal[8]),
        .Q6(data_internal[9]),
        .SHIFTOUT1(), 
        .SHIFTOUT2(),
        .BITSLIP(1'b0),
        .CE1(1'b1), 
        .CE2(1'b1),
        .CLK(iobclk),
        .CLKDIV(clkdiv),
        .D(1'b0), 
        .DLYCE(1'b0),
        .DLYINC(1'b0),
        .DLYRST(1'b0),
        .OCLK(1'b0), 
        .REV(1'b0),
        .SHIFTIN1(shiftdata1), 
        .SHIFTIN2(shiftdata2),
        .SR(rst)
    );
    defparam data_chan_slave.BITSLIP_ENABLE =  "TRUE"; 
    defparam data_chan_slave.DATA_RATE =  "DDR";
    defparam data_chan_slave.DATA_WIDTH =  10;   
    defparam data_chan_slave.INIT_Q1  =  1'b0;   
    defparam data_chan_slave.INIT_Q2  =  1'b0;   
    defparam data_chan_slave.INIT_Q3  =  1'b0;        
    defparam data_chan_slave.INIT_Q4  =  1'b0;   
    defparam data_chan_slave.INTERFACE_TYPE  =  "NETWORKING";         
    defparam data_chan_slave.IOBDELAY  =  "NONE";                 
    defparam data_chan_slave.IOBDELAY_TYPE  =  "DEFAULT";         
    defparam data_chan_slave.IOBDELAY_VALUE  =  0;                
    defparam data_chan_slave.NUM_CE  =  1;                        
    defparam data_chan_slave.SERDES_MODE  =  "SLAVE";             
    defparam data_chan_slave.SRVAL_Q1  =  1'b0;                   
    defparam data_chan_slave.SRVAL_Q2  =  1'b0;                   
    defparam data_chan_slave.SRVAL_Q3  =  1'b0;                   
    defparam data_chan_slave.SRVAL_Q4  =  1'b0;
    //
    BUFIO bufio1 (
        .O(iobclk),
         .I(iserdes_clkout)
                 );
    // To get a 1:10 deserialization factor in DDR mode, 
    // set the clock divide factor to "5"
    BUFR bufr1 (
        .O(clkdiv),
        .CE(1'b1),
        .CLR(1'b0),
        .I(iobclk)
    );
    defparam bufr1.BUFR_DIVIDE  =  "5";
    
    always @(posedge rst, posedge clkdiv) begin
        if (rst)
            data <= 0;
        else
            data <= data_internal;
    end
    assign q_out = data;
endmodule


上のソースでISERDESの属性のうち INTERFACE_TYPE = "MEMORY"; にした。基は"NETWORKING"だったのだが、"NETWORKING"だとISEでインプリメントしているときにMAPでエラーが出てしまう。下のようなエラーだ。

ERROR:PhysDesignRules:1696 - ISERDES instance <data_chan_master> has the
   attribute INTERFACE_TYPE set to NETWORKING and BITSLIP_ENABLE set to FALSE
   which are incompatible. BITSLIP_ENABLE must be set to TRUE when
   INTERFACE_TYPE is set to NETWORKING. This must be corrected in order to
   properly implement the design. 


結局、"NETWORKING"だと、BIT_SLOP_ENABLEをTRUEにしなければいけないようだ。よって、 INTERFACE_TYPE = "MEMORY"; に変更した。
これで、ちゃんとインプリメントできたようだ。

(2007/11/27 追記: MEMORYだとOCLKにクロックを入れないとだめなようなので、"NETWORKING"に戻して、BITSLIP_ENABLE = "TRUE"; に変更した。)

ISE9.2SP3でTiming AnalyzerやFloorplan Editorを使ってみようということもあって、詳しくやり方を見ていこうと思う。
まずはインプリメント後に、Processesペインのimplement Designを展開して、Place & Routeを展開。Generate Post-Place & Route Static Timingを展開して、Analyze Post-Place & Route Static Timingをダブルクリックして、Timing Analyzerを立ち上げる。Virtex4はISEに統合されているので、ISE上でTiming Analyzerが開く。
ISERDES_Verilog_1_071117.png

clk_inの解析するパスはないので、すべてのclkdivのパスを解析してみよう。Analyzメニューから Analyzer Timing Constraints... を選択する。
ISERDES_Verilog_2_071117.png

Analyze against Timing Constarintsダイアログが表示される。
ISERDES_Verilog_3_071117.png

Optionsタブをクリック。Timing Constraint Details を No limit にする。ちなみに、大きなデザインでTiming Constraint Details を No limit にすると時間がかかって大変なことになるので注意。
ISERDES_Verilog_4_071117.png

タイミングが表示されるが、長くなったので、次回とする。
ISERDESのお勉強の続き2に続く。

2007/11/27 追記: INTERFACE_TYPE = "MEMORY";にしておくと、OCLKにクロックを入れないと動作しないようだ。
INTERFACE_TYPE = "NETWORKING"; 
BITSLIP_ENABLE = "TRUE";
に変更した。

2007/11/28 追記:ザイリンクスの”アンサー# 25507 - 9.2i ISE - DRC で「ERROR:PhysDesignRules:1696 -BITSLIP_ENABLE must be set to TRUE when INTERFACE_TYPE is set to NETWORKING」というエラー メッセージが表示される”というのがあった。それによると、ISERDES でタイミングが確実に満たされるようにするレジスタを入れるために NETWORKING では、BITSLIP_ENABLEを TRUE にするようにしたようだ。
  1. 2007年11月17日 22:11 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:3

ET2007に行ってきました

今日、ET2007を見に、パシフィコ横浜に行ってきました。
ET2001_1_071115.jpg

会場の様子は、午前中に行ったときにはすいていました。
ET2001_2_071115.jpg

結局セミナは”FPGAと高速メモリインターフェイスソリューション”のみ受けてきました。
最初に、XilinxブースへSUZAKU-Vの説明員の方とお話をしました。かなりFPGAのエリアを使っているので、軽量化したコンフィグレーションを用意中とのことでした。
デザインウェーブマガジンのTEDのVirtex5LXT搭載PCI-Expressボードが動いているのを見てきました。びっくりしたのは、マザーボードからPCI-Expressのラインを同軸フラットケーブルで引き出して、コネクタでPCI-Expressボードにつないでいました。つまり、PCI-Expressボードがマザーボードにつながった状態で、よく見えるようにボードをむき出して展示してありました。びっくりしました。すごい。PCI-Expressって、こんなこともできるんですね。ROCKET IOでもコードで伸ばせるんだから、同じかな?
搭載しているVirtex5を触らせてもらいましたが、結構熱かったです。やはり、PCI-Expressを動かして、DDR-SDRAMへDMAをしているので、しょうがないとのこと、ヒートシンクやファンがないので、当然といえば当然ですね。ファンなしで動くほうがすごいですね。
”FPGAと高速メモリインターフェイスソリューション”セミナはDDR2-SDRAMの話でした。途中でプロジェクタが写らないアクシデントはありましたが、DDR2-SDRAMの実際の波形を見せてもらえてよかったです。ボードで選択した組み合わせも教えてもらいました。この辺の情報は重要です。が、ボードによって違うので、参考程度です。傾向は非常に参考になりました。
マイコンもたくさん展示がありましたが、あまり興味がないので、飛ばしました。ロボットとかの展示もありましたが、マインドストームなどが多かったかな?
北斗電子PUPPYは相変わらず面白かったです。けなげに立ってました。PUPPYⅡも出ていました。2軸なんで、曲がれるんですよね?
研修用のシステムも出ていました。富士通でもマインドストームやリモコンカーを使ったモデルベース開発研修システムなども展示していました。
SUZAKU-Vの回路図がもらえるかどうかも聞いたのですが、もらえないそうです。DDR2-SDRAMのコントローラを作る場合はカットアンドトライしてみます。前準備としてVirtex4のISERDES, OSERDESの勉強をもう一度、始めようと思っています。現在進行中です。
今日は、明日の朝大事な仕事があるので、速めに帰ってきました。
最後に、クイーンズタウンの名物巨大クリスマスツリーです。
ET2001_3_071115.jpg
  1. 2007年11月15日 21:31 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:3

ET2007に行く予定です

明日、ET2007に行く予定です。

FP-2 11月15日(木) 11:30~12:15 基礎をおさえて最先端を知る FPGA設計フロー
FP-3 11月15日(木) 13:00~13:45 FPGAと高速メモリインターフェイスソリューション
FP-4 11月15日(木) 14:00~14:45 これからのFPGAを支えるプロセッサ設計
FP-5 11月15日(木) 15:00~15:45 PCI-Express アドインカードの動向と設計要点

この4つを登録しましたが、展示が見られないようだったら、どれかをパスしようかと思っています。
展示は、XilinxやAltera、SUZAKU-Vの話を聞くためにアットマークテクノなどに行こうと思っています。
  1. 2007年11月14日 17:07 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

毛糸玉の一日

マフラーを編んでくれた下の娘が毛糸玉の一日というのを書いてくれたので、日記に書いておくことにする。
親ばか見たいだけけど、やはりうれしい。
こげぱんのパクリだとは思うんだけれど。。。
keitodama_1_071113.png
keitodama_2_071113.png
  1. 2007年11月13日 18:40 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:7

デザインウエーブマガジン12月号(PCI Expressのすべて)

昨日やっと、デザインウエーブマガジン12月号を買ってきた。
特集1のPCI Expressのすべてに目を通したが、興味深く読んだ。
PCI Expressの概要はなかなかよくわかった。一番よいと思ったのが、ディエンファシスの実際の波形が載っていることだ。高い、高ーいオシロを使わないと実際に見えない波形を見せてもらってうれしかった。
また、マザーボートのいろいろな波形、PCIバス、PCI-Expess, HDMI, SATA-2, HyperTransportなどの波形も載っていた。同じ理由でうれしかった(PCIバスは当然オシロで見たことがあるが。。。)。なお、波形を測定したら、再起動が必要なそうである。それはそうかも、1対1の信号にもう1つ負荷がついてしまったのだから、ミスっても不思議はない。
また、PALTEKのPIPEインターフェースのボード、TEDのVirtex-5LXTのPCI Expressの詳細が見られてよかった。TEDのボードは10電源だった。やはり、DDR, Rocket IOは別電源になるので、どうしても電源が多くなってしまう。前にボードを設計したときも、PCI Expressにしようとも考えたが、電源もネックになっていた。設計の詳細について見られたのは良かった。3端子コンデンサをTEDボードで使っていたが、かなり効果のあるものらしい。かなりコンデンサが減らせたとのこと。でも、どうやって、コンデンサを減らしても良いかどうかを評価したのだろう。そっちが気になる。それに3端子コンデンサを使うと、レギュレータの電圧出力パターンと使用するデバイスの電源入力パターンを切らなくてはならないので、なんか怖い。
久しぶりに良い特集だったと思う。
  1. 2007年11月13日 05:42 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

ゆびあみマフラー

muffler_071112.jpg

下の娘にゆびあみでマフラーを編んでもらった。
ゆびあみとは手の指を使って、編み物をすることだ。かなりのスピードで編めるようで、毛糸を買ってきたらあっという間に編んでしまったようだ。左のような本も売っている。
もうちょっと幅が広いほうが良いが、その分首に巻けばよいので、寒くなったら編んでもらったマフラーをしていこうと思う。
  1. 2007年11月12日 20:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

SystemVerilogセミナ(アサーションコース)

2007/12/13(木)~2007/12/14(金)に、HDラボ(株)のSystemVerilogセミナ(アサーションコース)に申し込みました。
LINUXで1人1台のPCというのが、ちょっと気になりますが、行って見ることにしました。EMACSあまり好きじゃないんで。。。コントロールキーを押しながら、ほかのキーをブラインドタッチで押せない。。。
VIでも良いんでしょうか?
QuestaSim 6.1bはModelSimみたいな物だから問題ないとして。。。
後は、新横浜まで通うのが大変そう。新幹線で行こうかな?行くだけは。。。帰りは普通ということで。。。そういえば、JR東海だからスイカカード使えないという話ですね?ということは秋葉原で切符と特急券を買ったほうが良い?
何はともあれ、有意義な研修になるようにしようと思います。
  1. 2007年11月11日 15:38 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:4

Cray、「ハイブリッド」スーパーコンピュータでFPGAを使用

ITmediaの”Cray、「ハイブリッド」スーパーコンピュータ発表”の記事によると、ハイブリッドシステム「Cray XT5h」はFPGA技術を使って再構成可能なコプロセッサを組み合わせたそうだ。
前にFPGAをコプロセッサをつけるというボードがあったと思うが、CRAYのスーパーコンピュータにもついたということは驚きだ。コンパイラはどうなっているんだろうか?
FPGAのコンフィギュレーションデータもあらかじめインプリメント済みのものをアプリによって切り替えるのだろうか?
本家のCRAYのサイトはここ。Cray XR1™ bladeというのがFPGAの搭載されたブレードらしい。
  1. 2007年11月08日 22:20 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

ISE9.2SP3でSynplify Pro 8.5を使用するときの注意点

現在は論理合成ツールにSynplify Pro8.5を使用しているが、使っている際に注意する点があったので、ここに書いておく。ISEのバージョンは9.2SP3。
今回はお仕事のファイルにバージョン番号を追加しようとしていた。

library ieee;
use ieee.std_logic_1164.all;

package bit_file_YMDN_pack is
    constant BIT_FILE_YEAR2 : integer := 0;
    constant BIT_FILE_YEAR1 : integer := 7;
    constant BIT_FILE_MONTH2 : integer := 1;
    constant BIT_FILE_MONTH1 : integer := 1;
    constant BIT_FILE_DAY2 : integer := 0;
    constant BIT_FILE_DAY1 : integer := 5;
    constant BIT_FILE_VERSION : integer := 8;
end bit_file_YMDN_pack;


bit_file_YMDN_pack.vhdを作って、とりあえずは手で書き換えようということだった。
これを内部レジスタ領域にマップしようとして、VHDLファイルを書き換えたのだが、書き換えたらISEでエラーが出て論理合成ができない。Synplify Proでエラーが出ているようだった。
synplify_error_1_071107.png

Synplify Proを立ち上げて、エラーの内容を見てみると、バージョン番号追加用パッケージのbit_file_year2が見つからないと言っているようだ。
synplify_error_2_071107.png

dout(27 downto 24) <= CONV_STD_LOGIC_VECTOR(BIT_FILE_YEAR2,4);の部分。
Synplify ProのプロジェクトのVHDL項目をみると、パッケージを使うVHDLファイルよりも、パッケージを書いたファイルが下にあるのが問題のようだ。つまり参照するときに宣言文がない状態になっているようだった。
bit_file_YMDN_packをuseしている内部レジスタ用VHDLファイルを見ると、最初にアドレスマップ用パッケージが書いてあって、次に内部レジスタ用のVHDLファイルが書いてあった。
(一部省略)


library ieee;
use ieee.std_logic_1164.all;

package int_reg_pack is
    constant MLX_REGISTERS : std_logic_vector(7 downto 2) := "000000"; -- 0xEC000000
          .....
    constant GEN_BIT_FILE_YMDN : std_logic_vector(7 downto 2) := "010110"; -- 0xEC000058
end int_reg_pack;

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
library work;
use work.int_reg_pack.all;
use work.swcontroller_pkg.all;
use work.bit_file_YMDN_pack.all;

entity IntReg is
    port(
        clk, reset : in std_logic;
        IntRegA : in std_logic;
        RnW : in std_logic;


どうもおかしいので、int_reg_packを別ファイルにして、このファイルから削除してみた。
つまりこれだけにした。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
library work;
use work.int_reg_pack.all;
use work.swcontroller_pkg.all;
use work.bit_file_YMDN_pack.all;

entity IntReg is
    port(
        clk, reset : in std_logic;
        IntRegA : in std_logic;
        RnW : in std_logic;


修正して、int_reg_pack.vhdをISEでプロジェクトに追加したら、論理合成が成功するようになった。
問題はSynplify ProにあるのではなくISEのSynplify用プロジェクトの生成機能にあるのではないかと思う。
とにかく1つのファイルにパッケージとentityを一緒に書くと良いことはないようだ。今日は教訓が1つ増えた。
  1. 2007年11月08日 05:30 |
  2. その他のFPGA用ツールについての話題
  3. | トラックバック:0
  4. | コメント:0

パソコンごとの論理合成時間と配置配線時間の比較

家のパソコンと職場のパソコンで論理合成時間と配置配線時間の比較をしてみた。
家のパソコンはCeleron 1.7GHz(Willamette) 2ndCache 128KBytes、メモリはDDR333、1GBytes、ハードディスクはISEが入ってるのはUSB2.0接続の250GBytes、Windowsが入っているハードディスクがATA100、40GBytes。
職場のパソコンはAthlon 64 3500+ シングルプロセッサ 512KBytes 2nd Cache、メモリはDDR-400、2GBytesデュアルチャネル、SATA1の160GBハードディスク。
インプリメントするターゲットは、Spartan3Eスタータキット用のDDR-SDRAMコントローラ。
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1からダウンロードできる。(完全なプロジェクトではないが。。。PicoBlazeを別途ダウンロードの必要あり)
ISEはどちらもISE9.2iSP3。
これで、ISEでRun Allで走らせ、論理合成のログとP&Rのログから時間を拾ってみた。
論理合成のログは”CPU : 174.16 / 175.19 s | Elapsed : 174.00 / 175.00 s”と書いてあるのが経過時間だと思うが、どれだかわらからないので一番長い時間を小数点以下四捨五入し、分と秒に直した。
P&R時間は、”Total REAL time to PAR completion: 2 mins 1 secs”を採用した。

家のパソコンの論理合成時間は2分54秒、職場のパソコンの論理合成時間は29秒
家のパソコンの配置配線時間は2分1秒、職場のパソコンの配置配線時間は27秒

家のパソコンの論理合成時間は職場のパソコンの論理合成時間の6倍。
家のパソコンの配置配線時間は職場のパソコンの配置配線時間の4.48倍。

やはり、家のパソコンの速度が本当に遅いことがよくわかった。それでも現在やっているような回路では、3分くらいなので、待っていられなくもない。面倒だから、家のパソコンのリプレースはやめようかな? それでもiGoogleが遅いのは何とかしたいのだが。。。ガジェットを入れすぎという話もあるが?

(注)もしかして、家のパソコンはCeleron1.7GHzだったかも?家に帰ったら確認して、必要だったら修正します。
2007/11/07 : やはりCeleronでした。修正します。
論理合成時間の方の倍率が大きいのは、より2nd Cacheが必要なのだろうか?
  1. 2007年11月07日 04:46 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

論理合成ツールによる論理合成時間の違い

このブログのコメントで、どのプロセッサがISEを速く実行できるかが議論になっていた。うちのパソコンでどのくらい速くインプリメントできるかをやってみようとしたが、まだ作りかけだったので、回路が消えているところがあったので、時間は測定しなかった。
その代わり、論理合成ツールXSTとSynplify Proの論理合成時間の差を測ってみた。
使用FPGAはXC2VP50-FF1152-6、Virtex2Pro。ISEのバージョンは9.2SP3。Synplfy Proのバージョンは8.5。パソコンはAthlon 64 3500+ シングルプロセッサ、メモリはDDR-400、2GByteデュアルチャネル、SATA1の160GBハードディスクだ。
インプリメントしたときのMAPリポートの4input LUT使用率は21%、IOB使用率は81%だった。

XSTのメモリ使用量 480MByte、論理合成時間 7分20秒
Synplify Pro のメモリ使用量 130MByte、論理合成時間 3分50秒

まだ、ちゃんとした回路になっていないので、比較は難しいかもしれないが、Synplify Proがメモリ使用量、論理合成時間的には良いようだ。
  1. 2007年11月06日 18:54 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

DELLのノートパソコン購入

去年の2月末に買った娘用のソーテックのデスクトップパソコンが壊れてしまったので、デルのノートパソコンを購入した。
AMD Athlon™ 64 X2 デュアルコア・プロセッサ TK-55(1.8GHz/512KB L2キャッシュ)で1GByteメモリ、RVR-R,RWドライブ、無線LAN、WXGAツルピカ液晶で67,000円くらいだった。今は安いんだね~。びっくり。
私の古い1.7GHz Pentium4も替えようかな? Core-DuoにするとISEのインプリメントが激早になって良いかな?考えてみよう。
Dell_note_071103.jpg
  1. 2007年11月03日 19:44 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:17

10月のアクセス数

Access_10_071102.png

FPGAの部屋の10月のアクセス数は29,452アクセスでした。皆さん、ご覧頂いてありがとうございました。また、よろしくお願いします。
  1. 2007年11月02日 21:05 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

FPGA Editorで配置と配線を割り当てる3

最初から見る場合は、FPGA Editorで配置と配線を割り当てる1をご覧ください。

いよいよ、UCFファイルに制約を書き戻そう。
Toolsメニューから Directec Routing Constraints... を選択する。
FPGA_Editor_Lock_11_071031.png

Directec Routing Constraintsダイアログが立ち上がる。
1.真ん中のConstraint File を inv_test.ucf に変更する。
2.下の Placement Constraint Type を Use Absolute Location Constraint に変更する。
3.上のほうの、line0, line1, line2, line3 をすべて選択する。
FPGA_Editor_Lock_12_071031.png

OKボタンをクリック。これで、この配置、配線のUCF制約が書き込まれた。
ISEに戻って、inv_test.ucf をプロジェクトに加えてみてみよう。このやり方は既知だと思うので書かない。知らない方はこのブログのチュートリアルなどを見てください。
無事に下のようなUCFファイルができていると思う。

// 11/01 @ 05:13:29
NET "line0"
ROUTE="{3;1;2vp30ff896;c48324d4!-1;-93904;135480;S!0;-159;0!1;1596;416!2;"
"1884;-1336!3;0;704!4;327;0;L!}";
NET "in" LOC=A28;
INST "U0" LOC=SLICE_X1Y159;
INST "U0" BEL="F";


NET "line1"
ROUTE="{3;1;2vp30ff896;23783c4a!-1;-90256;135464;S!0;1261;424!1;-1588;"
"-968!2;327;0;L!}";
INST "U0" LOC=SLICE_X1Y159;
INST "U0" BEL="F";
INST "U1" LOC=SLICE_X1Y158;
INST "U1" BEL="F";


NET "line2"
ROUTE="{3;1;2vp30ff896;6e161340!-1;-90256;135120;S!0;1261;-1192!1;-1653;"
"1093!2;232;-365;L!}";
INST "U1" LOC=SLICE_X1Y158;
INST "U1" BEL="F";
INST "U2" LOC=SLICE_X0Y159;
INST "U2" BEL="G";


NET "line3"
ROUTE="{3;1;2vp30ff896;a69c6d3e!-1;-90416;134808;S!0;-2075;-896!1;-1413;"
"840;L!}";
NET "out" LOC=G25;
INST "U2" LOC=SLICE_X0Y159;
INST "U2" BEL="G";


これで、無事にUCF制約ができたので、今まで配置、配線していたFPGA Editor を終了しよう。そのときに inv_test_map.ncd をセーブするか?と聞いてくるので、もういじることがないならば、”いいえ”ボタンをクリック。またいじりたいならば、”はい”ボタンをクリックする。
ISEで、UCFファイルをプロジェクトに追加してから、プロジェクトをImplement してみよう。その後、 FPGA Editorを起動して確かめてみよう。
FPGA_Editor_Lock_13_071031.png

その結果、Place & Route でウォーニングが出て、line3 のインスタンスが消えてしまった。これは、line2 スライスにline2, line3 の2つの論理素子が統合されてしまったからのようだ。line2 スライスの内部が下の図にある。
FPGA_Editor_Lock_14_071031.png

次に、line4 ネットはどこに行ったのかというと、最後の INV プリミティブが out のIOB内にマップされてしまっているため、IOB内部になってしまった。(ピンクの矢印)
FPGA_Editor_Lock_15_071031.png

これで終了です。
  1. 2007年11月01日 05:55 |
  2. FPGA Editorの使い方
  3. | トラックバック:0
  4. | コメント:4