ZYNQ学习——OSERDESE2原语
OSERDESE2原语端口
OSERDESE2 Attributes
时钟
CLK:高速串行时钟。
CLKDIV:并行时钟,用于并串转换;由CLK分频而来。
二者需相位相同。
唯一有效的时钟分配方式:
1、CLK driven by BUFIO, CLKDIV driven by BUFR;
2、CLK and CLKDIV driven by CLKOUT[0:6] of the same MMCM or PLL。
复位
OSERDESE2复位为高电平有效(若用PLL的locked信号作为复位时需加反相)。
数据线
输入
D1~D8:并行数据线,D1为发送的第一位。(可通过级联第二级slave模式的OSERDESE2原语来拓展输入数据宽度)
输出
OQ:串行数据输出端口,该端口无法驱动ODELAYE2。
OFB:串行数据输出端口,用于驱动ODELAYE2原语或发送反馈到ISERDESE2。
OP与OFB输出波形相同。
TQ:连接三态并串转换器的输出于IOB的三态输入。
TFB:
拓展输入数据位宽
- 仅可在DDR模式下,可将输出数据位宽提升至10:1或14:1。
- 需要将MASTER的 SHIFTOUT 端口连接至SLAVE的 SHIFTIN 端口。
- 输出必须通过buffer转成差分输出,否则将不能拓展。
- 不能用补充性的单端电平标准,eg: DIFF_HSTL and DIFF_SST
Data Width | Slave Inputs Used |
---|---|
10 | D3–D4 |
14 | D3–D8 |
三态
若工程无需使用到三态控制,则相关的控制信号(TCE、TBYTEIN、T1~T4)置0即可。
输入到输出延迟
延迟定义:
CLKDIV上升沿输入数据进入到OSERDESE2,到OQ输出串行数据流的第一位。
注:CLKDIV上沿采样数据,输出延迟单位为CLK周期。
OSERDESE2使用示例
代码
module OSERDESE2_test (
// input;
input clk,
input [7:0] data,
// output;
output data_out,
output data_out_test,
output data_out_tri_state
);
// wire TFB;
// wire TQ;
// wire clk_pll;
wire clk_50M; //
wire rst_n;
OSERDESE2 #(
.DATA_RATE_OQ ("DDR"), // DDR, SDR
.DATA_RATE_TQ ("DDR"), // DDR, BUF, SDR
.DATA_WIDTH (8), // Parallel data width (2-8,10,14)
.SERDES_MODE ("MASTER"), // MASTER, SLAVE
.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 (data_out_test), // 1-bit output: Feedback path for data
.OQ (data_out), // 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 (data_out_tri_state), // 1-bit output: 3-state control
.CLK (clk_200M), // 1-bit input: High speed clock
.CLKDIV (clk_50M), // 1-bit input: Divided clock
// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
.D1 (data[0]),
.D2 (data[1]),
.D3 (data[2]),
.D4 (data[3]),
.D5 (data[4]),
.D6 (data[5]),
.D7 (data[6]),
.D8 (data[7]),
.OCE (1'b1), // 1-bit input: Output data clock enable
.RST (~rst_n), // 由于使用锁相环,因此需将复位信号反相
// SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
.SHIFTIN1 (1'b0),
.SHIFTIN2 (1'b0),
// T1 - T4: 1-bit (each) input: Parallel 3-state inputs
.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
);
// PLL;
clk_wiz_0 instance_name
(
// Clock out ports
.clk_50M (clk_50M), // output clk_50M
.clk_200M (clk_200M), // output clk_200M
// Status and control signals
.locked (rst_n), // output locked
// Clock in ports
.clk_in (clk)
); // input clk_in
endmodule
TB
`timescale 1ns/1ns
module tb_OSERDESE2_test ();
reg clk = 1'b0;
always #5 clk = ~clk;
reg [7:0] data = 8'b0;
wire data_out;
wire data_out_test;
wire data_out_tri_state;
task delay_clks;
input [7:0] number;
begin
repeat(number) @(posedge clk);
#1;
end
endtask
initial begin
delay_clks(100);
data = 8'b1010_1010;
delay_clks(10);
data = 8'b1001_0011;
delay_clks(10);
data = 8'b1111_1111;
delay_clks(10);
data = 8'b0;
end
OSERDESE2_test U_OSERDESE2_TEST (
.clk (clk),
.data (data),
.data_out (data_out),
.data_out_test (data_out_test),
.data_out_tri_state (data_out_tri_state)
);
endmodule
仿真结果
1时刻:clk_50M即CLKDIV上升沿采样输入数据。
2时刻:由查表可知,DDR、8:1时输入到输出延迟为4个CLK周期,即4个clk_200M周期,因此在2时刻开始输出串行化的数据。而输出数据由D1即data[0]开始,因此数据实际输出为01010101,后续输出以此类推。