原文链接:浅析OSERDESE3
在高速接口的应用场景下,我们会经常听说SerDes(Serializer-Deserializer)这个词,也就是串行器和解串器,更为通俗的讲就是进行串并转换的。在Xilinx的FPGA中提供了ISERDES(提供串行数据到并行数据的转换)和OSERDES(提供并行数据到串行数据的转换)。在7系列的FPGA里面提供了ISERDESE2和OSERDESE2这两个原语供我们使用。而在UltraScale架构中提供了ISERDESE3和OSERDESE3这两个原语。OSERDESE3的结构如下图所示,支持SDR模式和DDR模式。
其可供配置的参数如下图所示:
从上表可以看出与OSERDESE2使用有差异的DATA_WIDTH,在OSERDESE3中只支持8bit和4bit两种模式,相对于OSERDESE2来说变少了。另外还有一点,对于熟悉OSERDESE2的人来说可以看出这里并没有配置是SDR模式还是DDR模式的参数,在OSERDESE2中可以通过DATA_RATE_OQ参数进行配置SDR或DDR。这个具体配置还请接着往下看。
那么先看一下DDR模式下的时序图:
可以看出当DATA_WIDTH是8时,CLK和CLK_DIV是4倍关系,当DATA_WIDTH是4时,CLK和CLK_DIV是2倍关系。
再看一下SDR模式下的端口连线和时序图:
相信看到这里应该就能看出来SDR和DDR模式的不同了,在SDR模式下需要将相邻的两个输入端口接同一个数据,这样实现的SDR功能。
下面就看一下SDR和DDR模式的所有连接情况吧
最后呢来看一下OSERDESE3具体要怎么使用吧。
OSERDESE3 #(
.DATA_WIDTH(8), // Parallel Data Width (4-8)
.INIT(1'b0), // Initialization value of the OSERDES flip-flops
.IS_CLKDIV_INVERTED(1'b0), // Optional inversion for CLKDIV
.IS_CLK_INVERTED(1'b0), // Optional inversion for CLK
.IS_RST_INVERTED(1'b0), // Optional inversion for RST
.SIM_DEVICE("ULTRASCALE") // Set the device version for simulation functionality (ULTRASCALE)
)
OSERDESE3_inst (
.OQ(OQ), // 1-bit output: Serial Output Data
.T_OUT(T_OUT), // 1-bit output: 3-state control output to IOB
.CLK(CLK), // 1-bit input: High-speed clock
.CLKDIV(CLKDIV), // 1-bit input: Divided Clock
.D(D), // 8-bit input: Parallel Data Input
.RST(RST), // 1-bit input: Asynchronous Reset
.T(T) // 1-bit input: Tristate input from fabric
);
一个小Tip,CLKDIV端口的时钟可以走BUFGCE_DIV哦,这样会有更小的Clock Skew,当TPWS违例的时候可以考虑这个方法进行解决。
欢迎关注我的微信公众号:FPGA开源工坊