一、ODDR概述及使用方法
ODDR(Output Double Data Rate,輸出雙倍數據速率):
在SDR接口中,ODDR轉發時鐘(仍在時鐘樹內),輸出端要直連到輸出port,不可加邏輯,連接方式:輸出時鐘連接ODDR的C引腳,D1固定值1'b1, D2固定值1'b0,CE固定值1’b1,ODDR的輸出Q連接到OBUF;
時鐘輸入有限制,需要從SRCC或者MRCC專用時鐘輸入引腳輸入,時鐘輸出可以在任何引腳上輸出。當輸出時鐘時,即使使用的是時鐘專用輸入管腳去輸出時鐘,也等同于使用普通的GPIO管腳輸出時鐘。
輸出時鐘的最佳方法是使用ODDR來轉發時鐘 (假設輸出的時鐘是一個專用時鐘網絡上的時鐘)。每個IOB(IO Bank)都具有ODDR功能。
這樣做時,內部時鐘一直停留在專用的時鐘網絡上,直到ODDR,永遠不需要進入一般的路由結構。不建議直接將時鐘帶到OBUF,因為這需要內部時鐘離開專用時鐘網絡,通過一般的fabric路由線路路由到OBUF。
對Spartan6里面,必須用ODDR寄存器輸出。
二、時鐘配置
建議在輸出時鐘時加入ODDR原語,現在加入ODDR對比一下加入前后的不同。
加入ODDR代碼,D1接高電平,D2接低電平,C接時鐘,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圖如下:
布局布線的資源中,下圖左側顯示沒有加ODDR的,右側是加入了ODDR,可見右側輸出時鐘經BUFG后先到輸出引腳附近的ODDR(藍線和紫線交匯處),經ODDR轉發后到PAD管腳輸出。
三、性能對比
按照Xilinx和網上的一些說法,加入ODDR后輸出時鐘的質量會更好。
輸出DDR可以轉發一個時鐘副本到輸出。這對于傳播具有相同延遲的時鐘和DDR數據、以及生成多個時鐘(其中每個時鐘負載都有惟一的時鐘驅動)非常有用。這是通過將ODDR的D1輸入高電平并且D2輸入低電平來實現的。Xilinx建議使用這種方案將時鐘從FPGA邏輯轉發到輸出引腳。
如下圖所示是加入ODDR前后的時序裕量和資源消耗對比,可以看到,對 WNS (Worst Negative Slack,最差負時序裕量)和 WHS (Worst Hold Slack,最差保持時序裕量)、資源使用在加入前后沒有明顯的區別。實測加入ODDR前后誤碼率基本一致,眼圖掃描結果也一致。
按照Xilinx的推薦,在輸出時鐘時最好還是把ODDR加上 。這個測試用例沒有體現出ODDR的優勢,也許在資源使用較多、時鐘頻率更高時才能體現。另外,這里只是輸出了時鐘,沒有輸出使用該時鐘的數據。
很多人說時鐘直接從BUFG輸出到管腳會報錯,必須加約束或者ODDR,目前我在ZYNQ7045上沒有發現此問題。
ODDR****的使用場景還在于 OSERDES、 FPGA 的源同步的系統設計 ,用 ODDR使得隨路時鐘和數據在輸出時是嚴格同步的,保證嚴格的相位對齊關系 。
-
FPGA設計
+關注
關注
9文章
428瀏覽量
26489 -
SDR
+關注
關注
7文章
233瀏覽量
50423 -
RTL
+關注
關注
1文章
385瀏覽量
59710 -
GPIO
+關注
關注
16文章
1196瀏覽量
51925
發布評論請先 登錄
相關推薦
評論