aboutsummaryrefslogtreecommitdiffstats
path: root/tx/serdes_n_to_1.v
blob: bc384b6abd3fb55448adf751ff7b926b9684ee3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
//////////////////////////////////////////////////////////////////////////////
//
//  Xilinx, Inc. 2008                 www.xilinx.com
//
//////////////////////////////////////////////////////////////////////////////
//
//  File name :       	serdes_n_to_1.v
//
//  Description :     	1-bit generic n:1 transmitter module
// 			Takes in n bits of data and serialises this to 1 bit
// 			data is transmitted LSB first
// 			0, 1, 2 ......
//
//  Date - revision : 	August 1st 2008 - v 1.0
//
//  Author :          	NJS
//
//  Disclaimer: LIMITED WARRANTY AND DISCLAMER. These designs are
//              provided to you "as is". Xilinx and its licensors make and you
//              receive no warranties or conditions, express, implied,
//              statutory or otherwise, and Xilinx specifically disclaims any
//              implied warranties of merchantability, non-infringement,or
//              fitness for a particular purpose. Xilinx does not warrant that
//              the functions contained in these designs will meet your
//              requirements, or that the operation of these designs will be
//              uninterrupted or error free, or that defects in the Designs
//              will be corrected. Furthermore, Xilinx does not warrantor
//              make any representations regarding use or the results of the
//              use of the designs in terms of correctness, accuracy,
//              reliability, or otherwise.
//
//              LIMITATION OF LIABILITY. In no event will Xilinx or its
//              licensors be liable for any loss of data, lost profits,cost
//              or procurement of substitute goods or services, or for any
//              special, incidental, consequential, or indirect damages
//              arising from the use or operation of the designs or
//              accompanying documentation, however caused and on any theory
//              of liability. This limitation will apply even if Xilinx
//              has been advised of the possibility of such damage. This
//              limitation shall apply not-withstanding the failure of the
//              essential purpose of any limited remedies herein.
//
//  Copyright © 2008 Xilinx, Inc.
//  All rights reserved
//
//////////////////////////////////////////////////////////////////////////////
//

`timescale 1ps/1ps

module serdes_n_to_1 (ioclk, serdesstrobe, reset, gclk, datain, iob_data_out) ;

parameter integer SF = 8 ;   		// Parameter to set the serdes factor 1..8

input 			ioclk ;		// IO Clock network
input 			serdesstrobe ;	// Parallel data capture strobe
input 			reset ;		// Reset
input 			gclk ;		// Global clock
input 	[SF-1 : 0]	datain ;  	// Data for output
output 			iob_data_out ;	// output data

wire		cascade_di ;		//
wire		cascade_do ;		//
wire		cascade_ti ;		//
wire		cascade_to ;		//
wire	[8:0]	mdatain ;		//

genvar i ;				// Pad out the input data bus with 0's to 8 bits to avoid errors
generate
for (i = 0 ; i <= (SF - 1) ; i = i + 1)
begin : loop0
assign mdatain[i] = datain[i] ;
end
endgenerate
generate
for (i = (SF) ; i <= 8 ; i = i + 1)
begin : loop1
assign mdatain[i] = 1'b0 ;
end
endgenerate

OSERDES2 #(
	.DATA_WIDTH     	(SF), 			// SERDES word width.  This should match the setting is BUFPLL
	.DATA_RATE_OQ      	("SDR"), 		// <SDR>, DDR
	.DATA_RATE_OT      	("SDR"), 		// <SDR>, DDR
	.SERDES_MODE    	("MASTER"), 		// <DEFAULT>, MASTER, SLAVE
	.OUTPUT_MODE 		("DIFFERENTIAL"))
oserdes_m (
	.OQ       		(iob_data_out),
	.OCE     		(1'b1),
	.CLK0    		(ioclk),
	.CLK1    		(1'b0),
	.IOCE    		(serdesstrobe),
	.RST     		(reset),
	.CLKDIV  		(gclk),
	.D4  			(mdatain[7]),
	.D3  			(mdatain[6]),
	.D2  			(mdatain[5]),
	.D1  			(mdatain[4]),
	.TQ  			(),
	.T1 			(1'b0),
	.T2 			(1'b0),
	.T3 			(1'b0),
	.T4 			(1'b0),
	.TRAIN    		(1'b0),
	.TCE	   		(1'b1),
	.SHIFTIN1 		(1'b1),			// Dummy input in Master
	.SHIFTIN2 		(1'b1),			// Dummy input in Master
	.SHIFTIN3 		(cascade_do),		// Cascade output D data from slave
	.SHIFTIN4 		(cascade_to),		// Cascade output T data from slave
	.SHIFTOUT1 		(cascade_di),		// Cascade input D data to slave
	.SHIFTOUT2 		(cascade_ti),		// Cascade input T data to slave
	.SHIFTOUT3 		(),			// Dummy output in Master
	.SHIFTOUT4 		()) ;			// Dummy output in Master

OSERDES2 #(
	.DATA_WIDTH     	(SF), 			// SERDES word width.  This should match the setting is BUFPLL
	.DATA_RATE_OQ      	("SDR"), 		// <SDR>, DDR
	.DATA_RATE_OT      	("SDR"), 		// <SDR>, DDR
	.SERDES_MODE    	("SLAVE"), 		// <DEFAULT>, MASTER, SLAVE
	.OUTPUT_MODE 		("DIFFERENTIAL"))
oserdes_s (
	.OQ       		(),
	.OCE     		(1'b1),
	.CLK0    		(ioclk),
	.CLK1    		(1'b0),
	.IOCE    		(serdesstrobe),
	.RST     		(reset),
	.CLKDIV  		(gclk),
	.D4  			(mdatain[3]),
	.D3  			(mdatain[2]),
	.D2  			(mdatain[1]),
	.D1  			(mdatain[0]),
	.TQ  			(),
	.T1 			(1'b0),
	.T2 			(1'b0),
	.T3  			(1'b0),
	.T4  			(1'b0),
	.TRAIN 			(1'b0),
	.TCE	 		(1'b1),
	.SHIFTIN1 		(cascade_di),		// Cascade input D from Master
	.SHIFTIN2 		(cascade_ti),		// Cascade input T from Master
	.SHIFTIN3 		(1'b1),			// Dummy input in Slave
	.SHIFTIN4 		(1'b1),			// Dummy input in Slave
	.SHIFTOUT1 		(),			// Dummy output in Slave
	.SHIFTOUT2 		(),			// Dummy output in Slave
	.SHIFTOUT3 		(cascade_do),   	// Cascade output D data to Master
	.SHIFTOUT4 		(cascade_to)) ; 	// Cascade output T data to Master

endmodule