0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Idelay對接收端時序進(jìn)行補(bǔ)救

冬至配餃子 ? 來源:Bug記錄 ? 作者:woodfan ? 2022-08-20 10:50 ? 次閱讀

在高速信號采集的過程中,經(jīng)常會因為電路設(shè)計或者其他原因,原本設(shè)計好對應(yīng)的data_clk與data經(jīng)過線路傳輸之后在接收端時序上不能很好的對應(yīng),這可能會造成采樣數(shù)據(jù)的錯位。

如果用了各種物理電路上的辦法都沒法解決后,可以嘗試使用Idelay(針對Xilinx,Altera應(yīng)該也有相應(yīng)的原語)。

Xilinx每個系列可能Idelay的名字會有一些差異,但差異不大,在K7系列下,Idelay的原語叫做Idelay2。

Idelay2原語示例:

(* IODELAY_GROUP = "RX_FRAME" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYE2 #(
.CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
.DELAY_SRC("DATAIN"), // Delay input (IDATAIN, DATAIN)
.HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
.IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(INIT_VALUE), // Input delay tap setting (0-31)
.PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
.SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
)
IDELAYE2_inst (
.CNTVALUEOUT(cnt_value), // 5-bit output: Counter value output
.DATAOUT(rx_frame_dly), // 1-bit output: Delayed data output
.C(sys_clk), // 1-bit input: Clock input
.CE(1'b0), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(tap_value), // 5-bit input: Counter value input
.DATAIN(rx_frame), // 1-bit input: Internal delay data input
.IDATAIN(1'b0), // 1-bit input: Data input from the I/O
.INC(1'b0), // 1-bit input: Increment / Decrement tap delay input
.LD(1'b1), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(1'b0), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(1'b0) // 1-bit input: Active-high reset tap-delay input
);

針對其中經(jīng)常用到的變量,功能如下:

DELAY_SRC常量,這個常量可以選DATAIN或IDATAIN,區(qū)別在于IDATAIN的數(shù)據(jù)輸入要求經(jīng)過BUF產(chǎn)生,常用于BUF的輸出信號,Input端口信號;DATAIN只要求FPGA內(nèi)部邏輯產(chǎn)生的信號就可以。

IDELAY_TYPE,設(shè)置IDELAY2的模式;FIXED代表延時值固定,一般用在確定好參數(shù)后使用,VARIBLE,VAR_LOAD,VAR_LOAD_PIPE都是動態(tài)改變延時值,VARIBLE可以自動增大減小,后兩個是根據(jù)CINVALUEIN端口動態(tài)改變延時值,一般選用VAR_LOAD。

IDELAY_VALUE,是初始化的值,在FIXED模式下,就是固定的延時值

REFCLK_FREQUENCY,指的Idelay的參考時鐘的頻率,一般選用200M,這個后面會具體講。

SIGNAL_PATTERN,這個有DATA和CLOCK兩個選項,影響Vivado對信號時序分析的路徑。

端口中,

CNTVALUEIN是設(shè)置延時值,用于手動調(diào)試;

CNTVALUEOUT輸出當(dāng)前延時值,便于調(diào)試觀測;

C是數(shù)據(jù)時鐘,但CE不是時鐘使能,而是延時值tap自動增加減少使能,所以我選擇拉低;

CINVCTRL,INC,LDPIPEEIN,REGRST不怎么用,全拉低;

在上面的DELAY_SRC選擇了哪一個,就在對應(yīng)的數(shù)據(jù)端口連接數(shù)據(jù),另一個數(shù)據(jù)端口拉低,比如DELAY_SRC設(shè)定為"DATAIN",選擇DATAIN端口輸入數(shù)據(jù),IDATAIN端口拉低;

因為需要手動調(diào)節(jié)延時值,所以LD拉高,只有LD拉高才能動態(tài)載入CNTVALUEIN的延時值

前面說到參考時鐘,Idelay之所以延時,CINVALUEIN對應(yīng)的延時值多少就跟這個地方有關(guān)系了,參考時鐘不是隨便設(shè)的,這跟另一個原語IDELAYCTRL有關(guān):

(* IODELAY_GROUP = "RX_FRAME" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYCTRL IDELAYCTRL_inst (
.RDY(idelay_rdy), // 1-bit output: Ready output
.REFCLK(ref_clk), // 1-bit input: Reference clock input
.RST(rst) // 1-bit input: Active high reset input
);


這個原語端口很少,連接對應(yīng)200M的參考時鐘,復(fù)位信號,輸出一個ready信號;

看起來這個原語并沒有什么有用的輸出;但其實它的作用是給Idelay2提供了延時的依據(jù);之所以可以精確延時并不是說我們在REFCLK_FREQUENCY填一個200就可以了,而是這個IDELAYCTRL 的作用,通過(* IODELAY_GROUP = "RX_FRAME" *)將IDELAYCTRL 和Idelay2連接起來,"RX_FRAME"類似于組名,可以隨意改,同一組的組名要一樣。

200MHz 對應(yīng)1個時鐘周期5ns,Idelay將其分為64tap,每個tap延時值大概是78ps,Idelay可調(diào)的最大tap為31,也就是延時值控制在0-31tap;

同樣,為了減小相同參考時鐘下Idelay2與IDELAYCTRL 的FPGA內(nèi)部走線延時,必須使用IODELAY_GROUP將它們綁定在一起,使用方法參考上面的做法。

注意,IDELAYCTRL 的REFCLK輸入時鐘一定要經(jīng)過BUFG輸出再接入。

效果:

沒加Idelay

pYYBAGMAS0CAYbmZAABKfq5RR0Y851.png

沒有加Idelay,并串轉(zhuǎn)換中找不到幀頭

加入Idelay

poYBAGMAS0mABuMvAABNQsJyH4I401.png

加了Idelay,找到幀頭

總結(jié):

使用方法都在上面,對于多bit信號可以使用generate for 生成塊。

調(diào)試這個的時候遇到過一個問題,C端口沒有連接到正常的時鐘,連接到一個根本沒有定義的信號,Vivado做好事不留名的直接幫我拉低到地,導(dǎo)致我在VAR_LOAD模式下一直無法正常改變延時值,CNTVALUEOUT與CINVALUEIN不正確,最后打開Schematic看RTL圖才找到問題。

這一系列都是Xilinx中SelectIO的內(nèi)容,包括I/ODDR,I/OBUFDS,下一篇就會講到ISERDES,并串轉(zhuǎn)換的一種用法,Idelay經(jīng)常與ISERDES一同出現(xiàn),解決高速串行通信上的問題。



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598994
  • 串行通信
    +關(guān)注

    關(guān)注

    4

    文章

    555

    瀏覽量

    35165
  • 高速信號
    +關(guān)注

    關(guān)注

    1

    文章

    214

    瀏覽量

    17649
收藏 人收藏

    評論

    相關(guān)推薦

    xilinx FPGA中oddr,idelay的用法詳解

    idelay2中按推薦配置,從DATAIN還是從IDATAIN輸入?yún)^(qū)別為是內(nèi)部延時還是從IO輸入,F(xiàn)IXED固定延時,idelay value先輸入0,,時鐘是200M,其他全部接0。
    的頭像 發(fā)表于 11-25 14:35 ?1.1w次閱讀

    時序優(yōu)化之接收打拍策略探討

    這篇文章是探討對接收進(jìn)行時序優(yōu)化(即ready打拍,或稱backward打拍)的方式。
    的頭像 發(fā)表于 12-04 10:20 ?488次閱讀
    <b class='flag-5'>時序</b>優(yōu)化之<b class='flag-5'>接收</b><b class='flag-5'>端</b>打拍策略探討

    請問AD7626與FPGA如何對接?

    D+/-后如何進(jìn)行字節(jié)對齊? 在自時候總模式下,AD7626要求接收能夠動態(tài)的選擇采樣時鐘相位,這在FPGA也是無法做到的。 請問有沒有比較好的通過FPGA與AD7626對接的方
    發(fā)表于 12-22 06:34

    高速電路的時序分析

    正確收發(fā)數(shù)據(jù),從而使系統(tǒng)不能正常工作。隨著系統(tǒng)時鐘頻率的不斷提高和信號邊沿不斷變陡,系統(tǒng)對時序有更高的要求,一方面留給數(shù)據(jù)傳輸?shù)挠行ёx寫窗口越來越小,另一方面,傳輸延時要考慮的因素增多,要想在很短的時間限制里,讓數(shù)據(jù)信號從驅(qū)動完整地傳送到
    發(fā)表于 08-02 22:26

    基于Labview對接收到的TCP數(shù)據(jù)進(jìn)行頻譜檢測

    包含Server和Client,Client端接收到TCP數(shù)據(jù)后,經(jīng)過數(shù)據(jù)轉(zhuǎn)換,在經(jīng)過FFT處理、邊界檢測后進(jìn)行頻譜測量
    發(fā)表于 06-23 15:22

    如何為設(shè)計計算IDELAY_VALUE的值?

    我在sp601板上使用tri-ethernet-mac示例。gmii接收器接口使用IODELAY2原語來延遲接收器側(cè)的輸入信號。vhdl代碼提到應(yīng)該根據(jù)設(shè)計在ucf中更改IDELAY_VALUE。我
    發(fā)表于 05-28 06:40

    怎么對接收串口的數(shù)據(jù)進(jìn)行處理?

    要編個程序,只要是接收串口的數(shù)據(jù),接收串口數(shù)據(jù)的格式是:AA 73 XX XX XX XX CC 33 C3 3C,后面沒有回車。只要是接收到該格式的數(shù)據(jù)后對XX XX XX XX進(jìn)行
    發(fā)表于 07-31 02:45

    如何將IDELAY與IOBUF一起使用?

    大家好,我正在使用IDELAY原語來實現(xiàn)DDR的DQ和DQS延遲。這是我的代碼:IOBUF pad_xb_dq7(.O(bus_data_in_flh [7]),. IO(xb_dq [7
    發(fā)表于 06-01 16:57

    請問時鐘輸入上的Virtex 7 IDELAY會導(dǎo)致占空比失真嗎?

    我正在構(gòu)建一個使用IDELAYS進(jìn)行訓(xùn)練的DDR總線輸入(找到有效的窗口和采樣點)。我必須在時鐘輸入上使用IDELAY,以適當(dāng)?shù)囟ㄎ贿吘墶?PLL不是一個選項,因為時鐘停止和啟動。我的問題是輸入
    發(fā)表于 07-15 06:06

    怎樣去設(shè)計SpaeeWire Codec接收時序?

    SpaceWire Codec接收是什么?怎樣去設(shè)計SpaeeWire Codec接收時序?時鐘域可劃分為哪幾個模塊?如何實現(xiàn)多時鐘域
    發(fā)表于 04-08 07:10

    如何利用STM32對接收的數(shù)據(jù)進(jìn)行拆幀組碼?

    如何利用STM32對接收的數(shù)據(jù)進(jìn)行拆幀組碼?
    發(fā)表于 12-09 08:00

    對接收一幀含有多個字節(jié)的不定長數(shù)據(jù)接收方式進(jìn)行討論

    在使用串口接收其他設(shè)備的數(shù)據(jù)時,應(yīng)該針對數(shù)據(jù)的特點,譬如單字節(jié)與多字節(jié)、數(shù)據(jù)量大小、速度等,采用不同的接收方式。下面針對接收一幀含有多個字節(jié)的不定長數(shù)據(jù)接收方式
    發(fā)表于 12-09 07:16

    微波無線傳能系統(tǒng)中,增減接收數(shù)量會對接收功率有影響嗎?

    假設(shè)在一個室內(nèi)、空曠的微波無線傳能系統(tǒng)中,發(fā)射的發(fā)射功率固定,采用定向發(fā)射的方式將微波傳送到固定的接收。此時在能量傳輸?shù)闹靼昊蛘吲园曛屑尤肱c接收
    發(fā)表于 09-25 09:37

    新器件需要對接收機(jī)體系結(jié)構(gòu)進(jìn)行硬件比較

    新器件需要對接收機(jī)體系結(jié)構(gòu)進(jìn)行硬件比較
    發(fā)表于 05-12 13:44 ?0次下載
    新器件需要<b class='flag-5'>對接收</b>機(jī)體系結(jié)構(gòu)<b class='flag-5'>進(jìn)行</b>硬件比較

    Idelay時序補(bǔ)救

    在高速信號采集的過程中,經(jīng)常會因為電路設(shè)計或者其他原因,原本設(shè)計好對應(yīng)的data_clk與data經(jīng)過線路傳輸之后在接收時序上不能很好的對應(yīng),這可能會造成采樣數(shù)據(jù)的錯位。
    的頭像 發(fā)表于 06-16 11:26 ?1890次閱讀
    <b class='flag-5'>Idelay</b>對<b class='flag-5'>時序</b>的<b class='flag-5'>補(bǔ)救</b>