自已创建网站要怎么做,福永网站建设公司哪家好,进入百度搜索首页,赣州网站建设专家ODDR位于OLOGIC中#xff0c;可以把单沿传输的数据转换为双沿传输的数据#xff0c; 在讲解ODDR功能之前#xff0c;需要先了解OLOGIC的结构及功能。
1、OLOGIC OLOGIC块位于IOB的内侧#xff0c;FPGA内部信号想要输出到管脚#xff0c;都必须经过OLOGIC。OLOGIC资源的类… ODDR位于OLOGIC中可以把单沿传输的数据转换为双沿传输的数据 在讲解ODDR功能之前需要先了解OLOGIC的结构及功能。
1、OLOGIC OLOGIC块位于IOB的内侧FPGA内部信号想要输出到管脚都必须经过OLOGIC。OLOGIC资源的类型为OLOGICE2HP I/O Bank和OLOGICE3HR I/O Bank两者在功能和结构上是相同的所以本文称为OLOGIC。 图1是OLOGIC的结构框图分为上下两部分下半部分用于配置输出数据路径上半部分用于配置三态控制路径分别实现对数据、三态信号进行单沿转双沿的功能两部分具有共同的时钟 (CLK)但是使能信号不同OCE和TCE。 图1 OLOGIC结构框图 如果输出的信号不使用OLOGIC中的ODDR功能那么此时信号从图1中红线路径进行传输从组合逻辑电路输出到IOB模块。如果要使用OLOGIC模块中的D触发器功能那么信号从D1进入OLOGIC模块沿绿色信号线进行传输。如果要使用OLOGIC的ODDR功能把单沿传输的信号转换为双沿传输的信号此时需要两个输入信号D1、D2沿蓝色路径进行传输。 图2是FPGA中OLOGIC实际的框图因为该电路还可以被配置为OSERDESE2所以相比图1会多出一些信号端口。 图2 OLOGIC在FPGA中结构框图 2、ODDR原语 图3是ODDR原语框图与IDDR一样不支持同时复位和置位。ODDR端口信号如表1所示表2描述了ODDR原语的可用参数。 图3 ODDR原语框图 表1 ODDR端口信号 端口名含义C时钟输入信号。CE钟使能信号高电平有效。D1、D2ODDR输入信号。S/R置位/复位引脚高电平有效。QODDR输出信号。 表2 ODDR原语的参数 参数名含义取值DDR_CLK_EDGEODDR工作模式OPPOSITE_EDGE (默认), SAME_EDGEINIT设置Q端口的初始值0默认1SRTYPE设置复位/置位相对于时钟的类型ASYNC, SYNC默认 上述的信号和参数都比较简单与前面IDDR原语相似不做过多解释。ODDR只有两种工作模式相比IDDR会少一种下文对两种模式进行讲解。 图4是OPPOSITE_EDGE模式的时序图在时钟CLK上升沿采集D1信号D1A并在时钟上升沿把D1A输出到OQ。然后在时钟CLK下降沿采集D2信号D2A并在下降沿将采集到的信号输出。这种模式使用起来会相对麻烦FPGA内部需要在时钟上升沿给D1赋值在时钟下降沿给D2赋值一般不使用。 图4 OPPOSITE_EDGE模式 图5是SAME_EDGE模式的时序图在时钟CLK上升沿 同时采集D1、D2的数据OQ再时钟上升沿输出采集的D1数据再下降沿输出采集的D2数据。这种方式实现比较简单属于常用模式。 图5 SAME_EDGE模式 3、ODDR模式仿真
ODDR原语的模板如下所示 ODDR #(.DDR_CLK_EDGE(OPPOSITE_EDGE), // OPPOSITE_EDGE or SAME_EDGE .INIT(1b0), // Initial value of Q: 1b0 or 1b1.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)begindout0 din0;dout1 din0;end//例化ODDR原语ODDR #(.DDR_CLK_EDGE ( OPPOSITE_EDGE ),// OPPOSITE_EDGE or SAME_EDGE .INIT ( 1b0 ),// Initial value of Q: 1b0 or 1b1.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 ( 1b0 ) // 1-bit set);endmodule对应的TestBench文件如下所示
timescale 1 ns/1 ns
module test();parameter CYCLE 10 ;//系统时钟周期单位ns默认10nsreg clk ;//系统时钟默认100MHzreg 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 beginclk 1;forever #(CYCLE/2) clk ~clk;end//生成复位信号initial beginrst 0;#2;rst 1;//开始时复位10个时钟#(10*CYCLE);rst 0;endinitial begin#1;clk_en 1b0;din2 1b0;din0 1b0;din1 1b0;#(CYCLE*20);clk_en 1b1;#(CYCLE);repeat(100)begin//产生100个双沿时钟数据。#(CYCLE/2);din0 ({$random} % 2);din1 ({$random} % 2);#(CYCLE/2);din2 ({$random} % 2);end#(CYCLE);clk_en 1b0;#(10*CYCLE);$stop;//停止仿真endendmodule首先对OPPOSITE_EDGE模式进行仿真对应的TestBench代码如下所示仿真结果如图6所示。 图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)begindoutr din0;dout0 doutr;dout1 doutr;end//例化ODDR原语ODDR #(.DDR_CLK_EDGE ( SAME_EDGE ),// OPPOSITE_EDGE or SAME_EDGE .INIT ( 1b0 ),// Initial value of Q: 1b0 or 1b1.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 ( 1b0 ) // 1-bit set);endmoduleTestBench文件如下所示
timescale 1 ns/1 ns
module test();parameter CYCLE 10 ;//系统时钟周期单位ns默认10nsreg clk ;//系统时钟默认100MHzreg 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 beginclk 1;forever #(CYCLE/2) clk ~clk;end//生成复位信号initial beginrst 0;#2;rst 1;//开始时复位10个时钟#(10*CYCLE);rst 0;endinitial begin#1;clk_en 1b0;din2 1b0;din0 1b0;din1 1b0;#(CYCLE*20);clk_en 1b1;#(CYCLE);repeat(100)begin//产生100个双沿时钟数据。#(CYCLE);din0 ({$random} % 2);din1 ({$random} % 2);din2 ({$random} % 2);end#(CYCLE);clk_en 1b0;#(10*CYCLE);$stop;//停止仿真endendmodule仿真结果如图7所示。 图7 SAME_EDGE模式 图7仿真结果与图5基本一致不再过多解释。图8是该模式下时钟使能无效时仿真结果此时输出信号将保持不变。 图8 SAME_EDGE模式下EN信号拉低 上述仿真均与前文理论一致下面将工程信号引脚分配对工程进行编译查看走线的图。
4、OLOGIC中触发器(OFD)的使用方式 在vivado中打开走线的方式在讲解IDDR原语时已经进行了讲解本文不再赘述。 前文的代码中dout0与dout1的代码都相同都是使用D触发器对din0打一拍然后输出通过查看dout0和dout1的寄存器位置得到OLOGIC中组合电路和触发器功能的使用方式。图9是din0到dout0信号的走线图红框处是寄存器所在位置白线是信号的走线。 图9 dout0信号走向 dout0信号是没有使用OLOGIC中的触发器和ODDR功能的图10就是dou0信号经过OLOGIC时的路径与前文讲解一致直接经过组合逻辑输出。 图10 dout0经过OLOGIC 如图11所示是dout1信号在FPGA内部的走向路径上又两个触发器其中一个在OLOGIC中。 图11 dout1信号走向 将OLOGIC放大如图12所示可知dout1触发器在OLOGIC中。 图12 dout1经过OLOGIC 最后查看dout2信号的走向如图13所示din1和din2输入FPGA后在OLOGIC进行单沿转双沿信号然后通过dout2管脚输出。 图13 dout2信号走向 将对应的OLOGIC放大可见其实现的是ODDR功能信号流向与前文讲解一致。 图13 dout2经过OLOGIC 综上OLOGIC与ILOGIC功能类似本文主要是讲解ODDR的工作模式并对工作模式进行仿真同时将OLOGIC的使用方式进行讲解。掌握ODDR使用方式的同时也知道如何使用OLOGIC中的触发器(使用IOBTRUE原语查看设计文件中dout1信号的定义)功能以及OLOGIC在FPGA中的位置。 OLOGIC中的触发器相对于FPGA内部触发器更靠近管脚并且触发器输出与IOB之间的路径是固定的对于多bit数据输出更有利于对齐。 最后需要此工程文件的用户在公众号后台回复“ODDR”不包括引号即可。