如何在Xilinx FPGA中實現高質量時鐘輸出
在xilinx的FPGA中,要實現高頻時鐘的輸出,並保證時鐘質量,最有效的方案是使用ODDR來產生。例如,需要輸出的時鐘為CLK,用CLK來驅動ODDR,讓ODDR在CLK的上升沿輸出0或1,在CLK的下降沿輸出1或0,從而產生一個時鐘脈衝CLKOUT,CLKOUT的時鐘頻率和CLK完全相同。ODDR位於IOB裡面,如果CLK是由BUFG驅動的,那麼從CLK到ODDR的路徑在每次實現中是確定,從OODR到FPGA晶片PAD的路徑和延遲也是確定的,由ODDR產生的時鐘是一個穩定的高質量時鐘。
一種常見的錯誤做法是:用CLK由BUFG驅動以後,直接連線到某個具有時鐘輸入能力的管腳(CC管腳)。因為,CC管腳只有用作時鐘輸入時才能直接輸入到BUFG中,而BUFG輸出到CC管腳,效果等同於輸出到任何一個普通管腳。這樣應用方法是無法保證從BUFG到FPGA晶片PAD的走線長度的,而且一部分走線使用的是非專用佈線資源。這種方法產生的時鐘脈衝質量並不好。
1.SPartan6FPGA中, PLL產生的時鐘不能直接連到FPGA的通用I/O上;
2.如果硬體已經連上了,可通過在PLL輸出與通用I/O之間增加ODDR2模組緩衝來解決。
3.ODDR2與PLL模組可放在一個V檔案中。
4.ODDR2模組如下:
ODDR2 #( .DDR_ALIGNMENT("NONE"), //Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), //Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies"SYNC" or "ASYNC" set/reset ) U_ODDR2_PLL輸出時鐘名 ( .Q(oddr2_I/O管腳名), // 1-bit DDR output data .C0(clock_PLL輸出時鐘名), // 1-bit clock input .C1(~clock_PLL輸出時鐘名), // 1-bit clock input .CE(1'b1), //1-bit clock enable input .D0(1'b1), //1-bit data input (associated with C0) .D1(1'b0), //1-bit data input (associated with C1) .R(1'b0), //1-bit reset input .S(1'b0) //1-bit set input );