记录背景:最近,为了实现GMIItoRGMII的功能,需要调用ODDR原语。
ODDR:dedicateddualdatarate(DDR )输出寄存器
如果通过ODDR将双向的单端数据汇总为一条路输出,在上边缘同时输出数据,在上边缘输出a电路的下边缘输出输出b电路的双向输入信号始终为1、始终为0,则输出的信号实际上是输入的时钟信号。
的Verilog语句如下:
1//oddr 3360 outputdoubledatarateoutputregisterwithset, reset2//andclockenable.3//7series4//xilinxhdlllanguagetemment version 2017.456 oddr # (7. DDR _ clk _ edge ) ) opopopor ) opposite_edge ) or ' same _ edge '8. ining//initialvalueofq :1 ' b0or1' B19.Sr type (' sync ' )/set/ret 1-bit DDR output12 .C(C (,/1-bitclockinput13.ce ),//1-bitclockenableinput14.D1 ),/1- bb but///1-bitdad 920//endofoddr _ inst instantiation
模式说明:
OPPOSITE_EDGE模式:
在此模式下,使用时钟沿以两倍的吞吐量从FPGA逻辑捕获数据。 该结构与virtex-6的实现相比相似。 这两个输出都提供给IOB的数据输入或三态控制输入。
SAME_EDGE模式:
在此模式下,数据在同一时钟沿从传递到IOB。 在同一时钟沿将数据发送到IOB可以避免时间冲突,用户可以使用最小的寄存器执行更高的DDR频率来延迟寄存器,而不是使用CLB寄存器。
注意:
1、set和reset不能同时设置;
2、重置ODDR原语需要约12个时钟,第一次输入的数据可能有问题(母测量),[由于公司网络,无法上传图像],但母测量是的。
修改代码之前:
wire oddr_do_test; ODDR_testoddr_test(.clk(tx_clk )、 rst )、 ce )至rst )、 di _ p (tx _ en ).di _ n (tx _ een ) )
添加以下代码:
wire oddr_do_test; reg [5:0]tx_en_d; reg [5:0]tx_er_d; always@(posedgetx_clk ) begin tx_en_d={tx_en_d[4:0],tx_en}; tx_er_d={tx_er_d[4:0],tx_er}; endoDDR_testoddr_test(.clk )、 rst )、 ce(rst )、 di _ p (tx _ en _ d )5)、 di