在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

ISERDESE2原語(yǔ)端口及參數(shù)介紹

FPGA技術(shù)江湖 ? 來(lái)源:數(shù)字站 ? 2025-03-17 10:52 ? 次閱讀

來(lái)源:數(shù)字站

前面在講解HDMI接口之前,講解過(guò)IDDR、ODDR、OSERDESE2、IBUF等原語(yǔ),之后一直有讀者在問(wèn)什么時(shí)候更新ISERDESE2這個(gè)原語(yǔ)。前文講解過(guò)這些原語(yǔ)都在HDMI或者RGMII中使用過(guò),但是ISERDESE2這個(gè)原語(yǔ)目前我的板子除了HDMI輸入,其余并不會(huì)使用到,所以當(dāng)時(shí)就沒(méi)有出。

最近在網(wǎng)上看并沒(méi)有用戶對(duì)ISERDESE2的使用講解的很清晰,所以本文就通過(guò)手冊(cè)、仿真和ILA去講解一下這個(gè)原語(yǔ)的使用方式,希望對(duì)大家的使用有所幫助。

01ISERDESE2的功能

ISERDESE2就是一個(gè)串并轉(zhuǎn)換的模塊,支持單沿或者雙沿傳輸數(shù)據(jù),其實(shí)ISERDESE2和IDDR使用的是同一個(gè)器件,所以均有雙沿轉(zhuǎn)單沿的功能,這可以在vivado綜合后的布局布線中查看,也是同一管腳輸入的信號(hào)不能同時(shí)使用IDDR和ISERDESE2的原因。

理想情況如下圖所示,并行輸出的數(shù)據(jù)就剛好被ISERDESE2采集,進(jìn)而完成串并轉(zhuǎn)換,然而真實(shí)情況是這樣嗎?

wKgZO2fXjwuAcJHrAABOWA1u7Es976.png

圖1 理想情況串并轉(zhuǎn)換

由于器件上電和初始化等等原因,實(shí)際的情況更可能如下圖所示,并串轉(zhuǎn)換模塊工作時(shí),串并轉(zhuǎn)換模塊還沒(méi)有工作,導(dǎo)致并串轉(zhuǎn)換模塊輸出的前幾個(gè)數(shù)據(jù)丟失,下圖中前面黑框中三個(gè)串行數(shù)據(jù)丟失。

此時(shí)串并轉(zhuǎn)換模塊就只能從后面黃色框中依次取八個(gè)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,由此轉(zhuǎn)換出的數(shù)據(jù)會(huì)是正常的數(shù)據(jù)?

顯然不是,因此在串并轉(zhuǎn)換模塊正常工作的初期,往往需要對(duì)轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行判斷,如果轉(zhuǎn)換后的數(shù)據(jù)不對(duì),則需要將ISERDESE2轉(zhuǎn)換的起始位置更改,直到轉(zhuǎn)換后的數(shù)據(jù)正確為止,之后數(shù)據(jù)的數(shù)據(jù)才是有效的。

這個(gè)校準(zhǔn)的過(guò)程需要用戶通過(guò)ISERDESE2的BITSLIP引腳去完成,在校準(zhǔn)的過(guò)程中,輸入端必須一直循環(huán)輸入一個(gè)校準(zhǔn)序列,就像下圖中一直輸入8’h5c和8’h82組成的序列一樣,這是相對(duì)于其他原語(yǔ)會(huì)難一點(diǎn)的地方。

wKgZPGfXjwyAPVhOAABPCpNQ5Ho435.png

圖2 真實(shí)情況串并轉(zhuǎn)換

通過(guò)上面知道了ISERDESE2原語(yǔ)需要解決的問(wèn)題后,下面就通過(guò)手冊(cè)講解原語(yǔ)的各個(gè)端口以及參數(shù),后面通過(guò)仿真驗(yàn)證前面所說(shuō)的原因。

02 ISERDESE2原語(yǔ)端口及參數(shù)

PART2.1

ISERDESE2端口信號(hào)

下圖是ISERDESE2的框圖。

wKgZPGfXjwyATbvbAAGuccRyOuA203.png

圖3 ISERDESE2框圖

Q1~Q8:ISERDESE2模塊的并行輸出數(shù)據(jù),其中Q8是最先輸入的串行數(shù)據(jù)位。一個(gè)ISERDESE2塊最多輸出8位并行數(shù)據(jù),在DDR雙沿采樣模式下,兩個(gè)ISERDESE2塊級(jí)聯(lián)可以輸出10位和14位并行數(shù)據(jù)。

Q8是接收到的最低位數(shù)據(jù),如下圖所示,OSERDESE2將8位從高到低為HGFEDCBA的并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù)輸出,最先輸出最低位D1的值A(chǔ)。當(dāng)ISERDESE2塊接收串行數(shù)據(jù)時(shí),Q1出現(xiàn)最高位,Q8出現(xiàn)最低位。

wKgZO2fXjwyALtvdAAGigfDgp7Q276.png

圖4 ISERDESE2接收數(shù)據(jù)

端口O:由圖3知,該端口直接連接到串行輸入的幾個(gè)端口,并沒(méi)有經(jīng)過(guò)ISERDESE2核心邏輯,可以把D或DDLY的數(shù)據(jù)直接輸出。

SHIFTIN1、SHIFTIN2、SHIFTOUT1和SHIFTOUT2與OSERDESE2中該信號(hào)的原理一致,都是在兩個(gè)OSERDESE2級(jí)聯(lián)的時(shí)候,把從OSERDESE2的SHIFTOUT與主OSERDESE2的SHIFTIN連接。

ISERDESE2的輸入可以來(lái)自FPGA的管腳,即D端輸入信號(hào)。也可以來(lái)自IDELAYE2的輸出,即DDLY端口作為輸入。還可以來(lái)自O(shè)SERDESE2的輸出,即OFB作為輸入,與OSERDESE2連接方式如下所示,兩個(gè)器件的OFB信號(hào)相連即可。

wKgZPGfXjwyAESX5AABQqYOVML8262.png

圖5 ISERDESE2與OSERDESE2連接

ISERDESE2與OSERDESE2連接時(shí)需要添加“OFB_USED = TRUE ”屬性,并且ISERDESE2和OSERDESE2的DATA_RATE、DATA_WIDTH參數(shù)必須設(shè)置一致。

高速時(shí)鐘輸入CLK,與串行數(shù)據(jù)流對(duì)齊。

輔助時(shí)鐘輸入CLKB,在MEMORY_QDR模式下,CLKB應(yīng)連接到唯一的相移時(shí)鐘,其余模式下,CLKB連接到CLK取反信號(hào)。

分頻時(shí)鐘CLKDIV,用于驅(qū)動(dòng)串并轉(zhuǎn)換器、Bitslip子模塊和CE模塊的輸出,與輸出的并行數(shù)據(jù)對(duì)齊。

SDR模式下,如果輸出的X位并行數(shù)據(jù),那么CLKDIV的頻率是CLK頻率的1/X,如果是DDR模式,則CLKDIV的頻率是CLK頻率的2/X。

手冊(cè)要求CLK和CLKDIV的相位必須對(duì)齊,一般推薦兩種連接方式,一種如下所示,時(shí)鐘輸入管腳通過(guò)BUFIO之后直接作為串行輸入數(shù)據(jù)的時(shí)鐘信號(hào),BUFIO優(yōu)點(diǎn)就是路徑短,延時(shí)小,缺點(diǎn)就是只能驅(qū)動(dòng)當(dāng)前時(shí)鐘區(qū)域的IDDR和ISERDESE2的時(shí)鐘管腳。而并行時(shí)鐘需要通過(guò)BUFR進(jìn)行分頻,分頻系數(shù)根據(jù)并行數(shù)據(jù)位寬和工作模式確定。

關(guān)于BUFIO和BUFR的相關(guān)使用,可以查看前文關(guān)于時(shí)鐘資源相關(guān)原語(yǔ)的講解,清晰講解過(guò)BUFG、BUFIO、BUFR、BUFH、BUFMR的使用。

wKgZPGfXjwyAFSCDAABhVomE7ko111.png

圖6 時(shí)鐘推薦

另一種就是通過(guò)同一個(gè)MMCM產(chǎn)生CLK和CLKDIV兩路時(shí)鐘信號(hào),這種方式更常用。原因是BUFIO和BUFR需要用戶提供高頻串行時(shí)鐘,如果需要幾百M(fèi)的串行時(shí)鐘,顯然用戶的外部晶振一般是無(wú)法提供的。

時(shí)鐘使能CE1和CE2,與參數(shù)NUM_CE的值有關(guān)。當(dāng)NUM_CE為1時(shí),使用CE1作為時(shí)鐘使能信號(hào)。當(dāng)NUM_CE為2時(shí),當(dāng)CLK_DIV為低電平時(shí),CE2作為時(shí)鐘使能信號(hào),當(dāng)CLK_DIV為高電平時(shí),CE1作為時(shí)鐘使能信號(hào),對(duì)應(yīng)真值表如下圖所示。pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg

wKgZO2fXjwyAQsxkAAEmCYNASTs411.png

圖7 輸入時(shí)鐘使能模塊

BITSLIP引腳在高電平時(shí)執(zhí)行與CLKDIV同步的移位操作,后文詳解。

RST復(fù)位信號(hào),高電平有效,推薦退出復(fù)位時(shí)間與CLKDIV同步。

過(guò)采樣模式時(shí)鐘OCLK,僅當(dāng)INTERFACE_TYPE設(shè)置不為NETWORKING,才會(huì)使用OCLK時(shí)鐘。

PART2.2

ISERDESE2原語(yǔ)參數(shù)

上述就是ISERDESE2原語(yǔ)相關(guān)的端口信號(hào),下面講解ISERDESE2原語(yǔ)的參數(shù)。

DATA_RATE用于設(shè)置ISERDESE2工作模式,可選擇單沿工作模式(SDR)和雙沿工作模式(DDR),默認(rèn)DDR模式。

DATA_WIDTH用于設(shè)置輸出并行數(shù)據(jù)位寬,取決于DATA_RATE和INTERFACE_TYPE的設(shè)置。如下圖所示,SDR模式下可以設(shè)置為2、3、4、5、6、7、8。DDR模式下單個(gè)ISERDESE2塊只能設(shè)置為4、6、8,兩個(gè)ISERDESE2塊級(jí)聯(lián)可以設(shè)置為10、14。

wKgZPGfXjwyAH40FAAD1nSCG6gA065.png

圖8 支持的數(shù)據(jù)寬度

INTERFACE_TYPE參數(shù)決定ISERDESE2是配置為內(nèi)存模式還是網(wǎng)絡(luò)模式。可選的值有MEMORY、MEMORY_DDR3、MEMORY_QDR、OVERSAMPLE、NETWORKING,默認(rèn)模式是MEMORY,常用NETWORKING模式。

NUM_CE參數(shù)定義使用的時(shí)鐘使能(CE1和CE2)數(shù)量,可設(shè)為1和2(默認(rèn)值為2)。

OFB_USED參數(shù)使能從OSERDESE2的OFB引腳到ISERDESE2 OFB引腳的路徑,禁用外部管腳輸入D和IDELAYE2的輸入DLY。

當(dāng)使用DDR模式進(jìn)行10位或者14位并行數(shù)據(jù)轉(zhuǎn)換時(shí),需要將兩個(gè)模塊級(jí)聯(lián),此時(shí)需要通過(guò)參數(shù)SERDES_MODE確定哪個(gè)是主ISERDESE2,哪個(gè)是從ISERDESE2。

INIT_Qn用于設(shè)置第n個(gè)采樣寄存器的初始值,而SRVAL_Qn用于設(shè)置復(fù)位第n個(gè)采樣寄存器后的值。

由圖3知D和DDLY都是ISERDESE2的專用輸入,D直接連接到IOB(直接與管腳相連),DDLY直接連接到IDELAYE2(在ISERDESE2和管腳之間有IDELAYE2加入延遲)。

允許用戶把延遲或非延遲的外部管腳輸入信號(hào)作為ISERDESE2輸入,通過(guò)參數(shù)IOBDELAY確定D和DDLY哪個(gè)作為ISERDESE2的輸入,下圖是IOBDELAY參數(shù)與輸入信號(hào)的關(guān)系,經(jīng)常設(shè)置位NONE,將外部管腳信號(hào)作為ISERDESE2串行數(shù)據(jù)輸入。

wKgZO2fXjwyAUZS-AACuvHuS6t0545.png

pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg圖9 IOBDELAY參數(shù)值

03位滑塊(BITSLIP)

這個(gè)信號(hào)就是進(jìn)行校準(zhǔn)的關(guān)鍵信號(hào),如果沒(méi)有這個(gè)信號(hào),那么ISERDESE2的輸出數(shù)據(jù)其實(shí)沒(méi)有意義,很大可能是錯(cuò)誤的。

通過(guò)拉高ISERDESE2模塊的Bitslip信號(hào),輸入的串行數(shù)據(jù)流在并行端重新排序,Bitslip與CLKDIV同步。

下圖說(shuō)明了SDR和DDR模式下位滑移操作對(duì)數(shù)據(jù)采樣的影響,ISERDESE2的數(shù)據(jù)寬度是八。在SDR模式下,每次Bitslip拉高都會(huì)導(dǎo)致輸出數(shù)據(jù)左移一位。在DDR模式下,每次Bitslip拉高都會(huì)導(dǎo)致輸出數(shù)據(jù)在右移1位和左移3位之間交替變化。

wKgZPGfXjwyABQbfAAGAt8KpgfA962.png

圖10 位滑移操作示例

上述操作其實(shí)可以看成下圖所示的操作,上電后因?yàn)槌跏蓟Y(jié)束比較晚等原因,ISERDESE2錯(cuò)過(guò)了下圖黑框中前三位數(shù)據(jù)的采集時(shí)刻,從紅框處開(kāi)始取數(shù)據(jù)進(jìn)行轉(zhuǎn)換。pYYBAGORftaABrbPAAAAjgjvZ2U927.jpg

wKgZPGfXjwuAak7QAABPnRAmis8259.png

圖11 采集數(shù)據(jù)

轉(zhuǎn)換結(jié)果為8’he4,并不是8’h5c或者8’h82,此時(shí)將Bitslip拉高一個(gè)CLKDIV時(shí)鐘周期,則ISERDESE2會(huì)將下次采集數(shù)據(jù)的位置向后移動(dòng)一位,如下圖所示。

本來(lái)第二次轉(zhuǎn)換應(yīng)該從下圖中天藍(lán)色方框開(kāi)始,因?yàn)锽itslip拉高一個(gè)時(shí)鐘,就會(huì)將開(kāi)始位置向后移動(dòng)一位,從紅框處開(kāi)始轉(zhuǎn)換,轉(zhuǎn)換結(jié)果繼續(xù)與目標(biāo)結(jié)果對(duì)比,如果不是,則繼續(xù)拉高Bitslip,直到ISERDESE2的輸出是8’h5c或者8’h82為止。

wKgZO2fXjwyAGol8AABY57AsXuU985.png

圖12 采集數(shù)據(jù)

其實(shí)用戶并不需要關(guān)心Bitslip為高電平后,SDR和DDR模式下,輸出數(shù)據(jù)怎么移動(dòng),只需要在這段校準(zhǔn)的時(shí)間內(nèi)保證輸入串行數(shù)據(jù)一直都是8’h5c或者8’h82即可,然后去檢測(cè)ISERDESE2的輸出是不是8’h5c或者8’h82,不是則拉高Bitslip將轉(zhuǎn)換開(kāi)始的位置移動(dòng),直到找到開(kāi)始轉(zhuǎn)換的位置為止。

只有當(dāng)ISERDESE2處于網(wǎng)絡(luò)模式(NETWORKING)下,位滑塊(BITSLIP)才可用。Bitslip每次只能拉高一個(gè)CLKDIV周期,不能在兩個(gè)CLKDIV周期內(nèi)連續(xù)拉高Bitslip信號(hào)。

在SDR和DDR模式下,從ISERDESE2檢測(cè)到Bitslip的高電平開(kāi)始,到ISERDESE2把Bitslip移動(dòng)后的數(shù)據(jù)輸出到Q1–Q8引腳為止,延遲時(shí)間為兩個(gè)CLKDIV周期。

在分析接收到的數(shù)據(jù)模式并可能發(fā)出下一個(gè)Bitslip命令之前,用戶邏輯應(yīng)在SDR模式下等待至少兩個(gè)CLKDIV周期,在DDR模式下等待至少三個(gè)CLKDIV周期。

綜上Bitslip拉高后,需要等待至少三個(gè)時(shí)鐘周期,才能檢測(cè)并行輸出結(jié)果是否與預(yù)期一致,進(jìn)而確定是否通過(guò)拉高Bitslip信號(hào)繼續(xù)調(diào)整輸出。

下圖是4位并行數(shù)據(jù)的DDR模式下Bitslip的時(shí)序圖,數(shù)據(jù)(D)重復(fù)的4位串行數(shù)據(jù)ABCD。ABCD可能以四種方式出現(xiàn)在ISERDESE2的Q1–Q4并行輸出端:ABCD、BCDA、CDAB和DABC,只有ABCD才是正確的輸出。

拉高Bitslip信號(hào)選擇所需的對(duì)齊方式(ABCD),下圖顯示了Bitslip的時(shí)序以及ISERDESE2并行輸出Q1–Q4的校準(zhǔn)時(shí)序。

wKgZO2fXjwuAClUeAADu_02cZ14241.png

圖13 DDR Bitslip功能圖

注意上圖在Bitslip拉高后的第三個(gè)時(shí)鐘,Q4-Q1才輸出移位后的轉(zhuǎn)換結(jié)果,與前文的延時(shí)一致。

04代碼設(shè)計(jì)

本文利用OSERDESE2和ISERDESE2回環(huán),來(lái)驗(yàn)證前文所講ISERDESE2和Bitslip的功能。ISERDESE2采用網(wǎng)絡(luò)模式(NETWORKING),選擇DDR的串行采樣方式,并行數(shù)據(jù)位寬為8位。

OSERDESE2相關(guān)模塊如下圖所示,用于產(chǎn)生測(cè)試的并行數(shù)據(jù),然后轉(zhuǎn)換為串行數(shù)據(jù),對(duì)應(yīng)代碼如下所示。

通過(guò)一個(gè)計(jì)數(shù)器cnt,上電后前64個(gè)時(shí)鐘周期用于產(chǎn)生用于校準(zhǔn)的序列,為8’h5c和8’h82交替發(fā)送的串行序列。當(dāng)校準(zhǔn)序列發(fā)送完畢后,通過(guò)m序列生成偽隨機(jī)數(shù)據(jù)用于測(cè)試。

//--###############################################################################################
//--#
//--# File Name  : oserdese2_ctrl
//--# Designer  : 數(shù)字站
//--# Tool   : Vivado 2021.1
//--# Design Date : 2024.4.4
//--# Description : 并串轉(zhuǎn)換數(shù)據(jù)生成模塊;
//--# Version  : 0.0
//--# Coding scheme : GBK(If the Chinese comment of the file is garbled, please do not save it and check whether the file is opened in GBK encoding mode)
//--#
//--###############################################################################################
module oserdese2_ctrl(
  input      clk     ,//系統(tǒng)時(shí)鐘信號(hào);
  input      clk_div   ,
  input      rst     ,//系統(tǒng)復(fù)位信號(hào),高電平有效;


  output     ofb     //直連iserdese2的OFB管腳。
);
  reg       flag  ;//
  reg [7:0]   cnt   ;//
  reg [7:0]   din   ;//


 //輔助生成測(cè)試信號(hào);
  always@(posedge clk_div)begin
   if(rst)begin//初始值為0;
      flag<=?1'b0;
? ? ? ? end
? ? ? ??else?begin
? ? ? ? ? ? flag?<=?~flag;
? ? ? ? end
? ? end
? ??
? ??//用于對(duì)校準(zhǔn)序列個(gè)數(shù)進(jìn)行計(jì)數(shù)。
? ? always@(posedge clk_div)begin
? ? ? ??if(rst)begin//初始值為0;
? ? ? ? ? ? cnt?<=?'d0;
? ? ? ? end
? ? ? ??else?if(&cnt)begin
? ? ? ? ? ? cnt?<=?cnt;
? ? ? ? end
? ? ? ??else?begin
? ? ? ? ? ? cnt?<=?cnt?+?1;
? ? ? ? end
? ? end


? ??//生成用于校準(zhǔn)的循環(huán)數(shù)據(jù);
? ? always@(posedge clk_div)begin
? ? ? ??if(rst)begin//初始值為0;
? ? ? ? ? ? din?<=?8'h82;
? ? ? ? end
? ? ? ??else?if(&cnt)begin//如果校準(zhǔn)序列發(fā)送完畢,則發(fā)送偽隨機(jī)信號(hào)用于測(cè)試。
? ? ? ? ? ? din?<=?{(din[0]?^?din[4]?^?din[5]?^?din[6]),din[7:1]};//M序列公式為x^8+x^4+x^3+x^2+1。
? ? ? ? end
? ? ? ??else?if(flag)begin//發(fā)送校準(zhǔn)序列8'h5c;
? ? ? ? ? ? din?<=?8'h5c;
? ? ? ? end
? ? ? ??else?begin//發(fā)送校準(zhǔn)序列8'h82.
? ? ? ? ? ? din?<=?8'h82;
? ? ? ? end
? ? end


? ??//例化主OSERDESE2原語(yǔ)
? ??OSERDESE2?#(
? ? ? ? .DATA_RATE_OQ? ?(?"DDR"? ? ?),// DDR, SDR
? ? ? ? .DATA_RATE_TQ? ?(?"DDR"? ? ?),// DDR, BUF, SDR
? ? ? ? .DATA_WIDTH? ? ?(?8? ? ? ? ?),// Parallel data width (2-8,10,14)
? ? ? ? .INIT_OQ? ? ? ? (?1'b0 ? ? ?),// Initial value of OQ output (1'b0,1'b1)
? ? ? ? .INIT_TQ? ? ? ? (?1'b0 ? ? ?),// Initial value of TQ output (1'b0,1'b1)
? ? ? ? .SERDES_MODE? ? (?"MASTER"? ),// MASTER, SLAVE
? ? ? ? .SRVAL_OQ? ? ? ?(?1'b0 ? ? ?),// OQ output value when SR is used (1'b0,1'b1)
? ? ? ? .SRVAL_TQ? ? ? ?(?1'b0 ? ? ?),// TQ output value when SR is used (1'b0,1'b1)
? ? ? ? .TBYTE_CTL? ? ? (?"FALSE"? ?),// Enable tristate byte operation (FALSE, TRUE)
? ? ? ? .TBYTE_SRC? ? ? (?"FALSE"? ?),// Tristate byte source (FALSE, TRUE)
? ? ? ? .TRISTATE_WIDTH?(?1? ? ? ? ?)?// 3-state converter width (1,4)
? ? )
? ??OSERDESE2_inst?(
? ? ? ? .OFB? ? ? ? ( ofb ? ? ? ? ? ),// 1-bit output: Feedback path for data
? ? ? ? .OQ? ? ? ? ?( ? ? ? ? ? ? ? ),// 1-bit output: Data path output
? ? ? ??// SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
? ? ? ? .SHIFTOUT1? ( ? ? ? ? ? ? ? ),
? ? ? ? .SHIFTOUT2? ( ? ? ? ? ? ? ? ),
? ? ? ? .TBYTEOUT? ?( ? ? ? ? ? ? ? ),// 1-bit output: Byte group tristate
? ? ? ? .TFB? ? ? ? ( ? ? ? ? ? ? ? ),// 1-bit output: 3-state control
? ? ? ? .TQ? ? ? ? ?( ? ? ? ? ? ? ? ),// 1-bit output: 3-state control
? ? ? ? .CLK? ? ? ? ( clk ? ? ? ? ? ),// 1-bit input: High speed clock
? ? ? ? .CLKDIV? ? ?( clk_div ? ? ? ),// 1-bit input: Divided clock
? ? ? ??// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
? ? ? ? .D1? ? ? ? ?( din[0] ? ? ? ?),
? ? ? ? .D2? ? ? ? ?( din[1] ? ? ? ?),
? ? ? ? .D3? ? ? ? ?( din[2] ? ? ? ?),
? ? ? ? .D4? ? ? ? ?( din[3] ? ? ? ?),
? ? ? ? .D5? ? ? ? ?( din[4] ? ? ? ?),
? ? ? ? .D6? ? ? ? ?( din[5] ? ? ? ?),
? ? ? ? .D7? ? ? ? ?( din[6] ? ? ? ?),
? ? ? ? .D8? ? ? ? ?( din[7] ? ? ? ?),
? ? ? ? .OCE? ? ? ? (?1'b1 ? ? ? ? ?),// 1-bit input: Output data clock enable
? ? ? ? .RST? ? ? ? ( rst ? ? ? ? ? ),// 1-bit input: Reset
? ? ? ??// SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
? ? ? ? .SHIFTIN1? ?( ? ? ? ? ? ? ? ),
? ? ? ? .SHIFTIN2? ?( ? ? ? ? ? ? ? ),
? ? ? ??// T1 - T4: 1-bit (each) input: Parallel 3-state inputs
? ? ? ? .T1? ? ? ? ?(?1'b0 ? ? ? ? ?),
? ? ? ? .T2? ? ? ? ?(?1'b0 ? ? ? ? ?),
? ? ? ? .T3? ? ? ? ?(?1'b0 ? ? ? ? ?),
? ? ? ? .T4? ? ? ? ?(?1'b0 ? ? ? ? ?),
? ? ? ? .TBYTEIN? ? (?1'b0 ? ? ? ? ?),// 1-bit input: Byte group tristate
? ? ? ? .TCE? ? ? ? (?1'b0 ? ? ? ? ?) ?// 1-bit input: 3-state clock enable
? ? );


endmodule

為了方便后續(xù)上板測(cè)試,OSERDESE2的串行輸出信號(hào)和ISERDESE2串行輸入信號(hào)采用OFB直連,不需要經(jīng)過(guò)IOB,直接在芯片內(nèi)部進(jìn)行回環(huán)。

之后是ISERDESE2模塊,對(duì)應(yīng)的原語(yǔ)調(diào)用如下所示,采用DDR雙沿采集數(shù)據(jù)模式,啟用OFB作為串行輸入,將輸出Q8-Q1順序調(diào)換,使得ISERDESE2輸出并行數(shù)據(jù)與OSERDESE2并行輸入數(shù)據(jù)保持一致。

  //例化主ISERDESE2原語(yǔ)
  ISERDESE2#(
    .DATA_RATE     ("DDR"    ),//DDR, SDR
    .DATA_WIDTH     (8      ),//Parallel data width (2-8,10,14)
    .DYN_CLKDIV_INV_EN ("FALSE"   ),//Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE)
    .DYN_CLK_INV_EN   ("FALSE"   ),//Enable DYNCLKINVSEL inversion (FALSE, TRUE)
    .INIT_Q1      (1'b0     ),// INIT_Q1 : Initial value on the Q outputs (0/1)
    .INIT_Q2      ( 1'b0     ),//INIT_Q2 : Initial value on the Q outputs (0/1)
    .INIT_Q3      (1'b0     ),// INIT_Q3 : Initial value on the Q outputs (0/1)
    .INIT_Q4      ( 1'b0     ),//INIT_Q4 : Initial value on the Q outputs (0/1)
    .INTERFACE_TYPE   ("NETWORKING" ),//MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
    .IOBDELAY      ("NONE"    ),//NONE, BOTH, IBUF, IFD
    .NUM_CE       (2      ),//Number of clock enables (1,2)
    .OFB_USED      ("TRUE"    ),//Select OFB path (FALSE, TRUE)
    .SERDES_MODE    ("MASTER"   ),//MASTER, SLAVE
    .SRVAL_Q1      (1'b0     ),// SRVAL_Q1 : Q output values when SR is used (0/1)
    .SRVAL_Q2      ( 1'b0     ),//SRVAL_Q2 : Q outputvalueswhenSR is used (0/1)
    .SRVAL_Q3      (1'b0     ),// SRVAL_Q3 : Q output values when SR is used (0/1)
    .SRVAL_Q4      ( 1'b0     ) // SRVAL_Q4 : Q outputvalueswhenSR is used (0/1)
  )
  ISERDESE2_inst (
    .O     (        ),//1-bit output: Combinatorial output
    .Q1     (q[7]     ),//Q1 - Q8:1-bit (each) output: Registered data outputs
    .Q2     (q[6]     ),
    .Q3     (q[5]     ),
    .Q4     (q[4]     ),
    .Q5     (q[3]     ),
    .Q6     (q[2]     ),
    .Q7     (q[1]     ),
    .Q8     (q[0]     ),
    .SHIFTOUT1 (        ),//SHIFTOUT1 :1-bit (each) output: Data width expansion output ports
    .SHIFTOUT2 (        ),//SHIFTOUT2 :1-bit (each) output: Data width expansion output ports
    .BITSLIP  ( bitslip    ),//1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
                   // CLKDIVwhenasserted (active High). Subsequently, the data seen on the Q1
                   // to Q8 output ports willshift, as in a barrel-shifter operation, one
                   // position everytimeBitslip is invoked (DDR operation is different from SDR).
    .CE1    (1'b1     ),// CE1: 1-bit (each) input: Data register clock enable inputs
    .CE2    ( 1'b1     ),//CE2:1-bit (each) input: Data register clock enable inputs
    .CLKDIVP  (1'b0     ),// 1-bit input: TBD
    // Clocks: 1-bit (each) input: ISERDESE2 clock input ports
    .CLK    ( clk      ),// 1-bit input: High-speed clock
    .CLKB    ( ~clk     ),// 1-bit input: High-speed secondary clock
    .CLKDIV   ( clk_div    ),// 1-bit input: Divided clock
    .OCLK    ( 1'b0     ),//1-bit input: High speed output clock usedwhenINTERFACE_TYPE="MEMORY"
    // Dynamic Clock Inversions:1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
    .DYNCLKDIVSEL(1'b0     ),// 1-bit input: Dynamic CLKDIV inversion
    .DYNCLKSEL ( 1'b0     ),//1-bit input: Dynamic CLK/CLKB inversion
    // Input Data:1-bit (each) input: ISERDESE2 data input ports
    .D     (1'b0     ),// 1-bit input: Data input
    .DDLY    ( 1'b0     ),//1-bit input: Serial data from IDELAYE2
    .OFB    ( ofb      ),//1-bit input: Data feedback from OSERDESE2
    .OCLKB   (1'b0     ),// 1-bit input: High speed negative edge output clock
    .RST    ( rst      ),// 1-bit input: Active high asynchronous reset
    // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
    .SHIFTIN1  (        ),
    .SHIFTIN2  (        )
  );
之后需要對(duì)ISERDESE2并行輸出進(jìn)行校準(zhǔn),OSERDESE2產(chǎn)生的校準(zhǔn)序列是8’h5c和8’h82交替串行序列,因此ISERDESE2轉(zhuǎn)換結(jié)果也應(yīng)該是8’h5c或者8’h82。如果轉(zhuǎn)換結(jié)果不是這兩個(gè)數(shù)據(jù),那么將bitslip拉高一個(gè)時(shí)鐘周期,對(duì)應(yīng)代碼如下所示。
 //當(dāng)沒(méi)有完成校準(zhǔn)時(shí),如果檢測(cè)到轉(zhuǎn)換結(jié)果與要求不一致,則把該信號(hào)拉高。
  always@(posedge clk_div)begin
    if(rst)begin//初始值為0;
      bitslip<=?1'b0;
? ? ? ? end//當(dāng)沒(méi)有校準(zhǔn),且沒(méi)有處于校準(zhǔn)階段時(shí)檢測(cè)到串并轉(zhuǎn)換結(jié)果不為8'h5c或者8'h82時(shí)拉高;
? ? ? ? else if(((q != 8'h5c)?&&?(q?!=?8'h82)) && (~slip_flag) && (~bitslip) && (~dout_vld))begin
? ? ? ? ? ? bitslip <= 1'b1;
? ? ? ??end
? ? ? ??else?begin//其余時(shí)間拉低;
? ? ? ? ? ? bitslip?<=?1'b0;
? ? ? ? end
? ? end

Bitslip拉高之后,ISERDESE2輸出數(shù)據(jù)不是立即有效的,需要經(jīng)過(guò)幾個(gè)時(shí)鐘的轉(zhuǎn)換時(shí)鐘,手冊(cè)中說(shuō)SDR模式需要消耗2個(gè)時(shí)鐘,而DDR模式需要消耗三個(gè)時(shí)鐘。

為了方便設(shè)計(jì),此處直接使用一個(gè)位寬為2的計(jì)數(shù)器,每次bitslip拉高之后,等待4個(gè)時(shí)鐘,之后才對(duì)ISERDESE2的并行數(shù)據(jù)進(jìn)行檢測(cè),確定是否滿足要求,bitslip還是否需要拉高。

 //滑塊計(jì)數(shù)器,因?yàn)閎itslip拉高后,輸出需要經(jīng)過(guò)一段時(shí)間才會(huì)有效,因此這段時(shí)間不能對(duì)輸出數(shù)據(jù)進(jìn)行讀取判斷。
  always@(posedge clk_div)begin
    if(rst)begin//初始值為0;
      slip_cnt<=?'d0;
? ? ? ? end
? ? ? ? else if(slip_flag)begin//對(duì)bitslip拉高后的時(shí)鐘計(jì)數(shù)。
? ? ? ? ? ? slip_cnt <= slip_cnt + 'd1;
? ? ? ??end
? ??end
? ??
? ??//bitslip拉高后的標(biāo)志信號(hào),初始值為0,當(dāng)bitslip拉高時(shí)拉高,當(dāng)slip_cnt計(jì)數(shù)器計(jì)數(shù)到最大值時(shí)清零。
? ? always@(posedge clk_div)begin
? ? ? ? if(rst)begin//初始值為0;
? ? ? ? ? ? slip_flag?<=?1'b0;
? ? ? ? end
? ? ? ? else if(&slip_cnt)begin
? ? ? ? ? ? slip_flag <= 1'b0;
? ? ? ??end
? ? ? ??else?if(bitslip)begin
? ? ? ? ? ? slip_flag?<=?1'b1;
? ? ? ? end
? ? end

在校準(zhǔn)階段ISERDESE2輸出可能會(huì)出現(xiàn)偶然結(jié)果,導(dǎo)致沒(méi)有校準(zhǔn)情況下,輸出的部分并行數(shù)據(jù)與校準(zhǔn)序列一致。為了避免這種情況,應(yīng)該多次檢測(cè)連續(xù)輸出數(shù)據(jù)均與校驗(yàn)數(shù)據(jù)一致時(shí),才認(rèn)為校準(zhǔn)完成。

因此需要一個(gè)計(jì)數(shù)器,對(duì)ISERDESE2輸出的正確數(shù)據(jù)進(jìn)行計(jì)數(shù),當(dāng)bitslip拉高或者處于拉高后的一段時(shí)間時(shí),證明前面檢測(cè)到的數(shù)據(jù)錯(cuò)誤,將計(jì)數(shù)器清零。

當(dāng)連續(xù)檢測(cè)CNT_NUM個(gè)數(shù)據(jù)均正確時(shí),認(rèn)為校準(zhǔn)完成,將計(jì)數(shù)器置為最大值,之后一直保持不變。

 //轉(zhuǎn)換成功計(jì)數(shù)器,用于記錄校準(zhǔn)階段,當(dāng)校準(zhǔn)階段檢測(cè)到固定個(gè)連續(xù)有效數(shù)據(jù)時(shí),認(rèn)為校準(zhǔn)成功。
  always@(posedge clk_div)begin
    if(rst)begin//
      cnt<=?0;
? ? ? ??end//當(dāng)在校準(zhǔn)階段時(shí),當(dāng)bitslip有效時(shí)拉高;
? ? ? ??else?if((slip_flag?||?bitslip)?&&?(~dout_vld))begin
? ? ? ? ? ? cnt?<=?0;
? ? ? ??end
? ? ? ??else?if(cnt?==?CNT_NUM?-?1)begin//當(dāng)檢測(cè)到固定校準(zhǔn)數(shù)據(jù)時(shí),計(jì)數(shù)器保持該數(shù)值。
? ? ? ? ? ? cnt?<=?CNT_NUM?-?1;
? ? ? ??end
? ? ? ??else?if(add_cnt)begin
? ? ? ? ? ? cnt?<=?cnt?+?1;
? ? ? ??end
? ??end
? ??
? ??//當(dāng)不處于移動(dòng)滑塊狀態(tài)且檢測(cè)到輸出數(shù)據(jù)為規(guī)定數(shù)據(jù)時(shí)加1.
? ? assign add_cnt?=?((q?==?8'h5c) || (q == 8'h82))?&&?(~slip_flag)?&&?(~bitslip);
? ??
? ??//將轉(zhuǎn)換后的數(shù)據(jù)輸出,只有當(dāng)校準(zhǔn)完成后,輸出有效指示信號(hào)磁能拉高,表示輸出的數(shù)據(jù)有效。
? ? always@(posedge clk_div)begin
? ? ? ? dout?<=?q;
? ? ? ? dout_vld?<=?(cnt?==?CNT_NUM?-?1);
? ??end

之后是頂層模塊的處理,對(duì)于串行時(shí)鐘和并行時(shí)鐘的處理方式有如下兩種,第一種是本時(shí)鐘區(qū)域的外部時(shí)鐘管腳輸入串行時(shí)鐘信號(hào),之后通過(guò)BUFIO作為ISERDESE2和OSERDESE2的串行時(shí)鐘信號(hào)。通過(guò)BUFR分頻輸出的時(shí)鐘作為ISERDESE2和OSERDESE2的并行數(shù)據(jù)時(shí)鐘信號(hào),對(duì)應(yīng)代碼如下所示。

但是這種方式仿真會(huì)出現(xiàn)錯(cuò)誤,OSERDESE2輸出的數(shù)據(jù)始終是不定態(tài),不知道為什么。另外要求輸入串行時(shí)鐘,然而串行時(shí)鐘一般頻率很高,用戶的晶振一般是提供不了的,因此這種方式不太常用。

  //調(diào)用BUFIO;
  /*BUFIO u_BUFIO (
   .O  ( o_clk   ),//1-bit output: Clock output (connectto I/O clock loads).
   .I  ( clk    ) //1-bit input: Clock input (connectto an IBUForBUFMR).
  );


 //調(diào)用BUFR對(duì)時(shí)鐘進(jìn)行分頻;
  BUFR#(
    .BUFR_DIVIDE ("4"    ),//Values:"BYPASS, 1, 2, 3, 4, 5, 6, 7, 8"
    .SIM_DEVICE  ("7SERIES" ) //Must be set to"7SERIES"
  )
  u_BUFR (
    .O  ( clk_div   ),//1-bit output: Clock output port
    .CE  (1'b1    ),//1-bit input: Active high, clock enable (Divided modes only)
    .CLR ( 1'b0    ),//1-bit input: Active high, asynchronous clear (Divided modes only)
    .I  ( clk     )
  );*/
另一種時(shí)鐘處理方式是使用同一個(gè)MMCM,生成串行時(shí)鐘和并行時(shí)鐘,對(duì)于輸入時(shí)鐘頻率沒(méi)有太大要求。本文外部輸入100MHz時(shí)鐘信號(hào)作為ISERDESE2和OSERDESE2的并行時(shí)鐘信號(hào),通過(guò)MMCM生成400MHz作為串行時(shí)鐘信號(hào)。對(duì)應(yīng)代碼如下所示:
 clk_wiz_0u_clk_wiz_0(
    .clk_out1  ( clk_div_o ),//output clk_out1
    .clk_out2 (clk   ),//output clk_out2
    .reset   (rst   ),//input reset
    .clk_in1  (clk_div )//input clk_in1
  );

MMCM的輸出配置如下所示:

007ce042-fc81-11ef-9310-92fbcf53809c.png

圖14 MMCM輸出配置

之后頂層模塊需要例化前面兩個(gè)模塊,對(duì)應(yīng)的完整代碼如下所示。

 //例化并串轉(zhuǎn)換原語(yǔ);
 oserdese2_ctrlu_oserdese2_ctrl(
    .clk    ( clk      ),//系統(tǒng)時(shí)鐘信號(hào);
    .clk_div  (clk_div_o  ),
    .rst    (rst     ),//系統(tǒng)復(fù)位信號(hào),高電平有效;
    .ofb    (oserdese_ofb )
  );


 //例化串并轉(zhuǎn)換原語(yǔ);
 iserdese2_ctrlu_iserdese2_ctrl(
    .clk     ( clk       ),//系統(tǒng)時(shí)鐘信號(hào);
    .clk_div  (clk_div_o    ),
    .rst    (rst       ),//系統(tǒng)復(fù)位信號(hào),高電平有效;
    .ofb    (oserdese_ofb  ),
    .dout    (o_iserdese2   ),//輸出數(shù)據(jù)
    .dout_vld  (o_iserdese2_vld )//輸出數(shù)據(jù)有效指示信號(hào);
  );


 //例化ILA
 ila_0u_ila_0(
    .clk  ( clk_div_o         ),//input wire clk;
    .probe0(u_oserdese2_ctrl.din   ),//input wire [7:0] probe0;
    .probe1(u_iserdese2_ctrl.q    ),//input wire [7:0] probe1;
    .probe2(u_iserdese2_ctrl.dout  ),//input wire [7:0] probe2;
    .probe3(u_iserdese2_ctrl.cnt   ),//input wire [3:0] probe3;
    .probe4(u_iserdese2_ctrl.slip_cnt),//input wire [1:0] probe4;
    .probe5(u_iserdese2_ctrl.bitslip ),//input wire [0:0] probe5;
    .probe6(u_iserdese2_ctrl.slip_flag),//input wire [0:0] probe6;
    .probe7(u_iserdese2_ctrl.add_cnt ),//input wire [0:0] probe7;
   .probe8(u_iserdese2_ctrl.dout_vld)//input wire [0:0] probe8;
  );

頂層模塊對(duì)應(yīng)的RTL視圖如下所示:

00a5fb44-fc81-11ef-9310-92fbcf53809c.png

圖15 頂層模塊RTL

05工程仿真

對(duì)應(yīng)的TestBench很簡(jiǎn)單,只需要提供時(shí)鐘和復(fù)位信號(hào)即可,如下所示:

//--###############################################################################################
//--#
//--# File Name  : testBench
//--# Designer  : 數(shù)字站
//--# Tool   : Vivado 2021.1
//--# Design Date : 2024.4.4
//--# Description : 測(cè)試串并轉(zhuǎn)換原語(yǔ)
//--# Version  : 0.0
//--# Coding scheme : GBK(If the Chinese comment of the file is garbled, please do not save it and check whether the file is opened in GBK encoding mode)
//--#
//--###############################################################################################
`timescale1ns /1ps
moduletest();
  localparam CYCLE  = 10     ;//系統(tǒng)時(shí)鐘周期,單位ns,默認(rèn)10ns;
  localparam RST_TIME = 10     ;//系統(tǒng)復(fù)位持續(xù)時(shí)間,默認(rèn)10個(gè)系統(tǒng)時(shí)鐘周期;


  reg       clk     ;//系統(tǒng)時(shí)鐘,默認(rèn)100MHz;
  reg       rst_n    ;//系統(tǒng)復(fù)位,默認(rèn)低電平有效;


  wire  [7:0]       o_iserdese2   ;
  wire            o_iserdese2_vld ;


 topu_top(
    .clk_div      ( clk      ),//系統(tǒng)時(shí)鐘信號(hào);
    .rst_n       (rst_n      ),//系統(tǒng)復(fù)位信號(hào),低電平有效;
    .o_iserdese2    (o_iserdese2   ),
    .o_iserdese2_vld  (o_iserdese2_vld )
  );


 //生成周期為CYCLE數(shù)值的系統(tǒng)時(shí)鐘;
  initial begin
    clk =0;
    forever#(CYCLE/2) clk = ~clk;
  end


 //生成復(fù)位信號(hào);
  initial begin
    rst_n =1;
   #2;
    rst_n =0;//開(kāi)始時(shí)復(fù)位10個(gè)時(shí)鐘;
   #(RST_TIME*CYCLE);
    rst_n =1;
    @(posedge o_iserdese2_vld);//校準(zhǔn)完成;
    repeat(400)@(posedge clk);
    $stop;//停止仿真;
  end


endmodule

之后運(yùn)行vivado仿真,下圖是OSERDESE2的時(shí)序圖,將并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù)輸出,串行數(shù)據(jù)與時(shí)鐘clk的雙沿對(duì)齊。

00cc2cec-fc81-11ef-9310-92fbcf53809c.png

圖16 OSERDESE2時(shí)序

之后查看ISERDESE2時(shí)序,如下圖所示,在校準(zhǔn)開(kāi)始階段,ISERDESE2輸出數(shù)據(jù)Q為8’h20,并不是校準(zhǔn)序列8’h5c或者8’h82,所以將bitslip拉高一個(gè)clk_div時(shí)鐘寬度。

等待四個(gè)clk_div時(shí)鐘周期后,再次檢測(cè)ISERDESE2輸出并行數(shù)據(jù),依舊不是規(guī)定數(shù)值,繼續(xù)拉高bitslip進(jìn)行調(diào)整。

00ed53cc-fc81-11ef-9310-92fbcf53809c.png

圖17 OSERDESE2時(shí)序

直到某次調(diào)整之后,ISERDESE2輸出的并行數(shù)據(jù)序列均為8’h5c或8’h82,如下圖所示,此時(shí)就可以拉高bitslip了。

0121ec68-fc81-11ef-9310-92fbcf53809c.png

圖18 OSERDESE2時(shí)序

之后檢測(cè)連續(xù)16個(gè)ISERDESE2并行輸出數(shù)據(jù),如果均為規(guī)定序列,沒(méi)有問(wèn)題,則將dout_vld拉高,表示輸出數(shù)據(jù)已經(jīng)對(duì)齊,是有效數(shù)據(jù)。

如果檢測(cè)過(guò)程中出現(xiàn)錯(cuò)誤,則計(jì)數(shù)器清零,bitslip拉高繼續(xù)調(diào)整,直到滿足要求即可。

ff7cb7ee-fc80-11ef-9310-92fbcf53809c.png

01840eca-fc81-11ef-9310-92fbcf53809c.png

圖19 計(jì)數(shù)器對(duì)校準(zhǔn)序列計(jì)數(shù)下面是截取當(dāng)轉(zhuǎn)換完成后,發(fā)送端校驗(yàn)數(shù)據(jù)發(fā)送完成之后,發(fā)送偽隨機(jī)的測(cè)試數(shù)據(jù),ISERDESE2的輸出依舊是正確的,證明前文的校準(zhǔn)方式?jīng)]有問(wèn)題。

01a24dd6-fc81-11ef-9310-92fbcf53809c.png

圖20 接收偽隨機(jī)序列

上述仿真就沒(méi)有問(wèn)題了,之后上板通過(guò)ila抓取相關(guān)信號(hào),查看結(jié)果是否正確。

06上板測(cè)試

至于在使用OFB回環(huán)時(shí),為什么不能使用D管腳,如下圖所示,ISERDESE2和OSERDESE2會(huì)使用掉一個(gè)管腳的ILOGIC和OLOGIC資源,導(dǎo)致這個(gè)IOB管腳不能使用,ISERDESE2的D管腳就不能使用了。

下圖中白色走線就是ISERDESE2和OSERDESE2的OFB回環(huán)走線。

ff7cb7ee-fc80-11ef-9310-92fbcf53809c.png

01cc9c3a-fc81-11ef-9310-92fbcf53809c.png

圖21 IO資源分布

工程綜合完畢之后,將代碼下載到開(kāi)發(fā)板中,之后把dout_vld的上升沿作為ILA的觸發(fā)條件。由于該條件在復(fù)位之后只會(huì)觸發(fā)一次,因此在ILA啟動(dòng)之后,需要按一下開(kāi)發(fā)板的復(fù)位引腳,才能夠觸發(fā)條件,對(duì)應(yīng)截圖如下所示。

ff7cb7ee-fc80-11ef-9310-92fbcf53809c.png

01f9405a-fc81-11ef-9310-92fbcf53809c.png

圖22 ILA的觸發(fā)條件設(shè)置

如下圖所示,開(kāi)始校準(zhǔn)時(shí),ISERDESE2輸出并行數(shù)據(jù)并不是校準(zhǔn)序列的8’h5c或者8’h82。之后把bitslip拉高一個(gè)時(shí)鐘,調(diào)整串并轉(zhuǎn)換的起始位置,下圖只調(diào)整了兩次,ISERDESE2就輸出了正確數(shù)據(jù)。

0213cc5e-fc81-11ef-9310-92fbcf53809c.png

圖23 校準(zhǔn)時(shí)序

計(jì)數(shù)器cnt對(duì)ISERDESE2輸出的正確數(shù)據(jù)進(jìn)行計(jì)數(shù),當(dāng)ISERDESE2連續(xù)輸出16個(gè)正確數(shù)據(jù)時(shí),認(rèn)為校準(zhǔn)成功,如果覺(jué)得16個(gè)太少,在校準(zhǔn)的時(shí)候可以設(shè)置更大的數(shù)據(jù)。

ff7cb7ee-fc80-11ef-9310-92fbcf53809c.png

0244e85c-fc81-11ef-9310-92fbcf53809c.png

圖24 校準(zhǔn)計(jì)數(shù)器

最后就是對(duì)比校準(zhǔn)后偽隨機(jī)序列的轉(zhuǎn)換了,din是OSERDESE2并串轉(zhuǎn)換的輸入數(shù)據(jù),而dout是ISERDESE2串并轉(zhuǎn)換的輸出結(jié)果,下圖中兩圖的數(shù)據(jù)相等,證明校準(zhǔn)電路和串并轉(zhuǎn)換均沒(méi)有問(wèn)題。

din和dout有延時(shí)是正常現(xiàn)象,因?yàn)閮烧咧虚g有很多電路和觸發(fā)器嘛,延時(shí)是正常的。

0261e5ba-fc81-11ef-9310-92fbcf53809c.png

圖25 轉(zhuǎn)換數(shù)據(jù)

關(guān)于ISERDESE2的講解到此結(jié)束了,本文雖然只是講解了DDR模式的使用,但SDR原理也是類似的,只不過(guò)是單沿轉(zhuǎn)換數(shù)據(jù),兩個(gè)時(shí)鐘頻率的比值不一樣罷了。

主要理解bitslip的使用,才能夠真正的了解該模塊,不必在意bitslip拉高后,數(shù)據(jù)該怎么移動(dòng),只需要關(guān)注ISERDESE2輸出是不是需要的輸出,不是就繼續(xù)通過(guò)bitslip調(diào)整ISERDESE2輸出。這個(gè)校準(zhǔn)的過(guò)程需要輸入一直連續(xù)輸入固定序列,不然無(wú)法校準(zhǔn)。

需要本工程的在公眾號(hào)后臺(tái)回復(fù)“ISERDESE2”(不包括引號(hào))即可,工程使用vivado2021.1,平臺(tái)是zynq-7030。

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

    關(guān)注

    33

    文章

    8782

    瀏覽量

    152459
  • Xilinx
    +關(guān)注

    關(guān)注

    72

    文章

    2174

    瀏覽量

    122946
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    4161

    瀏覽量

    134545

原文標(biāo)題:xilinx原語(yǔ)詳解及仿真—ISERDESE2

文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用其gearbox功能來(lái)實(shí)現(xiàn)不同的比率的串并轉(zhuǎn)換功能

    在SelectIO簡(jiǎn)介連載一中介紹了其架構(gòu),本章會(huì)繼續(xù)介紹如何使用其gearbox功能來(lái)實(shí)現(xiàn)不同的比率的串并轉(zhuǎn)換功能。7 Series FPGA中LVDS使用了ISERDESE2,SDR Rate可設(shè)為
    發(fā)表于 08-02 08:03 ?3595次閱讀
    如何使用其gearbox功能來(lái)實(shí)現(xiàn)不同的比率的串并轉(zhuǎn)換功能

    FPGA | Xilinx ISE14.7 LVDS應(yīng)用

    利用FPGA內(nèi)部自帶的SelectIO資源,利用ISERDESE2、 OSERDESE2,實(shí)現(xiàn)串-并,并-串的轉(zhuǎn)換,理論速度可達(dá)到750Mbs, 參考資料:Spartan-6 FPGA Data
    發(fā)表于 06-13 16:28

    ADC3583怎么用Xilinx的ISERDESE2采集信號(hào)?

    我看datasheet上3種模式2-wire/1-wire/1/2-wireSLDVS都是9位或者18位的,我用xilinx的fpga中的ISERDESE2的DDR模式只支持4-,6-,8-bit位寬,或者
    發(fā)表于 11-21 07:12

    請(qǐng)問(wèn)是否必須總是有一個(gè)訓(xùn)練模式來(lái)使用ISERDESE2

    了一個(gè)不同的op,它是這個(gè)的移位版本。那么,你是否必須總是有一個(gè)訓(xùn)練模式來(lái)使用ISERDESE2。如果沒(méi)有,是否有任何默認(rèn)值,它總是移動(dòng)輸出。以上來(lái)自于谷歌翻譯以下為原文Hi, I just had a
    發(fā)表于 04-04 13:53

    請(qǐng)問(wèn)ISERDESE2原語(yǔ)支持多少位輸入?

    嗨,有沒(méi)有辦法在7系列FPGA中讀取18位串行LVDS輸入,尤其是Artix-7?如果我理解正確,ISERDESE2原語(yǔ)僅支持最多14位輸入。數(shù)據(jù)速率約為400 Mbps,采用2線DDR傳輸模式。先謝謝你,
    發(fā)表于 04-24 09:33

    如何正確配置ISERDESE2

    關(guān)于正確配置ISERDESE2進(jìn)行操作,我有一個(gè)問(wèn)題。我之前有一個(gè)IDELAYE2,因此輸入被路由到DDLY輸入。當(dāng)置位復(fù)位時(shí),所有Q輸出變?yōu)榈碗娖健.?dāng)復(fù)位無(wú)效時(shí),4個(gè)輸出變?yōu)楦唠娖剑?個(gè)輸出變?yōu)?/div>
    發(fā)表于 07-22 12:28

    使用ISERDESE2 INTERFACE_TYPE設(shè)置為NETWORKING時(shí)收到警告的原因?

    我正在使用XC7K160T-FBG767-1當(dāng)使用ISERDESE2 INTERFACE_TYPE設(shè)置為NETWORKING時(shí),我收到以下警告:PhysDesignRules:2454 - 用于
    發(fā)表于 07-25 11:34

    應(yīng)用程序中是否需要外部LVDS終端才能進(jìn)行此配置?

    和data_p行直接從輸入板,通過(guò)IBUF到ISERDESE2的D輸入。 i / o std是LVCMOS25。我無(wú)法在I / O端口的片外終結(jié)列中啟用任何終止。我的應(yīng)用程序中是否需要外部LVDS終端才能
    發(fā)表于 07-31 11:02

    使用帶有XC7K160T的ISE 14.7在布局布線步驟中出現(xiàn)錯(cuò)誤的解決辦法?

    Net:adc_data_out在我的代碼中注釋掉了不同的模塊和子模塊,我認(rèn)為這個(gè)問(wèn)題與ISERDESE2原始.D端口有關(guān)。所有四個(gè)信號(hào)都使用IBUFDS_DIFF_OUT原語(yǔ),所以我認(rèn)為他們不應(yīng)該
    發(fā)表于 08-05 10:51

    端口網(wǎng)絡(luò)參數(shù)_二端口網(wǎng)絡(luò)參數(shù)的測(cè)定

    端口網(wǎng)絡(luò),two-port network,是端口數(shù)n等于2的多端網(wǎng)絡(luò)。又稱雙口。本文主要介紹了二端口網(wǎng)絡(luò)
    發(fā)表于 12-20 18:57 ?3.4w次閱讀
    二<b class='flag-5'>端口</b>網(wǎng)絡(luò)<b class='flag-5'>參數(shù)</b>_二<b class='flag-5'>端口</b>網(wǎng)絡(luò)<b class='flag-5'>參數(shù)</b>的測(cè)定

    Xilinx FPGA常用原語(yǔ)介紹

    項(xiàng)目中主要用到的原語(yǔ)與IO端口有關(guān),所以基本在Input/Output Functions 和IO兩類中。下面著重介紹實(shí)際中所用到的幾個(gè)原語(yǔ),芯片A7系列。
    發(fā)表于 01-06 11:23 ?1.6w次閱讀
    Xilinx FPGA常用<b class='flag-5'>原語(yǔ)</b><b class='flag-5'>介紹</b>

    Xilinx原語(yǔ)使用方法有哪些

    Xilinx公司的原語(yǔ)按照功能分為10類,包括:計(jì)算組件、I/O端口組件、寄存器和鎖存器、時(shí)鐘組件、處理器組件、移位寄存器、配置和檢測(cè)組件、RAM/ROM組件、Slice/CLB組件以及G比特收發(fā)器組件。下面分別對(duì)其進(jìn)行詳細(xì)介紹
    的頭像 發(fā)表于 02-08 14:01 ?1628次閱讀
    Xilinx<b class='flag-5'>原語(yǔ)</b>使用方法有哪些

    Xilinx原語(yǔ)使用方法

    Xilinx公司的原語(yǔ)按照功能分為10類,包括:計(jì)算組件、I/O端口組件、寄存器和鎖存器、時(shí)鐘組件、處理器組件、移位寄存器、配置和檢測(cè)組件、RAM/ROM組件、Slice/CLB組件以及G比特收發(fā)器組件。下面分別對(duì)其進(jìn)行詳細(xì)介紹
    發(fā)表于 03-24 06:14 ?3次下載
    Xilinx<b class='flag-5'>原語(yǔ)</b>使用方法

    《Xilinx—UG471中文翻譯》(2ISERDESE2原語(yǔ)介紹

    本文僅對(duì)UG471 第3章《Advanced SelectIO Logic Resources》部分進(jìn)行翻譯和學(xué)習(xí)解讀
    的頭像 發(fā)表于 02-16 16:21 ?3914次閱讀
    《Xilinx—UG471中文翻譯》(<b class='flag-5'>2</b>)<b class='flag-5'>ISERDESE2</b><b class='flag-5'>原語(yǔ)</b><b class='flag-5'>介紹</b>

    SERDES的工作原理及實(shí)現(xiàn)細(xì)節(jié)

    ISERDESE2 在 SDR 模式下數(shù)據(jù)轉(zhuǎn)換的位寬可以為 2、 3、 4、 5、 6、 7、 8bit,在 DDR 模式時(shí),數(shù)據(jù)轉(zhuǎn)換位寬為 4、 6、 8bit, 2 個(gè) ISERDESE2
    的頭像 發(fā)表于 09-05 14:30 ?6319次閱讀
    主站蜘蛛池模板: 四虎网址最新 | 国产成人毛片视频不卡在线 | se综合| 泰剧天堂| 夜夜操com| 亚洲伦理中文字幕一区 | 免费啪视频观在线视频在线 | 日本亚洲精品成人 | aa国产| 一本二卡三卡四卡乱码二百 | 亚洲午夜网 | 天堂社区在线观看 | 天天在线精品视频在线观看 | 亚洲免费人成在线视频观看 | 2018天堂视频免费观看 | 韩国三级观影久久 | 五月婷婷丁香在线 | 狠狠色噜噜| www深夜视频在线观看高清 | 福利区在线观看 | 在线免费观看色片 | 一本到在线观看视频不卡 | 日韩欧美中文字幕在线视频 | 日本一卡二卡≡卡四卡精品 | 农村女人的一级毛片 | 国产成人综合亚洲怡春院 | 午夜欧美精品 | 老司机亚洲精品影院在线观看 | 性69交片免费看 | 性欧美丰满xxxx性久久久 | 欧美日韩国产成人精品 | 女同毛片免费网站 | 国产高清视频在线免费观看 | 欧美黑人性色黄在线视频 | 又黄又爽又猛大片录像 | www.四虎| 2345成人高清毛片 | 午色影院| 在线天堂网www资源种子 | 天堂色综合 | 久久久噜噜噜www成人网 |