【技(jì )術分(fēn)享】Xilinx系列FPGA SelectIO簡介-連載二
【技(jì )術分(fēn)享】Xilinx系列FPGA SelectIO簡介-連載二

此前,我們在SelectIO簡介連載一中(zhōng)介紹了其架構,本章會繼續介紹如何使用(yòng)其gearbox功能(néng)來實現不同的比率的串并轉換功能(néng)。


 7 Series FPGA中(zhōng)LVDS使用(yòng)了ISERDESE2,SDR Rate可(kě)設為(wèi)2,3,4,5,6,7,8。DDR Rate可(kě)設為(wèi)4,6,8,10,14。


blob.png


從UG471的Bitslip部分(fēn)可(kě)以看出在SDR和DDR移位的位數不一樣。在SDR模式下,一個Bitslip脈沖使數據左移一位;而在DDR模式下,一個Bitslip脈沖使數據右移一位或左移三位。

blob.png


blob.png

 

所以在某些傳輸過程中(zhōng),可(kě)以先傳預設值,等待接收方調整Idelay和Bitslip解出正确的預設值後再傳輸有(yǒu)效數據。


對習慣使用(yòng)7 Series FPGA用(yòng)戶在接觸Xilinx®UltraScale™和UltraScale +™器件 SelectIO時感覺不習慣,原因Xilinx®UltraScale™和UltraScale +™是ISERDESE3和OSERDESE3組件,使用(yòng)Select IO需要在IP catlog中(zhōng)選擇high_speed_selectio IP Configuration interface 在Serialization Factor選項中(zhōng)隻有(yǒu)8或者4可(kě)以選擇。


blob.png


在Pin Selection選擇時會發現IO選擇會有(yǒu)一定限制,在Sensor的應用(yòng)中(zhōng)HP bank理(lǐ)想的硬件設計是在同一個bank中(zhōng)連續放置設備I/O,部分(fēn)Sensor輸出的Serialization Factor需要7:1,6:1,5:1,不能(néng)直接使用(yòng)ISERDES。


對這類應用(yòng)Xilinx 提供了XAPP1315 7:1的參考設計,那麽對6:1,5:1這種應用(yòng)用(yòng)戶需要在參考設計上改哪裏,怎樣去改?


下面我們提供修改方式供參考。


1、從Data Reception看需要把ISERDESE3 輸出的8位數據(Serialization Factor=8)通過gearbox模塊轉成7,6,5位的數據。其中(zhōng)7位的數據XAPP1315已經做過了,這裏我們用(yòng)6:1的數據為(wèi)例, 需要從ISERDES3實現Read8 bit 數據通過gearbox 轉換為(wèi)6bit數據。


blob.png



2、對于Read 8 to 6 gearbox設計方式:


blob.png



從數據排列可(kě)以分(fēn)析到8 bit數據在每次讀取6 bit數據,經過4次後開始循環,我們通過狀态機設計gearbox的代碼需隻需要實現;


blob.png

// Read 8 to 6 gearbox

//

always @ (posedge px_clk)

begin

    case (px_rd_seq )

      3'h0 : begin

         px_data <=px_rd_curr[5:0];

         end

      3'h1 : begin

         px_data <={px_rd_curr[3:0], px_rd_last[7:6]};

         end

      3'h2 : begin

         px_data <={px_rd_curr[1:0], px_rd_last[7:4]};

         end

      3'h3 : begin

         px_data <={px_rd_last[7:2]};

         end

    endcase

end




3、Data Transmission,OSERDES3使用(yòng)4 bit 輸入,參考例程是把ISERDES的數據接到OSERDES,這裏我們在參考例程上任然使用(yòng)ISERDE 到OSERDES的數據傳送方式驗證。分(fēn)析知道需要一個6 bit 轉4 bit數據的 Gearbox。


blob.png



4、Gearbox設計思路是把6 bit的數據按4bit大小(xiǎo)去讀取直到數據開始循環。


blob.png


通過表格客戶分(fēn)析出設計代碼做3次循環可(kě)以滿足要求

blob.png


Read state machine and gear box

//

always @ (posedge tx_clkdiv4)

begin

   if(!tx_enable) begin

      rd_addr  <= 4'b0;

      rd_state <= 3'h0;

  end else begin

      case (rd_state )

        3'h0 : begin

           rd_addr <= rd_addr + 1'b1;

           tx_data <= rd_curr[3:0];

           rd_state<= rd_state + 1'b1;

           end

        3'h1 : begin

           rd_addr <= rd_addr;

           tx_data <= {rd_curr[1:0], rd_last[5:4]};

           rd_state<= rd_state + 1'b1;

           end

        3'h2 : begin

           rd_addr <= rd_addr + 1'b1;

           tx_data <= rd_last[5:2];

           rd_state<= 3'h0;

           end

      endcase

  end

end



5、到這來我們已經完成gearbox 模塊的設計,實現LVDS Source Synchronous 6:1。在Serialization and Deserialization部分(fēn)還需要修改輸入的數據


//

// Transmit Data Generation

//

always @ (posedge tx_px_clk)

begin

   if(tx_px_reset) begin

     tx_px_data[ 5:0 ] <= 6'h01;

     tx_px_data[11:6 ] <= 6'h02;

     tx_px_data[17:12] <= 6'h03;

     tx_px_data[23:18] <= 6'h04;

     tx_px_data[29:24] <= 6'h05;

  end

  else begin

     tx_px_data[ 5:0 ]<= tx_px_data[ 5:0 ]+1'b1;

     tx_px_data[11:6 ]<= tx_px_data[11:6 ]+1'b1; 

     tx_px_data[17:12]<= tx_px_data[17:12]+1'b1; 

     tx_px_data[23:18]<= tx_px_data[23:18]+1'b1; 

     tx_px_data[29:24]<= tx_px_data[29:24]+1'b1;

  end

end

 

 

// Receiver 1 - Data checking per pixelclock

//

always @(posedge rx1_px_clk or negedgerx1_px_ready)

begin

  rx1_px_last <= rx1_px_data;

   if(!rx1_px_ready) begin

        rx1_match <= 1'b0;

  end

  else if ((rx1_px_data[ 5:0 ]==rx1_px_last[ 5:0 ]+1'b1)&&

           (rx1_px_data[11:6 ]==rx1_px_last[11:6 ]+1'b1)&&

           (rx1_px_data[17:12]==rx1_px_last[17:12]+1'b1)&&

           (rx1_px_data[23:18]==rx1_px_last[23:18]+1'b1)&&

           (rx1_px_data[29:24]==rx1_px_last[29:24]+1'b1)) begin

     rx1_match <= 1'b1;

  end

  else begin

     rx1_match <= 1'b0;

  end

end



6、對用(yòng)戶的系統可(kě)能(néng)需要的lane數量為(wèi)8,在對應的數據部分(fēn)需要做對應的修改

blob.png



Receiver使用(yòng)ISERDESE3在1:8 DDR模式與8:6分(fēn)布式RAM基于齒輪箱反序列化和對齊輸入數據流。這個實現需要三個時鍾域,1/2速率采樣時鍾(rx_clkdiv2), 1/8速率反序列化數據時鍾(rx_clkdiv8),和1/6像素時鍾(px_clk),它等于Receiversource clock。


Receiver source clock在MMCM或PLL中(zhōng)乘以6或12以滿足VCO頻率範圍,然後除以2生成1/2速率采樣時鍾(rx_clkdiv2),除以6生成織物(wù)像素時鍾(px_clk)。


//

// Instantiate PLL or MMCM

//

generate

if (USE_PLL == "FALSE")begin                   // use an MMCM

  MMCME3_BASE # (

        .CLKIN1_PERIOD     (CLKIN_PERIOD),

        .BANDWIDTH         ("OPTIMIZED"),

        .CLKFBOUT_MULT_F   (6*VCO_MULTIPLIER),

        .CLKFBOUT_PHASE     (0.0),

        .CLKOUT0_DIVIDE_F  (2*VCO_MULTIPLIER),

        .CLKOUT0_DUTY_CYCLE (0.5),

        .CLKOUT0_PHASE      (0.0),

        .DIVCLK_DIVIDE      (1),

        .REF_JITTER1        (0.100)

     )

     tx_mmcm (

        .CLKFBOUT       (px_pllmmcm),

        .CLKFBOUTB      (),

        .CLKOUT0        (tx_pllmmcm_div2),

        .CLKOUT0B       (),

        .CLKOUT1        (),

        .CLKOUT1B       (),

        .CLKOUT2        (),

        .CLKOUT2B       (),

        .CLKOUT3        (),

        .CLKOUT3B       (),

        .CLKOUT4        (),

         .CLKOUT5        (),

        .CLKOUT6        (),

        .LOCKED         (cmt_locked),

        .CLKFBIN        (px_clk),

        .CLKIN1         (clkin),

        .PWRDWN         (1'b0),

        .RST            (reset)

    );

  end else begin           // Use aPLL

  PLLE3_BASE # (

        .CLKIN_PERIOD      (CLKIN_PERIOD),

        .CLKFBOUT_MULT     (6*VCO_MULTIPLIER),

        .CLKFBOUT_PHASE     (0.0),

        .CLKOUT0_DIVIDE    (2*VCO_MULTIPLIER),

        .CLKOUT0_DUTY_CYCLE (0.5),

        .REF_JITTER         (0.100),

        .DIVCLK_DIVIDE      (1)

     )

     tx_pll (

         .CLKFBOUT       (px_pllmmcm),

         .CLKOUT0        (tx_pllmmcm_div2),

         .CLKOUT0B       (),

         .CLKOUT1        (),

         .CLKOUT1B       (),

         .CLKOUTPHY      (),

         .LOCKED         (cmt_locked),

         .CLKFBIN        (px_clk),

         .CLKIN          (clkin),

         .CLKOUTPHYEN    (1'b0),

         .PWRDWN         (1'b0),

         .RST            (reset)

     );

  end



7、代碼中(zhōng)對應的源語需要升級到ULTRASCALE_PLUS對應的部分(fēn)類似的地方:


localparam DELAY_VALUE    = ((CLKIN_PERIOD*1000)/6 <= 1100.0) ?(CLKIN_PERIOD*1000)/6 : 1100.0;

ULTRASCALE_PLUS maximumvalue for 1100.0

 

IDELAYE3 SIM_DEVICE(“ULTRASCALE_PLUS”), // Set the device version for simulationfunctionality (ULTRASCALE// ULTRASCALE_PLUS,recommended to re-call IDELAYE3 in the ULTRASCALE_PLUSdirectory



8、所以以模塊修完之後通過軟件仿真驗證修改的數據跟XAPP1315的數據對比,設計中(zhōng)采用(yòng)parameter  DATA_FORMAT = "PER_CLOCK",數據格式會安(ān)裝(zhuāng)PER_CLOCK方式排列LVDS Source Synchronous 6:1 Serializationand Deserialization Using Clock Multiplication。


blob.png


Xapp1315 LVDS Source Synchronous 7:1Serialization and Deserialization Using Clock Multiplication 仿真數據:


blob.png


綜上所述,通過數據比對分(fēn)析數據沒有(yǒu)問題,從而實現此功能(néng)。



深圳市科(kē)通技(jì )術股份有(yǒu)限公(gōng)司    客服電(diàn)話:(+86)755-26018083    郵箱:cs@comtech.cn

© Copyright 2018 www.comtech.cn | 京ICP證000000号 | 粵公(gōng)網安(ān)備 44030502003347号