新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > xilinx FPGA中oddr,idelay的用法詳解

        xilinx FPGA中oddr,idelay的用法詳解

        作者: 時間:2024-01-31 來源:至芯科技 收藏

        我們知道的selectio中有ilogic和ologic資源,可以實現iddr/和odelay等功能。剛入門時可能對xilinx的原語不太熟練,在vivado的tools-> language templates中搜索iddr 等關鍵詞,可以看到A7等器件下原語模板。復制出來照葫蘆畫瓢,再仿真一下基本就能學會怎么用了。

        本文引用地址:http://www.104case.com/article/202401/455254.htm

        1.

        和iddr都一樣,以oddr為例,先去templates里把模板復制出來。

        Add simulation source,建立一個簡單的仿真文件。

        module simu_oddr(
         
            );
                
            reg clk = 1'd0;
            always
            forever #2 clk = ~ clk;
               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_inst (
               .Q(Q),   // 1-bit DDR output
               .C(clk),   // 1-bit clock input
               .CE(1'd1), // 1-bit clock enable input
               .D1(1'd1), // 1-bit data input (positive edge)
               .D2(1'd0), // 1-bit data input (negative edge)
               .R(1'd0),   // 1-bit reset
               .S(1'd0)    // 1-bit set
            );
            
        endmodule

        ODDR的使用方法在selectoi中的參考手冊ug471中127頁開始有說明,使用這些資源首先要參考的都是官方的資源手冊。


        簡單說明:

        CE是使能,C是時鐘,在時鐘的上升沿下降沿分別輸出D1和D2,Q是輸出,S/R是復位,R = 1 Q輸出0,S= 1,Q輸出1,默認情況應該兩個都等于0 ,兩個都等于1時,輸出0。"OPPOSITE_EDGE" or "SAME_EDGE" 手冊中也有說明,指明采樣時刻不同,具體有什么應用上區別我也不知道。


        通過仿真,就可以看到輸出是什么情況,在上升沿輸出1,下降沿輸出0,還可以看到輸出有一點滯后。iddr和oddr在rgmii的接口中就可以方便地接收數據,轉為gmii。一般情況要注意下時鐘和數據的對齊問題,采樣時鐘可以相位往后一點,90° 1//4周期,輸出的時候時鐘也相應地滯后一點,就根據實際情況來,125M的DDR還是很容易采樣穩定的。

        2.

        在ug471告訴我們,只有hp bank才有odelay,在ug475中說明哪些系列有hp bank,簡單說hp bank速度快很多,支持odelay,電壓只能1.2V- 1.8V。其中A7全系是沒有odelay的,K7才有(保留意見,簡單看了一下),所以在language templates中搜索odelay是沒有A系列的原語的。



        idelay作用就是實現輸入延遲,實際中應該有更明確的用法,這里只是我自己學習時的一些介紹。同樣在ug471中對idelay也有介紹,有固定延時,可變延時,使用時都要例化idelay ctrl,延時的精度就可idelay ctrl的接入時鐘有關。一個bank 只有1個idelay ctrl,同一個bank 要用idelay或者odelay,延時精度是一樣的,雖然可以idelay ctrl可以接200Mhz,300Mhz,但同一個bank只能接1個,也只需要例化一次。多個bank要用idelay時,就要例化多次。

        `timescale 1ns / 1ps
         
        module s(
         
            );
            
            reg clk = 1'd0;
            always
            forever #2.5 clk = ~ clk;
            
            
             (* IODELAY_GROUP = "idelay" *)
               IDELAYCTRL IDELAYCTRL_inst (
               .RDY(),       // 1-bit output: Ready output
               .REFCLK(clk), // 1-bit input: Reference clock input
               .RST(1'd0)        // 1-bit input: Active high reset input
            );
         
            
            reg clk2 = 1'd0;
            always @(posedge clk)
                clk2 <= ~clk2;
            
            
            wire DATAOUT;
            
               (* IODELAY_GROUP = "idelay" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
            
               IDELAYE2 #(
                  .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion (FALSE, TRUE)
                  .DELAY_SRC("IDATAIN"),           // Delay input (IDATAIN, DATAIN)
                  .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
                  .IDELAY_TYPE("FIXED"),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
                  .IDELAY_VALUE(31),                // Input delay tap setting (0-31)
                  .PIPE_SEL("FALSE"),              // Select pipelined mode, FALSE, TRUE
                  .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
                  .SIGNAL_PATTERN("DATA")          // DATA, CLOCK input signal
               )
               IDELAYE2_inst (
                  .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
                  .DATAOUT(DATAOUT),         // 1-bit output: Delayed data output
                  .C(1'd1),                     // 1-bit input: Clock input
                  .CE(1'd0),                   // 1-bit input: Active high enable increment/decrement input
                  .CINVCTRL(1'd0),       // 1-bit input: Dynamic clock inversion input
                  .CNTVALUEIN(1'd0),   // 5-bit input: Counter value input
                  .DATAIN(1'd0),           // 1-bit input: Internal delay data input
                  .IDATAIN(clk2),         // 1-bit input: Data input from the I/O
                  .INC(1'd0),                 // 1-bit input: Increment / Decrement tap delay input
                  .LD(1'd0),                   // 1-bit input: Load IDELAY_VALUE input
                  .LDPIPEEN(1'd0),       // 1-bit input: Enable PIPELINE register to load data input
                  .REGRST(1'd0)            // 1-bit input: Active-high reset tap-delay input
               );
         
        endmodule

        這里例化了一個idelay ctrl,是屬于idelay group的,這個聲明還沒有研究過有什么用,不知道是不是指定idelay2和哪個ctrl是綁定的。idelay ctrl端口很簡單,仿真時復位rst接0就好了,實際中推薦接輸入時鐘的pll lock引腳取反,保證在時鐘鎖定前(lock = 0)idelay ctrl處于復位狀態。

        idelay2中按推薦配置,從DATAIN還是從IDATAIN輸入區別為是內部延時還是從IO輸入,FIXED固定延時,idelay value先輸入0,,時鐘是200M,其他全部接0。此處,idelay的作用就是把IDATAIN的信號接入ilogic中,延時0個tap再從DATAOUT輸出。可變延時的使用說明ug471上都有,還沒學習,有需要了再去看。

        idelay 有0-31個tap,分割200M的半個周期2.5ns,每個tap就是2.5ns/32 = 0.078125 ns

        value = 0 可以看到輸出延遲了0.6ns,value = 10時,延時了1.38ns。0.078125 * 10 + 0.6 = 1.38125,大體相近的。

        其實oddr,idelay這些資源應該用起來都比較簡單,可能我實際中就用了一下oddr/iddr,也沒有覺得有多少難以調試的地方,本文簡單介紹了這2個原語的使用方法,從復制原語,看手冊介紹到仿真,其他原語也是類似的,學會如何去學習最重要。

        文末再介紹一下generate,一樣的在tools -> language templates中搜索。

           genvar;
           generate
              for (=0;<;=+1)
              begin:
                 
              end
           endgenerate

        用這個可以很方便地例化出多個相似的模塊。

               genvar i; //genvar i;也可以定義到generate語句里面
               generate
                      for(i=0;i<10;i=i+1)
                      begin:mymodule
                             assign a[i]=reg[i];
                      end
               endgenerate




        關鍵詞: xilinx FPGA oddr idelay

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新巴尔虎左旗| 信阳市| 江津市| 桐城市| 齐齐哈尔市| 屏边| 临清市| 老河口市| 朝阳县| 乐平市| 五台县| 绵竹市| 施甸县| 精河县| 曲水县| 观塘区| 温宿县| 五寨县| 饶河县| 涞源县| 邮箱| 徐水县| 米易县| 竹山县| 阿拉善左旗| 乌兰浩特市| 黄大仙区| 康保县| 车险| 铜鼓县| 博湖县| 浙江省| 宜兰市| 汶川县| 庄浪县| 阿巴嘎旗| 南昌市| 汝城县| 贺州市| 神木县| 大理市|