Rev Author Line No. Line
3641 kaklik 1 -- file: selectio_iserdes_8bit_ddr_diffin.vhd
2 -- (c) Copyright 2009 - 2011 Xilinx, Inc. All rights reserved.
3 --
4 -- This file contains confidential and proprietary information
5 -- of Xilinx, Inc. and is protected under U.S. and
6 -- international copyright and other intellectual property
7 -- laws.
8 --
9 -- DISCLAIMER
10 -- This disclaimer is not a license and does not grant any
11 -- rights to the materials distributed herewith. Except as
12 -- otherwise provided in a valid license issued to you by
13 -- Xilinx, and to the maximum extent permitted by applicable
14 -- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
15 -- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
16 -- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
17 -- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
18 -- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
19 -- (2) Xilinx shall not be liable (whether in contract or tort,
20 -- including negligence, or under any other theory of
21 -- liability) for any loss or damage of any kind or nature
22 -- related to, arising under or in connection with these
23 -- materials, including for any direct, or any indirect,
24 -- special, incidental, or consequential loss or damage
25 -- (including loss of data, profits, goodwill, or any type of
26 -- loss or damage suffered as a result of any action brought
27 -- by a third party) even if such damage or loss was
28 -- reasonably foreseeable or Xilinx had been advised of the
29 -- possibility of the same.
30 --
31 -- CRITICAL APPLICATIONS
32 -- Xilinx products are not designed or intended to be fail-
33 -- safe, or for use in any application requiring fail-safe
34 -- performance, such as life-support or safety devices or
35 -- systems, Class III medical devices, nuclear facilities,
36 -- applications related to the deployment of airbags, or any
37 -- other applications that could lead to death, personal
38 -- injury, or severe property or environmental damage
39 -- (individually and collectively, "Critical
40 -- Applications"). Customer assumes the sole risk and
41 -- liability of any use of Xilinx products in Critical
42 -- Applications, subject only to applicable laws and
43 -- regulations governing limitations on product liability.
44 --
45 -- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46 -- PART OF THIS FILE AT ALL TIMES.
47 ------------------------------------------------------------------------------
48 -- User entered comments
49 ------------------------------------------------------------------------------
50 -- None
51 ------------------------------------------------------------------------------
52 --
53 -- EDIT: the clocking logic has been moved outside
54  
55  
56 library ieee;
57 use ieee.std_logic_1164.all;
58 use ieee.std_logic_unsigned.all;
59 use ieee.std_logic_arith.all;
60 use ieee.std_logic_misc.all;
61 use ieee.numeric_std.all;
62  
63 library unisim;
64 use unisim.vcomponents.all;
65  
66 entity myserdes_ddr is
67 generic
68 (-- width of the data for the system
69 sys_w : integer := 1;
70 -- width of the data for the device
71 dev_w : integer := 8);
72 port
73 (
74 -- From the system into the device
75 DATA_IN_FROM_PINS_P : in std_logic_vector(sys_w-1 downto 0);
76 DATA_IN_FROM_PINS_N : in std_logic_vector(sys_w-1 downto 0);
77 DATA_IN_TO_DEVICE : out std_logic_vector(dev_w-1 downto 0);
78  
79 BITSLIP : in std_logic; -- Bitslip module is enabled in NETWORKING mode
80 -- User should tie it to '0' if not needed
81  
82 -- Clock and reset signals
83 CLK_IN : in std_logic; -- Fast clock from IOB, after IBUFGDS and BUFIO
84 CLK_DIV_IN : in std_logic; -- Divided fast clock from IBUFGDS and BUFR
85  
86 IO_RESET : in std_logic); -- Reset signal for IO circuit
87 end myserdes_ddr;
88  
89 architecture xilinx of myserdes_ddr is
90 attribute CORE_GENERATION_INFO : string;
91 attribute CORE_GENERATION_INFO of xilinx : architecture is "selectio_iserdes_8bit_ddr_diffin,selectio_wiz_v4_1,{component_name=selectio_iserdes_8bit_ddr_diffin,bus_dir=INPUTS,bus_sig_type=DIFF,bus_io_std=LVDS_25,use_serialization=true,use_phase_detector=false,serialization_factor=8,enable_bitslip=false,enable_train=false,system_data_width=1,bus_in_delay=NONE,bus_out_delay=NONE,clk_sig_type=DIFF,clk_io_std=LVCMOS18,clk_buf=BUFIO2,active_edge=RISING,clk_delay=NONE,v6_bus_in_delay=NONE,v6_bus_out_delay=NONE,v6_clk_buf=BUFIO,v6_active_edge=DDR,v6_ddr_alignment=SAME_EDGE_PIPELINED,v6_oddr_alignment=SAME_EDGE,ddr_alignment=C0,v6_interface_type=NETWORKING,interface_type=NETWORKING,v6_bus_in_tap=0,v6_bus_out_tap=0,v6_clk_io_std=LVDS_25,v6_clk_sig_type=DIFF}";
92 constant clock_enable : std_logic := '1';
93 signal unused : std_logic;
94  
95  
96 -- After the buffer
97 signal data_in_from_pins_int : std_logic_vector(sys_w-1 downto 0);
98 -- Between the delay and serdes
99 signal data_in_from_pins_delay : std_logic_vector(sys_w-1 downto 0);
100 constant num_serial_bits : integer := dev_w/sys_w;
101 type serdarr is array (0 to 9) of std_logic_vector(sys_w-1 downto 0);
102 -- Array to use intermediately from the serdes to the internal
103 -- devices. bus "0" is the leftmost bus
104 -- * fills in starting with 0
105 signal iserdes_q : serdarr := (( others => (others => '0')));
106 signal serdesstrobe : std_logic;
107 signal icascade1 : std_logic_vector(sys_w-1 downto 0);
108 signal icascade2 : std_logic_vector(sys_w-1 downto 0);
109 signal clk_in_inv : std_logic;
110  
111  
112  
113 begin
114  
115 -- We have multiple bits- step over every bit, instantiating the required elements
116 pins: for pin_count in 0 to sys_w-1 generate
117 begin
118 -- Instantiate the buffers
119 ----------------------------------
120 -- Instantiate a buffer for every bit of the data bus
121 ibufds_inst : IBUFDS
122 generic map (
123 DIFF_TERM => TRUE, -- Differential termination
124 IOSTANDARD => "LVDS_25")
125 port map (
126 I => DATA_IN_FROM_PINS_P (pin_count),
127 IB => DATA_IN_FROM_PINS_N (pin_count),
128 O => data_in_from_pins_int(pin_count));
129  
130  
131 -- Pass through the delay
132 -----------------------------------
133 data_in_from_pins_delay(pin_count) <= data_in_from_pins_int(pin_count);
134  
135 -- Instantiate the serdes primitive
136 ----------------------------------
137  
138 clk_in_inv <= not (CLK_IN);
139  
140 -- declare the iserdes
141 iserdese1_master : ISERDESE1
142 generic map (
143 DATA_RATE => "DDR",
144 DATA_WIDTH => 8,
145 INTERFACE_TYPE => "NETWORKING",
146 DYN_CLKDIV_INV_EN => FALSE,
147 DYN_CLK_INV_EN => FALSE,
148 NUM_CE => 2,
149  
150 OFB_USED => FALSE,
151 IOBDELAY => "NONE", -- Use input at D to output the data on Q1-Q6
152 SERDES_MODE => "MASTER")
153 port map (
154 Q1 => iserdes_q(0)(pin_count),
155 Q2 => iserdes_q(1)(pin_count),
156 Q3 => iserdes_q(2)(pin_count),
157 Q4 => iserdes_q(3)(pin_count),
158 Q5 => iserdes_q(4)(pin_count),
159 Q6 => iserdes_q(5)(pin_count),
160 SHIFTOUT1 => icascade1(pin_count), -- Cascade connection to Slave ISERDES
161 SHIFTOUT2 => icascade2(pin_count), -- Cascade connection to Slave ISERDES
162 BITSLIP => BITSLIP, -- 1-bit Invoke Bitslip. This can be used with any
163 -- DATA_WIDTH, cascaded or not.
164 CE1 => clock_enable, -- 1-bit Clock enable input
165 CE2 => clock_enable, -- 1-bit Clock enable input
166 CLK => CLK_IN, -- Fast Source Synchronous SERDES clock from BUFIO
167 CLKB => clk_in_inv, -- Locally inverted clock
168 CLKDIV => CLK_DIV_IN, -- Slow clock driven by BUFR
169 D => data_in_from_pins_delay(pin_count), -- 1-bit Input signal from IOB.
170 DDLY => '0',
171 RST => IO_RESET, -- 1-bit Asynchronous reset only.
172 SHIFTIN1 => '0',
173 SHIFTIN2 => '0',
174 -- unused connections
175 DYNCLKDIVSEL => '0',
176 DYNCLKSEL => '0',
177 OFB => '0',
178 OCLK => '0',
179 O => open); -- unregistered output of ISERDESE1
180  
181 iserdese1_slave : ISERDESE1
182 generic map (
183 DATA_RATE => "DDR",
184 DATA_WIDTH => 8,
185 INTERFACE_TYPE => "NETWORKING",
186 DYN_CLKDIV_INV_EN => FALSE,
187 DYN_CLK_INV_EN => FALSE,
188 NUM_CE => 2,
189  
190 OFB_USED => FALSE,
191 IOBDELAY => "NONE", -- Use input at D to output the data on Q1-Q6
192 SERDES_MODE => "SLAVE")
193 port map (
194 Q1 => open,
195 Q2 => open,
196 Q3 => iserdes_q(6)(pin_count),
197 Q4 => iserdes_q(7)(pin_count),
198 Q5 => iserdes_q(8)(pin_count),
199 Q6 => iserdes_q(9)(pin_count),
200 SHIFTOUT1 => open,
201 SHIFTOUT2 => open,
202 SHIFTIN1 => icascade1(pin_count), -- Cascade connections from Master ISERDES
203 SHIFTIN2 => icascade2(pin_count), -- Cascade connections from Master ISERDES
204 BITSLIP => BITSLIP, -- 1-bit Invoke Bitslip. This can be used with any
205 -- DATA_WIDTH, cascaded or not.
206 CE1 => clock_enable, -- 1-bit Clock enable input
207 CE2 => clock_enable, -- 1-bit Clock enable input
208 CLK => CLK_IN, -- Fast source synchronous serdes clock
209 CLKB => clk_in_inv, -- locally inverted clock
210 CLKDIV => CLK_DIV_IN, -- Slow clock sriven by BUFR.
211 D => '0', -- Slave ISERDES module. No need to connect D, DDLY
212 DDLY => '0',
213 RST => IO_RESET, -- 1-bit Asynchronous reset only.
214 -- unused connections
215 DYNCLKDIVSEL => '0',
216 DYNCLKSEL => '0',
217 OFB => '0',
218 OCLK => '0',
219 O => open); -- unregistered output of ISERDESE1
220  
221 -- Concatenate the serdes outputs together. Keep the timesliced
222 -- bits together, and placing the earliest bits on the right
223 -- ie, if data comes in 0, 1, 2, 3, 4, 5, 6, 7, ...
224 -- the output will be 3210, 7654, ...
225 -------------------------------------------------------------
226  
227 in_slices: for slice_count in 0 to num_serial_bits-1 generate begin
228 -- This places the first data in time on the right
229 -- DATA_IN_TO_DEVICE(slice_count) <=
230 -- iserdes_q(num_serial_bits-slice_count-1)(0);
231 -- To place the first data in time on the left, use the
232 -- following code, instead
233 DATA_IN_TO_DEVICE(slice_count) <=
234 iserdes_q(slice_count)(0);
235 end generate in_slices;
236  
237  
238 end generate pins;
239  
240  
241  
242  
243  
244 end xilinx;
245  
246  
247