您当前的位置: 首页 > 

FPGA硅农

暂无认证

  • 2浏览

    0关注

    282博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

FPGA并串转换的实现

FPGA硅农 发布时间:2021-12-24 20:35:04 ,浏览量:2

介绍

随着电子行业技术的发展,特别是在传输接口的发展上,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             
关注
打赏
1658642721
查看更多评论
0.1329s