FC2カウンター FPGAの部屋 ISERDESのNETWORKINGモードのbitslip
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

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/669-55a0986a
この記事にトラックバックする(FC2ブログユーザー)