FPGA-Xilinx原語調用之ODDR


記錄背景:最近由於想實現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)
        );

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM