0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

QDR SRAM接口FPGA詳細(xì)Verilog代碼分享

Hx ? 作者:工程師陳翠 ? 2018-06-28 16:20 ? 次閱讀

QDR SRAM介紹

QDR 具有獨(dú)立的讀、寫數(shù)據(jù)通路,均使用DDR,在每個(gè)時(shí)鐘周期內(nèi)會(huì)傳輸四個(gè)總線寬度的數(shù)據(jù) (兩個(gè)讀和兩個(gè)寫),這就是QDR四倍數(shù)據(jù)速率的由來(lái)。

這里用到的是典型2字突發(fā)的QDR,對(duì)于4字突發(fā)的QDR操作類似,稍作改動(dòng)就行。針對(duì)每個(gè)讀或?qū)懻?qǐng)求,2 字突發(fā)器件傳輸兩個(gè)字。DDR 地址總線用于在前半個(gè)時(shí)鐘周期允許讀請(qǐng)求,在后半個(gè)時(shí)鐘周期允許寫請(qǐng)求。

首先看接口的時(shí)序圖

QDR SRAM接口FPGA詳細(xì)Verilog代碼分享

時(shí)序圖,表明了 2 字突發(fā) QDR II 存儲(chǔ)器接口上的并發(fā)讀 / 寫操作。時(shí)鐘有三組差分時(shí)鐘,其中C時(shí)鐘是發(fā)送寄存器的發(fā)送時(shí)鐘,K時(shí)鐘是目的寄存器用的采樣時(shí)鐘,CQ時(shí)鐘是經(jīng)過(guò)QDR器件延時(shí),跟輸出Q同步的時(shí)鐘。

在K時(shí)鐘的前半個(gè)周期,DDR 地址總線允許讀地址傳輸給存儲(chǔ)器;在時(shí)鐘的后半個(gè)周期,DDR 地址總線允許寫地址出現(xiàn)其中。因此,低有效的讀控制 (/R) 和寫控制 (/W) 控制可在同一時(shí)鐘周期內(nèi)有效。

設(shè)計(jì)目標(biāo)就是要把QDR接口封裝簡(jiǎn)化,把DDR接口都轉(zhuǎn)化為FPGA內(nèi)部可用的SDR,這樣對(duì)用戶側(cè)而言,讀寫控制分離,讀寫地址分離,操作起來(lái)更簡(jiǎn)便。接口的原理圖如下

QDR SRAM接口FPGA詳細(xì)Verilog代碼分享

時(shí)鐘關(guān)系

可用看出兩組發(fā)送給QDR的時(shí)鐘,同頻,滿足C時(shí)鐘相位為0和K時(shí)鐘相位為270的關(guān)系。

QDR SRAM接口FPGA詳細(xì)Verilog代碼分享

寫數(shù)據(jù)通路

QDR SRAM接口FPGA詳細(xì)Verilog代碼分享

從QDR SRAM的時(shí)序圖中可以看出,寫數(shù)據(jù)和地址的時(shí)序要求一樣,因此處理起來(lái)也一樣。多根數(shù)據(jù)總線用generate for生成,代碼如下。地址通道做相同的處理

generate

genvar var1;

for(var1=0;var1《18;var1=var1+1)

begin:

gen_QDR_D

ODDR #(

.DDR_CLK_EDGE(“SAME_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”

) O_QDR_D_inst (

.Q (O_QDR_D[var1] ), // 1-bit DDR output

.C (I_user_clk0 ), // 1-bit clock input

.CE(1’b1 ), // 1-bit clock enable input

.D1(I_user_wr_data1[var1]), // 1-bit data input (positive edge)

.D2(I_user_wr_data2[var1]), // 1-bit data input (negative edge)

.R (1‘b0 ), // 1-bit reset

.S (1’b0 ) // 1-bit set

);

end

endgenerate

時(shí)鐘通路

由于數(shù)據(jù)要經(jīng)過(guò)DDR輸出,為了保證時(shí)鐘和數(shù)據(jù)具有相同的延時(shí),構(gòu)造相同的時(shí)鐘通路,對(duì)CLK0和CLK270都進(jìn)行如下處理

QDR SRAM接口FPGA詳細(xì)Verilog代碼分享

參考代碼如下,這里只是一個(gè)差分時(shí)鐘CLK270的處理,對(duì)另一個(gè)差分時(shí)鐘CLK0做相同處理。

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”

) O_QDR_K_p_inst (

.Q (O_QDR_K_p), // 1-bit DDR output

.C (I_user_clk270), // 1-bit clock input

.CE(1’b1), // 1-bit clock enable input

.D1(1‘b0), // 1-bit data input (positive edge)

.D2(1’b1), // 1-bit data input (negative edge)

.R (1‘b0), // 1-bit reset

.S (1’b0) // 1-bit set

);

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”

) O_QDR_K_n_inst (

.Q (O_QDR_K_n), // 1-bit DDR output

.C (I_user_clk270), // 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‘b0), // 1-bit reset

.S (1’b0) // 1-bit set

);

讀數(shù)據(jù)通路

QDR SRAM接口FPGA詳細(xì)Verilog代碼分享

//******************************************************************************

// input data path

//******************************************************************************

//-------------------------------------QDR_Q-------------------------------------

generate

genvar var3;

for(var3=0;var3《18;var3=var3+1)

begin:

gen_QDR_Q

IDDR #(

.DDR_CLK_EDGE(“SAME_EDGE_PIPELINED”), // “OPPOSITE_EDGE”, “SAME_EDGE”// or “SAME_EDGE_PIPELINED”

.INIT_Q1 (1‘b0 ), // Initial value of Q1: 1’b0 or 1‘b1

.INIT_Q2 (1’b0 ), // Initial value of Q2: 1‘b0 or 1’b1

.SRTYPE (“SYNC” ) // Set/Reset type: “SYNC” or “ASYNC”

) I_QDR_Q_inst (

.Q1(W_rd_data1[var3]), // 1-bit output for positive edge of clock

.Q2(W_rd_data2[var3]), // 1-bit output for negative edge of clock

.C (W_dly_clk0), // 1-bit clock input

.CE(1‘b1), // 1-bit clock enable input

.D (I_QDR_Q[var3]), // 1-bit DDR data input

.R (1’b0), // 1-bit reset

.S (1‘b0) // 1-bit set

);

end

endgenerate

IDELATY延時(shí)調(diào)整算法

其中IDELAY的延時(shí)調(diào)整算法如圖所示,分別找到CQ的上升沿(DDR輸出:01-》10)和下降沿(DDR輸出:10-》01),然后delay_cnt取中間值,使CLK0對(duì)準(zhǔn)CQ的中間。由于相同的延遲,CLK0也對(duì)準(zhǔn)數(shù)據(jù)采樣窗口的中間。當(dāng)然,最簡(jiǎn)單的是直接上板子,輸入一個(gè)正弦波,延時(shí)用vio輸入,用lia查看波形??梢允謩?dòng)調(diào)整延時(shí)到能看到穩(wěn)定的波形就行了,然后在代碼里面把delay_cnt寫死。也可以調(diào)兩個(gè)最壞的情況,取中間的延時(shí),跟自動(dòng)調(diào)整算法一樣。

QDR SRAM接口FPGA詳細(xì)Verilog代碼分享

(* IODELAY_GROUP = “delay1” *)

IDELAYCTRL IDELAYCTRL_inst1 (

.RDY(W_delay_rdy), // 1-bit output: Ready output

.REFCLK(I_ref_clk_200m), // 1-bit input: Reference clock input

.RST(~I_reset_n) // 1-bit input: Active high reset input

);

(* IODELAY_GROUP = “delay1” *)

IDELAYE2 #(

.CINVCTRL_SEL(“FALSE”), // Enable dynamic clock inversion (FALSE, TRUE)

.DELAY_SRC(“IDATAIN”), // Delay input (IDATAIN, DATAIN)

.HIGH_PERFORMANCE_MODE(“TRUE”), // Reduced jitter (“TRUE”), Reduced power (“FALSE”)

.IDELAY_TYPE(“VAR_LOAD”), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE

.IDELAY_VALUE(0), // 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(“CLOCK”) // DATA, CLOCK input signal

IDELAYE2_inst1 (

.CNTVALUEOUT(), // 5-bit output: Counter value output

.DATAOUT(W_dly_clk0), // 1-bit output: Delayed data output

.C(W_fc_clk), // 1-bit input: Clock input

.CE(1‘b0), // 1-bit input: Active high enable increment/decrement input

.CINVCTRL(1’b0), // 1-bit input: Dynamic clock inversion input

.CNTVALUEIN(W_delay_cnt), // 5-bit input: Counter value input

.DATAIN(1‘b0), // 1-bit input: Internal delay data input

.IDATAIN(I_uae_clk0), // 1-bit input: Data input from the I/O

.INC(1’b0), // 1-bit input: Increment / Decrement tap delay input

.LD(1‘b1), // 1-bit input: Load IDELAY_VALUE input

.LDPIPEEN(1’b0), // 1-bit input: Enable PIPELINE register to load data input

.REGRST(1‘b0) // 1-bit input: Active-high reset tap-delay input

);

代碼很簡(jiǎn)單,把I_user_clk0延遲一下,對(duì)齊CQ的中間,這樣也就對(duì)齊了數(shù)據(jù)QDR_Q的中間了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598904
  • QDR
    QDR
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    11950
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    異步sram測(cè)試verilog代碼

    異步sram測(cè)試verilog代碼是個(gè)很好的參考程序。
    發(fā)表于 01-13 10:24

    ISSI公司的sram verilog model使用

    現(xiàn)在正在進(jìn)行用fpga來(lái)讀寫sram的小項(xiàng)目,為了驗(yàn)證讀寫時(shí)序,我特地到ISSI公司官網(wǎng)聯(lián)系他們的技術(shù)人員給我發(fā)來(lái)了一個(gè)sram芯片的verilog model,我將其加入到我的工程中
    發(fā)表于 11-07 13:34

    基于Virtex-5器件的QDR II SRAM接口設(shè)計(jì)

    些位置可以訪問(wèn)各組 (bank) 內(nèi)可用的 BUFIO。對(duì)于 x36 寬的 QDR II SRAM 接口,CQ_P 和 CQ_N 均用來(lái)采集讀數(shù)據(jù)(第 11 頁(yè)圖9)。一個(gè)Virtex-5 器件中的每個(gè)
    發(fā)表于 04-22 07:00

    用于DDR、QDRQDR-IV SRAM的完整高性能穩(wěn)壓器解決方案

    DN551 - 用于 DDR、QDRQDR-IV SRAM 的超薄型三路輸出 μModule 穩(wěn)壓器可安放在 0.5cm2 面積內(nèi)和 PCB 的背面
    發(fā)表于 05-06 08:40

    Spartan-6的QDR接口能連接到MCB引腳嗎

    親愛(ài)的論壇,我正在處理將** II SRAM連接到Spartan-6 FPGA的問(wèn)題。我不是斯巴達(dá)IP核的專家,但我意識(shí)到Spartan-6沒(méi)有預(yù)見(jiàn)到的QDR接口。但是我確信它可以做到
    發(fā)表于 05-22 07:16

    如何利用Virtex-5器件去實(shí)現(xiàn)QDR II SRAM接口?

    如何利用Virtex-5器件去實(shí)現(xiàn)QDR II SRAM接口?
    發(fā)表于 04-30 06:02

    QDR聯(lián)盟推出業(yè)界最快的四倍數(shù)據(jù)率(QDR)SRAM

    賽普拉斯半導(dǎo)體公司和瑞薩電子公司在內(nèi)的QDR聯(lián)盟日前宣布推出業(yè)界最快的四倍數(shù)據(jù)率(QDR) SRAM(靜態(tài)隨機(jī)存取存儲(chǔ)器)。
    發(fā)表于 05-01 09:03 ?1573次閱讀

    fpga實(shí)現(xiàn)jpeg Verilog代碼

    本站提供的fpga實(shí)現(xiàn)jpeg Verilog代碼資料,希望能夠幫你的學(xué)習(xí)。
    發(fā)表于 05-27 15:09 ?200次下載

    QDR SRAM與Spartan3 FPGA接口設(shè)計(jì)

    以CY7C1302為例來(lái)詳細(xì)介紹QDR的工作原理及其與Spartan3系列FPGA接口設(shè)計(jì)。CY7C1302是賽普拉斯公司生產(chǎn)的一種QDR
    發(fā)表于 06-01 09:57 ?5174次閱讀
    <b class='flag-5'>QDR</b> <b class='flag-5'>SRAM</b>與Spartan3 <b class='flag-5'>FPGA</b>的<b class='flag-5'>接口</b>設(shè)計(jì)

    用于DDR、QDRQDR-IV SRAM的超薄型三路輸出μmodule穩(wěn)壓器

    數(shù)據(jù)速率下的一項(xiàng)主要挑戰(zhàn)是保持在 SRAM 與高速 FPGA 和處理器等器件之間傳輸數(shù)據(jù)的完整性。 一種良好的解決方案是把 SRAM (例如:QDR-IV、
    發(fā)表于 05-08 15:56 ?7次下載
    用于DDR、<b class='flag-5'>QDR</b>和<b class='flag-5'>QDR</b>-IV <b class='flag-5'>SRAM</b>的超薄型三路輸出μmodule穩(wěn)壓器

    SRAM 72-Mbit QDR? II SRAM 2 字突發(fā)結(jié)構(gòu)

    SRAM 72-Mbit QDR? II SRAM 2 字突發(fā)結(jié)構(gòu)
    發(fā)表于 10-10 08:58 ?12次下載
    <b class='flag-5'>SRAM</b> 72-Mbit <b class='flag-5'>QDR</b>? II <b class='flag-5'>SRAM</b> 2 字突發(fā)結(jié)構(gòu)

    SRAM 72-Mbit QDR? II+ SRAM 4 字突發(fā)架構(gòu)(2.5 周期讀延遲

    SRAM 72-Mbit QDR? II+ SRAM 4 字突發(fā)架構(gòu)(2.5 周期讀延遲
    發(fā)表于 10-10 09:00 ?17次下載
    <b class='flag-5'>SRAM</b> 72-Mbit <b class='flag-5'>QDR</b>? II+ <b class='flag-5'>SRAM</b> 4 字突發(fā)架構(gòu)(2.5 周期讀延遲

    利用Virtex-5器件實(shí)現(xiàn)在FPGA內(nèi)實(shí)現(xiàn)QDR SRAM接口設(shè)計(jì)

    本應(yīng)用指南所討論的參考設(shè)計(jì)針對(duì)的是 4 字突發(fā) QDR II SRAM 器件。QDR II 架構(gòu)的獨(dú)特性能之一是源同步回送時(shí)鐘 (CQ) 輸出,它與器件輸入時(shí)鐘 (K) 頻率相同,與通過(guò)讀通路輸出
    的頭像 發(fā)表于 05-23 08:11 ?3481次閱讀
    利用Virtex-5器件實(shí)現(xiàn)在<b class='flag-5'>FPGA</b>內(nèi)實(shí)現(xiàn)<b class='flag-5'>QDR</b> <b class='flag-5'>SRAM</b><b class='flag-5'>接口</b>設(shè)計(jì)

    通過(guò)VerilogSRAM讀寫程序源代碼

    通過(guò)VerilogSRAM讀寫程序源代碼
    發(fā)表于 06-29 09:26 ?7次下載

    如何使用 QDR(TM) II SRAM 和 DDR II SRAM 用戶手冊(cè)

    如何使用 QDR(TM) II SRAM 和 DDR II SRAM 用戶手冊(cè)
    發(fā)表于 04-27 20:25 ?6次下載
    如何使用 <b class='flag-5'>QDR</b>(TM) II <b class='flag-5'>SRAM</b> 和 DDR II <b class='flag-5'>SRAM</b> 用戶手冊(cè)