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

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

3天内不再提示

DDR信号的处理

冬至子 来源:Bug记录 作者:woodfan 2023-06-16 10:22 次阅读

注意,这里的DDR指的是Double Data Rate,双倍数据速率。这篇文章并不是讲DDR存储器系列的东西。

不同于SDR,也就是单上升沿或下降沿,传输数据。DDR说我不想选择是上升沿还是下降沿传输数据,小孩子才做选择,大人只会说我全都要。

上升沿和下降沿全部都要传数据

通过一组图片就可以看到SDR和DDR的区别:

图片

SDR

图片

DDR

可以看到经过DDR处理的数据在数据时钟上升沿和下降沿都有数据更新,对于如何完整的取出数据,我仔细思考了许久,经历了否定之否定的过程,最终才找到了通用的解决方案。现在写出解决方案的心路历程:

  1. 刚开始觉得,既然它上升沿和下降沿都有,不如用一个always检测时钟跳变,有跳变就开始取值。代码示例如下:
always @ (fb_clk)
begin
if (fb_clk == 1'b1) //上升沿跳变
   i_data <= tx_frame ? {tx_d,6'd0} : {i_data[11:6], tx_d};// tx_frame为高代表高6位, 低为低8else
   q_data <= tx_frame ? {tx_d,6'd0} : {q_data[11:6], tx_d};
end

但是这么做肯定是有问题的,我们本来是要描述一个时序电路,最后always的敏感列表里面是一个信号,这么做就成了组合逻辑了,这么做不稳定不可取。

  1. 第二种方法是使用锁相环输出一个与原数据时钟同频但相位延后180度的时钟fb_clk_180, fb_clk负责采样data_I, fb_clk_180负责data_Q。这种方法可以,但感觉麻烦,因为后面还要使用DDR输出信号,时钟转来转去有点麻烦。
  2. 第三种方法还是使用锁相环,输出一个同相但频率为原来频率2倍的时钟信号fb_clk_mul2。fb_clk_mul2的每次上升沿,对应着原时钟fb_clk的上升沿和下降沿,使用fb_clk_mul2就可以分离data_I和data_Q。但这种方法也有局限性,不仅增加时钟数量,当原时钟速率过高,这种方法的稳定性也将有待商榷。

最后,我们在Vivado里面找到了一种原语,完美解决这个问题。这就是IDDR和ODDR。

对于输入信号,我们使用IDDR解出原始数据,在Language Template找到IDDR原语示例,例子如下:

IDDR #(
         .DDR_CLK_EDGE("SAME_EDGE"), // "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"
      ) IDDR_inst (
         .Q1(rx_data_pos[i]), // 1-bit output for positive edge of clock
         .Q2(rx_data_neg[i]), // 1-bit output for negative edge of clock
         .C(data_clk),   // 1-bit clock input
         .CE(1'b1), // 1-bit clock enable input
         .D(rx_data_dly[i]),   // 1-bit DDR data input
//         .D(rx_data[i]),   // 1-bit DDR data input
         .R(1'b0),   // 1-bit reset
         .S(1'b0)    // 1-bit set
      );

设置好IDDR的4个常量参数之后,将数据时钟接入C端口,时钟使能CE端口拉高,待转数据信号接入D端口,Q1端口将会输出时钟上升沿采样的数据,Q2端口将会输出时钟下降沿采样的数据。注意设置好复位R和置位S端口。

设置好之后就可以在rx_data_pos,rx_data_neg看到数据。这里我使用了generate for生成块,所以出现了genvar变量i;

同样,对于DDR输出信号,使用ODDR原语解决:

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"
  ) ODDR_inst (
     .Q(p0_data[i]),   // 1-bit DDR output
     .C(data_clk),   // 1-bit clock input
     .CE(1'b1), // 1-bit clock enable input
     .D1(idata[i]), // 1-bit data input (positive edge)
     .D2(qdata[i]), // 1-bit data input (negative edge)
     .R(1'b0),   // 1-bit reset
     .S(1'b0)    // 1-bit set
  );

设置好ODDR的3个常量参数之后,将数据时钟接入C端口,时钟使能CE端口拉高,Q端口输出DDR处理后的数据,数据时钟上升沿更新的数据接入D1端口,数据时钟下降沿更新的数据接入D2端口。注意设置好复位R和置位S端口。

ODDR还可以巧妙地输出时钟,在D1输入1'b1, D2输入1'b0,其他不变,则在数据时钟上升沿输出高电平,下降沿输出低电平。巧妙地输出了数据时钟。

注意,ODDR输出的数据只能经过IOBUF或者输出,曾经有人想使用ILA抓取ODDR的Q端口输出的数据,无奈Implemention总会报错。

总结:

  • 对于DDR信号,不能直接用always @ (data_clk)的方法采样信号,详细见上述(1)内容
  • 上述(2)和(3)的方法在一定范围内都有其可行性,但也有一些弊端,详细见上述(2)和(3)内容
  • 使用IDDR和ODDR最为妥当,IDDR和ODDR的数据端口都是1bit,多bit可以使用generate for生成块
  • 可以使用ODDR在普通IO上输出数据时钟
  • ODDR输出的数据只能经过IOBUF或者输出

如果是LVDS信号,需要先转单端再进IDDR;或者ODDR后再转差分输出;差分信号的处理方法可以看上一篇文章。

信号处理好之后,如果出现了时钟与数据对不上该怎么办,这个时候可以使用Idelay调整时序。

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

    关注

    38

    文章

    7148

    浏览量

    161986
  • DDR
    DDR
    +关注

    关注

    9

    文章

    677

    浏览量

    64240
  • SDR
    SDR
    +关注

    关注

    7

    文章

    232

    浏览量

    50157
  • LVDS信号
    +关注

    关注

    0

    文章

    17

    浏览量

    7733
  • Vivado
    +关注

    关注

    18

    文章

    790

    浏览量

    65100
收藏 人收藏

    评论

    相关推荐

    DDR4信号完整性测试要求

    DDR5已经开始商用,但是有的产品还才开始使用DDR4。本文分享一些DDR4的测试内容。DDR4 和前代的 DDR3 相比, 它的速度大幅提
    的头像 发表于 01-08 09:18 676次阅读
    <b class='flag-5'>DDR</b>4<b class='flag-5'>信号</b>完整性测试要求

    240-4C6678_K7_DDR3_VPX高速信号处理

    4C6678_K7_DDR3_VPX高速信号处理板 4C6678_K7_DDR3_VPX板为基于TI多核DSP TMS320C6678的通用处理
    发表于 09-18 14:50

    DDR2-800和DDR3的PCB信号完整性设计

    本文章主要涉及到对 DDR2 和DDR3 在设计印制线路板(PCB)时,考虑信号完整性和电源完整性的设计事项,这些是具有相当大的挑战性的。文章重点是讨论在尽可能少的PCB 层数,特别是4 层板
    发表于 07-12 17:31 0次下载
    <b class='flag-5'>DDR</b>2-800和<b class='flag-5'>DDR</b>3的PCB<b class='flag-5'>信号</b>完整性设计

    针对DDR2-800和DDR3的PCB信号完整性设计

    针对DDR2-800和DDR3的PCB信号完整性设计
    发表于 02-23 11:37 0次下载

    针对DDR2-800和DDR3的PCB信号完整性设计

    针对DDR2-800和DDR3的PCB信号完整性设计,要认证看
    发表于 12-16 21:23 0次下载

    嵌入式DDR布线分析 DDR信号布线介绍

    嵌入式 DDR(Double Data Rate,双数据速率)设计是含DDR的 嵌入式 硬件设计中最重要和最核心的部分。随着嵌入式系统的处理能力越来越强大,实现的功能越来越多,系统的工作频率越来越高,
    发表于 04-11 15:33 4029次阅读
    嵌入式<b class='flag-5'>DDR</b>布线分析 <b class='flag-5'>DDR</b><b class='flag-5'>信号</b>布线介绍

    DDR工作原理_DDR DQS信号处理

    Random Access Memory的缩写,即同步动态随机存取存储器。本文首先介绍了DDR工作原理及结构图,其次阐述了DDR DQS信号处理,具体的跟随小编一起来了解一下。
    的头像 发表于 05-23 16:07 5.1w次阅读
    <b class='flag-5'>DDR</b>工作原理_<b class='flag-5'>DDR</b> DQS<b class='flag-5'>信号</b>的<b class='flag-5'>处理</b>

    DDR高速信号线的布线原则和技巧

    在普通印制电路板的布线中由于信号是低速信号,所以在3W原则的基本布线规则下按照信号的流向将其连接起来,一般都不会出现问题。但是如果信号是100M以上的速度时,布线就很有讲究了。由于最近
    发表于 03-24 10:00 7055次阅读
    <b class='flag-5'>DDR</b>高速<b class='flag-5'>信号</b>线的布线原则和技巧

    DDR总线时间的解决办法

    基于向导的查询很容易设置批处理模式模拟评估时间和信号质量DDR 1/2/3和LPDDR 1/2/3设计。
    的头像 发表于 10-22 07:07 2695次阅读

    DDRDDR2与DDR3的设计资料总结

    本文档的主要内容详细介绍的是DDRDDR2与DDR3的设计资料总结包括了:一、DDR的布线分析与设计,二、DDR电路的
    发表于 05-29 08:00 0次下载
    <b class='flag-5'>DDR</b>和<b class='flag-5'>DDR</b>2与<b class='flag-5'>DDR</b>3的设计资料总结

    ZCU10中MPSoC对DDR复位信号设计

    Xilinx的开发板ZCU102支持休眠到内存(suspend-to-ram)。休眠到内存时,DDR进入自刷新,MPSoC被关电,完全不耗电。唤醒时,MPSoC根据外部输入信号判断出不是上电启动而是
    的头像 发表于 11-04 17:02 2470次阅读
    ZCU10中MPSoC对<b class='flag-5'>DDR</b>复位<b class='flag-5'>信号</b>设计

    关于DDR信号的如何去判断信号质量?

    通常,DDR设计完成之后 ,对信号质量并没有一个完全确定的概念,需要我们通过仿真和测试的手段去判断和验证。而此时,往往我们拿到的就是一个波形,测试波形或者仿真波形,该如何去判断其信号质量,参照的标准
    的头像 发表于 04-09 10:04 4977次阅读
    关于<b class='flag-5'>DDR</b><b class='flag-5'>信号</b>的如何去判断<b class='flag-5'>信号</b>质量?

    针对DDR2和DDR3的PCB信号完整性设计介绍

    本文章主要涉及到对DDR2和DDR3在PCB设计时,考虑信号完整性和电源完整性的设计事项,这些是具有相当大的挑战性的。 文章重点是讨论在尽可能少的PCB层数,特别是4层板的情况下的相关技术,其中
    的头像 发表于 03-25 14:26 3923次阅读
    针对<b class='flag-5'>DDR</b>2和<b class='flag-5'>DDR</b>3的PCB<b class='flag-5'>信号</b>完整性设计介绍

    如何去解决LVDS差分接口的DDR信号问题

    注意,这里的DDR指的是Double Data Rate,双倍数据速率。这篇文章并不是讲DDR存储器系列的东西。
    发表于 08-20 10:29 1911次阅读
    如何去解决LVDS差分接口的<b class='flag-5'>DDR</b><b class='flag-5'>信号</b>问题

    DDR加终端匹配电阻和不加信号质量的区别

    DDR加终端匹配电阻和不加信号质量的区别  DDR(双倍数据传输速率)是一种常用于计算机内存的高速数据传输技术。在DDR中,终端匹配电阻和信号
    的头像 发表于 12-29 13:54 416次阅读