delay_controller_wrap.v 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. //////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) 2012-2015 Xilinx, Inc.
  3. // This design is confidential and proprietary of Xilinx, All Rights Reserved.
  4. //////////////////////////////////////////////////////////////////////////////
  5. // ____ ____
  6. // / /\/ /
  7. // /___/ \ / Vendor: Xilinx
  8. // \ \ \/ Version: 1.2
  9. // \ \ Filename: delay_controller_wrap.v
  10. // / / Date Last Modified: 21JAN2015
  11. // /___/ /\ Date Created: 8JAN2013
  12. // \ \ / \
  13. // \___\/\___\
  14. //
  15. //Device: 7 Series
  16. //Purpose: Controls delays on a per-bit basis
  17. // Number of bits from each seres set via an attribute
  18. //
  19. //Reference: XAPP585
  20. //
  21. //Revision History:
  22. // Rev 1.0 - First created (nicks)
  23. // Rev 1.2 - Updated format (brandond)
  24. //
  25. //////////////////////////////////////////////////////////////////////////////
  26. //
  27. // Disclaimer:
  28. //
  29. // This disclaimer is not a license and does not grant any rights to the materials
  30. // distributed herewith. Except as otherwise provided in a valid license issued to you
  31. // by Xilinx, and to the maximum extent permitted by applicable law:
  32. // (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS,
  33. // AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
  34. // INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
  35. // FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether in contract
  36. // or tort, including negligence, or under any other theory of liability) for any loss or damage
  37. // of any kind or nature related to, arising under or in connection with these materials,
  38. // including for any direct, or any indirect, special, incidental, or consequential loss
  39. // or damage (including loss of data, profits, goodwill, or any type of loss or damage suffered
  40. // as a result of any action brought by a third party) even if such damage or loss was
  41. // reasonably foreseeable or Xilinx had been advised of the possibility of the same.
  42. //
  43. // Critical Applications:
  44. //
  45. // Xilinx products are not designed or intended to be fail-safe, or for use in any application
  46. // requiring fail-safe performance, such as life-support or safety devices or systems,
  47. // Class III medical devices, nuclear facilities, applications related to the deployment of airbags,
  48. // or any other applications that could lead to death, personal injury, or severe property or
  49. // environmental damage (individually and collectively, "Critical Applications"). Customer assumes
  50. // the sole risk and liability of any use of Xilinx products in Critical Applications, subject only
  51. // to applicable laws and regulations governing limitations on product liability.
  52. //
  53. // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT ALL TIMES.
  54. //
  55. //////////////////////////////////////////////////////////////////////////////
  56. `timescale 1ps/1ps
  57. module delay_controller_wrap (m_datain, s_datain, enable_phase_detector, enable_monitor, reset, clk, c_delay_in, m_delay_out, s_delay_out, data_out, bt_val, results, m_delay_1hot, del_mech) ;
  58. parameter integer S = 4 ; // Set the number of bits
  59. input [S-1:0] m_datain ; // Inputs from master serdes
  60. input [S-1:0] s_datain ; // Inputs from slave serdes
  61. input enable_phase_detector ; // Enables the phase detector logic when high
  62. input enable_monitor ; // Enables the eye monitoring logic when high
  63. input reset ; // Reset line synchronous to clk
  64. input clk ; // Global/Regional clock
  65. input [4:0] c_delay_in ; // delay value found on clock line
  66. output [4:0] m_delay_out ; // Master delay control value
  67. output [4:0] s_delay_out ; // Master delay control value
  68. output reg [S-1:0] data_out ; // Output data
  69. input [4:0] bt_val ; // Calculated bit time value for slave devices
  70. output reg [31:0] results ; // eye monitor result data
  71. output reg [31:0] m_delay_1hot ; // Master delay control value as a one-hot vector
  72. input del_mech ; // changes delay mechanism slightly at higher bit rates
  73. reg [S-1:0] mdataouta ;
  74. reg mdataoutb ;
  75. reg [S-1:0] mdataoutc ;
  76. reg [S-1:0] sdataouta ;
  77. reg sdataoutb ;
  78. reg [S-1:0] sdataoutc ;
  79. reg s_ovflw ;
  80. reg [1:0] m_delay_mux ;
  81. reg [1:0] s_delay_mux ;
  82. reg data_mux ;
  83. reg dec_run ;
  84. reg inc_run ;
  85. reg eye_run ;
  86. reg [4:0] s_state ;
  87. reg [5:0] pdcount ;
  88. reg [4:0] m_delay_val_int ;
  89. reg [4:0] s_delay_val_int ;
  90. reg [4:0] s_delay_val_eye ;
  91. reg meq_max ;
  92. reg meq_min ;
  93. reg pd_max ;
  94. reg pd_min ;
  95. reg delay_change ;
  96. wire [S-1:0] all_high ;
  97. wire [S-1:0] all_low ;
  98. wire [7:0] msxoria ;
  99. wire [7:0] msxorda ;
  100. reg [1:0] action ;
  101. reg [1:0] msxor_cti ;
  102. reg [1:0] msxor_ctd ;
  103. reg [1:0] msxor_ctix ;
  104. reg [1:0] msxor_ctdx ;
  105. wire [2:0] msxor_ctiy ;
  106. wire [2:0] msxor_ctdy ;
  107. reg [7:0] match ;
  108. reg [31:0] shifter ;
  109. reg [7:0] pd_hold ;
  110. assign m_delay_out = m_delay_val_int ;
  111. assign s_delay_out = s_delay_val_int ;
  112. genvar i ;
  113. generate
  114. for (i = 0 ; i <= S-2 ; i = i+1) begin : loop0
  115. assign msxoria[i+1] = ((~s_ovflw & ((mdataouta[i] & ~mdataouta[i+1] & ~sdataouta[i]) | (~mdataouta[i] & mdataouta[i+1] & sdataouta[i]))) |
  116. ( s_ovflw & ((mdataouta[i] & ~mdataouta[i+1] & ~sdataouta[i+1]) | (~mdataouta[i] & mdataouta[i+1] & sdataouta[i+1])))) ; // early bits
  117. assign msxorda[i+1] = ((~s_ovflw & ((mdataouta[i] & ~mdataouta[i+1] & sdataouta[i]) | (~mdataouta[i] & mdataouta[i+1] & ~sdataouta[i])))) |
  118. ( s_ovflw & ((mdataouta[i] & ~mdataouta[i+1] & sdataouta[i+1]) | (~mdataouta[i] & mdataouta[i+1] & ~sdataouta[i+1]))) ; // late bits
  119. end
  120. endgenerate
  121. assign msxoria[0] = ((~s_ovflw & ((mdataoutb & ~mdataouta[0] & ~sdataoutb) | (~mdataoutb & mdataouta[0] & sdataoutb))) | // first early bit
  122. ( s_ovflw & ((mdataoutb & ~mdataouta[0] & ~sdataouta[0]) | (~mdataoutb & mdataouta[0] & sdataouta[0])))) ;
  123. assign msxorda[0] = ((~s_ovflw & ((mdataoutb & ~mdataouta[0] & sdataoutb) | (~mdataoutb & mdataouta[0] & ~sdataoutb)))) | // first late bit
  124. ( s_ovflw & ((mdataoutb & ~mdataouta[0] & sdataouta[0]) | (~mdataoutb & mdataouta[0] & ~sdataouta[0]))) ;
  125. always @ (posedge clk) begin // generate number of incs or decs for low 4 bits
  126. case (msxoria[3:0])
  127. 4'h0 : msxor_cti <= 2'h0 ;
  128. 4'h1 : msxor_cti <= 2'h1 ;
  129. 4'h2 : msxor_cti <= 2'h1 ;
  130. 4'h3 : msxor_cti <= 2'h2 ;
  131. 4'h4 : msxor_cti <= 2'h1 ;
  132. 4'h5 : msxor_cti <= 2'h2 ;
  133. 4'h6 : msxor_cti <= 2'h2 ;
  134. 4'h8 : msxor_cti <= 2'h1 ;
  135. 4'h9 : msxor_cti <= 2'h2 ;
  136. 4'hA : msxor_cti <= 2'h2 ;
  137. 4'hC : msxor_cti <= 2'h2 ;
  138. default : msxor_cti <= 2'h3 ;
  139. endcase
  140. case (msxorda[3:0])
  141. 4'h0 : msxor_ctd <= 2'h0 ;
  142. 4'h1 : msxor_ctd <= 2'h1 ;
  143. 4'h2 : msxor_ctd <= 2'h1 ;
  144. 4'h3 : msxor_ctd <= 2'h2 ;
  145. 4'h4 : msxor_ctd <= 2'h1 ;
  146. 4'h5 : msxor_ctd <= 2'h2 ;
  147. 4'h6 : msxor_ctd <= 2'h2 ;
  148. 4'h8 : msxor_ctd <= 2'h1 ;
  149. 4'h9 : msxor_ctd <= 2'h2 ;
  150. 4'hA : msxor_ctd <= 2'h2 ;
  151. 4'hC : msxor_ctd <= 2'h2 ;
  152. default : msxor_ctd <= 2'h3 ;
  153. endcase
  154. case (msxoria[7:4]) // generate number of incs or decs for high n bits, max 4
  155. 4'h0 : msxor_ctix <= 2'h0 ;
  156. 4'h1 : msxor_ctix <= 2'h1 ;
  157. 4'h2 : msxor_ctix <= 2'h1 ;
  158. 4'h3 : msxor_ctix <= 2'h2 ;
  159. 4'h4 : msxor_ctix <= 2'h1 ;
  160. 4'h5 : msxor_ctix <= 2'h2 ;
  161. 4'h6 : msxor_ctix <= 2'h2 ;
  162. 4'h8 : msxor_ctix <= 2'h1 ;
  163. 4'h9 : msxor_ctix <= 2'h2 ;
  164. 4'hA : msxor_ctix <= 2'h2 ;
  165. 4'hC : msxor_ctix <= 2'h2 ;
  166. default : msxor_ctix <= 2'h3 ;
  167. endcase
  168. case (msxorda[7:4])
  169. 4'h0 : msxor_ctdx <= 2'h0 ;
  170. 4'h1 : msxor_ctdx <= 2'h1 ;
  171. 4'h2 : msxor_ctdx <= 2'h1 ;
  172. 4'h3 : msxor_ctdx <= 2'h2 ;
  173. 4'h4 : msxor_ctdx <= 2'h1 ;
  174. 4'h5 : msxor_ctdx <= 2'h2 ;
  175. 4'h6 : msxor_ctdx <= 2'h2 ;
  176. 4'h8 : msxor_ctdx <= 2'h1 ;
  177. 4'h9 : msxor_ctdx <= 2'h2 ;
  178. 4'hA : msxor_ctdx <= 2'h2 ;
  179. 4'hC : msxor_ctdx <= 2'h2 ;
  180. default : msxor_ctdx <= 2'h3 ;
  181. endcase
  182. end
  183. assign msxor_ctiy = {1'b0, msxor_cti} + {1'b0, msxor_ctix} ;
  184. assign msxor_ctdy = {1'b0, msxor_ctd} + {1'b0, msxor_ctdx} ;
  185. always @ (posedge clk) begin
  186. if (msxor_ctiy == msxor_ctdy) begin
  187. action <= 2'h0 ;
  188. end
  189. else if (msxor_ctiy > msxor_ctdy) begin
  190. action <= 2'h1 ;
  191. end
  192. else begin
  193. action <= 2'h2 ;
  194. end
  195. end
  196. generate
  197. for (i = 0 ; i <= S-1 ; i = i+1) begin : loop1
  198. assign all_high[i] = 1'b1 ;
  199. assign all_low[i] = 1'b0 ;
  200. end
  201. endgenerate
  202. always @ (posedge clk) begin
  203. mdataouta <= m_datain ;
  204. mdataoutb <= mdataouta[S-1] ;
  205. sdataouta <= s_datain ;
  206. sdataoutb <= sdataouta[S-1] ;
  207. end
  208. always @ (posedge clk) begin
  209. if (reset == 1'b1) begin
  210. s_ovflw <= 1'b0 ;
  211. pdcount <= 6'b100000 ;
  212. m_delay_val_int <= c_delay_in ; // initial master delay
  213. s_delay_val_int <= c_delay_in ; // initial slave delay
  214. data_mux <= 1'b0 ;
  215. m_delay_mux <= 2'b01 ;
  216. s_delay_mux <= 2'b01 ;
  217. s_state <= 5'b00000 ;
  218. inc_run <= 1'b0 ;
  219. dec_run <= 1'b0 ;
  220. eye_run <= 1'b0 ;
  221. s_delay_val_eye <= 5'h00 ;
  222. shifter <= 32'h00000001 ;
  223. delay_change <= 1'b0 ;
  224. results <= 32'h00000000 ;
  225. pd_hold <= 8'h00 ;
  226. end
  227. else begin
  228. case (m_delay_mux)
  229. 2'b00 : mdataoutc <= {mdataouta[S-2:0], mdataoutb} ;
  230. 2'b10 : mdataoutc <= {m_datain[0], mdataouta[S-1:1]} ;
  231. default : mdataoutc <= mdataouta ;
  232. endcase
  233. case (s_delay_mux)
  234. 2'b00 : sdataoutc <= {sdataouta[S-2:0], sdataoutb} ;
  235. 2'b10 : sdataoutc <= {s_datain[0], sdataouta[S-1:1]} ;
  236. default : sdataoutc <= sdataouta ;
  237. endcase
  238. if (m_delay_val_int == bt_val) begin
  239. meq_max <= 1'b1 ;
  240. end else begin
  241. meq_max <= 1'b0 ;
  242. end
  243. if (m_delay_val_int == 5'h00) begin
  244. meq_min <= 1'b1 ;
  245. end else begin
  246. meq_min <= 1'b0 ;
  247. end
  248. if (pdcount == 6'h3F && pd_max == 1'b0 && delay_change == 1'b0) begin
  249. pd_max <= 1'b1 ;
  250. end else begin
  251. pd_max <= 1'b0 ;
  252. end
  253. if (pdcount == 6'h00 && pd_min == 1'b0 && delay_change == 1'b0) begin
  254. pd_min <= 1'b1 ;
  255. end else begin
  256. pd_min <= 1'b0 ;
  257. end
  258. if (delay_change == 1'b1 || inc_run == 1'b1 || dec_run == 1'b1 || eye_run == 1'b1) begin
  259. pd_hold <= 8'hFF ;
  260. pdcount <= 6'b100000 ;
  261. end // increment filter count
  262. else if (pd_hold[7] == 1'b1) begin
  263. pdcount <= 6'b100000 ;
  264. pd_hold <= {pd_hold[6:0], 1'b0} ;
  265. end
  266. else if (action[0] == 1'b1 && pdcount != 6'b111111) begin
  267. pdcount <= pdcount + 6'h01 ;
  268. end // decrement filter count
  269. else if (action[1] == 1'b1 && pdcount != 6'b000000) begin
  270. pdcount <= pdcount - 6'h01 ;
  271. end
  272. if ((enable_phase_detector == 1'b1 && pd_max == 1'b1 && delay_change == 1'b0) || inc_run == 1'b1) begin // increment delays, check for master delay = max
  273. delay_change <= 1'b1 ;
  274. if (meq_max == 1'b0 && inc_run == 1'b0) begin
  275. m_delay_val_int <= m_delay_val_int + 5'h01 ;
  276. end
  277. else begin // master is max
  278. s_state[3:0] <= s_state[3:0] + 4'h1 ;
  279. case (s_state[3:0])
  280. 4'b0000 : begin inc_run <= 1'b1 ; s_delay_val_int <= bt_val ; end // indicate state machine running and set slave delay to bit time
  281. 4'b0110 : begin data_mux <= 1'b1 ; m_delay_val_int <= 5'b00000 ; end // change data mux over to forward slave data and set master delay to zero
  282. 4'b1001 : begin m_delay_mux <= m_delay_mux - 2'h1 ; end // change delay mux over to forward with a 1-bit less advance
  283. 4'b1110 : begin data_mux <= 1'b0 ; end // change data mux over to forward master data
  284. 4'b1111 : begin s_delay_mux <= m_delay_mux ; inc_run <= 1'b0 ; end // change delay mux over to forward with a 1-bit less advance
  285. default : begin inc_run <= 1'b1 ; end
  286. endcase
  287. end
  288. end
  289. else if ((enable_phase_detector == 1'b1 && pd_min == 1'b1 && delay_change == 1'b0) || dec_run == 1'b1) begin // decrement delays, check for master delay = 0
  290. delay_change <= 1'b1 ;
  291. if (meq_min == 1'b0 && dec_run == 1'b0) begin
  292. m_delay_val_int <= m_delay_val_int - 5'h01 ;
  293. end
  294. else begin // master is zero
  295. s_state[3:0] <= s_state[3:0] + 4'h1 ;
  296. case (s_state[3:0])
  297. 4'b0000 : begin dec_run <= 1'b1 ; s_delay_val_int <= 5'b00000 ; end // indicate state machine running and set slave delay to zero
  298. 4'b0110 : begin data_mux <= 1'b1 ; m_delay_val_int <= bt_val ; end // change data mux over to forward slave data and set master delay to bit time
  299. 4'b1001 : begin m_delay_mux <= m_delay_mux + 2'h1 ; end // change delay mux over to forward with a 1-bit more advance
  300. 4'b1110 : begin data_mux <= 1'b0 ; end // change data mux over to forward master data
  301. 4'b1111 : begin s_delay_mux <= m_delay_mux ; dec_run <= 1'b0 ; end // change delay mux over to forward with a 1-bit less advance
  302. default : begin dec_run <= 1'b1 ; end
  303. endcase
  304. end
  305. end
  306. else if (enable_monitor == 1'b1 && (eye_run == 1'b1 || delay_change == 1'b1)) begin
  307. delay_change <= 1'b0 ;
  308. s_state <= s_state + 5'h01 ;
  309. case (s_state)
  310. 5'b00000 : begin eye_run <= 1'b1 ; s_delay_val_int <= s_delay_val_eye ; end // indicate state machine running and set slave delay to monitor value
  311. 5'b10110 : begin
  312. if (match == 8'hFF) begin results <= results | shifter ; end //. set or clear result bit
  313. else begin results <= results & ~shifter ; end
  314. if (s_delay_val_eye == bt_val) begin // only monitor active taps, ie as far as btval
  315. shifter <= 32'h00000001 ; s_delay_val_eye <= 5'h00 ; end
  316. else begin shifter <= {shifter[30:0], shifter[31]} ;
  317. s_delay_val_eye <= s_delay_val_eye + 5'h01 ; end //
  318. eye_run <= 1'b0 ; s_state <= 5'h00 ; end
  319. default : begin eye_run <= 1'b1 ; end
  320. endcase
  321. end
  322. else begin
  323. delay_change <= 1'b0 ;
  324. if (m_delay_val_int >= {1'b0, bt_val[4:1]} && del_mech == 1'b0) begin // set slave delay to 1/2 bit period beyond or behind the master delay
  325. s_delay_val_int <= m_delay_val_int - {1'b0, bt_val[4:1]} ;
  326. s_ovflw <= 1'b0 ;
  327. end
  328. else begin
  329. s_delay_val_int <= m_delay_val_int + {1'b0, bt_val[4:1]} ;
  330. s_ovflw <= 1'b1 ;
  331. end
  332. end
  333. if (enable_phase_detector == 1'b0 && delay_change == 1'b0) begin
  334. delay_change <= 1'b1 ;
  335. end
  336. end
  337. if (enable_phase_detector == 1'b1) begin
  338. if (data_mux == 1'b0) begin
  339. data_out <= mdataoutc ;
  340. end else begin
  341. data_out <= sdataoutc ;
  342. end
  343. end
  344. else begin
  345. data_out <= m_datain ;
  346. end
  347. end
  348. always @ (posedge clk) begin
  349. if ((mdataouta == sdataouta)) begin
  350. match <= {match[6:0], 1'b1} ;
  351. end else begin
  352. match <= {match[6:0], 1'b0} ;
  353. end
  354. end
  355. always @ (m_delay_val_int) begin
  356. case (m_delay_val_int)
  357. 5'b00000 : m_delay_1hot <= 32'h00000001 ;
  358. 5'b00001 : m_delay_1hot <= 32'h00000002 ;
  359. 5'b00010 : m_delay_1hot <= 32'h00000004 ;
  360. 5'b00011 : m_delay_1hot <= 32'h00000008 ;
  361. 5'b00100 : m_delay_1hot <= 32'h00000010 ;
  362. 5'b00101 : m_delay_1hot <= 32'h00000020 ;
  363. 5'b00110 : m_delay_1hot <= 32'h00000040 ;
  364. 5'b00111 : m_delay_1hot <= 32'h00000080 ;
  365. 5'b01000 : m_delay_1hot <= 32'h00000100 ;
  366. 5'b01001 : m_delay_1hot <= 32'h00000200 ;
  367. 5'b01010 : m_delay_1hot <= 32'h00000400 ;
  368. 5'b01011 : m_delay_1hot <= 32'h00000800 ;
  369. 5'b01100 : m_delay_1hot <= 32'h00001000 ;
  370. 5'b01101 : m_delay_1hot <= 32'h00002000 ;
  371. 5'b01110 : m_delay_1hot <= 32'h00004000 ;
  372. 5'b01111 : m_delay_1hot <= 32'h00008000 ;
  373. 5'b10000 : m_delay_1hot <= 32'h00010000 ;
  374. 5'b10001 : m_delay_1hot <= 32'h00020000 ;
  375. 5'b10010 : m_delay_1hot <= 32'h00040000 ;
  376. 5'b10011 : m_delay_1hot <= 32'h00080000 ;
  377. 5'b10100 : m_delay_1hot <= 32'h00100000 ;
  378. 5'b10101 : m_delay_1hot <= 32'h00200000 ;
  379. 5'b10110 : m_delay_1hot <= 32'h00400000 ;
  380. 5'b10111 : m_delay_1hot <= 32'h00800000 ;
  381. 5'b11000 : m_delay_1hot <= 32'h01000000 ;
  382. 5'b11001 : m_delay_1hot <= 32'h02000000 ;
  383. 5'b11010 : m_delay_1hot <= 32'h04000000 ;
  384. 5'b11011 : m_delay_1hot <= 32'h08000000 ;
  385. 5'b11100 : m_delay_1hot <= 32'h10000000 ;
  386. 5'b11101 : m_delay_1hot <= 32'h20000000 ;
  387. 5'b11110 : m_delay_1hot <= 32'h40000000 ;
  388. default : m_delay_1hot <= 32'h80000000 ;
  389. endcase
  390. end
  391. endmodule