x393  1.0
FPGAcodeforElphelNC393camera
sens_hispi_clock.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42 
43  parameter SENS_PHASE_WIDTH= 8, // number of bits for te phase counter (depends on divisors)
44  parameter SENS_BANDWIDTH = "OPTIMIZED", //"OPTIMIZED", "HIGH","LOW"
45  parameter CLKIN_PERIOD_SENSOR = 3.000, // input period in ns, 0..100.000 - MANDATORY, resolution down to 1 ps
46  parameter CLKFBOUT_MULT_SENSOR = 3, // 330 MHz --> 990 MHz
47  parameter CLKFBOUT_PHASE_SENSOR = 0.000, // CLOCK FEEDBACK phase in degrees (3 significant digits, -360.000...+360.000)
48  parameter IPCLK_PHASE = 0.000,
49  parameter IPCLK2X_PHASE = 0.000,
50  parameter BUF_IPCLK = "BUFR",
51  parameter BUF_IPCLK2X = "BUFR",
52 
53  parameter SENS_DIVCLK_DIVIDE = 1, // Integer 1..106. Divides all outputs with respect to CLKIN
54  parameter SENS_REF_JITTER1 = 0.010, // Expected jitter on CLKIN1 (0.000..0.999)
55  parameter SENS_REF_JITTER2 = 0.010,
56  parameter SENS_SS_EN = "FALSE", // Enables Spread Spectrum mode
57  parameter SENS_SS_MODE = "CENTER_HIGH",//"CENTER_HIGH","CENTER_LOW","DOWN_HIGH","DOWN_LOW"
58  parameter SENS_SS_MOD_PERIOD = 10000, // integer 4000-40000 - SS modulation period in ns
59  // Used with delay
60  parameter IODELAY_GRP = "IODELAY_SENSOR", // may need different for different channels?
61  parameter integer IDELAY_VALUE = 0,
62  parameter real REFCLK_FREQUENCY = 200.0,
63  parameter HIGH_PERFORMANCE_MODE = "FALSE",
64 
65  parameter HISPI_DELAY_CLK = "FALSE",
66  parameter HISPI_MMCM = "TRUE",
67  parameter HISPI_CAPACITANCE = "DONT_CARE",
68  parameter HISPI_DIFF_TERM = "TRUE",
69  parameter HISPI_UNTUNED_SPLIT = "FALSE", // Very power-hungry
70  parameter HISPI_DQS_BIAS = "TRUE",
71  parameter HISPI_IBUF_DELAY_VALUE = "0",
72  parameter HISPI_IBUF_LOW_PWR = "TRUE",
73  parameter HISPI_IFD_DELAY_VALUE = "AUTO",
74  parameter HISPI_IOSTANDARD = "DIFF_SSTL18_I" //"DIFF_SSTL18_II" for high current (13.4mA vs 8mA)
75 
76 )(
77  input mclk,
78  input mrst,
79  input [7:0] phase,
80  input set_phase,
81  input load, // only used when delay, not phase
82  input rst_mmcm,
83  input clp_p,
84  input clk_n,
85  output ipclk, // 165 MHz
86  output ipclk2x, // 330 MHz
87  output ps_rdy, // output
88  output [7:0] ps_out, // output[7:0] reg
90  output clkin_pxd_stopped_mmcm, // output
91  output clkfb_pxd_stopped_mmcm // output
92 );
93  wire ipclk_pre;
94  wire ipclk2x_pre; // output
95  wire clk_fb;
96  wire prst = mrst;
97  wire clk_in;
98  wire clk_int;
99  wire set_phase_w = (HISPI_DELAY_CLK == "TRUE") ? 1'b0: set_phase;
100  wire [7:0] phase_w = (HISPI_DELAY_CLK == "TRUE") ? 8'b0: phase;
101  wire ps_rdy_w;
102  wire [7:0] ps_out_w;
103 
104  assign ps_rdy = (HISPI_DELAY_CLK == "TRUE") ? 1'b1 : ps_rdy_w;
105  assign ps_out = (HISPI_DELAY_CLK == "TRUE") ? 8'b0 : ps_out_w;
106  generate
107  if (HISPI_UNTUNED_SPLIT == "TRUE") begin
109  .CAPACITANCE (HISPI_CAPACITANCE),
110  .DIFF_TERM (HISPI_DIFF_TERM),
111  .DQS_BIAS (HISPI_DQS_BIAS),
112  .IBUF_DELAY_VALUE (HISPI_IBUF_DELAY_VALUE),
113  .IBUF_LOW_PWR (HISPI_IBUF_LOW_PWR),
114  .IFD_DELAY_VALUE (HISPI_IFD_DELAY_VALUE),
115  .IOSTANDARD (HISPI_IOSTANDARD)
116  ) ibufds_ibufgds0_i (
117  .O (clk_int), // output
118  .I (clp_p), // input
119  .IB (clk_n) // input
120  );
121  end else begin
123  .CAPACITANCE (HISPI_CAPACITANCE),
124  .DIFF_TERM (HISPI_DIFF_TERM),
125  .DQS_BIAS (HISPI_DQS_BIAS),
126  .IBUF_DELAY_VALUE (HISPI_IBUF_DELAY_VALUE),
127  .IBUF_LOW_PWR (HISPI_IBUF_LOW_PWR),
128  .IFD_DELAY_VALUE (HISPI_IFD_DELAY_VALUE),
129  .IOSTANDARD (HISPI_IOSTANDARD)
130  ) ibufds_ibufgds0_i (
131  .O (clk_int), // output
132  .I (clp_p), // input
133  .IB (clk_n) // input
134  );
135  end
136  endgenerate
137  generate
138  if (HISPI_DELAY_CLK == "TRUE") begin
141  .DELAY_VALUE (IDELAY_VALUE),
144  ) clk_dly_i(
145  .clk (mclk),
146  .rst (mrst),
147  .set (set_phase),
148  .ld (load),
149  .delay (phase[4:0]),
150  .data_in (clk_int),
151  .data_out (clk_in)
152  );
153  end else begin
154  assign clk_in = clk_int;
155  end
156  endgenerate
157 
158  // generate phase-shifterd pixel clock (and 2x version) from either the internal clock (that is output to the sensor) or from the clock
159  // received from the sensor (may need to reset MMCM after resetting sensor)
160 
161  generate
162  if (HISPI_MMCM == "TRUE") begin
164  .PHASE_WIDTH (SENS_PHASE_WIDTH),
165  .CLKIN_PERIOD (CLKIN_PERIOD_SENSOR),
166  .BANDWIDTH (SENS_BANDWIDTH),
167  .CLKFBOUT_MULT_F (CLKFBOUT_MULT_SENSOR), // 4
168  .DIVCLK_DIVIDE (SENS_DIVCLK_DIVIDE),
169  .CLKFBOUT_PHASE (CLKFBOUT_PHASE_SENSOR),
170  .CLKOUT0_PHASE (IPCLK_PHASE),
171  .CLKOUT1_PHASE (IPCLK2X_PHASE),
172  .CLKFBOUT_USE_FINE_PS("FALSE"),
173  .CLKOUT0_USE_FINE_PS ("TRUE"),
174  .CLKOUT1_USE_FINE_PS ("TRUE"),
175  .CLKOUT0_DIVIDE_F (CLKFBOUT_MULT_SENSOR * 2), // 6 // 8.000),
176  .CLKOUT1_DIVIDE (CLKFBOUT_MULT_SENSOR ), // 3 // 4),
177  .COMPENSATION ("ZHOLD"),
178  .REF_JITTER1 (SENS_REF_JITTER1),
179  .REF_JITTER2 (SENS_REF_JITTER2),
180  .SS_EN (SENS_SS_EN),
181  .SS_MODE (SENS_SS_MODE),
182  .SS_MOD_PERIOD (SENS_SS_MOD_PERIOD),
183  .STARTUP_WAIT ("FALSE")
184  ) mmcm_or_pll_i (
185  .clkin1 (clk_in), // input
186  .clkin2 (1'b0), // input
187  .sel_clk2 (1'b0), // input
188  .clkfbin (clk_fb), // input
189  .rst (rst_mmcm), // input
190  .pwrdwn (1'b0), // input
191 
192  .psclk (mclk), // input
193  .ps_we (set_phase_w), // input
194  .ps_din (phase_w), // input[7:0]
195  .ps_ready (ps_rdy_w), // output
196  .ps_dout (ps_out_w), // output[7:0] reg
197 
198  .clkout0 (ipclk_pre), // output
199  .clkout1 (ipclk2x_pre), // output
200  .clkout2(), // output
201  .clkout3(), // output
202  .clkout4(), // output
203  .clkout5(), // output
204  .clkout6(), // output
205  .clkout0b(), // output
206  .clkout1b(), // output
207  .clkout2b(), // output
208  .clkout3b(), // output
209  .clkfbout (clk_fb), // output
210  .clkfboutb(), // output
214  // output
215  );
216  end else begin
218  .CLKIN_PERIOD (CLKIN_PERIOD_SENSOR),
219  .BANDWIDTH (SENS_BANDWIDTH),
220  .CLKFBOUT_MULT (CLKFBOUT_MULT_SENSOR), // 4
221  .DIVCLK_DIVIDE (SENS_DIVCLK_DIVIDE),
222  .CLKFBOUT_PHASE (CLKFBOUT_PHASE_SENSOR),
223  .CLKOUT0_PHASE (IPCLK_PHASE),
224  .CLKOUT1_PHASE (IPCLK2X_PHASE),
225  .CLKOUT0_DIVIDE (CLKFBOUT_MULT_SENSOR * 2), // 6 // 8.000),
226  .CLKOUT1_DIVIDE (CLKFBOUT_MULT_SENSOR ), // 3 // 4),
227  .REF_JITTER1 (SENS_REF_JITTER1),
228  .STARTUP_WAIT ("FALSE")
229  ) mmcm_or_pll_i (
230  .clkin (clk_in), // input
231  .clkfbin (clk_fb), // input
232  .rst (rst_mmcm), // input
233  .pwrdwn (1'b0), // input
234  .clkout0 (ipclk_pre), // output
235  .clkout1 (ipclk2x_pre), // output
236  .clkout2(), // output
237  .clkout3(), // output
238  .clkout4(), // output
239  .clkout5(), // output
240  .clkfbout (clk_fb), // output
242  // output
243  );
244  assign clkin_pxd_stopped_mmcm = 0;
245  assign clkfb_pxd_stopped_mmcm = 0;
246  assign ps_rdy_w = 1;
247  assign ps_out_w = 0; // alternatively - register delay written
248  end
249  endgenerate
250 
251  generate
252  if (BUF_IPCLK == "BUFR2") BUFR #(.BUFR_DIVIDE(2)) clk1x_i (.O(ipclk), .I(ipclk2x_pre), .CE(1'b1), .CLR(rst_mmcm));
253  else if (BUF_IPCLK == "BUFG") BUFG clk1x_i (.O(ipclk), .I(ipclk_pre));
254  else if (BUF_IPCLK == "BUFH") BUFH clk1x_i (.O(ipclk), .I(ipclk_pre));
255  else if (BUF_IPCLK == "BUFR") BUFR clk1x_i (.O(ipclk), .I(ipclk_pre), .CE(1'b1), .CLR(prst));
256  else if (BUF_IPCLK == "BUFMR") BUFMR clk1x_i (.O(ipclk), .I(ipclk_pre));
257  else if (BUF_IPCLK == "BUFIO") BUFIO clk1x_i (.O(ipclk), .I(ipclk_pre));
258  else assign ipclk = ipclk_pre;
259  endgenerate
260 
261  generate
262  if (BUF_IPCLK2X == "BUFG") BUFG clk2x_i (.O(ipclk2x), .I(ipclk2x_pre));
263  else if (BUF_IPCLK2X == "BUFH") BUFH clk2x_i (.O(ipclk2x), .I(ipclk2x_pre));
264  else if (BUF_IPCLK2X == "BUFR") BUFR clk2x_i (.O(ipclk2x), .I(ipclk2x_pre), .CE(1'b1), .CLR(prst));
265  else if (BUF_IPCLK2X == "BUFMR") BUFMR clk2x_i (.O(ipclk2x), .I(ipclk2x_pre));
266  else if (BUF_IPCLK2X == "BUFIO") BUFIO clk2x_i (.O(ipclk2x), .I(ipclk2x_pre));
267  else assign ipclk2x = ipclk2x_pre;
268  endgenerate
269 
270 
271 
272 
273 
274 endmodule
275 
11577clkout1
Definition: pll_base.v:74
clk2x_i BUFIO[generate]
7164IODELAY_GRP"IODELAY_SENSOR"
7162SENS_SS_MODE"CENTER_HIGH"
7176HISPI_IFD_DELAY_VALUE"AUTO"
11572clkin
Definition: pll_base.v:69
real 7166REFCLK_FREQUENCY200.0
11575pwrdwn
Definition: pll_base.v:72
integer 7165IDELAY_VALUE0
clk_dly_i idelay_nofine[generate]
11579clkout3
Definition: pll_base.v:76
11573clkfbin
Definition: pll_base.v:70
11580clkout4
Definition: pll_base.v:77
clk2x_i BUFR[generate]
11576clkout0
Definition: pll_base.v:73
7172HISPI_UNTUNED_SPLIT"FALSE"
11582clkfbout
Definition: pll_base.v:79
7168HISPI_DELAY_CLK"FALSE"
7175HISPI_IBUF_LOW_PWR"TRUE"
11581clkout5
Definition: pll_base.v:78
11574rst
Definition: pll_base.v:71
[PHASE_WIDTH-1:0] 11433ps_dout
11583locked
Definition: pll_base.v:80
clk2x_i BUFMR[generate]
[PHASE_WIDTH-1:0] 11431ps_din
clk2x_i BUFH[generate]
mmcm_or_pll_i mmcm_phase_cntr[generate]
7153CLKFBOUT_PHASE_SENSOR0.000
[4:0] 11280delay
Definition: idelay_nofine.v:52
7167HIGH_PERFORMANCE_MODE"FALSE"
mmcm_or_pll_i pll_base[generate]
ibufds_ibufgds0_i ibufds_ibufgds_50[generate]
clk2x_i BUFG[generate]
ibufds_ibufgds0_i ibufds_ibufgds[generate]
7177HISPI_IOSTANDARD"DIFF_SSTL18_I"
7150SENS_BANDWIDTH"OPTIMIZED"
11578clkout2
Definition: pll_base.v:75
7170HISPI_CAPACITANCE"DONT_CARE"