1、介紹
隨著電子行業(yè)技術(shù)的發(fā)展,特別是在傳輸接口的發(fā)展上,IEEE1284被 USB 接口取代,PATA被 SATA 取代,PCI被 PCI-Express 所取代,無(wú)一不證明了傳統(tǒng)并行接口的速度已經(jīng)達(dá)到一個(gè)瓶頸了,取而代之的是速度更快的串行接口,于是原本用于光纖通信的SerDes 技術(shù)成為了為高速串行接口的主流。串行接口主要應(yīng)用了差分信號(hào)傳輸技術(shù),具有功耗低、抗干擾強(qiáng),速度快的特點(diǎn),理論上串行接口的最高傳輸速率可達(dá)到10Gbps 以上。
2、理論
Xilinx的原語(yǔ)OSERDESE2是一種專用的并-串轉(zhuǎn)換器,每個(gè)OSERDESE2模塊都包括一個(gè)專用串行化程序用于數(shù)據(jù)和3狀態(tài)控制。數(shù)據(jù)和3狀態(tài)序列化程序都可以工作在SDR和DDR模式。數(shù)據(jù)串行化的位寬可以達(dá)到8:1(如果使用原語(yǔ)模塊級(jí)聯(lián),則可以到10:1和14:1)。3狀態(tài)序列化最高可達(dá)14:1,有一個(gè)專用的DDR3模式可用于支持高速內(nèi)存應(yīng)用程序。
OSERDESE2的框圖如下:

OSERDESE2的端口說(shuō)明如下:

需要例化的一些可用屬性如下:

TRISTATE_WIDTH的選取見下表:

SDR、DDR輸出模式下位寬的選取有如下限制:

輸出數(shù)據(jù)會(huì)有一些時(shí)鐘周期的延遲,具體見下表:

3、8位數(shù)據(jù)的并串轉(zhuǎn)換
接下里例化一個(gè)原語(yǔ)來(lái)熟悉下用法,8位數(shù)據(jù)的并串轉(zhuǎn)換,采用DDR輸出。
官方手冊(cè)的8位DDR轉(zhuǎn)化時(shí)序圖如下:

例化原語(yǔ)OSERDESE2(打開VIvado--Tools--Language Templates,搜索“OSERDESE2”,可以找到Xilinx提供的模板),與DDR、3態(tài)控制相關(guān)的端口,輸入全設(shè)置為0,輸出不關(guān)心,編寫Verilog如下:
//------------------------------------------------------------------------
//--OSERDESE2測(cè)試模塊
//------------------------------------------------------------------------
//--------------------------------------------------------
module serializer(
input clk_ser , //串行輸出時(shí)鐘,50M*4=200M
input clk_per , //并行輸入時(shí)鐘,50M
input rst_n , //復(fù)位信號(hào),低電平有效
input [7:0] par_data , //并行輸入數(shù)據(jù)
output ser_data //串行輸出數(shù)據(jù)
);
//---------------------------------------------------------------
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
每隔20ns隨機(jī)生成1個(gè)8位2進(jìn)制數(shù)據(jù)作為并行輸入,觀察串行輸出,Testbench如下:
//------------------------------------------------
//--OSERDESE2原語(yǔ)仿真
//------------------------------------------------
`timescale 1ns / 1ps //時(shí)間單位/精度
//----------------------------------------------------
module tb_serializer();
reg clk_per ;
reg clk_ser ;
reg rst_n ;
reg [7:0] par_data ;
wire ser_data ;
//----------------------------------------------------
initial begin
clk_per clk_ser rst_n par_data #180
rst_n end
//----------------------------------------------------------
always #10 clk_per = ~clk_per;
always #2.5 clk_ser = ~clk_ser;
always #20 par_data
//----------------------------------------------------
serializer serializer_inst(
.clk_per (clk_per) ,
.clk_ser (clk_ser) ,
.rst_n (rst_n) ,
.par_data (par_data) ,
.ser_data (ser_data)
);
endmodule
仿真結(jié)果如下:

可以看出:
在第1條藍(lán)線處,是復(fù)位后并行時(shí)鐘的第1個(gè)上升沿,此時(shí)采集到的數(shù)據(jù)為0000_0001
在第2條藍(lán)線處,也就是4個(gè)串行時(shí)鐘的延遲后,串行輸出開始有數(shù)據(jù),分別為1-0-0-0-0-0-0-0,可以看出是第1個(gè)上升沿采集到的數(shù)據(jù)輸出(0000_0001從低位往高位輸出)
在第2條藍(lán)線處,是復(fù)位后并行時(shí)鐘的第2個(gè)上升沿,此時(shí)采集到的數(shù)據(jù)為0000_1101
在第3條藍(lán)線處,也就是4個(gè)串行時(shí)鐘的延遲后,串行輸出開始有數(shù)據(jù),分別為1-0-1-1-0-0-0-0,可以看出是第2個(gè)上升沿采集到的數(shù)據(jù)輸出(0000_1101從低位往高位輸出)
其他與上述相同,符合官方給出的時(shí)序圖
4、10位數(shù)據(jù)的并串轉(zhuǎn)換(級(jí)聯(lián))
OSERDESE2原語(yǔ)還支持例化兩次原語(yǔ)級(jí)聯(lián),以便實(shí)現(xiàn)10位、14位位寬的串行化轉(zhuǎn)換。下圖是10位位寬的級(jí)聯(lián)框圖,其中一個(gè)設(shè)置位MASTER,另一個(gè)設(shè)置為SLAVE,通過(guò)SHIFTIN與SHIFTOUT連接。
需要注意:數(shù)據(jù)的輸出從MASTER輸出,數(shù)據(jù)的高位輸入到SLAVE模塊時(shí),需要從D3開始(只能使用D3~D8)

接下里例化一個(gè)原語(yǔ)來(lái)實(shí)現(xiàn)10位數(shù)據(jù)的并串轉(zhuǎn)換,采用DDR輸出。
例化2個(gè)原語(yǔ)OSERDESE2級(jí)聯(lián)(打開VIvado--Tools--Language Templates,搜索“OSERDESE2”,可以找到Xilinx提供的模板),與DDR、3態(tài)控制相關(guān)的端口,輸入全設(shè)置為0,輸出不關(guān)心,編寫Verilog如下:
//------------------------------------------------------------------------
//--OSERDESE2測(cè)試模塊
//------------------------------------------------------------------------
//--------------------------------------------------------
module serializer(
input clk_ser , //串行輸出時(shí)鐘,50M*5=250M
input clk_per , //并行輸入時(shí)鐘,50M
input rst_n , //復(fù)位信號(hào),低電平有效
input [9:0] par_data , //并行輸入數(shù)據(jù),位寬10
output ser_data //串行輸出數(shù)據(jù)
);
//------------------------------------------------------------------
wire shift1; //級(jí)聯(lián)線1
wire shift2; //級(jí)聯(lián)線2
//------------------------------------------------------------------
//例化主模塊MASTER
OSERDESE2 #(
.DATA_RATE_OQ ("DDR") , // DDR, SDR
.DATA_RATE_TQ ("SDR") , // DDR, BUF, SDR
.DATA_WIDTH (10) , // 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_inst1 (
.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 (shift1) ,
.SHIFTIN2 (shift2) ,
.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
);
//例化從模塊SLAVE
OSERDESE2 #(
.DATA_RATE_OQ ("DDR") , // DDR, SDR
.DATA_RATE_TQ ("SDR") , // DDR, BUF, SDR
.DATA_WIDTH (10) , // 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 ("SLAVE") , // 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_inst2 (
.OFB () , // 1-bit output: Feedback path for data
.OQ () , // 1-bit output: Data path output
.SHIFTOUT1 (shift1) ,
.SHIFTOUT2 (shift2) ,
.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 () ,
.D2 () ,
.D3 (par_data[8]) ,
.D4 (par_data[9]) ,
.D5 () ,
.D6 () ,
.D7 () ,
.D8 () ,
.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
每隔20ns隨機(jī)生成1個(gè)10位2進(jìn)制數(shù)據(jù)作為并行輸入,觀察串行輸出,Testbench如下:
//------------------------------------------------
//--OSERDESE2原語(yǔ)仿真
//------------------------------------------------
`timescale 1ns / 1ps //時(shí)間單位/精度
//----------------------------------------------------
module tb_serializer();
reg clk_per ;
reg clk_ser ;
reg rst_n ;
reg [9:0] par_data ;
wire ser_data ;
//----------------------------------------------------
initial begin
clk_per clk_ser rst_n par_data #180
rst_n end
//----------------------------------------------------------
always #10 clk_per = ~clk_per;
always #2 clk_ser = ~clk_ser;
always #20 par_data
//----------------------------------------------------
serializer serializer_inst(
.clk_per (clk_per) ,
.clk_ser (clk_ser) ,
.rst_n (rst_n) ,
.par_data (par_data) ,
.ser_data (ser_data)
);
endmodule
仿真結(jié)果如下:

可以看出:
在第1條藍(lán)線處,是復(fù)位后并行時(shí)鐘的第1個(gè)上升沿,此時(shí)采集到的數(shù)據(jù)為11000_00001
在第2條藍(lán)線處,也就是4個(gè)串行時(shí)鐘的延遲后,串行輸出開始有數(shù)據(jù),分別為1-0-0-0-0-0-0-0-1-1,可以看出是第1個(gè)上升沿采集到的數(shù)據(jù)輸出(11000_00001從低位往高位輸出)
在第2條藍(lán)線處,是復(fù)位后并行時(shí)鐘的第2個(gè)上升沿,此時(shí)采集到的數(shù)據(jù)為01000_01101
在第3條藍(lán)線處,也就是4個(gè)串行時(shí)鐘的延遲后,串行輸出開始有數(shù)據(jù),分別為1-0-1-1-0-0-0-0-1-0,可以看出是第2個(gè)上升沿采集到的數(shù)據(jù)輸出(01000_01101從低位往高位輸出)
其他與上述相同。
這里官方手冊(cè)沒(méi)有給出10bitDDR輸出的時(shí)序圖,輸出延遲給出的表如下圖:

可以看到這里10:1的輸出延遲應(yīng)該是5個(gè)時(shí)鐘周期,但是我上面仿真的卻是4個(gè)時(shí)鐘周期,一開始我還以為是哪里錯(cuò)了,搞得我重復(fù)仿真了好幾遍,后面又看了一下手冊(cè),終于在延遲表的下面發(fā)現(xiàn)了這句話(上圖標(biāo)紅):CLK、CLKDIV的時(shí)鐘沿通常不是相位一致的。當(dāng)這兩個(gè)時(shí)鐘的時(shí)鐘沿相位一致時(shí),延遲會(huì)存在一個(gè)周期的差異。
這樣的話,仿真結(jié)果應(yīng)該是沒(méi)有問(wèn)題。
審核編輯:湯梓紅
-
轉(zhuǎn)換器
+關(guān)注
關(guān)注
27文章
9395瀏覽量
155707 -
Xilinx
+關(guān)注
關(guān)注
73文章
2195瀏覽量
130548 -
仿真
+關(guān)注
關(guān)注
54文章
4451瀏覽量
137908
發(fā)布評(píng)論請(qǐng)先 登錄
如何使用Modelsim仿真I2C控制器
一文詳解SystemC仿真庫(kù)的編譯
Xilinx FPGA串行通信協(xié)議介紹
一文詳解xilinx 7系列FPGA配置技巧
vivado仿真時(shí)GSR信號(hào)的影響
詳解ADC電路的靜態(tài)仿真和動(dòng)態(tài)仿真
XILINX XCZU67DR FPGA完整原理圖
詳解Xilinx的10G PCS PMA IP
ISERDESE2原語(yǔ)端口及參數(shù)介紹
Xilinx原語(yǔ)OSERDESE2的使用和仿真詳解
評(píng)論