随着电子行业技术的发展,特别是在传输接口的发展上,IEEE1284被 USB 接口取代,PATA被 SATA 取代,PCI被 PCI-Express 所取代,无一不证明了传统并行接口的速度已经达到一个瓶颈了,取而代之的是速度更快的串行接口,于是原本用于光纤通信的SerDes 技术成为了为高速串行接口的主流。串行接口主要应用了差分信号传输技术,具有功耗低、抗干扰强,速度快的特点,理论上串行接口的最高传输速率可达到10Gbps 以上。因此,串并/并串转换在FPGA设计中具有重要意义。
方法一:Xilinx原语实现Xlinx的原语OSERDESE2是一种专用的并-串转换器,每个OSERDESE2模块都包括一个专用串行化程序用于数据和3状态控制。数据和3状态序列化程序都可以工作在SDR和DDR模式。数据串行化的位宽可以达到8:1(如果使用原语模块级联,则可以到10:1和14:1)。3状态序列化最高可达14:1,有一个专用的DDR3模式可用于支持高速内存应用程序。 下图便是OSERDESE2的框图 其各个端口的含义如下表所示
在本博客的实验中,我们不关心三态控制模块,因此,用到的信号为CLK,CLKDIV,分别作为串行输出和并行输入的时钟,D1-D8为并行的数据输入端口,OQ为串行的数据输出端口,RST为复位信号。 例化时一些可配置的属性如下所示:
当DATA_RATE_OQ属性为DDR时,串行数据在每个时钟周期(串行数据的时钟,即快时钟)的跳变沿都会更新,当值为SDR时,仅在上升沿更新,在不同的属性配置下,原语支持的并行数据位宽也不同,如下图所示:
DATA_WIDTH为并串转换时并行数据的位宽。在不同的DATA_RATE_OQ和DATA_WIDTH下,串行数据输出的延迟也略有不同,如下表所示:
例如在进行8位并行数据转串行时,其时序应如下图所示
可以看到,并行数据被慢时钟的上升沿寄存后,经过4个快时钟周期,第一个串行数据开始输出,与表中的延迟一致。 下面是8位并行转串行的代码: 设计文件:
//------------------------------------------------------------------------
//--OSERDESE2测试模块
//------------------------------------------------------------------------
//--------------------------------------------------------
module serializer(
input clk_ser , //串行输出时钟,50M*4=200M
input clk_per , //并行输入时钟,50M
input rst_n , //复位信号,低电平有效
input [7:0] par_data , //并行输入数据
output ser_data //串行输出数据
);
//---------------------------------------------------------------
OSERDESE2 #(
.DATA_RATE_OQ ("DDR") , // DDR, SDR
.DATA_RATE_TQ ("SDR") , // DDR, BUF, SDR
.DATA_WIDTH (8) , // Parallel data width (2-8,10,14)
.INIT_OQ (1'b0) , // Initial value of OQ output (1'b0,1'b1)
.INIT_TQ (1'b0) , // Initial value of TQ output (1'b0,1'b1)
.SERDES_MODE ("MASTER") , // MASTER, SLAVE
.SRVAL_OQ (1'b0) , // OQ output value when SR is used (1'b0,1'b1)
.SRVAL_TQ (1'b0) , // TQ output value when SR is used (1'b0,1'b1)
.TBYTE_CTL ("FALSE") , // Enable tristate byte operation (FALSE, TRUE)
.TBYTE_SRC ("FALSE") , // Tristate byte source (FALSE, TRUE)
.TRISTATE_WIDTH (1) // 3-state converter width (1,4)
)
OSERDESE2_inst (
.OFB () , // 1-bit output: Feedback path for data
.OQ (ser_data) , // 1-bit output: Data path output
.SHIFTOUT1 () ,
.SHIFTOUT2 () ,
.TBYTEOUT () , // 1-bit output: Byte group tristate
.TFB () , // 1-bit output: 3-state control
.TQ () , // 1-bit output: 3-state control
.CLK (clk_ser) , // 1-bit input: High speed clock
.CLKDIV (clk_per) , // 1-bit input: Divided clock
.D1 (par_data[0]) ,
.D2 (par_data[1]) ,
.D3 (par_data[2]) ,
.D4 (par_data[3]) ,
.D5 (par_data[4]) ,
.D6 (par_data[5]) ,
.D7 (par_data[6]) ,
.D8 (par_data[7]) ,
.OCE (1'b1) , // 1-bit input: Output data clock enable
.RST (~rst_n) , // 1-bit input: Reset
.SHIFTIN1 () ,
.SHIFTIN2 () ,
.T1 (1'b0) ,
.T2 (1'b0) ,
.T3 (1'b0) ,
.T4 (1'b0) ,
.TBYTEIN (1'b0) , // 1-bit input: Byte group tristate
.TCE (1'b0) // 1-bit input: 3-state clock enable
);
endmodule
测试文件
//------------------------------------------------
//--OSERDESE2原语仿真
//------------------------------------------------
`timescale 1ns / 1ps //时间单位/精度
//----------------------------------------------------
module tb_serializer();
reg clk_per ;
reg clk_ser ;
reg rst_n ;
reg [7:0] par_data ;
wire ser_data ;
//----------------------------------------------------
initial begin
clk_per
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?