一、赛灵思7系列FPGA

1.1 ODDR:实现数据的双边沿发送

支持两种模式:OPPOSITE_EDGE模式、SAME_EDGE模式

ODDR #(
      .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" 
      .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1,Q初始值
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   ) ODDR_inst (
      .Q(Q),   // 1-bit DDR output
      .C(C),   // 1-bit clock input
      .CE(CE), // 1-bit clock enable input,高电平使能发送数据
      .D1(D1), // 1-bit data input (positive edge)
      .D2(D2), // 1-bit data input (negative edge)
      .R(R),   // 1-bit reset,高电平复位
      .S(S)    // 1-bit set,高电平置位
   );

1.1.1、OPPOSITE_EDGE模式

时钟上升沿提取D1数据赋值给Q,时钟下降沿提取D2数据赋值给Q。Q输出相比较于时钟边沿,有一定的延迟。

1.1.2、SAME_EDGE模式

时钟上升沿提取D1和D2,然后依次在一个时钟内赋值给Q,发送出去。 

1.2 IDDR:实现输入信号的时钟双边沿接收

支持3种模式:OPPOSITE_EDGE模式、SAME_EDGE模式、SAME_EDGE_PIPELINED模式。

IDDR #(
      .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE" 
                                      //    or "SAME_EDGE_PIPELINED" 
      .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1,Q1的初始值
      .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1  Q2的初始值
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   ) IDDR_inst (
      .Q1(Q1), // 1-bit output for positive edge of clock
      .Q2(Q2), // 1-bit output for negative edge of clock
      .C(C),   // 1-bit clock input
      .CE(CE), // 1-bit clock enable input,高电平时接收新数据
      .D(D),   // 1-bit DDR data input,IOB输入
      .R(R),   // 1-bit reset,高电平复位
      .S(S)    // 1-bit set,高电平置位
   );

1.2.1、OPPOSITE_EDGE模式

时钟上升沿的DDR数据赋值给Q1,时钟下降沿时的数据赋值给Q2,Q1与Q2的输出相比较时钟上升沿与下降沿延迟了一段时间。

1.2.2、SAME_EDGE模式

在时钟上升沿同时将DDR数据赋值给Q1和Q2。时序图如下。CE有效后第一个时钟内,Q2为无效值。

1.2.3、SAME_EDGE_PIPELINED模式

在时钟上升沿将DDR数据赋值给Q1与Q2,Q1与Q2进行了流水线处理。

二、ultrascale架构FPGA

2.1、ODDRE1 实现数据的双边沿发送

仅支持SAME_EDGE模式。时钟上升沿提取数据,在一个时钟周期内发送出去。

ODDRE1 #(
      .IS_C_INVERTED(1'b0),      // Optional inversion for C,信号取反
      .IS_D1_INVERTED(1'b0),     // Unsupported, do not use
      .IS_D2_INVERTED(1'b0),     // Unsupported, do not use
      .SIM_DEVICE("ULTRASCALE"), // Set the device version for simulation functionality (ULTRASCALE)
      .SRVAL(1'b0)               // Initializes the ODDRE1 Flip-Flops to the specified value (1'b0, 1'b1),复位后初始值
   )
   ODDRE1_inst (
      .Q(Q),   // 1-bit output: Data output to IOB
      .C(C),   // 1-bit input: High-speed clock input
      .D1(D1), // 1-bit input: Parallel data input 1
      .D2(D2), // 1-bit input: Parallel data input 2
      .SR(SR)  // 1-bit input: Active-High Async Reset
   );

2.2、IDDRE1 实现数据的双边沿发送

支持3种模式:OPPOSITE_EDGE模式、SAME_EDGE模式、SAME_EDGE_PIPELINED模式。

IDDRE1 #(
      .DDR_CLK_EDGE("OPPOSITE_EDGE"), // IDDRE1  mode (OPPOSITE_EDGE,                                                                         SAME_EDGE, SAME_EDGE_PIPELINED)
      .IS_CB_INVERTED(1'b0),   // Optional inversion for CB,0时不对CB取反,1时对CB取反
      .IS_C_INVERTED(1'b0)      // Optional inversion for C,0时不对C取反,1时对C取反
   )
   IDDRE1_inst (
      .Q1(Q1), // 1-bit output: Registered parallel output 1
      .Q2(Q2), // 1-bit output: Registered parallel output 2
      .C(C),   // 1-bit input: High-speed clock
      .CB(CB), // 1-bit input: Inversion of High-speed clock C,C时钟的取反输入
      .D(D),   // 1-bit input: Serial Data Input
      .R(R)    // 1-bit input: Active-High Async Reset,高电平有效
   );

2.2.1、OPPOSITE_EDGE模式

时钟上升沿的DDR数据赋值给Q1,时钟下降沿时的数据赋值给Q2

2.2.2、SAME_EDGE模式

在时钟上升沿。Q1与Q2同时有效。

2.2.3、SAME_EDGE_PIPELINED模式

相似与SAME_EDGE模式,数据Q1与Q2在时钟上升沿同时有效,不过数据对没有被拆分到不同时钟。

三、通过实例解析原语

假设有一需求,将SPARTAN7 8bits位宽的数据,采用双边沿DDR的方式发送Ultrascale系列的任意FPGA上。为实现该需求进行设计(仿真模型设计)。
        首先确认spartan7需要使用的原语为ODDR,ultrascale FPGA使用原语为IDDRE1。

Spartan7示例程序:

`timescale 1ns/1ps

module S7_model
    (output ddr_clk,//DDR数据同步时钟
    output data_valid,//数据有效标志
    output [3:0] ddr_data
);

//-------------------模拟生成时钟---------
reg clk=0;//模拟生成100M时钟
always
begin
    #5 clk <= ~clk;
end

//----------------------基于clk实现逻辑----------------
wire clk_bufg;
wire not_clk_bufg;
reg [7:0] clk_cnt =0;//时钟计数
reg data_valid;
reg [7:0]data=0;
wire [3:0] data_pos;
wire [3:0] data_neg;

assign ddr_clk = clk_bufg;
   BUFG BUFG_inst (
      .O(clk_bufg), // 1-bit output: Clock output.
      .I(clk)  // 1-bit input: Clock input.
   );

always@(posedge clk_bufg)
begin
    clk_cnt <= #1 clk_cnt + 1'b1;
end

always@(posedge clk_bufg)
begin
    if(clk_cnt >= 8'h80) begin//clk_cnt从0x80到0x00有效
        #1 data_valid <= 1'b1;
         data <= clk_cnt;
     end
     else begin
        #1 data_valid <= 1'b0;
     end
end

assign data_pos = data[3:0];
assign data_neg =data [7:4];

//上升沿发送data_pos,下降沿发送data_neg.因为数据经过ODDR输出时存在延时,
//因此接收数据时,应该是上升沿接收data_neg,下降沿接收data_pos
    generate
        genvar i;
        for(i=0;i<=3;i=i+1) begin
             ODDR #(
              .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" 
              .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
              .SRTYPE("ASYNC") // Set/Reset type: "SYNC" or "ASYNC" 
           ) ODDR_inst (
              .Q(ddr_data[i]),   // 1-bit DDR output
              .C(clk_bufg),   // 1-bit clock input
              .CE(1'b1), // 1-bit clock enable input
              .D1(data_pos[i]), // 1-bit data input (positive edge)
              .D2(data_neg[i]), // 1-bit data input (negative edge)
              .R(1'b0),   // 1-bit reset
              .S(1'b0)    // 1-bit set
           );
        end
    endgenerate

endmodule

Ultra FPGA示例程序

`timescale 1ns / 1ps
module ultra_model(
    input ddr_clk,//DDR数据同步时钟
    input data_valid,//数据有效标志
    input [3:0] ddr_data
    );
wire [3:0] ddr_data_pos;//
wire [3:0] ddr_data_neg;//
wire [7:0] rx_data;//还原的8bits数据
reg rx_valid;//还原的数据有效标志

wire ddr_clk_bufg;

BUFG BUFG_inst (
      .O(ddr_clk_bufg), // 1-bit output: Clock output.
      .I(ddr_clk)  // 1-bit input: Clock input.
   );
   
  always@(posedge ddr_clk_bufg)
  begin
    #1 rx_valid <=data_valid;
  end
  
  assign rx_data = {ddr_data_pos,ddr_data_neg};
  
        generate
        genvar i;
        for(i=0;i<=3;i=i+1) begin
           IDDRE1 #(
              .DDR_CLK_EDGE("OPPOSITE_EDGE"), // IDDRE1 mode (OPPOSITE_EDGE, SAME_EDGE, SAME_EDGE_PIPELINED)
              .IS_CB_INVERTED(1'b0),          // Optional inversion for CB
              .IS_C_INVERTED(1'b0)            // Optional inversion for C
           )
           IDDRE1_inst (
              .Q1(ddr_data_pos[i]), // 1-bit output: Registered parallel output 1
              .Q2(ddr_data_neg[i]), // 1-bit output: Registered parallel output 2
              .C(ddr_clk_bufg),   // 1-bit input: High-speed clock
              .CB(~ddr_clk_bufg), // 1-bit input: Inversion of High-speed clock C
              .D(ddr_data[i]),   // 1-bit input: Serial Data Input
              .R(1'b0)    // 1-bit input: Active-High Async Reset
           );
        end
    endgenerate
    
endmodule

仿真顶层文件

`timescale 1ns/1ps

module testbench_ddr();

wire  ddr_clk;//DDR数据同步时钟
wire  data_valid;//数据有效标志
wire  [3:0] ddr_data;

S7_model S7_model
(   .ddr_clk(ddr_clk),//DDR数据同步时钟
    .data_valid(data_valid),//数据有效标志
    .ddr_data(ddr_data)
);

ultra_model ultra_model
(   .ddr_clk(ddr_clk),//DDR数据同步时钟
    .data_valid(data_valid),//数据有效标志
    .ddr_data(ddr_data)
);

endmodule

仿真结果截图:

可以看到,Spartan7有效数据0x80、0x81、0x82·····,在ultra_model模块成功接收到0x80、0x81、0x82···

需要注意的是,S7上升沿发送数据A,则ultra接收该数据时,只能在下降沿提取到该数据A。因为A滞后于时钟上升沿。如果还是想在ultra FPGA的上升沿提取到该数据,则需要采取措施调整一下时钟数据的时序。比如:考虑在ultraFPGA使用IDELAYE3延迟一下时钟输入引脚,或者在spartan7上使用ODELAYE2,延迟以下数据输出引脚。

赛灵思7系列 ODDR、IDDR原语 与 ultrascale系列ODDRE1 、IDDRE1 原语相关推荐

  1. ddr4单颗粒最大_Zynq UltraScale +系列之“DDR4接口设计”

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 本篇主要针对Zynq UltraScale + MPSoC的DDR接口,从硬件设计的角度进行详细 ...

  2. 基于 Kintex UltraScale 系列 FPGA 的高性能 VPX 数据预处理载板(4 路 SRIO X4、 XCKU115-2FFVA1517I)

    VPX302 是一款基于 3U VPX 总线架构的高性能数据预处理FMC 载板,板卡具有 1 个 FMC+(HPC)接口,1 个 X8 GTH 背板互联接口,可以实现 1 路 PCIe x8:具有 4 ...

  3. ML:MLOps系列讲解之系列知识解读之完整总结系列内容(第一章~第九章)

    ML:MLOps系列讲解之系列知识解读之完整总结系列内容(第一章~第九章) 导读:您将了解如何使用机器学习,了解需要管理的各种变更场景,以及基于ml的软件开发的迭代性质.最后,我们提供了MLOps的定 ...

  4. 华硕服务器主板那个系列好,华硕主板哪个系列好?华硕主板各个系列区别对比...

    目前的DIY市场中,主板的品牌较多,而品牌之间又存在不同的系列,相信不少装机用户选购主板十分纠结.目前主板品牌中,龙头老大无疑是华硕主板,那么华硕主板哪个系列好?下面装机之家分享一下华硕主板各个系列区 ...

  5. List系列集合、泛型、Set系列集合、Collection系列集合使用场景总结

    目录 List系列集合 LinkedList集合 遍历可能存在的问题 泛型 泛型类的概述 泛型方法的概述 泛型接口 通配符 Set系列集合 HashSet集合 LinkedHashSet集合 Tree ...

  6. Android盒子 摄像头,UVC系列1-Android盒子控制云台摄像头系列

    微信公众号:Android部落格 个人网站:chengang.plus/ 文章最初发布在CSDN 1.知识点 Android作为host端控制云台摄像头整个实现过程中涉及了Android kernel ...

  7. 16系列显卡支持的计算机系统,GTX16系列显卡:GTX10系列显卡,正式再见

    原标题:GTX16系列显卡:GTX10系列显卡,正式再见 GTX16系列显卡是NVIDIA今年发布的新卡,分别是GTX1660和1650系列,主打1000元到2000元级别的市场,相比上一代的GTX1 ...

  8. 西门子PLC S7-1500系列CPU与西门子PLC S7-300系列的通讯模块CP343-1进行TCP通讯的方法

    西门子PLC S7-1500系列是西门子新一代PLC产品,它通过多方面的创新,为用户提供了更高性价比的产品,提高了用户的工程实施效率.西门子PLC S7-1500为用户在自动化控制系统中提供了更高的运 ...

  9. 三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

    三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法 本次和大家分享三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法,由于汇 ...

最新文章

  1. 人工智能及其应用(第5版).蔡自兴-2章课后习题。【参考答案】
  2. R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象
  3. 使用UPnP来穿透NAT使内网接口对外网可见
  4. 再谈 iptables 防火墙的 指令配置
  5. android NDk编程
  6. NLP:语言模型与n元语法
  7. 读取遥感图像中遇到的问题集锦
  8. ibm db2获取目标时间与当前时间的差值_【学术论文】高帧频视觉实时目标检测系统...
  9. python使用pdfminer解析页面内容,得到内容的详细坐标
  10. 友华PT939G移动光猫开启telnet获取配置文件
  11. 描述性统计分析案例题_SPSSAU描述性分析指标如何选择?
  12. Python网络爬虫入门篇
  13. Metadata 元数据信息详解
  14. 仙剑永恒的经典──仙剑诗集
  15. python爬取和平精英皮肤_Python——LOL官方商城皮肤信息爬取(一次练手)
  16. 来自朋友圈的“精神食粮”
  17. Neutron — Bonding SR-IOV ports
  18. 功能超级强大的计算器程序 免费开源 全部源码
  19. 通过股票代码识别所属板块(20190730)
  20. 再谈深度学习文本的表示

热门文章

  1. 关于word的HOOK(_WwG种)
  2. 零基础如何学好python爬虫?之python爬取B站小视频
  3. 解决error LNK2001: unresolved external symbol__imp__xxx
  4. SecureCRT命令方式上传文件
  5. eclipse更改代码后reload,不用重启服务器
  6. 一招长期引流并锁定客户的活动,饺子馆靠“比赛”做到月入10万
  7. 视觉slam爬坑——高翔深蓝学院——第一讲
  8. 关晓彤同款无米寿司,让你感受一下远离碳水也无敌幸福~
  9. 第四章 word2vec 的高速化
  10. 微信/QQ/TIM防撤回神器,看见没有,这就是撤回狗