xilinx原语详解及仿真——ODDR

这篇具有很好参考价值的文章主要介绍了xilinx原语详解及仿真——ODDR。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  ODDR位于OLOGIC中,可以把单沿传输的数据转换为双沿传输的数据, 在讲解ODDR功能之前,需要先了解OLOGIC的结构及功能。

1、OLOGIC

  OLOGIC块位于IOB的内侧,FPGA内部信号想要输出到管脚,都必须经过OLOGIC。OLOGIC资源的类型为OLOGICE2(HP I/O Bank)和OLOGICE3(HR I/O Bank),两者在功能和结构上是相同的,所以本文称为OLOGIC。

  图1是OLOGIC的结构框图,分为上下两部分,下半部分用于配置输出数据路径,上半部分用于配置三态控制路径,分别实现对数据、三态信号进行单沿转双沿的功能,两部分具有共同的时钟 (CLK),但是使能信号不同(OCE和TCE)。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图1 OLOGIC结构框图

  如果输出的信号不使用OLOGIC中的ODDR功能,那么此时信号从图1中红线路径进行传输,从组合逻辑电路输出到IOB模块。如果要使用OLOGIC模块中的D触发器功能,那么信号从D1进入OLOGIC模块,沿绿色信号线进行传输。如果要使用OLOGIC的ODDR功能,把单沿传输的信号转换为双沿传输的信号,此时需要两个输入信号D1、D2沿蓝色路径进行传输。

  图2是FPGA中OLOGIC实际的框图,因为该电路还可以被配置为OSERDESE2,所以相比图1会多出一些信号端口。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图2 OLOGIC在FPGA中结构框图

2、ODDR原语

  图3是ODDR原语框图,与IDDR一样不支持同时复位和置位。ODDR端口信号如表1所示,表2描述了ODDR原语的可用参数。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图3 ODDR原语框图
表1 ODDR端口信号
端口名 含义
C 时钟输入信号。
CE 钟使能信号,高电平有效。
D1、D2 ODDR输入信号。
S/R 置位/复位引脚,高电平有效。
Q ODDR输出信号。
表2 ODDR原语的参数
参数名 含义 取值
DDR_CLK_EDGE ODDR工作模式 OPPOSITE_EDGE (默认), SAME_EDGE
INIT 设置Q端口的初始值 0(默认),1
SRTYPE 设置复位/置位相对于时钟的类型 ASYNC, SYNC(默认)

  上述的信号和参数都比较简单,与前面IDDR原语相似,不做过多解释。ODDR只有两种工作模式,相比IDDR会少一种,下文对两种模式进行讲解。

  图4是OPPOSITE_EDGE模式的时序图,在时钟CLK上升沿采集D1信号D1A,并在时钟上升沿把D1A输出到OQ。然后在时钟CLK下降沿采集D2信号D2A,并在下降沿将采集到的信号输出。这种模式使用起来会相对麻烦,FPGA内部需要在时钟上升沿给D1赋值,在时钟下降沿给D2赋值,一般不使用。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图4 OPPOSITE_EDGE模式

  图5是SAME_EDGE模式的时序图,在时钟CLK上升沿 同时采集D1、D2的数据,OQ再时钟上升沿输出采集的D1数据,再下降沿输出采集的D2数据。这种方式实现比较简单,属于常用模式。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图5 SAME_EDGE模式

3、ODDR模式仿真

​ODDR原语的模板如下所示:

   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(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
   );

  接下来对ODDR的两种工作模式进行仿真,对应的设计文件如下所示,din0在内部D触发器打一拍后得到dout0输出,din0经过OLOGIC内部的D触发器打一拍后得到dout1输出。两个单沿输入的信号din1、din2转化位单沿信号dout2,对应代码如下所示。

module oddr_ctrl(
    input       clk      ,//系统时钟信号;
    input       rst      ,//系统复位信号,高电平有效;

    input       clk_en   ,//时钟使能信号;
    input       din0     ,//输入数据;
    input       din1     ,//输入数据;
    input       din2     ,//输入数据;
    output      dout0    ,//输出数据
    output      dout1    ,//输出数据
    output      dout2    
); 
    reg         dout0   ;
    (* IOB = "TRUE" *)reg dout1 ;//将dout1放在ILOGICE中;

    always@(posedge clk)begin
        dout0 <= din0;
        dout1 <= din0;
    end

   //例化ODDR原语
    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    ( dout2   ),// 1-bit DDR output
        .C    ( clk     ),// 1-bit clock input
        .CE   ( clk_en  ),// 1-bit clock enable input
        .D1   ( din1    ),// 1-bit data input (positive edge)
        .D2   ( din2    ),// 1-bit data input (negative edge)
        .R    ( rst     ),// 1-bit reset
        .S    ( 1'b0    ) // 1-bit set
    );

endmodule

对应的Test​Bench文件如下所示:

`timescale 1 ns/1 ns
module test();
    parameter	CYCLE		=   10      ;//系统时钟周期,单位ns,默认10ns;

    reg			                clk     ;//系统时钟,默认100MHz;
    reg			                rst     ;//系统复位,默认高电平有效;
    reg                         clk_en  ;
    reg                         din0    ;
    reg                         din1    ;
    reg                         din2    ;

    wire                        dout0   ;
    wire                        dout1   ;
    wire                        dout2   ;

    oddr_ctrl  u_oddr_ctrl (
        .clk        ( clk       ),
        .rst        ( rst       ),
        .clk_en     ( clk_en    ),
        .din0       ( din0      ),
        .din1       ( din1      ),
        .din2       ( din2      ),
        .dout0      ( dout0     ),
        .dout1      ( dout1     ),
        .dout2      ( dout2     )
    );

    //生成周期为CYCLE数值的系统时钟;
    initial begin
        clk = 1;
        forever #(CYCLE/2) clk = ~clk;
    end

    //生成复位信号;
    initial begin
        rst = 0;
        #2;
        rst = 1;//开始时复位10个时钟;
        #(10*CYCLE);
        rst = 0;
    end

    initial begin
        #1;
        clk_en = 1'b0;din2 = 1'b0;
        din0 = 1'b0;din1 = 1'b0;
        #(CYCLE*20);
        clk_en = 1'b1;
        #(CYCLE);
        repeat(100)begin//产生100个双沿时钟数据。
            #(CYCLE/2);
            din0 = ({$random} % 2);
            din1 = ({$random} % 2);
            #(CYCLE/2);
            din2 = ({$random} % 2);
        end
        #(CYCLE);
        clk_en = 1'b0;
        #(10*CYCLE);
        $stop;//停止仿真;
    end

endmodule

  首先对OPPOSITE_EDGE模式进行仿真,对应的TestBench代码如下所示,仿真结果如图6所示。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图6 OPPOSITE_EDGE模式

  图6仿真结果与图4的时序图一致,不做过多解释。

  然后对SAME_EDGE模式进行仿真,对应的设计文件:

module oddr_ctrl(
    input       clk      ,//系统时钟信号;
    input       rst      ,//系统复位信号,高电平有效;

    input       clk_en   ,//时钟使能信号;
    input       din0     ,//输入数据;
    input       din1     ,//输入数据;
    input       din2     ,//输入数据;
    output      dout0    ,//输出数据
    output      dout1    ,//输出数据
    output      dout2    
); 
    reg         dout0   ;
    reg         doutr   ;
    (* IOB = "TRUE" *)reg dout1 ;//将dout1放在ILOGICE中;

    always@(posedge clk)begin
        doutr <= din0;
        dout0 <= doutr;
        dout1 <= doutr;
    end

   //例化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    ( dout2   ),// 1-bit DDR output
        .C    ( clk     ),// 1-bit clock input
        .CE   ( clk_en  ),// 1-bit clock enable input
        .D1   ( din1    ),// 1-bit data input (positive edge)
        .D2   ( din2    ),// 1-bit data input (negative edge)
        .R    ( rst     ),// 1-bit reset
        .S    ( 1'b0    ) // 1-bit set
    );

endmodule

TestBench文件如下所示:

`timescale 1 ns/1 ns
module test();
    parameter	CYCLE		=   10      ;//系统时钟周期,单位ns,默认10ns;

    reg			                clk     ;//系统时钟,默认100MHz;
    reg			                rst     ;//系统复位,默认高电平有效;
    reg                         clk_en  ;
    reg                         din0    ;
    reg                         din1    ;
    reg                         din2    ;

    wire                        dout0   ;
    wire                        dout1   ;
    wire                        dout2   ;

    oddr_ctrl  u_oddr_ctrl (
        .clk        ( clk       ),
        .rst        ( rst       ),
        .clk_en     ( clk_en    ),
        .din0       ( din0      ),
        .din1       ( din1      ),
        .din2       ( din2      ),
        .dout0      ( dout0     ),
        .dout1      ( dout1     ),
        .dout2      ( dout2     )
    );

    //生成周期为CYCLE数值的系统时钟;
    initial begin
        clk = 1;
        forever #(CYCLE/2) clk = ~clk;
    end

    //生成复位信号;
    initial begin
        rst = 0;
        #2;
        rst = 1;//开始时复位10个时钟;
        #(10*CYCLE);
        rst = 0;
    end

    initial begin
        #1;
        clk_en = 1'b0;din2 = 1'b0;
        din0 = 1'b0;din1 = 1'b0;
        #(CYCLE*20);
        clk_en = 1'b1;
        #(CYCLE);
        repeat(100)begin//产生100个双沿时钟数据。
            #(CYCLE);
            din0 = ({$random} % 2);
            din1 = ({$random} % 2);
            din2 = ({$random} % 2);
        end
        #(CYCLE);
        clk_en = 1'b0;
        #(10*CYCLE);
        $stop;//停止仿真;
    end

endmodule

仿真结果如图7所示。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图7 SAME_EDGE模式

  图7仿真结果与图5基本一致,不再过多解释。图8是该模式下时钟使能无效时仿真结果,此时输出信号将保持不变。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图8 SAME_EDGE模式下EN信号拉低

  上述仿真均与前文理论一致,下面将工程信号引脚分配,对工程进行编译,查看走线的图。

4、OLOGIC中触发器(OFD)的使用方式

  在vivado中打开走线的方式在讲解IDDR原语时已经进行了讲解,本文不再赘述。

  前文的代码中dout0与dout1的代码都相同,都是使用D触发器对din0打一拍,然后输出,通过查看dout0和dout1的寄存器位置,得到OLOGIC中组合电路和触发器功能的使用方式。图9是din0到dout0信号的走线图,红框处是寄存器所在位置,白线是信号的走线。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图9 dout0信号走向

  dout0信号是没有使用OLOGIC中的触发器和ODDR功能的,图10就是dou0信号经过OLOGIC时的路径,与前文讲解一致,直接经过组合逻辑输出。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图10 dout0经过OLOGIC

  如图11所示,是dout1信号在FPGA内部的走向,路径上又两个触发器,其中一个在OLOGIC中。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图11 dout1信号走向

  将OLOGIC放大,如图12所示,可知dout1触发器在OLOGIC中。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图12 dout1经过OLOGIC

  最后查看dout2信号的走向,如图13所示,din1和din2输入FPGA后,在OLOGIC进行单沿转双沿信号,然后通过dout2管脚输出。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图13 dout2信号走向

  将对应的OLOGIC放大,可见其实现的是ODDR功能,信号流向与前文讲解一致。

fpga差分信号oddr,FPGA,xilix原语,HDMI,fpga开发

图13 dout2经过OLOGIC

  综上,OLOGIC与ILOGIC功能类似,本文主要是讲解ODDR的工作模式,并对工作模式进行仿真,同时将OLOGIC的使用方式进行讲解。掌握ODDR使用方式的同时,也知道如何使用OLOGIC中的触发器(使用IOB=TRUE原语,查看设计文件中dout1信号的定义)功能,以及OLOGIC在FPGA中的位置。

  OLOGIC中的触发器相对于FPGA内部触发器更靠近管脚,并且触发器输出与IOB之间的路径是固定的,对于多bit数据输出更有利于对齐。

  最后需要此工程文件的用户,在公众号后台回复“ODDR”(不包括引号)即可。

  您的支持是我更新的最大动力!将持续更新工程,如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!文章来源地址https://www.toymoban.com/news/detail-838286.html

到了这里,关于xilinx原语详解及仿真——ODDR的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【XINLIX 原语】XILINX 原语的使用之 IBUFDS 差分转单端、OBUFDS 单端转差分

    目录 IBUFGDS IBUFDS 介绍 IBUFDS 示意图 例化方式 OBUFDS OBUFDS 介绍 OBUFDS 示意图 例化方式   在 XILINX 中有许多原语,常见的差分转单端 IBUFDS、单端转差分 OBUFDS。 IBUFDS 即专用差分输入时钟缓冲器(Dedicated Differential Signaling Input Buffer with Selectable I/O Interface) IBUFDS :在实验工程中如

    2024年02月16日
    浏览(27)
  • xilinx原语介绍及仿真——ODELAYE2

      7系列IO模块相关的结构如图1所示,前文对IOB、IDELAYE2、ILOGIC、OLOGIC进行了讲解,还剩下ISERDESE2、OSERDESE2、ODELAYE2原语,本文对ODELAYE2进行讲解,该原语只有HP bank才有,即7系列FPGA的A7系列没有ODELAYE2结构,不能使用ODELAYE2原语。 图1 7系列IO模块(左侧HP bank,右侧HR bank)   图

    2024年02月20日
    浏览(24)
  • Xilinx FPGA ICAP原语实现多重配置

    1. FPGA可以运行几个固件 众所周知,常见的FPGA通常为SRAM结构,固件程序一般存放在外置的串行Flash中,比如SPI Flash,M25P16或N25Q128等。 FPGA启动时,一般先从SPI起始地址开始加载数据到内部的SRAM,加载完成、校验通过则会直接运行。 那么有没有可能在SPI Flash中存放两个或多个

    2024年02月02日
    浏览(27)
  • Xilinx原语详解——IBUFDS & OBUFDS

      在使用FPGA时,往往会用到一些差分信号,比如HDMI接口,LVDS接口的ADC、显示器等等设备,而FPGA内部往往只会使用单端信号,就需要完成单端信号和差分信号的相互转换,xilinx提供了两个原语对所有IO信号实现差分和单端的转换, IBUFDS将FPGA输入的差分信号转换为单端信号

    2024年01月21日
    浏览(42)
  • XILINX 7系列FPGA普通IO与差分IO

      🏡《Xilinx FPGA开发宝典》     本文介绍XILINX 7系列FPGA普通IO和差分IO的识别方法与注意事项。     7系列FPGA的绝大多数IO均支持差分,但是有些IO是不支持的,应注意不要用错差分IO的极性以及不要将普通非差分IO作为差分IO使用。     如下图所示差分IO的命名

    2024年02月11日
    浏览(33)
  • 【Xilinx FPGA】DDR3 MIG IP 仿真

    Memory Interface Generator (MIG 7 Series)是 Xilinx 为 7 系列器件提供的 Memory 控制器 IP,使用该 IP 可以很方便地进行 DDR3 的读写操作。本文主要记录 Xilinx DDR3 MIG IP 的仿真过程,包括 IP 配置和 DDR3 读写仿真两部分内容。 目录 1 MIG IP 配置 2 DDR3 读写仿真         在 Vivado 开发平台 IP C

    2024年02月09日
    浏览(37)
  • 差分信号详解

    差分信号是由双绞线进行通讯的,为什么选择双绞线呢?因为这其中有个电磁学的原理,在通讯过程中噪声一般来自外界天气或其它元器件的电磁干扰导致导线中的电流变得不稳定,如2.3v是低电平突然被噪声干扰会造成信号增大变成了高电平,这就导致了传输过程中数据不对

    2023年04月08日
    浏览(25)
  • 基于FPGA的 SelectIO IP核 的仿真验证-----( LVDS差分高速传输)

    由于系统功能实现日益增多,主控芯片的外围芯片也越来越多,因此主控芯片的引脚 资源相对变得紧俏,在数字系统互联的设计中,并行传输的方式将会被高速串行传输逐步 替代。而在串行传输标准中,低电压差分信号传输( LVDS)接口具有高速率、低功耗、低 噪声和低电

    2024年02月02日
    浏览(36)
  • AXI4-Full Xilinx FPGA使用理解---信号定义理解

             一、AXI4 signal dir Xilinx 中文理解 ID类 AWID M2S Masters need only output the set of ID bits that it varies (if any) to indicate re-orderable transaction threads. Single-threaded master interfaces can omit this signal. Masters do not need to output the constant portion that comprises the Master ID, as this is appended by the AXI Interco

    2024年02月22日
    浏览(38)
  • Xilinx原语的使用

    原语,英文名称primitive,是FPGA软件集成开发环境所提供的一系列底层逻辑功能单元。由于是底层逻辑功能单元,所以它们往往跟目标FPGA芯片以及芯片厂商紧密相关,因此不同厂商、不同器件的原语往往不能通用。当编译器对我们的HDL代码进行编译时,其中间环节的一些输出

    2024年02月10日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包