在高速信號(hào)采集的過(guò)程中,經(jīng)常會(huì)因?yàn)?a target="_blank">電路設(shè)計(jì)或者其他原因,原本設(shè)計(jì)好對(duì)應(yīng)的data_clk與data經(jīng)過(guò)線路傳輸之后在接收端時(shí)序上不能很好的對(duì)應(yīng),這可能會(huì)造成采樣數(shù)據(jù)的錯(cuò)位。
如果用了各種物理電路上的辦法都沒(méi)法解決后,可以嘗試使用Idelay(針對(duì)Xilinx,Altera應(yīng)該也有相應(yīng)的原語(yǔ))。
Xilinx每個(gè)系列可能Idelay的名字會(huì)有一些差異,但差異不大,在K7系列下,Idelay的原語(yǔ)叫做Idelay2。
Idelay2原語(yǔ)示例:
(* 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
);
針對(duì)其中經(jīng)常用到的變量,功能如下:
DELAY_SRC常量,這個(gè)常量可以選DATAIN或IDATAIN,區(qū)別在于IDATAIN的數(shù)據(jù)輸入要求經(jīng)過(guò)BUF產(chǎn)生,常用于BUF的輸出信號(hào),Input端口信號(hào);DATAIN只要求FPGA內(nèi)部邏輯產(chǎn)生的信號(hào)就可以。
IDELAY_TYPE,設(shè)置IDELAY2的模式;FIXED代表延時(shí)值固定,一般用在確定好參數(shù)后使用,VARIBLE,VAR_LOAD,VAR_LOAD_PIPE都是動(dòng)態(tài)改變延時(shí)值,VARIBLE可以自動(dòng)增大減小,后兩個(gè)是根據(jù)CINVALUEIN端口動(dòng)態(tài)改變延時(shí)值,一般選用VAR_LOAD。
IDELAY_VALUE,是初始化的值,在FIXED模式下,就是固定的延時(shí)值
REFCLK_FREQUENCY,指的Idelay的參考時(shí)鐘的頻率,一般選用200M,這個(gè)后面會(huì)具體講。
SIGNAL_PATTERN,這個(gè)有DATA和CLOCK兩個(gè)選項(xiàng),影響Vivado對(duì)信號(hào)時(shí)序分析的路徑。
端口中,
CNTVALUEIN是設(shè)置延時(shí)值,用于手動(dòng)調(diào)試;
CNTVALUEOUT輸出當(dāng)前延時(shí)值,便于調(diào)試觀測(cè);
C是數(shù)據(jù)時(shí)鐘,但CE不是時(shí)鐘使能,而是延時(shí)值tap自動(dòng)增加減少使能,所以我選擇拉低;
CINVCTRL,INC,LDPIPEEIN,REGRST不怎么用,全拉低;
在上面的DELAY_SRC選擇了哪一個(gè),就在對(duì)應(yīng)的數(shù)據(jù)端口連接數(shù)據(jù),另一個(gè)數(shù)據(jù)端口拉低,比如DELAY_SRC設(shè)定為"DATAIN",選擇DATAIN端口輸入數(shù)據(jù),IDATAIN端口拉低;
因?yàn)樾枰謩?dòng)調(diào)節(jié)延時(shí)值,所以LD拉高,只有LD拉高才能動(dòng)態(tài)載入CNTVALUEIN的延時(shí)值
前面說(shuō)到參考時(shí)鐘,Idelay之所以延時(shí),CINVALUEIN對(duì)應(yīng)的延時(shí)值多少就跟這個(gè)地方有關(guān)系了,參考時(shí)鐘不是隨便設(shè)的,這跟另一個(gè)原語(yǔ)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
);
這個(gè)原語(yǔ)端口很少,連接對(duì)應(yīng)200M的參考時(shí)鐘,復(fù)位信號(hào),輸出一個(gè)ready信號(hào);
看起來(lái)這個(gè)原語(yǔ)并沒(méi)有什么有用的輸出;但其實(shí)它的作用是給Idelay2提供了延時(shí)的依據(jù);之所以可以精確延時(shí)并不是說(shuō)我們?cè)赗EFCLK_FREQUENCY填一個(gè)200就可以了,而是這個(gè)IDELAYCTRL 的作用,通過(guò)(* IODELAY_GROUP = "RX_FRAME" *)將IDELAYCTRL 和Idelay2連接起來(lái),"RX_FRAME"類(lèi)似于組名,可以隨意改,同一組的組名要一樣。
200MHz 對(duì)應(yīng)1個(gè)時(shí)鐘周期5ns,Idelay將其分為64tap,每個(gè)tap延時(shí)值大概是78ps,Idelay可調(diào)的最大tap為31,也就是延時(shí)值控制在0-31tap;
同樣,為了減小相同參考時(shí)鐘下Idelay2與IDELAYCTRL 的FPGA內(nèi)部走線延時(shí),必須使用IODELAY_GROUP將它們綁定在一起,使用方法參考上面的做法。
注意,IDELAYCTRL 的REFCLK輸入時(shí)鐘一定要經(jīng)過(guò)BUFG輸出再接入。
效果:
沒(méi)加Idelay
沒(méi)有加Idelay,并串轉(zhuǎn)換中找不到幀頭
加入Idelay
加了Idelay,找到幀頭
總結(jié):
使用方法都在上面,對(duì)于多bit信號(hào)可以使用generate for 生成塊。
調(diào)試這個(gè)的時(shí)候遇到過(guò)一個(gè)問(wèn)題,C端口沒(méi)有連接到正常的時(shí)鐘,連接到一個(gè)根本沒(méi)有定義的信號(hào),Vivado做好事不留名的直接幫我拉低到地,導(dǎo)致我在VAR_LOAD模式下一直無(wú)法正常改變延時(shí)值,CNTVALUEOUT與CINVALUEIN不正確,最后打開(kāi)Schematic看RTL圖才找到問(wèn)題。
這一系列都是Xilinx中SelectIO的內(nèi)容,包括I/ODDR,I/OBUFDS,下一篇就會(huì)講到ISERDES,并串轉(zhuǎn)換的一種用法,Idelay經(jīng)常與ISERDES一同出現(xiàn),解決高速串行通信上的問(wèn)題。
審核編輯:劉清
-
FPGA
+關(guān)注
關(guān)注
1643文章
21925瀏覽量
612411 -
串行通信
+關(guān)注
關(guān)注
4文章
584瀏覽量
35951 -
高速信號(hào)
+關(guān)注
關(guān)注
1文章
236瀏覽量
17950
發(fā)布評(píng)論請(qǐng)先 登錄
xilinx FPGA中oddr,idelay的用法詳解
請(qǐng)問(wèn)AD7626與FPGA如何對(duì)接?
高速電路的時(shí)序分析
基于Labview對(duì)接收到的TCP數(shù)據(jù)進(jìn)行頻譜檢測(cè)
如何為設(shè)計(jì)計(jì)算IDELAY_VALUE的值?
怎么對(duì)接收串口的數(shù)據(jù)進(jìn)行處理?
如何將IDELAY與IOBUF一起使用?
請(qǐng)問(wèn)時(shí)鐘輸入上的Virtex 7 IDELAY會(huì)導(dǎo)致占空比失真嗎?
怎樣去設(shè)計(jì)SpaeeWire Codec接收端的時(shí)序?
如何利用STM32對(duì)接收的數(shù)據(jù)進(jìn)行拆幀組碼?
針對(duì)接收一幀含有多個(gè)字節(jié)的不定長(zhǎng)數(shù)據(jù)接收方式進(jìn)行討論
微波無(wú)線傳能系統(tǒng)中,增減接收端數(shù)量會(huì)對(duì)接收功率有影響嗎?
新器件需要對(duì)接收機(jī)體系結(jié)構(gòu)進(jìn)行硬件比較

Idelay對(duì)時(shí)序的補(bǔ)救

評(píng)論