x393  1.0
FPGAcodeforElphelNC393camera
camsync393.v
Go to the documentation of this file.
1 
44 
45  // TODO: make a separate clock for transmission (program counters too?) and/or for the period timer?
46  // TODO: change timestamp to serial message
47  // TODO: see what depends on pclk and if can be made independent of the sensor clock.
48 //`define GENERATE_TRIG_OVERDUE 1
49 `undef GENERATE_TRIG_OVERDUE
50 module camsync393 #(
51  parameter CAMSYNC_ADDR = 'h160, //TODO: assign valid address
52  parameter CAMSYNC_MASK = 'h7f8,
53  parameter CAMSYNC_MODE = 'h0,
54  parameter CAMSYNC_TRIG_SRC = 'h1, // setup trigger source
55  parameter CAMSYNC_TRIG_DST = 'h2, // setup trigger destination line(s)
56  parameter CAMSYNC_TRIG_PERIOD = 'h3, // setup output trigger period
57  parameter CAMSYNC_TRIG_DELAY0 = 'h4, // setup input trigger delay
58  parameter CAMSYNC_TRIG_DELAY1 = 'h5, // setup input trigger delay
59  parameter CAMSYNC_TRIG_DELAY2 = 'h6, // setup input trigger delay
60  parameter CAMSYNC_TRIG_DELAY3 = 'h7, // setup input trigger delay
61 
62  parameter CAMSYNC_EN_BIT = 'h0, // enable module (0 - reset)
63  parameter CAMSYNC_SNDEN_BIT = 'h2, // enable writing ts_snd_en
64  parameter CAMSYNC_EXTERNAL_BIT = 'h4, // enable writing ts_external (0 - local timestamp in the frame header)
65  parameter CAMSYNC_TRIGGERED_BIT = 'h6, // triggered mode ( 0- async)
66  parameter CAMSYNC_MASTER_BIT = 'h9, // select a 2-bit master channel (master delay may be used as a flash delay)
67  parameter CAMSYNC_CHN_EN_BIT = 'he, // per-channel enable timestamp generation
68 
69 
70  parameter CAMSYNC_PRE_MAGIC = 6'b110100,
71  parameter CAMSYNC_POST_MAGIC = 6'b001101
72 
73  )(
74 // input rst, // global reset
75  input mclk, // @posedge (was negedge) AF2015: check external inversion - make it @posedge mclk
76  input mrst, // @ posedge mclk - sync reset
77  input [7:0] cmd_ad, // byte-serial command address/data (up to 6 bytes: AL-AH-D0-D1-D2-D3
78  input cmd_stb, // strobe (with first byte) for the command a/d
79  // 0 - mode: [0] - enable module, 0 reset
80  // [2:1] +4 - reset ts_snd_en, +6 - set ts_snd_en - enable sending timestamp over sync line
81  // [4:3] +0x10 - reset ts_external, +'hc - set ts_external:
82  // 1 - use external timestamp, if available. 0 - always use local ts
83  // [6:5] +'h40 - reset triggered mode (free running sensor), +'h30 - set sensor triggered mode
84  // [9:7] +'h200 - set master channel (zero delay in internal trigger mode, delay used for flash output)
85  // [14:10] +'h4000 - set which channels to generate timestamp messages
86  // UPDATE now di-bit "01" means "keep" (00 - do not use, 01 - keep, 10 set active 0, 11 - set active 1)
87  // 1 - source of trigger (10 bit pairs, LSB - level to trigger, MSB - use this bit). All 0 - internal trigger
88  // in internal mode output has variable delay from the internal trigger (relative to sensor trigger)
89  // 2 - 10 bit pairs: MSB - enable selected line, LSB - level to send when trigger active
90  // bit 25==1 some of the bits use test mode signals:
91  // 3 - output trigger period (duration constant of 256 pixel clocks).
92  // d == 0 - disable (stop periodic mode)
93  // d == 1 - single trigger
94  // d == 2..255 - set output pulse / input-output serial bit duration (no start generated)
95  // d >= 256 - repetitive trigger
96 
97  // 4..7 - input trigger delay (in pclk periods)
98  input pclk, // pixel clock (global) - switch it to 100MHz (mclk/2)?
99  input prst, // @ posedge pclk - sync reset
100  input [9:0] gpio_in, // 10-bit input from GPIO pins -> 10 bit
101  output [9:0] gpio_out, // 10-bit output to GPIO pins
102  output [9:0] gpio_out_en, // 10-bit output enable to GPIO pins
103 
104  output triggered_mode, // use triggered mode (0 - sensors are free-running) @mclk
105 
106  input frsync_chn0, // @mclk trigrst, // single-clock start of frame input (resets trigger output) posedge (@pclk)
107  output trig_chn0, // @mclk 1 cycle-long trigger output
108 `ifdef GENERATE_TRIG_OVERDUE
109  output trigger_chn0, // @mclk active high trigger to the sensor (reset by vacts)
110  output overdue_chn0, // @mclk prevents lock-up when no vact was detected during one period and trigger was toggled
111 `endif
112  input frsync_chn1, // @mclk trigrst, // single-clock start of frame input (resets trigger output) posedge (@pclk)
113  output trig_chn1, // 1 cycle-long trigger output
114 `ifdef GENERATE_TRIG_OVERDUE
115  output trigger_chn1, // active high trigger to the sensor (reset by vacts)
116  output overdue_chn1, // prevents lock-up when no vact was detected during one period and trigger was toggled
117 `endif
118  input frsync_chn2, // @mclk trigrst, // single-clock start of frame input (resets trigger output) posedge (@pclk)
119  output trig_chn2, // 1 cycle-long trigger output
120 `ifdef GENERATE_TRIG_OVERDUE
121  output trigger_chn2, // active high trigger to the sensor (reset by vacts)
122  output overdue_chn2, // prevents lock-up when no vact was detected during one period and trigger was toggled
123 `endif
124  input frsync_chn3, // @mclk trigrst, // single-clock start of frame input (resets trigger output) posedge (@pclk)
125  output trig_chn3, // 1 cycle-long trigger output
126 `ifdef GENERATE_TRIG_OVERDUE
127  output trigger_chn3, // active high trigger to the sensor (reset by vacts)
128  output overdue_chn3, // prevents lock-up when no vact was detected during one period and trigger was toggled
129 `endif
130  // getting timestamp from rtc module, all @posedge mclk (from timestmp_snapshot)
131  // this timestmp is used either to send local timestamp for synchronization, or
132  // to acquire local timestamp of sync pulse for logging
133  output ts_snap_mclk_chn0, // ts_snap_mclk make a timestamp pulse single @(posedge pclk)
134  input ts_snd_stb_chn0, // 1 clk before ts_snd_data is valid
135  input [7:0] ts_snd_data_chn0, // byte-wide serialized timestamp message
136 
137  output ts_snap_mclk_chn1, // ts_snap_mclk make a timestamp pulse single @(posedge pclk)
138  input ts_snd_stb_chn1, // 1 clk before ts_snd_data is valid
139  input [7:0] ts_snd_data_chn1, // byte-wide serialized timestamp message
140 
141  output ts_snap_mclk_chn2, // ts_snap_mclk make a timestamp pulse single @(posedge pclk)
142  input ts_snd_stb_chn2, // 1 clk before ts_snd_data is valid
143  input [7:0] ts_snd_data_chn2, // byte-wide serialized timestamp message
144 
145  output ts_snap_mclk_chn3, // ts_snap_mclk make a timestamp pulse single @(posedge pclk)
146  input ts_snd_stb_chn3, // 1 clk before ts_snd_data is valid
147  input [7:0] ts_snd_data_chn3, // byte-wide serialized timestamp message
148  //ts_rcv_*sec (@mclk) goes to the following receivers:
149  //ts_sync_*sec (synchronized to sensor clock) -> timestamp353 REMOVED
150  //ts_sync_*sec (synchronized to sensor clock) -> compressor
151  //ts_sync_*sec (synchronized to sensor clock) -> imu_logger
152  // This timestamp is either received, got from internal timer (both common to all 4 channels)
153  // or it is a free-running timestamp
154  output ts_rcv_stb_chn0, // 1 clock before ts_rcv_data is valid
155  output [7:0] ts_rcv_data_chn0, // byte-wide serialized timestamp message received or local
157  output ts_rcv_stb_chn1, // 1 clock before ts_rcv_data is valid
158  output [7:0] ts_rcv_data_chn1, // byte-wide serialized timestamp message received or local
159 
160  output ts_rcv_stb_chn2, // 1 clock before ts_rcv_data is valid
161  output [7:0] ts_rcv_data_chn2, // byte-wide serialized timestamp message received or local
163  output ts_rcv_stb_chn3, // 1 clock before ts_rcv_data is valid
164  output [7:0] ts_rcv_data_chn3 // byte-wide serialized timestamp message received or local
165 );
166  reg en = 0; // enable camsync module
167 // wire rst = mrst || !en;
168  wire en_pclk;
169  wire eprst = prst || !en_pclk;
170  reg ts_snd_en; // enable sending timestamp over sync line
171  reg ts_external; // 1 - use external timestamp, if available. 0 - always use local ts
174  reg [31:0] ts_snd_sec; // [31:0] timestamp seconds to be sent over the sync line - multiplexed from master channel
175  reg [19:0] ts_snd_usec; // [19:0] timestamp microseconds to be sent over the sync line
177  wire [31:0] ts_snd_sec_chn0; // [31:0] timestamp seconds to be sent over the sync line
178  wire [19:0] ts_snd_usec_chn0; // [19:0] timestamp microseconds to be sent over the sync line
180  reg [31:0] ts_rcv_sec_chn0; // [31:0] timestamp seconds received over the sync line
181  reg [19:0] ts_rcv_usec_chn0;// [19:0] timestamp microseconds received over the sync line
182  wire [3:0] ts_stb; // strobe when received timestamp is valid
184  wire [31:0] ts_snd_sec_chn1; // [31:0] timestamp seconds to be sent over the sync line
185  wire [19:0] ts_snd_usec_chn1; // [19:0] timestamp microseconds to be sent over the sync line
187  reg [31:0] ts_rcv_sec_chn1; // [31:0] timestamp seconds received over the sync line
188  reg [19:0] ts_rcv_usec_chn1;// [19:0] timestamp microseconds received over the sync line
190  wire [31:0] ts_snd_sec_chn2; // [31:0] timestamp seconds to be sent over the sync line
191  wire [19:0] ts_snd_usec_chn2; // [19:0] timestamp microseconds to be sent over the sync line
193  reg [31:0] ts_rcv_sec_chn2; // [31:0] timestamp seconds received over the sync line
194  reg [19:0] ts_rcv_usec_chn2;// [19:0] timestamp microseconds received over the sync line
195 
196  wire [31:0] ts_snd_sec_chn3; // [31:0] timestamp seconds to be sent over the sync line
197  wire [19:0] ts_snd_usec_chn3; // [19:0] timestamp microseconds to be sent over the sync line
199  reg [31:0] ts_rcv_sec_chn3; // [31:0] timestamp seconds received over the sync line
200  reg [19:0] ts_rcv_usec_chn3;// [19:0] timestamp microseconds received over the sync line
202 
203 
204  wire [2:0] cmd_a; // command address
205  wire [31:0] cmd_data; // command data TODO: trim
206  wire cmd_we; // command write enable
207 
210  wire set_trig_delay0_w;
211  wire set_trig_delay1_w;
216  wire [9:0] pre_input_use;
217  wire [9:0] pre_input_pattern;
219 // delaying everything by 1 clock to reduce data fan in
220  reg high_zero; // 24 MSBs are zero
221  reg [9:0] input_use; // 1 - use this bit
222  reg [9:0] input_pattern; // data to be compared for trigger event to take place
223  reg [9:0] gpio_out_en_r;
224  reg pre_input_use_intern;// @(posedge mclk) Use internal trigger generator, 0 - use external trigger (also switches delay from input to output)
225  reg input_use_intern;// @(posedge clk)
226  reg [31:0] input_dly_chn0; // delay value for the trigger
227  reg [31:0] input_dly_chn1; // delay value for the trigger
228  reg [31:0] input_dly_chn2; // delay value for the trigger
229  reg [31:0] input_dly_chn3; // delay value for the trigger
230  reg [3:0] chn_en; // enable channels
231  reg [1:0] master_chn; // master channel (internal mode - delay used for flash)
232  reg [9:0] gpio_active; // output levels on the selected GPIO lines during output pulse (will be negated when inactive)
233  reg testmode; // drive some internal signals to GPIO bits
234  reg outsync; // during output active
235  reg out_data; // output data (modulated with timestamp if enabled)
236  reg [31:0] repeat_period; // restart period in repetitive mode
237  reg start,start_d; // start single/repetitive output pulse(s)
238  reg rep_en; // enable repetitive mode
239  reg start_en;
241  reg [2:0] start_pclk; // start and restart
242  reg [31:0] restart_cntr; // restart period counter
243  reg [1:0] restart_cntr_run; // restart counter running
244  wire restart; // restart out sync
245  reg trigger_condition; // GPIO input trigger condition met
246  reg trigger_condition_d; // GPIO input trigger condition met, delayed (for edge detection)
247  reg trigger_condition_filtered; // trigger condition filtered
249  reg [3:0] trig_r;
250  wire [3:0] trig_r_mclk;
251 // wire trig_dly16; // trigger1 delayed by 16 clk cycles to get local timestamp
252 `ifdef GENERATE_TRIG_OVERDUE
253  reg [3:0] trigger_r=0; // for happy simulator
254  reg [3:0] overdue;
255 `endif
256  reg start_dly; // start delay (external input filtered or from internal single/rep)
257  reg [31:0] dly_cntr_chn0; // trigger delay counter
258  reg [31:0] dly_cntr_chn1; // trigger delay counter
259  reg [31:0] dly_cntr_chn2; // trigger delay counter
260  reg [31:0] dly_cntr_chn3; // trigger delay counter
261  reg [3:0] dly_cntr_run=0; // trigger delay counter running (to use FD for simulation)
262  reg [3:0] dly_cntr_run_d=0; // trigger delay counter running - delayed by 1
263  wire [3:0] dly_cntr_end;
265  reg start_out_pulse; /// start generation of output pulse. In internal trigger mode uses delay counter, in external - no delay
266  reg [31:0] pre_period;
267  reg [ 7:0] bit_length='hff; /// Output pulse duration or bit duration in timestamp mode
268  /// input will be filtered with (bit_length>>2) duration
269  wire [ 7:0] bit_length_plus1; // bit_length+1
270  reg [ 7:0] bit_length_short; /// 3/4 bit duration, delay for input strobe from the leading edge.
271 
272  wire pre_start0;
273  reg start0;
275  reg set_bit;
278  wire start_late ;// delayed start to wait for time stamp to be available
280  reg [31:0] sr_snd_first;
281  reg [31:0] sr_snd_second;
282 
283  reg [31:0] sr_rcv_first;
284  reg [31:0] sr_rcv_second;
285  reg [ 7:0] bit_snd_duration;
286  reg [ 5:0] bit_snd_counter;
287  reg [ 7:0] bit_rcv_duration;
288  reg bit_rcv_duration_zero; // to make it faster, duration always >=2
289  reg [ 6:0] bit_rcv_counter; // includes "deaf" period ater receving
292 
293  reg rcv_run_or_deaf; // counters active
294  wire rcv_run; // receive in progress, will always last for 64 bit_length+1 intervals before ready for the new input pulse
295  reg rcv_run_d;
296  reg rcv_done_rq; // request to copy time stamp (if it is not ready yet)
298  reg rcv_done; // rcv_run ended, copy timestamp if requested
299  wire rcv_done_mclk; // rcv_done re-clocked @mclk
300  wire pre_rcv_error; // pre/post magic does not match, set ts to all ff-s
302 
303  reg ts_external_pclk; // 1 - use external timestamp (combines ts_external and input_use_intern)
305 
306 
307  wire [3:0] local_got; // received local timestamp (@ posedge mclk)
308  wire [3:0] local_got_pclk; // local_got reclocked @pclk
309  wire [3:0] frame_sync;
310  reg [3:0] ts_snap_triggered; // make a timestamp pulse single @(posedge pclk)
311  wire [3:0] ts_snap_triggered_mclk; // make a timestamp pulse single @(posedge pclk)
312  assign gpio_out_en = gpio_out_en_r;
313 
314 //! in testmode GPIO[9] and GPIO[8] use internal signals instead of the outsync:
315 //! bit 11 - same as TRIGGER output to the sensor (signal to the sensor may be disabled externally)
316 //! then that bit will be still from internall trigger to frame valid
317 //! bit 10 - dly_cntr_run (delay counter run) - active during trigger delay
319  assign bit_length_plus1 [ 7:0] =bit_length[7:0]+1;
321 
323 
324 
325  assign gpio_out[7: 0] = out_data? gpio_active[7: 0]: ~gpio_active[7: 0];
326  assign gpio_out[8] = (testmode? dly_cntr_run[0]: out_data)? gpio_active[8]: ~gpio_active[8];
327 `ifdef GENERATE_TRIG_OVERDUE
328  assign gpio_out[9] = (testmode? trigger_r[0]: out_data)? gpio_active[9]: ~gpio_active[9];
329 `else
330  assign gpio_out[9] = (out_data)? gpio_active[9]: ~gpio_active[9];
331 `endif
332  assign restart= restart_cntr_run[1] && !restart_cntr_run[0];
333 
334  assign pre_set_bit= (|cmd_data[31:8]==0) && |cmd_data[7:1]; // 2..255
335  assign pre_start0= |cmd_data[31:0] && !pre_set_bit;
336  assign pre_set_period = !pre_set_bit;
337 
339 
340 `ifdef GENERATE_TRIG_OVERDUE
341  assign {trigger_chn3, trigger_chn2, trigger_chn1, trigger_chn0} = trigger_r;
342  assign {overdue_chn3, overdue_chn2, overdue_chn1, overdue_chn0} = overdue;
343 `endif
345 
346  assign set_mode_reg_w = cmd_we && (cmd_a == CAMSYNC_MODE);
347  assign set_trig_src_w = cmd_we && (cmd_a == CAMSYNC_TRIG_SRC);
348  assign set_trig_dst_w = cmd_we && (cmd_a == CAMSYNC_TRIG_DST);
354 
355  assign pre_input_use = {cmd_data[19],cmd_data[17],cmd_data[15],cmd_data[13],cmd_data[11],
357  assign pre_input_pattern = {cmd_data[18],cmd_data[16],cmd_data[14],cmd_data[12],cmd_data[10],
358  cmd_data[8],cmd_data[6],cmd_data[4],cmd_data[2],cmd_data[0]};
361  // keep previous value if 2'b01
362 // assign input_use_w = pre_input_use | (~pre_input_use & pre_input_pattern & input_use);
364  wire [9:0] input_use_w = ((input_use ^ pre_input_use) & input_mask) ^ input_use;
366 
367  wire [9:0] pre_gpio_out_en = {cmd_data[19],cmd_data[17],cmd_data[15],cmd_data[13],cmd_data[11],
368  cmd_data[9], cmd_data[7], cmd_data[5], cmd_data[3], cmd_data[1]};
369  wire [9:0] pre_gpio_active = {cmd_data[18],cmd_data[16],cmd_data[14],cmd_data[12],cmd_data[10],
370  cmd_data[8], cmd_data[6], cmd_data[4], cmd_data[2], cmd_data[0]};
371 
375 
376  always @(posedge mclk) begin
377  if (set_mode_reg_w) begin
384  end
385  if (mrst) input_use <= 0;
386  if (!en) begin
387  input_use <= 0;
388  input_pattern <= 0;
389  pre_input_use_intern <= 0; // use internal source for triggering
390  end else if (set_trig_src_w) begin
393  pre_input_use_intern <= (input_use_w == 0); // use internal source for triggering
394  end
395 
396  if (set_trig_delay0_w) begin
397  input_dly_chn0[31:0] <= cmd_data[31:0];
398  end
399 
400  if (set_trig_delay1_w) begin
401  input_dly_chn1[31:0] <= cmd_data[31:0];
402  end
403 
404  if (set_trig_delay2_w) begin
405  input_dly_chn2[31:0] <= cmd_data[31:0];
406  end
407 
408  if (set_trig_delay3_w) begin
409  input_dly_chn3[31:0] <= cmd_data[31:0];
410  end
411 
412  if (!en) begin
413  gpio_out_en_r[9:0] <= 0;
414  gpio_active[9:0] <= 0;
415  testmode <= 0;
416  end else if (set_trig_dst_w) begin
418  gpio_active[9:0] <= gpio_active_w;
419  testmode <= cmd_data[24];
420  end
421 
422  if (set_trig_period_w) begin
423  pre_period[31:0] <= cmd_data[31:0];
424  high_zero <= cmd_data[31:8]==24'b0;
425  end
426 
430 
431  if (set_period) repeat_period[31:0] <= pre_period[31:0];
432  if (set_bit) bit_length[7:0] <= pre_period[ 7:0];
433 
434  start <= start0;
435  start_d <= start;
436 
437  start_en <= en && (repeat_period[31:0]!=0);
438  if (!en) rep_en <= 0;
439  else if (set_period) rep_en <= !high_zero;
440  end
441  always @ (posedge pclk) begin
442  case (master_chn)
443  2'h0: begin
446  end
447  2'h1: begin
450  end
451  2'h2: begin
454  end
455  2'h3: begin
458  end
459  endcase
460  end
461  always @ (posedge pclk) begin
462  ts_snap_triggered <= chn_en & ({4{(start_pclk[2] & ts_snd_en_pclk)}} | //strobe by internal generator if output timestamp is enabled
463  (trig_r & ~{4{ts_external_pclk}})); // get local timestamp of the trigger (ext/int)
464 
468 
469  start_pclk[2:0] <= {(restart && rep_en) ||
470  (start_pclk[1] && !restart_cntr_run[1] && !restart_cntr_run[0] && !start_pclk[2]),
471  start_pclk[0],
472  start_to_pclk && !start_pclk[0]};
473  restart_cntr_run[1:0] <= {restart_cntr_run[0],start_en && (start_pclk[2] || (restart_cntr_run[0] && (restart_cntr[31:2] !=0)))};
474 
475  if (restart_cntr_run[0]) restart_cntr[31:0] <= restart_cntr[31:0] - 1;
476  else restart_cntr[31:0] <= repeat_period[31:0];
477 
479 /// Generating output pulse - 64* bit_length if timestamp is disabled or
480 /// 64 bits with encoded timestamp, including pre/post magic for error detectrion
481  outsync <= start_en && (start_out_pulse || (outsync && !((bit_snd_duration[7:0]==0) &&(bit_snd_counter[5:0]==0))));
482 
483  if (!outsync || (bit_snd_duration[7:0]==0)) bit_snd_duration[7:0] <= bit_length[7:0];
484  else bit_snd_duration[7:0] <= bit_snd_duration[7:0] - 1;
485 
487 
488  if (!outsync) bit_snd_counter[5:0] <=ts_snd_en_pclk?63:3; /// when no ts serial, send pulse 4 periods long (max 1024 pclk)
489  /// Same bit length (1/4) is used in input filter/de-glitcher
490  else if (bit_snd_duration[7:0]==0) bit_snd_counter[5:0] <= bit_snd_counter[5:0] -1;
491 
492  if (!outsync) sr_snd_first[31:0] <= {CAMSYNC_PRE_MAGIC,ts_snd_sec[31:6]};
493  else if (bit_snd_duration_zero) sr_snd_first[31:0] <={sr_snd_first[30:0],sr_snd_second[31]};
494 
495  if (!outsync) sr_snd_second[31:0] <= {ts_snd_sec[5:0], ts_snd_usec[19:0],CAMSYNC_POST_MAGIC};
496  else if (bit_snd_duration_zero) sr_snd_second[31:0] <={sr_snd_second[30:0],1'b0};
497 
499 
500  end
501 
502  always @ (posedge pclk) begin
503  if (eprst) dly_cntr_run <= 0;
504  else if (!triggered_mode_pclk) dly_cntr_run <= 0;
505  else if (start_dly) dly_cntr_run <= 4'hf;
506  else dly_cntr_run <= dly_cntr_run &
507  {(dly_cntr_chn3[31:0]!=0)?1'b1:1'b0,
508  (dly_cntr_chn2[31:0]!=0)?1'b1:1'b0,
509  (dly_cntr_chn1[31:0]!=0)?1'b1:1'b0,
510  (dly_cntr_chn0[31:0]!=0)?1'b1:1'b0};
511  end
512 
513  `ifdef GENERATE_TRIG_OVERDUE
514  always @ (posedge mclk) begin
515  if (rst) trigger_r <= 0;
516  else if (!triggered_mode) trigger_r <= 0;
517  else trigger_r <= ~frame_sync & (trig_r_mclk ^ trigger_r);
518 
519  if (rst) overdue <= 0;
520  else if (!triggered_mode) overdue <= 0;
521  else overdue <= ((overdue ^ trigger_r) & trig_r_mclk) ^ overdue;
522 
523  end
524  `endif
525 
526 // Detecting input sync pulse (filter - 64 pclk, pulse is 256 pclk)
527 
528 /// Now trig_r toggles trigger output to prevent lock-up if no vacts
529 /// Lock-up could take place if:
530 /// 1 - Sensor is in snapshot mode
531 /// 2 - trigger was applied before end of previous frame.
532 /// With implemented toggling 1 extra pulse can be missed (2 with the original missed one), but the system will not lock-up
533 /// if the trigger pulses continue to come.
534 
536  always @ (posedge pclk) begin
537 
539  bit_length_short[7:0] <= bit_length[7:0]-bit_length_plus1[7:2]-1; // 3/4 of the duration
540 
541  trigger_condition <= (((gpio_in[9:0] ^ input_pattern[9:0]) & input_use[9:0]) == 10'b0);
543 
546 
549 
550 
553 
554  rcv_run_d <= rcv_run;
555  start_dly <= input_use_intern ? (start_late && start_en) : (rcv_run && !rcv_run_d); // all start at the same time - master/others
556 // simulation problems w/o "start_en &&" ?
557 
559  if (dly_cntr_run[0]) dly_cntr_chn0[31:0] <= dly_cntr_chn0[31:0] -1;
560  else dly_cntr_chn0[31:0] <= input_dly_chn0[31:0];
561 
562  if (dly_cntr_run[1]) dly_cntr_chn1[31:0] <= dly_cntr_chn1[31:0] -1;
563  else dly_cntr_chn1[31:0] <= input_dly_chn1[31:0];
564 
565  if (dly_cntr_run[2]) dly_cntr_chn2[31:0] <= dly_cntr_chn2[31:0] -1;
566  else dly_cntr_chn2[31:0] <= input_dly_chn2[31:0];
567 
568  if (dly_cntr_run[3]) dly_cntr_chn3[31:0] <= dly_cntr_chn3[31:0] -1;
569  else dly_cntr_chn3[31:0] <= input_dly_chn3[31:0];
570 
571  /// bypass delay to trig_r in internal trigger mode
576 
577 /// 64-bit serial receiver (52 bit payload, 6 pre magic and 6 bits post magic for error checking
578  if (!rcv_run_or_deaf) bit_rcv_duration[7:0] <= bit_length_short[7:0]; // 3/4 bit length-1
579  else if (bit_rcv_duration[7:0]==0) bit_rcv_duration[7:0] <= bit_length[7:0]; // bit length-1
580  else bit_rcv_duration[7:0] <= bit_rcv_duration[7:0]-1;
581 
583  if (!rcv_run_or_deaf) bit_rcv_counter[6:0] <= 127;
584  else if (bit_rcv_duration_zero) bit_rcv_counter[6:0] <= bit_rcv_counter[6:0] -1;
585 
586  if (rcv_run && bit_rcv_duration_zero) begin
587  sr_rcv_first[31:0] <={sr_rcv_first[30:0],sr_rcv_second[31]};
589  end
590 // Why was it local_got_pclk? Also, it is a multi-bit vector
591 // rcv_done_rq <= start_en && ((ts_external_pclk && local_got_pclk) || (rcv_done_rq && rcv_run));
592 // TODO: think of disabling receiving sync if sensor is not ready yet (not done with a previous frame)
594  //
597 
599 
600  if (rcv_done) begin
601  ts_rcv_sec_chn0 [31:0] <= {sr_rcv_first[25:0],sr_rcv_second[31:26]};
602  ts_rcv_usec_chn0 [19:0] <= rcv_error?20'hfffff: sr_rcv_second[25:6];
603  end else if (!triggered_mode_pclk || (!ts_external_pclk && local_got_pclk[0])) begin
604  ts_rcv_sec_chn0[31:0] <= ts_snd_sec_chn0 [31:0];
605  ts_rcv_usec_chn0[19:0] <= ts_snd_usec_chn0[19:0];
606  end
607 
608  if (rcv_done) begin
609  ts_rcv_sec_chn1 [31:0] <= {sr_rcv_first[25:0],sr_rcv_second[31:26]};
610  ts_rcv_usec_chn1 [19:0] <= rcv_error?20'hfffff: sr_rcv_second[25:6];
611  end else if (!triggered_mode_pclk || (!ts_external_pclk && local_got_pclk[1])) begin
612  ts_rcv_sec_chn1[31:0] <= ts_snd_sec_chn1 [31:0];
613  ts_rcv_usec_chn1[19:0] <= ts_snd_usec_chn1[19:0];
614  end
615 
616  if (rcv_done) begin
617  ts_rcv_sec_chn2 [31:0] <= {sr_rcv_first[25:0],sr_rcv_second[31:26]};
618  ts_rcv_usec_chn2 [19:0] <= rcv_error?20'hfffff: sr_rcv_second[25:6];
619  end else if (!triggered_mode_pclk || (!ts_external_pclk && local_got_pclk[2])) begin
620  ts_rcv_sec_chn2[31:0] <= ts_snd_sec_chn2 [31:0];
621  ts_rcv_usec_chn2[19:0] <= ts_snd_usec_chn2[19:0];
622  end
623 
624  if (rcv_done) begin
625  ts_rcv_sec_chn3 [31:0] <= {sr_rcv_first[25:0],sr_rcv_second[31:26]};
626  ts_rcv_usec_chn3 [19:0] <= rcv_error?20'hfffff: sr_rcv_second[25:6];
627  end else if (!triggered_mode_pclk || (!ts_external_pclk && local_got_pclk[3])) begin
628  ts_rcv_sec_chn3[31:0] <= ts_snd_sec_chn3 [31:0];
629  ts_rcv_usec_chn3[19:0] <= ts_snd_usec_chn3[19:0];
630  end
631  end
632 
634  // Making delayed start that waits for timestamp use timestamp_got, otherwize - nothing to wait
636 
637 
638  cmd_deser #(
639  .ADDR (CAMSYNC_ADDR),
640  .ADDR_MASK (CAMSYNC_MASK),
641  .NUM_CYCLES (6),
642  .ADDR_WIDTH (3),
643  .DATA_WIDTH (32)
644  ) cmd_deser_32bit_i (
645  .rst (1'b0), //rst), // input
646  .clk (mclk), // input
647  .srst (mrst), // input
648  .ad (cmd_ad), // input[7:0]
649  .stb (cmd_stb), // input
650  .addr (cmd_a), // output[3:0]
651  .data (cmd_data), // output[31:0]
652  .we (cmd_we) // output
653  );
654 
655  timestamp_to_parallel timestamp_to_parallel0_i (
656  .clk (mclk), // input
657  .pre_stb (ts_snd_stb_chn0), // input
658  .tdata (ts_snd_data_chn0), // input[7:0]
659  .sec (ts_snd_sec_chn0), // output[31:0] reg
660  .usec (ts_snd_usec_chn0), // output[19:0] reg
661  .done (local_got[0]) // output
662  );
663 
664  timestamp_to_parallel timestamp_to_parallel1_i (
665  .clk (mclk), // input
666  .pre_stb (ts_snd_stb_chn1), // input
667  .tdata (ts_snd_data_chn1), // input[7:0]
668  .sec (ts_snd_sec_chn1), // output[31:0] reg
669  .usec (ts_snd_usec_chn1), // output[19:0] reg
670  .done (local_got[1]) // output
671  );
672 
673  timestamp_to_parallel timestamp_to_parallel2_i (
674  .clk (mclk), // input
675  .pre_stb (ts_snd_stb_chn2), // input
676  .tdata (ts_snd_data_chn2), // input[7:0]
677  .sec (ts_snd_sec_chn2), // output[31:0] reg
678  .usec (ts_snd_usec_chn2), // output[19:0] reg
679  .done (local_got[2]) // output
680  );
681 
682  timestamp_to_parallel timestamp_to_parallel3_i (
683  .clk (mclk), // input
684  .pre_stb (ts_snd_stb_chn3), // input
685  .tdata (ts_snd_data_chn3), // input[7:0]
686  .sec (ts_snd_sec_chn3), // output[31:0] reg
687  .usec (ts_snd_usec_chn3), // output[19:0] reg
688  .done (local_got[3]) // output
689  );
690 
691  timestamp_to_serial timestamp_to_serial0_i (
692  .clk (mclk), // input
693  .stb (ts_stb[0]), // input
694  .sec (ts_rcv_sec_chn0), // input[31:0]
695  .usec (ts_rcv_usec_chn0), // input[19:0]
696  .tdata (ts_rcv_data_chn0) // output[7:0] reg
697  );
698 
699  timestamp_to_serial timestamp_to_serial1_i (
700  .clk (mclk), // input
701  .stb (ts_stb[1]), // input
702  .sec (ts_rcv_sec_chn1), // input[31:0]
703  .usec (ts_rcv_usec_chn1), // input[19:0]
704  .tdata (ts_rcv_data_chn1) // output[7:0] reg
705  );
706 
707  timestamp_to_serial timestamp_to_serial2_i (
708  .clk (mclk), // input
709  .stb (ts_stb[2]), // input
710  .sec (ts_rcv_sec_chn2), // input[31:0]
711  .usec (ts_rcv_usec_chn2), // input[19:0]
712  .tdata (ts_rcv_data_chn2) // output[7:0] reg
713  );
714 
715  timestamp_to_serial timestamp_to_serial3_i (
716  .clk (mclk), // input
717  .stb (ts_stb[3]), // input
718  .sec (ts_rcv_sec_chn3), // input[31:0]
719  .usec (ts_rcv_usec_chn3), // input[19:0]
720  .tdata (ts_rcv_data_chn3) // output[7:0] reg
721  );
724  .WIDTH(1),
725  .REGISTER(2)
726  ) level_cross_clocks_en_pclki (
727  .clk (pclk), // input
728  .d_in (en), // input[0:0]
729  .d_out (en_pclk) // output[0:0]
730  );
731 
732 
735 
740 
742 
743  pulse_cross_clock i_local_got_pclk0(.rst(mrst), .src_clk(mclk), .dst_clk(pclk), .in_pulse(local_got[0]), .out_pulse(local_got_pclk[0]),.busy());
744  pulse_cross_clock i_local_got_pclk1(.rst(mrst), .src_clk(mclk), .dst_clk(pclk), .in_pulse(local_got[1]), .out_pulse(local_got_pclk[1]),.busy());
745  pulse_cross_clock i_local_got_pclk2(.rst(mrst), .src_clk(mclk), .dst_clk(pclk), .in_pulse(local_got[2]), .out_pulse(local_got_pclk[2]),.busy());
746  pulse_cross_clock i_local_got_pclk3(.rst(mrst), .src_clk(mclk), .dst_clk(pclk), .in_pulse(local_got[3]), .out_pulse(local_got_pclk[3]),.busy());
747 
748  pulse_cross_clock i_trig_r_mclk0 (.rst(eprst), .src_clk(pclk), .dst_clk(mclk), .in_pulse(trig_r[0]), .out_pulse(trig_r_mclk[0]),.busy());
749  pulse_cross_clock i_trig_r_mclk1 (.rst(eprst), .src_clk(pclk), .dst_clk(mclk), .in_pulse(trig_r[1]), .out_pulse(trig_r_mclk[1]),.busy());
750  pulse_cross_clock i_trig_r_mclk2 (.rst(eprst), .src_clk(pclk), .dst_clk(mclk), .in_pulse(trig_r[2]), .out_pulse(trig_r_mclk[2]),.busy());
751  pulse_cross_clock i_trig_r_mclk3 (.rst(eprst), .src_clk(pclk), .dst_clk(mclk), .in_pulse(trig_r[3]), .out_pulse(trig_r_mclk[3]),.busy());
752 
753 endmodule
754 
755 
9487rep_enreg
Definition: camsync393.v:230
9417ts_snd_stb_chn2
Definition: camsync393.v:134
9543local_gotwire[3:0]
Definition: camsync393.v:297
9438ts_snd_sec_chn0wire[31:0]
Definition: camsync393.v:169
9492restart_cntr_runreg[1:0]
Definition: camsync393.v:235
9545frame_syncwire[3:0]
Definition: camsync393.v:299
9477input_dly_chn3reg[31:0]
Definition: camsync393.v:221
9444ts_snd_usec_chn1wire[19:0]
Definition: camsync393.v:177
9416ts_snap_mclk_chn2
Definition: camsync393.v:133
9389CAMSYNC_CHN_EN_BIT'he
Definition: camsync393.v:67
i_trig_r_mclk3 pulse_cross_clock
Definition: camsync393.v:730
9539pre_rcv_errorwire
Definition: camsync393.v:290
9544local_got_pclkwire[3:0]
Definition: camsync393.v:298
9382CAMSYNC_TRIG_DELAY2'h6
Definition: camsync393.v:59
9546ts_snap_triggeredreg[3:0]
Definition: camsync393.v:300
9475input_dly_chn1reg[31:0]
Definition: camsync393.v:219
9516pre_set_bitwire
Definition: camsync393.v:264
[WIDTH-1:0] 10629d_out
9550input_pattern_wwire[9:0]
Definition: camsync393.v:352
9541ts_external_pclkreg
Definition: camsync393.v:293
9500start_dlyreg
Definition: camsync393.v:246
9493restartwire
Definition: camsync393.v:236
9437ts_snd_usecreg[19:0]
Definition: camsync393.v:167
9523sr_rcv_firstreg[31:0]
Definition: camsync393.v:273
9512bit_length_plus1wire[7:0]
Definition: camsync393.v:259
timestamp_to_parallel3_i timestamp_to_parallel
Definition: camsync393.v:661
9466pre_input_usewire[9:0]
Definition: camsync393.v:208
9447ts_snd_sec_chn2wire[31:0]
Definition: camsync393.v:182
9455cmd_awire[2:0]
Definition: camsync393.v:196
9458set_mode_reg_wwire
Definition: camsync393.v:200
9483out_datareg
Definition: camsync393.v:227
9471gpio_out_en_rreg[9:0]
Definition: camsync393.v:215
9513bit_length_shortreg[7:0]
Definition: camsync393.v:260
timestamp_to_serial3_i timestamp_to_serial
Definition: camsync393.v:694
9521sr_snd_firstreg[31:0]
Definition: camsync393.v:270
9517set_bitreg
Definition: camsync393.v:265
9486start_dreg
Definition: camsync393.v:229
9551pre_gpio_out_enwire[9:0]
Definition: camsync393.v:354
9533rcv_runwire
Definition: camsync393.v:284
9377CAMSYNC_TRIG_SRC'h1
Definition: camsync393.v:54
[WIDTH-1:0] 10628d_in
9476input_dly_chn2reg[31:0]
Definition: camsync393.v:220
9463set_trig_delay3_wwire
Definition: camsync393.v:205
9420ts_snd_stb_chn3
Definition: camsync393.v:138
[7:0] 9429ts_rcv_data_chn3
Definition: camsync393.v:156
9473input_use_internreg
Definition: camsync393.v:217
9391CAMSYNC_POST_MAGIC6'b001101
Definition: camsync393.v:71
[9:0] 9398gpio_in
Definition: camsync393.v:100
9528bit_rcv_duration_zeroreg
Definition: camsync393.v:278
9542triggered_mode_pclkreg
Definition: camsync393.v:294
9472pre_input_use_internreg
Definition: camsync393.v:216
9424ts_rcv_stb_chn1
Definition: camsync393.v:149
9451ts_snd_sec_chn3wire[31:0]
Definition: camsync393.v:188
[7:0] 9415ts_snd_data_chn1
Definition: camsync393.v:131
level_cross_clocks_en_pclki level_cross_clocks
Definition: camsync393.v:702
9524sr_rcv_secondreg[31:0]
Definition: camsync393.v:274
9443ts_snd_sec_chn1wire[31:0]
Definition: camsync393.v:176
9537rcv_donereg
Definition: camsync393.v:288
9490start_pclkreg[2:0]
Definition: camsync393.v:233
9379CAMSYNC_TRIG_PERIOD'h3
Definition: camsync393.v:56
9440ts_rcv_sec_chn0reg[31:0]
Definition: camsync393.v:172
9498trig_rreg[3:0]
Definition: camsync393.v:241
9485startreg
Definition: camsync393.v:229
9426ts_rcv_stb_chn2
Definition: camsync393.v:152
9494trigger_conditionreg
Definition: camsync393.v:237
9505dly_cntr_runreg[3:0]
Definition: camsync393.v:251
cmd_deser_32bit_i cmd_deser
Definition: camsync393.v:617
9553output_maskwire[9:0]
Definition: camsync393.v:359
9532rcv_run_or_deafreg
Definition: camsync393.v:283
9469input_usereg[9:0]
Definition: camsync393.v:213
[7:0] 9427ts_rcv_data_chn2
Definition: camsync393.v:153
[7:0] 9421ts_snd_data_chn3
Definition: camsync393.v:139
[ADDR_MASK2!=0?2:ADDR_MASK1!=0?1:0:0] 9935we
Definition: cmd_deser.v:60
9433ts_snd_enreg
Definition: camsync393.v:162
9386CAMSYNC_EXTERNAL_BIT'h4
Definition: camsync393.v:64
9506dly_cntr_run_dreg[3:0]
Definition: camsync393.v:252
9502dly_cntr_chn1reg[31:0]
Definition: camsync393.v:248
9470input_patternreg[9:0]
Definition: camsync393.v:214
9453ts_rcv_sec_chn3reg[31:0]
Definition: camsync393.v:191
9428ts_rcv_stb_chn3
Definition: camsync393.v:155
9381CAMSYNC_TRIG_DELAY1'h5
Definition: camsync393.v:58
9534rcv_run_dreg
Definition: camsync393.v:285
9499trig_r_mclkwire[3:0]
Definition: camsync393.v:242
9549input_use_wwire[9:0]
Definition: camsync393.v:351
9529bit_rcv_counterreg[6:0]
Definition: camsync393.v:279
9518pre_set_periodwire
Definition: camsync393.v:266
9514pre_start0wire
Definition: camsync393.v:262
[7:0] 9412ts_snd_data_chn0
Definition: camsync393.v:127
9376CAMSYNC_MODE'h0
Definition: camsync393.v:53
9504dly_cntr_chn3reg[31:0]
Definition: camsync393.v:250
9388CAMSYNC_MASTER_BIT'h9
Definition: camsync393.v:66
[7:0] 9394cmd_ad
Definition: camsync393.v:77
9439ts_snd_usec_chn0wire[19:0]
Definition: camsync393.v:170
9479master_chnreg[1:0]
Definition: camsync393.v:223
9491restart_cntrreg[31:0]
Definition: camsync393.v:234
9383CAMSYNC_TRIG_DELAY3'h7
Definition: camsync393.v:60
9555gpio_active_wwire[9:0]
Definition: camsync393.v:361
9445ts_rcv_sec_chn1reg[31:0]
Definition: camsync393.v:179
9459set_trig_src_wwire
Definition: camsync393.v:201
9536rcv_done_rq_dreg
Definition: camsync393.v:287
9454ts_rcv_usec_chn3reg[19:0]
Definition: camsync393.v:192
9552pre_gpio_activewire[9:0]
Definition: camsync393.v:356
9435triggered_mode_rreg
Definition: camsync393.v:164
9448ts_snd_usec_chn2wire[19:0]
Definition: camsync393.v:183
9378CAMSYNC_TRIG_DST'h2
Definition: camsync393.v:55
9515start0reg
Definition: camsync393.v:263
9474input_dly_chn0reg[31:0]
Definition: camsync393.v:218
[DATA_WIDTH-1:0] 9934data
Definition: cmd_deser.v:59
9432eprstwire
Definition: camsync393.v:161
9450ts_rcv_usec_chn2reg[19:0]
Definition: camsync393.v:186
9507dly_cntr_endwire[3:0]
Definition: camsync393.v:253
9431en_pclkwire
Definition: camsync393.v:160
9522sr_snd_secondreg[31:0]
Definition: camsync393.v:271
9422ts_rcv_stb_chn0
Definition: camsync393.v:146
9497trigger_filter_cntrreg[6:0]
Definition: camsync393.v:240
9480gpio_activereg[9:0]
Definition: camsync393.v:224
9481testmodereg
Definition: camsync393.v:225
9449ts_rcv_sec_chn2reg[31:0]
Definition: camsync393.v:185
9482outsyncreg
Definition: camsync393.v:226
9462set_trig_delay2_wwire
Definition: camsync393.v:204
9548input_maskwire[9:0]
Definition: camsync393.v:350
[7:0] 9931ad
Definition: cmd_deser.v:56
9410ts_snap_mclk_chn0
Definition: camsync393.v:125
[ADDR_WIDTH-1:0] 9933addr
Definition: cmd_deser.v:58
9535rcv_done_rqreg
Definition: camsync393.v:286
9446ts_rcv_usec_chn1reg[19:0]
Definition: camsync393.v:180
9501dly_cntr_chn0reg[31:0]
Definition: camsync393.v:247
9530bit_snd_duration_zeroreg
Definition: camsync393.v:280
9441ts_rcv_usec_chn0reg[19:0]
Definition: camsync393.v:173
9374CAMSYNC_ADDR'h160
Definition: camsync393.v:51
9384CAMSYNC_EN_BIT'h0
Definition: camsync393.v:62
9488start_enreg
Definition: camsync393.v:231
9540rcv_errorreg
Definition: camsync393.v:291
9554gpio_out_en_wwire[9:0]
Definition: camsync393.v:360
9511bit_lengthreg[7:0]
Definition: camsync393.v:257
9411ts_snd_stb_chn0
Definition: camsync393.v:126
9464set_trig_dst_wwire
Definition: camsync393.v:206
[7:0] 9423ts_rcv_data_chn0
Definition: camsync393.v:147
9547ts_snap_triggered_mclkwire[3:0]
Definition: camsync393.v:301
9489start_to_pclkwire
Definition: camsync393.v:232
9434ts_externalreg
Definition: camsync393.v:163
9509start_out_pulsereg
Definition: camsync393.v:255
9531ts_snd_en_pclkreg
Definition: camsync393.v:281
[9:0] 9399gpio_out
Definition: camsync393.v:101
9414ts_snd_stb_chn1
Definition: camsync393.v:130
9419ts_snap_mclk_chn3
Definition: camsync393.v:137
9436ts_snd_secreg[31:0]
Definition: camsync393.v:166
9503dly_cntr_chn2reg[31:0]
Definition: camsync393.v:249
9457cmd_wewire
Definition: camsync393.v:198
9468high_zeroreg
Definition: camsync393.v:212
9401triggered_mode
Definition: camsync393.v:104
9478chn_enreg[3:0]
Definition: camsync393.v:222
[9:0] 9400gpio_out_en
Definition: camsync393.v:102
9442ts_stbwire[3:0]
Definition: camsync393.v:174
9525bit_snd_durationreg[7:0]
Definition: camsync393.v:275
9452ts_snd_usec_chn3wire[19:0]
Definition: camsync393.v:189
[7:0] 9425ts_rcv_data_chn1
Definition: camsync393.v:150
9461set_trig_delay1_wwire
Definition: camsync393.v:203
9519set_periodreg
Definition: camsync393.v:267
9390CAMSYNC_PRE_MAGIC6'b110100
Definition: camsync393.v:70
9520start_latewire
Definition: camsync393.v:268
9538rcv_done_mclkwire
Definition: camsync393.v:289
9526bit_snd_counterreg[5:0]
Definition: camsync393.v:276
9385CAMSYNC_SNDEN_BIT'h2
Definition: camsync393.v:63
9467pre_input_patternwire[9:0]
Definition: camsync393.v:209
9496trigger_condition_filteredreg
Definition: camsync393.v:239
9413ts_snap_mclk_chn1
Definition: camsync393.v:129
9484repeat_periodreg[31:0]
Definition: camsync393.v:228
9387CAMSYNC_TRIGGERED_BIT'h6
Definition: camsync393.v:65
9527bit_rcv_durationreg[7:0]
Definition: camsync393.v:277
9465set_trig_period_wwire
Definition: camsync393.v:207
9375CAMSYNC_MASK'h7f8
Definition: camsync393.v:52
9456cmd_datawire[31:0]
Definition: camsync393.v:197
9460set_trig_delay0_wwire
Definition: camsync393.v:202
9495trigger_condition_dreg
Definition: camsync393.v:238
[7:0] 9418ts_snd_data_chn2
Definition: camsync393.v:135
9380CAMSYNC_TRIG_DELAY0'h4
Definition: camsync393.v:57
9510pre_periodreg[31:0]
Definition: camsync393.v:256
9508pre_start_out_pulsewire
Definition: camsync393.v:254