一、数据并行-串行转换
—个OSERDESE2模块中的数据并行到串行转换器接收2〜8位来自FPGA逻辑结构内的并行数据 (如果使用OSERDESE2宽度扩展,则为14位),将数据串行化,并通过OQ输出将其传送到IO B。并行数据的串行化按照从数据输入引脚最低到最高的顺序,即在D1输入引脚上的数据是第一位发送到OQ引脚上的。数据并行 -串行转换器有两种模式,既单数据速率(Single Data Rate,SDR) 和双数据速率(Double Data Rate,DD R) 。
OSERDESE2 使 用 时 钟 CLK和CLK DIV 进行数据速率转换。CLK 是高速串行时钟,
C L K D IV 是分频并行时钟。CLK和CLK LDIV必须相位对齐。在使用该模块之前,必须对 OSERDESE2 应用复位。OSERDESE2 包含一个控制数据流 的内部计数器。
二、三态并行-串行转换器
除数据的并行到串行转换外,OSERDESE2 模块还包含一个并行到串行转换器,用于IOB的三态控制。与数据转换不同,三态转换器最多只能串行化 4 位并行三态信号。三态转换器不能级联。
三、引脚接触分析
1.示意图
2.基本电路图
3.管脚分析
(1) OQ: 输 出 宽 度 为 1 ) , 数 据 路 径 仅 输 出 到 IOB。
(2) OFB: 输 出 (宽 度 为 1 ) , 数据路径输出反馈到ISERDESE2 或连接到ODELAYE2 。
(3) TQ: 输 出 (宽 度 为 1 ) ,到 IO B 的三状态控制输出。
(4) TFB: 输出,到 F P G A内逻辑结构的三状态控制输出。
(5) SHIFT0 U T1 : 输 出 (宽 度 为 1 ) , 进 位 数 据 输 出 用 于 宽 度 扩 展 。 连 接 到 主
OSERDESE2 的 S HIFTIN1 0 SERDESE2 。
(6) SHIFT0 UT2 : 输 出 (宽 度 为 1 ) , 进位数据输出用于宽度扩展。连 接 到 主 OSERDESE2
的 SHIFTIN2 OSERDESE2 。
(7) C LK: 输 入 (宽 度 为 1 ) , 高速时钟输入。
(8) C LK D IV: 输 入 (宽 度 为 1 ) , 分频时钟输入。时钟延迟元素、解串行化数据和CE单元。
(9) D 1〜D8 : 输 入 (每 个 宽 度 为 1 ) , 并行数据输入。
(10) TCE: 输 入 (宽 度 为 1 ) , 三态时钟使能。
(11) OCE: 输 入 (宽 度 为 1 ) , 输出数据时钟使能。
(12) TB Y TEIN:输入(宽 度 为 1 ) , 字节组三态输入。
(13) TBYTEO U T: 输 出 (宽 度 为 1 ) ,字节组三态输出。
(14) RST: 输 入 (宽 度 为 1 ) , 有效高电平复位。
(15) SHIFTIN1 : 输 入 宽度为1) ,进位数据宽度扩展输入。连接到从OSERDESE2的SHIFTOUT1。
(16) SHIFTIN2 :输入(宽 度 为 1 ) , 进 位 数 据 宽 度 扩 展 输 入 。连 接 到 从 OSERDESE2
的 SH1FTOUT2 。
(17) T 1〜T4 : 输 入 (每 个 宽 度 为 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