一、数据并行-串行转换
—个OSERDESE
2模块中的数据并行到串行转换器接收2〜8位来自
FPGA
逻辑结构内的并行数据 (如果使用OSERDESE2
宽度扩展,则为14位),将数据串行化,并通过
OQ输出将其传送到IO B
。并行数据的串行化按照从数据输入引脚最低到最高的顺序,即在
D
1输入引脚上的数据是第一位发送到OQ
引脚上的。数据并行 -串行转换器有两种模式,既单数据速率(Single Data Rate
,
SDR
) 和双数据速率
(Double Data Rate
,
DD R
) 。
OSERDESE
2 使 用 时 钟
CLK
和
CLK DIV
进行数据速率转换。
CLK
是高速串行时钟,
C L K D IV
是分频并行时钟。
CLK
和
CLK LDIV
必须相位对齐。在使用该模块之前,必须对 OSERDESE
2 应用复位。O
SERDESE
2 包含一个控制数据流 的内部计数器。
二、三态并行-串行转换器
除数据的并行到串行转换外,OSERDESE
2 模块还包含一个并行到串行转换器,用于IOB的三态控制。与数据转换不同,三态转换器最多只能串行化 4 位并行三态信号。三态转换器不能级联。
三、引脚接触分析
1.示意图
2.基本电路图
3.管脚分析
(1) O
Q
: 输 出 宽 度 为 1 ) , 数 据 路 径 仅 输 出 到
IOB
。
(2)
OFB
: 输 出 (宽 度 为 1 ) , 数据路径输出反馈到
ISERDESE
2 或连接到
ODELAYE
2 。
(3)
TQ
: 输 出 (宽 度 为 1 ) ,到
IO B
的三状态控制输出。
(4)
TFB
: 输出,到
F P G A
内逻辑结构的三状态控制输出。
(5)
SHIFT
0
U T
1 : 输 出 (宽 度 为 1 ) , 进 位 数 据 输 出 用 于 宽 度 扩 展 。 连 接 到 主
O
SERDESE
2 的
S HIFTIN
1 0
SERDESE
2 。
(6)
SHIFT
0
UT
2 : 输 出 (宽 度 为 1 ) , 进位数据输出用于宽度扩展。连 接 到 主
OSERDESE
2
的
SHIFTIN
2 O
SERDESE
2 。
(7)
C LK
: 输 入 (宽 度 为 1 ) , 高速时钟输入。
(8)
C LK D IV
: 输 入 (宽 度 为 1 ) , 分频时钟输入。时钟延迟元素、解串行化数据和
CE单元。
(9)
D
1〜
D
8 : 输 入 (每 个 宽 度 为 1 ) , 并行数据输入。
(10)
TCE
: 输 入 (宽 度 为 1 ) , 三态时钟使能。
(11)
OCE
: 输 入 (宽 度 为 1 ) , 输出数据时钟使能。
(12)
TB Y TEIN
:输入(宽 度 为 1 ) , 字节组三态输入。
(13)
TBYTEO U T
: 输 出 (宽 度 为 1 ) ,字节组三态输出。
(14)
RST
: 输 入 (宽 度 为 1 ) , 有效高电平复位。
(15)
SHIFTIN
1 : 输 入 宽度为1) ,进位数据宽度扩展输入。连接到从
OSERDESE
2的SHIFTOUT
1。
(16)
SHIFTIN
2 :输入(宽 度 为 1 ) , 进 位 数 据 宽 度 扩 展 输 入 。连 接 到 从
OSERDESE
2
的
SH
1
FTOUT
2 。
(17)
T
1〜
T
4 : 输 入 (每 个 宽 度 为 1 ) , 并行三态输入。
属 性
| 描述 | 值 | 默认值 |
D A T A _ R A T E _ O Q
|
定 义 是 在 每 个 时 钟 沿 还 是 只 在 时
钟 的 上 升 沿 改 变 数 据 (
O Q )
|
字 符 串 :
S D R
或
D D R
| D D R |
D A T A _ R A T E _ T Q
|
定 义 是 在 每 个 时 钟 沿 还 是 只 在 时
钟 的 上 升 沿 改 变 三 态 (
T Q
) , 或 者
设 置 为 缓 冲
E
配 置
|
字 符 串 :
B U F/SD R /D D R
| D D R |
D A T A _ W ID T H
|
定 义 并 行 -串 行 数 据 转 换 器 的 宽
度 。 这 个 值 取 决 于
D A T A _ R A T E _ O Q
的值
|
整 数 :
2
、
3
、
4
、
5
、
6
、
7
、
8 、 10
或
1 4
。
在
S D R
模 式 下 ,
2
、
3
、
4
、 5、 6 、
7
、和
8
是 有 效 的 。
在
D D R
模 式 下 ,
2
、
4
、 6 、 8 、
1 0
和
1 4
是 有效的
| 4 |
S E R D E S
一
M O D E
|
当 使 用 宽 度 扩 展 时 , 定 义
O S E R D E S E 2
是 主 还 是 从
|
字 符 串 :
M A S T E R /S L A V E
| M A S T E R |
T R IS T A T E
一
W ID TH
|
定 义 并 行
-
串 行
3
态 转 换 器 的 宽 度
|
整 数 :
1
或
4
|
4
|
T B Y T E _ C T L
|
只 用 于 通 过
M I G 工 具
|
F A L S E /T R U E
|
F A L S E
|
T B Y T E
一
S R C
|
只 用 于 通 过
M
丨
G
工 具
| F A L S E /T R U E | F A L S E |
4.主从机连接示意图
四、应用方法
相信你们也不愿意看上面的废话,那么就来点实际有用的东西,直接展示
原语原本模样
OSERDESE2 #(
.DATA_RATE_OQ("DDR"), // DDR, SDR
.DATA_RATE_TQ("DDR"), // DDR, BUF, SDR
.DATA_WIDTH(4), // 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(4) // 3-state converter width (1,4)
)
OSERDESE2_inst (
.OFB(OFB), // 1-bit output: Feedback path for data
.OQ(OQ), // 1-bit output: Data path output
// SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
.SHIFTOUT1(SHIFTOUT1),
.SHIFTOUT2(SHIFTOUT2),
.TBYTEOUT(TBYTEOUT), // 1-bit output: Byte group tristate
.TFB(TFB), // 1-bit output: 3-state control
.TQ(TQ), // 1-bit output: 3-state control
.CLK(CLK), // 1-bit input: High speed clock
.CLKDIV(CLKDIV), // 1-bit input: Divided clock
// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
.D1(D1),
.D2(D2),
.D3(D3),
.D4(D4),
.D5(D5),
.D6(D6),
.D7(D7),
.D8(D8),
.OCE(OCE), // 1-bit input: Output data clock enable
.RST(RST), // 1-bit input: Reset
// SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
.SHIFTIN1(SHIFTIN1),
.SHIFTIN2(SHIFTIN2),
// T1 - T4: 1-bit (each) input: Parallel 3-state inputs
.T1(T1),
.T2(T2),
.T3(T3),
.T4(T4),
.TBYTEIN(TBYTEIN), // 1-bit input: Byte group tristate
.TCE(TCE) // 1-bit input: 3-state clock enable
);
HDMI使用原语
module par_to_ser(
input wire sys_clk ,
input wire sys_clk_5x ,
input wire sys_rst_n ,
input wire [9:0] data_in ,
output wire data_p ,
output wire data_n
);
wire shift_data1;
wire shift_data2;
wire data;
OSERDESE2 #(
.DATA_RATE_OQ("DDR"), // DDR, SDR
.DATA_RATE_TQ("DDR"), // 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(data), // 1-bit output: Data path output
// SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
.SHIFTOUT1(),
.SHIFTOUT2(),
.TBYTEOUT(), // 1-bit output: Byte group tristate
.TFB(), // 1-bit output: 3-state control
.TQ(), // 1-bit output: 3-state control
.CLK(sys_clk_5x), // 1-bit input: High speed clock
.CLKDIV(sys_clk), // 1-bit input: Divided clock
// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
.D1(data_in[0]),
.D2(data_in[1]),
.D3(data_in[2]),
.D4(data_in[3]),
.D5(data_in[4]),
.D6(data_in[5]),
.D7(data_in[6]),
.D8(data_in[7]),
.OCE(1), // 1-bit input: Output data clock enable
.RST(~sys_rst_n), // 1-bit input: Reset
// SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
.SHIFTIN1(shift_data1),
.SHIFTIN2(shift_data2),
// T1 - T4: 1-bit (each) input: Parallel 3-state inputs
.T1(0),
.T2(0),
.T3(0),
.T4(0),
.TBYTEIN(0), // 1-bit input: Byte group tristate
.TCE(0) // 1-bit input: 3-state clock enable
);
OSERDESE2 #(
.DATA_RATE_OQ("DDR"), // DDR, SDR
.DATA_RATE_TQ("DDR"), // 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 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
.SHIFTOUT1(shift_data1),
.SHIFTOUT2(shift_data2),
.TBYTEOUT(), // 1-bit output: Byte group tristate
.TFB(), // 1-bit output: 3-state control
.TQ(), // 1-bit output: 3-state control
.CLK(sys_clk_5x), // 1-bit input: High speed clock
.CLKDIV(sys_clk), // 1-bit input: Divided clock
// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
.D1(0),
.D2(0),
.D3(data_in[8]),
.D4(data_in[9]),
.D5(0),
.D6(0),
.D7(0),
.D8(0),
.OCE(1), // 1-bit input: Output data clock enable
.RST(~sys_rst_n), // 1-bit input: Reset
// SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
.SHIFTIN1(),
.SHIFTIN2(),
// T1 - T4: 1-bit (each) input: Parallel 3-state inputs
.T1(0),
.T2(0),
.T3(0),
.T4(0),
.TBYTEIN(0), // 1-bit input: Byte group tristate
.TCE(0) // 1-bit input: 3-state clock enable
);
OBUFDS #(
.IOSTANDARD("TMDS33"), // Specify the output I/O standard
.SLEW("SLOW") // Specify the output slew rate
) OBUFDS_inst (
.O (data_p), // Diff_p output (connect directly to top-level port)
.OB(data_n), // Diff_n output (connect directly to top-level port)
.I(data) // Buffer input
);
endmodule