記錄背景:最近由於想實現GMIItoRGMII的功能,因此需要調用ODDR原語。 ODDR:Dedicated Dual Data Rate (DDR) Output Register 通過ODDR把兩路單端的數據合併到一路上輸出,上下沿同時輸出數據,上沿輸出a路下沿輸出b路;如果兩路輸入信號一路恆 ...
記錄背景:最近由於想實現GMIItoRGMII的功能,因此需要調用ODDR原語。
ODDR:Dedicated Dual Data Rate (DDR) Output Register
通過ODDR把兩路單端的數據合併到一路上輸出,上下沿同時輸出數據,上沿輸出a路下沿輸出b路;如果兩路輸入信號一路恆定為1,一路恆定為0,那麼輸出的信號實際上就是輸入的時鐘信號。
調用的Verilog語句是:
1 // ODDR: Output Double Data Rate Output Register with Set, Reset 2 // and Clock Enable. 3 // 7 Series 4 // Xilinx HDL Language Template, version 2017.4 5 6 ODDR #( 7 .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" 8 .INIT(1'b0), // Initial value of Q: 1'b0 or 1'b1 9 .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 10 ) ODDR_inst ( 11 .Q(Q), // 1-bit DDR output 12 .C(C), // 1-bit clock input 13 .CE(CE), // 1-bit clock enable input 14 .D1(D1), // 1-bit data input (positive edge) 15 .D2(D2), // 1-bit data input (negative edge) 16 .R(R), // 1-bit reset 17 .S(S) // 1-bit set 18 ); 19 20 // End of ODDR_inst instantiation
模式解釋:
OPPOSITE_EDGE模式:
在此模式中,時鐘邊沿被用來以兩倍的吞吐量從FPGA邏輯中捕獲數據。這種結構與virtex-6的實現比較相似。兩個輸出都提供給IOB的數據輸入或者三態控制輸入。
SAME_EDGE模式:
在此模式下,數據可以在相同的時鐘邊沿從給IOB。相同的時鐘沿將數據送給IOB可以避免建立時間違規,並允許用戶使用最小的寄存器來執行更高的DDR頻率來進行寄存器的延遲,而不是使用CLB寄存器。
註意:
1、set和reset不能同時置位;
2、ODDR原語的複位需要約12個clock,第一次輸入的數據可能會有問題(親測),[由於公司網路的原因,無法上傳圖片],但親測是如此。
修改代碼前:
wire oddr_do_test; oddr_test oddr_test (.clk(tx_clk), .rst(rst), .ce(~rst), .di_p(tx_en), .di_n(tx_er), .do_o(oddr_do_test) );
增加如下代碼:
wire oddr_do_test; reg [5:0]tx_en_d; reg [5:0]tx_er_d; always @ (posedge tx_clk) begin tx_en_d <= {tx_en_d[4:0],tx_en}; tx_er_d <= {tx_er_d[4:0],tx_er}; end oddr_test oddr_test (.clk(tx_clk), .rst(rst), .ce(~rst), .di_p(tx_en_d[5]), .di_n(tx_er_d[5]), .do_o(oddr_do_test) );