0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

QDR SRAM接口FPGA详细Verilog代码分享

Hx 作者:工程师陈翠 2018-06-28 16:20 次阅读

QDR SRAM介绍

QDR 具有独立的读、写数据通路,均使用DDR,在每个时钟周期内会传输四个总线宽度的数据 (两个读和两个写),这就是QDR四倍数据速率的由来。

这里用到的是典型2字突发的QDR,对于4字突发的QDR操作类似,稍作改动就行。针对每个读或写请求,2 字突发器件传输两个字。DDR 地址总线用于在前半个时钟周期允许读请求,在后半个时钟周期允许写请求。

首先看接口的时序图

QDR SRAM接口FPGA详细Verilog代码分享

时序图,表明了 2 字突发 QDR II 存储器接口上的并发读 / 写操作。时钟有三组差分时钟,其中C时钟是发送寄存器的发送时钟,K时钟是目的寄存器用的采样时钟,CQ时钟是经过QDR器件延时,跟输出Q同步的时钟。

在K时钟的前半个周期,DDR 地址总线允许读地址传输给存储器;在时钟的后半个周期,DDR 地址总线允许写地址出现其中。因此,低有效的读控制 (/R) 和写控制 (/W) 控制可在同一时钟周期内有效。

设计目标就是要把QDR接口封装简化,把DDR接口都转化为FPGA内部可用的SDR,这样对用户侧而言,读写控制分离,读写地址分离,操作起来更简便。接口的原理图如下

QDR SRAM接口FPGA详细Verilog代码分享

时钟关系

可用看出两组发送给QDR的时钟,同频,满足C时钟相位为0和K时钟相位为270的关系。

QDR SRAM接口FPGA详细Verilog代码分享

写数据通路

QDR SRAM接口FPGA详细Verilog代码分享

从QDR SRAM的时序图中可以看出,写数据和地址的时序要求一样,因此处理起来也一样。多根数据总线用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

时钟通路

由于数据要经过DDR输出,为了保证时钟和数据具有相同的延时,构造相同的时钟通路,对CLK0和CLK270都进行如下处理

QDR SRAM接口FPGA详细Verilog代码分享

参考代码如下,这里只是一个差分时钟CLK270的处理,对另一个差分时钟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

);

读数据通路

QDR SRAM接口FPGA详细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延时调整算法

其中IDELAY的延时调整算法如图所示,分别找到CQ的上升沿(DDR输出:01-》10)和下降沿(DDR输出:10-》01),然后delay_cnt取中间值,使CLK0对准CQ的中间。由于相同的延迟,CLK0也对准数据采样窗口的中间。当然,最简单的是直接上板子,输入一个正弦波,延时用vio输入,用lia查看波形。可以手动调整延时到能看到稳定的波形就行了,然后在代码里面把delay_cnt写死。也可以调两个最坏的情况,取中间的延时,跟自动调整算法一样。

QDR SRAM接口FPGA详细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

);

代码很简单,把I_user_clk0延迟一下,对齐CQ的中间,这样也就对齐了数据QDR_Q的中间了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21328

    浏览量

    593265
  • QDR
    QDR
    +关注

    关注

    0

    文章

    14

    浏览量

    11901
收藏 人收藏

    评论

    相关推荐

    异步sram测试verilog代码

    异步sram测试verilog代码是个很好的参考程序。
    发表于 01-13 10:24

    ISSI公司的sram verilog model使用

    现在正在进行用fpga来读写sram的小项目,为了验证读写时序,我特地到ISSI公司官网联系他们的技术人员给我发来了一个sram芯片的verilog model,我将其加入到我的工程中
    发表于 11-07 13:34

    基于Virtex-5器件的QDR II SRAM接口设计

    些位置可以访问各组 (bank) 内可用的 BUFIO。对于 x36 宽的 QDR II SRAM 接口,CQ_P 和 CQ_N 均用来采集读数据(第 11 页图9)。一个Virtex-5 器件中的每个
    发表于 04-22 07:00

    用于DDR、QDRQDR-IV SRAM的完整高性能稳压器解决方案

    DN551 - 用于 DDR、QDRQDR-IV SRAM 的超薄型三路输出 μModule 稳压器可安放在 0.5cm2 面积内和 PCB 的背面
    发表于 05-06 08:40

    Spartan-6的QDR接口能连接到MCB引脚吗

    亲爱的论坛,我正在处理将** II SRAM连接到Spartan-6 FPGA的问题。我不是斯巴达IP核的专家,但我意识到Spartan-6没有预见到的QDR接口。但是我确信它可以做到
    发表于 05-22 07:16

    如何利用Virtex-5器件去实现QDR II SRAM接口

    如何利用Virtex-5器件去实现QDR II SRAM接口
    发表于 04-30 06:02

    QDR联盟推出业界最快的四倍数据率(QDR)SRAM

    赛普拉斯半导体公司和瑞萨电子公司在内的QDR联盟日前宣布推出业界最快的四倍数据率(QDR) SRAM(静态随机存取存储器)。
    发表于 05-01 09:03 1496次阅读

    fpga实现jpeg Verilog代码

    本站提供的fpga实现jpeg Verilog代码资料,希望能够帮你的学习。
    发表于 05-27 15:09 200次下载

    QDR SRAM与Spartan3 FPGA接口设计

    以CY7C1302为例来详细介绍QDR的工作原理及其与Spartan3系列FPGA接口设计。CY7C1302是赛普拉斯公司生产的一种QDR
    发表于 06-01 09:57 4778次阅读
    <b class='flag-5'>QDR</b> <b class='flag-5'>SRAM</b>与Spartan3 <b class='flag-5'>FPGA</b>的<b class='flag-5'>接口</b>设计

    用于DDR、QDRQDR-IV SRAM的超薄型三路输出µmodule稳压器

    数据速率下的一项主要挑战是保持在 SRAM 与高速 FPGA 和处理器等器件之间传输数据的完整性。 一种良好的解决方案是把 SRAM (例如:QDR-IV、
    发表于 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稳压器

    SRAM 72-Mbit QDR® II SRAM 2 字突发结构

    SRAM 72-Mbit QDR® II SRAM 2 字突发结构
    发表于 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 字突发结构

    SRAM 72-Mbit QDR® II+ SRAM 4 字突发架构(2.5 周期读延迟

    SRAM 72-Mbit QDR® II+ SRAM 4 字突发架构(2.5 周期读延迟
    发表于 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 字突发架构(2.5 周期读延迟

    利用Virtex-5器件实现在FPGA内实现QDR SRAM接口设计

    本应用指南所讨论的参考设计针对的是 4 字突发 QDR II SRAM 器件。QDR II 架构的独特性能之一是源同步回送时钟 (CQ) 输出,它与器件输入时钟 (K) 频率相同,与通过读通路输出
    的头像 发表于 05-23 08:11 3182次阅读
    利用Virtex-5器件实现在<b class='flag-5'>FPGA</b>内实现<b class='flag-5'>QDR</b> <b class='flag-5'>SRAM</b><b class='flag-5'>接口</b>设计

    通过VerilogSRAM读写程序源代码

    通过VerilogSRAM读写程序源代码
    发表于 06-29 09:26 7次下载

    如何使用 QDR(TM) II SRAM 和 DDR II SRAM 用户手册

    如何使用 QDR(TM) II SRAM 和 DDR II SRAM 用户手册
    发表于 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> 用户手册