一、ODDR概述及使用方法
ODDR(Output Double Data Rate,輸出雙倍數(shù)據(jù)速率):
在DDR接口中,ODDR用于發(fā)送時(shí)鐘和數(shù)據(jù);
在SDR接口中,ODDR轉(zhuǎn)發(fā)時(shí)鐘(仍在時(shí)鐘樹內(nèi)),輸出端要直連到輸出port,不可加邏輯,連接方式:輸出時(shí)鐘連接ODDR的C引腳,D1固定值1'b1, D2固定值1'b0,CE固定值1’b1,ODDR的輸出Q連接到OBUF;
時(shí)鐘輸入有限制,需要從SRCC或者M(jìn)RCC專用時(shí)鐘輸入引腳輸入,時(shí)鐘輸出可以在任何引腳上輸出。當(dāng)輸出時(shí)鐘時(shí),即使使用的是時(shí)鐘專用輸入管腳去輸出時(shí)鐘,也等同于使用普通的GPIO管腳輸出時(shí)鐘。
輸出時(shí)鐘的最佳方法是使用ODDR來轉(zhuǎn)發(fā)時(shí)鐘 (假設(shè)輸出的時(shí)鐘是一個(gè)專用時(shí)鐘網(wǎng)絡(luò)上的時(shí)鐘)。每個(gè)IOB(IO Bank)都具有ODDR功能。
這樣做時(shí),內(nèi)部時(shí)鐘一直停留在專用的時(shí)鐘網(wǎng)絡(luò)上,直到ODDR,永遠(yuǎn)不需要進(jìn)入一般的路由結(jié)構(gòu)。不建議直接將時(shí)鐘帶到OBUF,因?yàn)檫@需要內(nèi)部時(shí)鐘離開專用時(shí)鐘網(wǎng)絡(luò),通過一般的fabric路由線路路由到OBUF。
對(duì)Spartan6里面,必須用ODDR寄存器輸出。
二、時(shí)鐘配置
建議在輸出時(shí)鐘時(shí)加入ODDR原語,現(xiàn)在加入ODDR對(duì)比一下加入前后的不同。
加入ODDR代碼,D1接高電平,D2接低電平,C接時(shí)鐘,Q輸出。
wire user_clk;
IBUFDS IBUFDS_inst_user_clk(
.O(user_clk), // Buffer output
.I(USRCLK_P_I), // Diff_p buffer input
.IB(USRCLK_N_I) // Diff_n buffer input
);
wire user_clk_bufg;
BUFG BUFG_inst_user_clk (
.O(user_clk_bufg), // 1-bit output: Clock output
.I(user_clk)
);
wire user_clk_bufg_oddr;
ODDR #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), //"OPPOSITE_EDGE" or "SAME_EDGE"
.INIT(1'b0), // Initial value of Q: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
) ODDR_out_clock_inst_user_clock (
.Q(user_clk_bufg_oddr), // 1-bit DDR output
.C(user_clk_bufg), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D1(1'b1), // 1-bit data input (positive edge)
.D2(1'b0), // 1-bit data input (negative edge)
.R(), // 1-bit reset
.S() // 1-bit set
);
OBUFDS OBUFDS_inst_user_clock (
.O (USER_SMA_CLOCK_P_O
.OB(USER_SMA_CLOCK_N_O), // Diff_n output
.I (user_clk_bufg_oddr) // Buffer input
)
不加ODDR,布局布線后RTL圖如下:
加ODDR,布局布線后RTL圖如下:
布局布線的資源中,下圖左側(cè)顯示沒有加ODDR的,右側(cè)是加入了ODDR,可見右側(cè)輸出時(shí)鐘經(jīng)BUFG后先到輸出引腳附近的ODDR(藍(lán)線和紫線交匯處),經(jīng)ODDR轉(zhuǎn)發(fā)后到PAD管腳輸出。
三、性能對(duì)比
按照Xilinx和網(wǎng)上的一些說法,加入ODDR后輸出時(shí)鐘的質(zhì)量會(huì)更好。
輸出DDR可以轉(zhuǎn)發(fā)一個(gè)時(shí)鐘副本到輸出。這對(duì)于傳播具有相同延遲的時(shí)鐘和DDR數(shù)據(jù)、以及生成多個(gè)時(shí)鐘(其中每個(gè)時(shí)鐘負(fù)載都有惟一的時(shí)鐘驅(qū)動(dòng))非常有用。這是通過將ODDR的D1輸入高電平并且D2輸入低電平來實(shí)現(xiàn)的。Xilinx建議使用這種方案將時(shí)鐘從FPGA邏輯轉(zhuǎn)發(fā)到輸出引腳。
如下圖所示是加入ODDR前后的時(shí)序裕量和資源消耗對(duì)比,可以看到,對(duì) WNS (Worst Negative Slack,最差負(fù)時(shí)序裕量)和 WHS (Worst Hold Slack,最差保持時(shí)序裕量)、資源使用在加入前后沒有明顯的區(qū)別。實(shí)測(cè)加入ODDR前后誤碼率基本一致,眼圖掃描結(jié)果也一致。
按照Xilinx的推薦,在輸出時(shí)鐘時(shí)最好還是把ODDR加上 。這個(gè)測(cè)試用例沒有體現(xiàn)出ODDR的優(yōu)勢(shì),也許在資源使用較多、時(shí)鐘頻率更高時(shí)才能體現(xiàn)。另外,這里只是輸出了時(shí)鐘,沒有輸出使用該時(shí)鐘的數(shù)據(jù)。
很多人說時(shí)鐘直接從BUFG輸出到管腳會(huì)報(bào)錯(cuò),必須加約束或者ODDR,目前我在ZYNQ7045上沒有發(fā)現(xiàn)此問題。
ODDR****的使用場(chǎng)景還在于 OSERDES、 FPGA 的源同步的系統(tǒng)設(shè)計(jì) ,用 ODDR使得隨路時(shí)鐘和數(shù)據(jù)在輸出時(shí)是嚴(yán)格同步的,保證嚴(yán)格的相位對(duì)齊關(guān)系 。
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26643 -
SDR
+關(guān)注
關(guān)注
7文章
234瀏覽量
50601 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59991 -
GPIO
+關(guān)注
關(guān)注
16文章
1217瀏覽量
52447
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
protel輸出高質(zhì)量gerber
高質(zhì)量編程
【下載】高質(zhì)量干貨-22本高質(zhì)量EMC電磁兼容性設(shè)計(jì)資料
使用ODDR原語的重要性是什么?
Xilinx高質(zhì)量時(shí)鐘輸出ODDR原語的概述及使用方法
![<b class='flag-5'>Xilinx</b><b class='flag-5'>高質(zhì)量</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>輸出</b><b class='flag-5'>ODDR</b><b class='flag-5'>原語</b>的概述及使用方法](https://file1.elecfans.com/web2/M00/8A/73/wKgZomSSlGWAFRwWAADHJRCxSso011.jpg)
評(píng)論