x393  1.0
FPGAcodeforElphelNC393camera
sens_histogram_snglclk.v
Go to the documentation of this file.
1 
41 `timescale 1ns/1ps
42 
44  parameter HISTOGRAM_RAM_MODE = "BUF32", // valid: "NOBUF" (32-bits, no buffering - now is replaced by BUF32), "BUF18", "BUF32"
45  parameter HISTOGRAM_ADDR = 'h33c,
46  parameter HISTOGRAM_ADDR_MASK = 'h7fe,
47  parameter HISTOGRAM_LEFT_TOP = 'h0,
48  parameter HISTOGRAM_WIDTH_HEIGHT = 'h1, // 1.. 2^16, 0 - use HACT
49  parameter [1:0] XOR_HIST_BAYER = 2'b00// 11 // invert bayer setting
50 `ifdef DEBUG_RING
51  ,parameter DEBUG_CMD_LATENCY = 2 // SuppressThisWarning VEditor - not used
52 `endif
53 
54 )(
55  input mrst, // @posedge mclk, sync reset
56  input prst, // @posedge pclk, sync reset
57  input pclk, // global clock input, pixel rate (96MHz for MT9P006)
58 // input pclk2x,
59  input sof,
60  input eof,
61  input hact,
62  input [7:0] hist_di, // 8-bit pixel data
63 
64  input mclk,
65  input hist_en, // @mclk - gracefully enable/disable histogram
66  input hist_rst, // @mclk - immediately disable if true
67  output hist_rq,
68  input hist_grant,
69  output [31:0] hist_do,
70  output reg hist_dv,
71  input [7:0] cmd_ad, // byte-serial command address/data (up to 6 bytes: AL-AH-D0-D1-D2-D3
72  input cmd_stb // strobe (with first byte) for the command a/d
73 // , input monochrome // NOT supported in this implementation - use software to sum
74 `ifdef DEBUG_RING
75  ,output debug_do, // output to the debug ring
76  input debug_sl, // 0 - idle, (1,0) - shift, (1,1) - load // SuppressThisWarning VEditor - not used
77  input debug_di // input from the debug ring
78 `endif
79 );
80 
81  localparam HIST_WIDTH = (HISTOGRAM_RAM_MODE == "BUF18") ? 18 : 32;
83 
84  reg [8:0] hist_rwaddr_even; // {bayer[1], pixel}
85  reg [8:0] hist_rwaddr_odd; // {bayer[1], pixel}
86 
88 
91 
92  wire [1:0] pio_addr;
93  wire [31:0] pio_data;
94  wire pio_stb;
95 
96  reg [31:0] lt_mclk; // left+top @ posedge mclk
97  reg [31:0] wh_mclk; // width+height @ posedge mclk
98  reg [15:0] width_m1; // @posedge pclk
99  reg [15:0] height_m1; // @posedge pclk
100  reg [15:0] left; // @posedge pclk
101  reg [15:0] top; // @posedge pclk
102 
103  reg hist_en_pclk; // @pclk - gracefully enable/disable histogram
104  reg hist_rst_pclk; // @pclk - immediately disable if true
105  reg en;
106  reg en_new; // @ pclk - enable new frame
107 
108  reg en_mclk;
109 
112 // reg pclk_sync; // CE for pclk2x, ~=pclk
113  reg odd_pix;
114 
115  reg [1:0] bayer_pclk;
116 
117  reg [1:0] hact_d;
118 
119  reg top_margin; // above (before) active window
120  reg hist_done; // @pclk single cycle
122  reg vert_woi; // vertically in window TESTED ACTIVE
123  reg left_margin; // left of (before) active window
124 // reg [2:0] woi; // @ pclk2x - inside WOI (and delayed
125  reg [6:0] hor_woi; // vertically in window and delayed
126  reg [15:0] vcntr; // vertical (line) counter
127  reg [15:0] hcntr; // horizontal (pixel) counter
128  wire vcntr_zero_w; // vertical counter is zero
129  wire hcntr_zero_w; // horizontal counter is zero
130 
131  reg hist_out; // some data yet to be sent out
133  reg [2:0] hist_re;
136  reg [9:0] hist_raddr;
138  wire hist_xfer_done_mclk; //@ mclk
139  wire hist_xfer_done; // @pclk
140  reg hist_xfer_busy; // @pclk, during histogram readout , immediately after woi (no gaps)
141  reg wait_readout; // only used in NOBUF mode, in outher modes readout is expected to be always finished in time
142 
143 `ifdef DEBUG_RING
144  reg [15:0] debug_line_cntr;
145  reg [15:0] debug_lines;
146 `endif
147 
150  assign vcntr_zero_w = !(|vcntr);
151  assign hcntr_zero_w = !(|hcntr);
152 
153  assign hist_rq = hist_rq_r;
155 
156  wire line_start_w = hact && !hact_d[0]; // // tested active
158  reg frame_active; // until done
159 
160 `ifdef DEBUG_RING
161  always @ (posedge pclk) begin
162  if (sof) debug_line_cntr <= 0;
164 
166  end
167 `endif
168 
169  always @ (posedge mclk) begin
172  end
173 
174  always @ (posedge pclk) begin
175  if (set_left_top_pclk) {top,left} <= lt_mclk[31:0];
177  end
178 
179  // process WOI
180  always @ (posedge pclk) begin
181  hact_d <= {hact_d[0],hact};
182  if (!en) pre_first_line <= 0;
183  else if (sof && en_new) pre_first_line <= 1;
184  else if (hact) pre_first_line <= 0;
185 
186  if (!en) top_margin <= 0;
187  else if (sof && en_new) top_margin <= 1;
188  else if (vcntr_zero_w & line_start_w) top_margin <= 0;
189 
190  if (!en ||(pre_first_line && !hact)) vert_woi <= 0;
192 
193  hist_done <= vert_woi && (eof || (vcntr_zero_w && line_start_w)); // hist done never asserted, line_start_w - active
194 
195  if (!en || hist_done) frame_active <= 0;
196  else if (sof && en_new) frame_active <= 1;
197 
198 
199  if ((pre_first_line && !hact) || !frame_active) vcntr <= top;
200  else if (line_start_w) vcntr <= vcntr_zero_w ? height_m1 : (vcntr - 1);
201 
202  if (!frame_active) left_margin <= 0;
203  else if (!hact_d[0]) left_margin <= 1;
204  else if (hcntr_zero_w) left_margin <= 0;
205 
206  // !hact_d[0] to limit by right margin if window is set wrong
207 
208  if (!vert_woi || wait_readout || !hact_d[0]) hor_woi[0] <= 0; // postpone WOI if reading out/erasing histogram (no-buffer mode)
209  else if (hcntr_zero_w) hor_woi[0] <= left_margin && vert_woi;
210 
211  hor_woi[6:1] <= hor_woi[5:0];
212 
213  if (!hact_d[0]) hcntr <= left;
214  else if (hcntr_zero_w && left_margin) hcntr <= width_m1;
215  else if (left_margin || hor_woi[0]) hcntr <= hcntr - 1;
216 
217  if (!en) hist_bank_pclk <= 0;
218  //else if (hist_done && (HISTOGRAM_RAM_MODE != "NOBUF")) hist_bank_pclk <= !hist_bank_pclk;// NOT applicable in this module
220  // hist_xfer_busy to extend en
221  if (!en) hist_xfer_busy <= 0;
222  else if (hist_xfer_done) hist_xfer_busy <= 0;
223  else if (vcntr_zero_w && vert_woi) hist_xfer_busy <= 1;
224 
227 
228  if (hist_rst_pclk) en <= 0;
229  else if (hist_en_pclk) en <= 1;
230  else if (!top_margin && !vert_woi && !hist_xfer_busy) en <= 0;
231 
233 
234  if (!hact && hact_d[0]) bayer_pclk[1] <= !bayer_pclk[1];
235  else if (pre_first_line && !hact) bayer_pclk[1] <= XOR_HIST_BAYER[1];
236 
237  if (!hact) bayer_pclk[0] <= XOR_HIST_BAYER[0];
238  else bayer_pclk[0] <= ~bayer_pclk[0];
239 
240  end
241 
242 // assign hlstart = hcntr_zero_w && left_margin && hact_d[0];
243  reg [6:0] memen_even;
244  reg [6:0] memen_odd;
248  wire we_even = memen_even[6];
250  wire regen_odd = memen_odd[2];
252  wire we_odd = memen_odd[6];
253 
254  reg rwen_even; // re or we
255  reg rwen_odd; // re or we
256 
257  wire [7:0] px_d0; // px delayed to match hor_woi (2 cycles)
258  wire [7:0] px_d2; // px delayed by 2 cycles from px_d0
259  wire [7:0] px_d4; // px delayed by 2 cycles from px_d2
260  wire [7:0] px_d5; // px delayed by 1 cycle from px_d4
261 
262  reg [HIST_WIDTH -1 :0] r0;
263  reg [HIST_WIDTH -1 :0] r1;
264  reg r1_sat; // only used in 18-bit mode
265  reg [HIST_WIDTH -1 :0] r2;
266  reg [HIST_WIDTH -1 :0] r3;
267  wire [HIST_WIDTH -1 :0] hist_new_even; // data (to increment) read from the histogram memory, even pixels
268  wire [HIST_WIDTH -1 :0] hist_new_odd; // data (to increment) read from the histogram memory, odd pixels
269  reg [3:0] r_load; // load r0-r1-r2-r3 registers
270  reg r0_sel; // select odd/even for r0 (other option possible)
271  reg eq_prev_prev; // pixel equals one before previous of the same color
272  wire eq_prev_prev_d2; // eq_prev_prev delayed by 2 clocks to select r1 source
273  reg eq_prev; // pixel equals previous of the same color
274  wire eq_prev_d3; // eq_prev delayed by 3 clocks to select r1 source
275 // wire start_hor_woi = hcntr_zero_w && left_margin && vert_woi;
276 
277 
278  // hist_di is 2 cycles ahead of hor_woi
279  always @(posedge pclk) begin
280 
281  if (!hist_en_pclk || !(|hor_woi)) odd_pix <= 0;
282  else odd_pix <= ~odd_pix;
283 
284  if (!hist_en_pclk || !((XOR_HIST_BAYER[0] ^ left[0])? hor_woi[1] : hor_woi[0])) memen_even[0] <= 0;
285  else memen_even[0] <= ~memen_even[0];
286 
287  memen_even[6:1] <= memen_even[5:0];
288 
289  if (!hist_en_pclk || !((XOR_HIST_BAYER[0] ^ left[0])? hor_woi[0] : hor_woi[1])) memen_odd[0] <= 0;
290  else memen_odd[0] <= ~memen_odd[0];
291 
292  memen_odd[6:1] <= memen_odd[5:0];
293 
294  if (hor_woi[1:0] == 2'b01) hist_rwaddr_even[8] <= bayer_pclk[1];
295  if (hor_woi[1:0] == 2'b01) hist_rwaddr_odd[8] <= bayer_pclk[1];
296 
297  if (set_ra_even) hist_rwaddr_even[7:0] <= px_d0;
298  else if (set_wa_even) hist_rwaddr_even[7:0] <= px_d5;
299 
300  if (set_ra_odd) hist_rwaddr_odd[7:0] <= px_d0;
301  else if (set_wa_odd) hist_rwaddr_odd[7:0] <= px_d5;
302 
303  rwen_even <= memen_even[0] || memen_even[5];
304  rwen_odd <= memen_odd[0] || memen_odd[5];
305 
306  r_load <= {r_load[2:0], regen_even | regen_odd};
307  r0_sel <= regen_odd;
308 
309  eq_prev_prev <= hor_woi[4] && (px_d4 == px_d0);
310 
311  eq_prev <= hor_woi[2] && (px_d2 == px_d0);
312 
314 
315  if (r_load[1]) r1 <= eq_prev_d3 ? r2 : r0;
316 
317  if (r_load[1]) r1_sat <= eq_prev_d3 ? (&r2) : (&r0);
318 
319  if (r_load[2]) r2 <= ((HISTOGRAM_RAM_MODE != "BUF18") || !r1_sat) ? (r1 + 1) : r1;
320 
321  if (r_load[3]) r3 <= r2;
322 
323  end
324 
325  // after hist_out was off, require inactive grant before sending rq
327 
328  always @ (posedge mclk) begin
329  en_mclk <= en;
330  if (!en_mclk) hist_out <= 0;
331  else if (hist_done_mclk) hist_out <= 1;
332  else if (&hist_raddr) hist_out <= 0;
333 
334  hist_out_d <= hist_out;
335  // reset address each time new transfer is started
336  if (!hist_out) hist_raddr <= 0;
337  else if (hist_re[0]) hist_raddr <= hist_raddr + 1;
338 
339 // prevent starting rq if grant is still on (back-to-back)
340  if (!hist_out) en_rq_start <= 0;
341  else if (!hist_grant) en_rq_start <= 1;
343 
344  if (!hist_out || (&hist_raddr[7:0])) hist_re[0] <= 0;
345  else if (hist_grant) hist_re[0] <= 1;
346 
347  hist_re[2:1] <= hist_re[1:0];
348 // reg hist_re_even;
349 // reg hist_re_odd;
350 
351  if (!hist_out || (&hist_raddr[7:0])) hist_re_even <= 0;
352  else if (hist_grant && !hist_re[0]) hist_re_even <= !hist_raddr[8];
353 
354  if (!hist_out || (&hist_raddr[7:0])) hist_re_odd <= 0;
355  else if (hist_grant && !hist_re[0]) hist_re_odd <= hist_raddr[8];
356 
357 // if (!hist_out || (&hist_raddr[7:1])) hist_re_even_odd[0] <= 0;
358 // else if (hist_re[0]) hist_re_even_odd[0] <= ~hist_re_even_odd[0];
359 // else if (hist_grant) hist_re_even_odd[0] <= 1; // hist_re[0] == 0 here
360 
361  if (!en_mclk) hist_bank_mclk <= 0;
362  // else if (hist_xfer_done_mclk && (HISTOGRAM_RAM_MODE != "NOBUF")) hist_bank_mclk <= !hist_bank_mclk; // Not applicable in this module
364 
365  hist_dv <= hist_re[2];
366 
367  end
368 
369  always @ (posedge pclk) begin
370  if (!en) wait_readout <= 0;
371  // else if ((HISTOGRAM_RAM_MODE == "NOBUF") && hist_done) wait_readout <= 1; // Not applicable in this module
372  else if (hist_xfer_done) wait_readout <= 0;
373 
374  end
375 
376 `ifdef DEBUG_RING
378  .SHIFT_WIDTH (64),
379  .READ_WIDTH (64),
380  .WRITE_WIDTH (32),
381  .DEBUG_CMD_LATENCY (DEBUG_CMD_LATENCY)
382  ) debug_slave_i (
383  .mclk (mclk), // input
384  .mrst (mrst), // input
385  .debug_di (debug_di), // input
386  .debug_sl (debug_sl), // input
387  .debug_do (debug_do), // output
388  .rd_data ({debug_lines[15:0], debug_line_cntr[15:0], width_m1[15:0], hcntr[15:0]}), // input[31:0]
389  .wr_data (), // output[31:0] - not used
390  .stb () // output - not used
391  );
392 `endif
393 
395  .ADDR (HISTOGRAM_ADDR),
396  .ADDR_MASK (HISTOGRAM_ADDR_MASK),
397  .NUM_CYCLES (6),
398  .ADDR_WIDTH (2),
399  .DATA_WIDTH (32),
400  .ADDR1 (0),
401  .ADDR_MASK1 (0),
402  .ADDR2 (0),
403  .ADDR_MASK2 (0)
404  ) cmd_deser_sens_histogram_i (
405  .rst (1'b0), // input
406  .clk (mclk), // input
407  .srst (mrst), // input
408  .ad (cmd_ad), // input[7:0]
409  .stb (cmd_stb), // input
410  .addr (pio_addr), // output[15:0]
411  .data (pio_data), // output[31:0]
412  .we (pio_stb) // output
413  );
414 
416  .WIDTH(8)
417  ) dly_16_px_dly0_i (
418  .clk (pclk), // input
419  .rst (prst), // input
420  .dly (4'h2), // input[3:0]
421  .din (hist_di), // input[0:0]
422  .dout (px_d0) // output[0:0]
423  );
424 
426  .WIDTH(8)
427  ) dly_16_px_dly2_i (
428  .clk (pclk), // input
429  .rst (prst), // input
430  .dly (4'h1), // input[3:0]
431  .din (px_d0), // input[0:0]
432  .dout (px_d2) // output[0:0]
433  );
434 
436  .WIDTH(8)
437  ) dly_16_px_dly4_i (
438  .clk (pclk), // input
439  .rst (prst), // input
440  .dly (4'h1), // input[3:0]
441  .din (px_d2), // input[0:0]
442  .dout (px_d4) // output[0:0]
443  );
444 
446  .WIDTH(8)
447  ) dly_16_px_dly5_i (
448  .clk (pclk), // input
449  .rst (prst), // input
450  .dly (4'h0), // input[3:0]
451  .din (px_d4), // input[0:0]
452  .dout (px_d5) // output[0:0]
453  );
454 
456  .WIDTH(1)
457  ) dly_16_eq_prev_prev_d2_i (
458  .clk (pclk), // input
459  .rst (prst), // input
460  .dly (4'h1), // input[3:0]
461  .din (eq_prev_prev), // input[0:0]
462  .dout (eq_prev_prev_d2) // output[0:0]
463  );
464 
466  .WIDTH(1)
467  ) dly_16_eq_prev_d3_i (
468  .clk (pclk), // input
469  .rst (prst), // input
470  .dly (4'h2), // input[3:0]
471  .din (eq_prev), // input[0:0]
472  .dout (eq_prev_d3) // output[0:0]
473  );
474 
475 
476  pulse_cross_clock pulse_cross_clock_lt_i (
477  .rst (mrst), // input
478  .src_clk (mclk), // input
479  .dst_clk (pclk), // input
480  .in_pulse (set_left_top_w), // input
481  .out_pulse (set_left_top_pclk), // output
482  .busy() // output
483  );
484 
485  pulse_cross_clock pulse_cross_clock_wh_i (
486  .rst (mrst), // input
487  .src_clk (mclk), // input
488  .dst_clk (pclk), // input
489  .in_pulse (set_width_height_w), // input
490  .out_pulse (set_width_height_pclk), // output
491  .busy() // output
492  );
493 
494  pulse_cross_clock pulse_cross_clock_hist_done_i (
495  .rst (prst), // input
496  .src_clk (pclk), // input
497  .dst_clk (mclk), // input
498  .in_pulse (hist_done), // input
499  .out_pulse (hist_done_mclk), // output
500  .busy() // output
501  );
502 
503  pulse_cross_clock pulse_cross_clock_hist_xfer_done_i (
504  .rst (mrst), // input
505  .src_clk (mclk), // input
506  .dst_clk (pclk), // input
507  .in_pulse (hist_xfer_done_mclk), // input
508  .out_pulse (hist_xfer_done), // output
509  .busy() // output
510  );
511  //TODO: make it double cycle in timing
512 
513  // select between 18-bit wide histogram data using a single BRAM or 2 BRAMs having full 32 bits
514  generate
515  if ((HISTOGRAM_RAM_MODE=="BUF32") || (HISTOGRAM_RAM_MODE=="NOBUF"))// impossible to use a two RAMB18E1 32-bit wide
516  sens_hist_ram_snglclk_32 sens_hist_ram_snglclk_32_i (
517  .pclk (pclk), // input
518  .addr_a_even ({hist_bank_pclk, hist_rwaddr_even}), // input[9:0]
519  .addr_a_odd ({hist_bank_pclk, hist_rwaddr_odd}), // input[9:0]
520  .data_in_a (r2), // input[31:0]
521  .data_out_a_even (hist_new_even), // output[31:0]
522  .data_out_a_odd (hist_new_odd), // output[31:0]
523  .en_a_even (rwen_even), // input
524  .en_a_odd (rwen_odd), // input
525  .regen_a_even (regen_even), // input
526  .regen_a_odd (regen_odd), // input
527  .we_a_even (we_even), // input
528  .we_a_odd (we_odd), // input
529  .mclk (mclk), // input
530  .addr_b ({hist_bank_mclk,hist_raddr[9],hist_raddr[7:0]}), // input[9:0]
531  .data_out_b (hist_do), // output[31:0] reg
532  .re_even (hist_re_even), // input
533  .re_odd (hist_re_odd) // input
534  );
535  else if (HISTOGRAM_RAM_MODE=="BUF18")
536  sens_hist_ram_snglclk_18 sens_hist_ram_snglclk_18_i (
537  .pclk (pclk), // input
538  .addr_a_even ({hist_bank_pclk, hist_rwaddr_even}), // input[9:0]
539  .addr_a_odd ({hist_bank_pclk, hist_rwaddr_odd}), // input[9:0]
540  .data_in_a (r2[17:0]), // input[31:0]
541  .data_out_a_even (hist_new_even[17:0]), // output[31:0]
542  .data_out_a_odd (hist_new_odd[17:0]), // output[31:0]
543  .en_a_even (rwen_even), // input
544  .en_a_odd (rwen_odd), // input
545  .regen_a_even (regen_even), // input
546  .regen_a_odd (regen_odd), // input
547  .we_a_even (we_even), // input
548  .we_a_odd (we_odd), // input
549  .mclk (mclk), // input
550  .addr_b ({hist_bank_mclk,hist_raddr[9],hist_raddr[7:0]}), // input[9:0]
551  .data_out_b (hist_do), // output[31:0] reg
552  .re_even (hist_re_even), // input
553  .re_odd (hist_re_odd) // input
554  );
555 
556  endgenerate
557 
558 
559 endmodule
560 
562  input pclk,
563  input [9:0] addr_a_even,
564  input [9:0] addr_a_odd,
565  input [31:0] data_in_a,
566  output [31:0] data_out_a_even,
567  output [31:0] data_out_a_odd,
568  input en_a_even,
569  input en_a_odd,
571  input regen_a_odd,
572  input we_a_even,
573  input we_a_odd,
574 
575  input mclk,
576  input [9:0] addr_b,
577  output reg [31:0] data_out_b,
578  input re_even,
579  input re_odd
580 );
582  reg re_odd_d;
583  reg odd;
584  wire [31:0] data_out_b_w_even;
585  wire [31:0] data_out_b_w_odd;
586  always @(posedge mclk) begin
587  re_even_d <= re_even;
588  re_odd_d <= re_odd;
589  odd <= re_odd;
591  end
592 
594  .REGISTERS_A(1),
595  .REGISTERS_B(1),
596  .LOG2WIDTH_A(5),
597  .LOG2WIDTH_B(5),
598  .WRITE_MODE_A("NO_CHANGE"),
599  .WRITE_MODE_B("READ_FIRST")
600  ) ramt_var_w_var_r_even_i (
601  .clk_a (pclk), // input
602  .addr_a (addr_a_even), // input[10:0]
603  .en_a (en_a_even), // input
604  .regen_a (regen_a_even), // input
605  .we_a (we_a_even), // input
606  .data_out_a (data_out_a_even), // output[15:0]
607  .data_in_a (data_in_a), // input[15:0]
608  .clk_b (mclk), // input
609  .addr_b (addr_b), // input[10:0]
610  .en_b (re_even), // input
611  .regen_b (re_even_d), // input
612  .we_b (1'b1), // input
613  .data_out_b (data_out_b_w_even), // output[15:0]
614  .data_in_b (32'b0) // input[15:0]
615  );
616 
618  .REGISTERS_A(1),
619  .REGISTERS_B(1),
620  .LOG2WIDTH_A(5),
621  .LOG2WIDTH_B(5),
622  .WRITE_MODE_A("NO_CHANGE"),
623  .WRITE_MODE_B("READ_FIRST")
624  ) ramt_var_w_var_r_odd_i (
625  .clk_a (pclk), // input
626  .addr_a (addr_a_odd), // input[10:0]
627  .en_a (en_a_odd), // input
628  .regen_a (regen_a_odd), // input
629  .we_a (we_a_odd), // input
630  .data_out_a (data_out_a_odd), // output[15:0]
631  .data_in_a (data_in_a), // input[15:0]
632  .clk_b (mclk), // input
633  .addr_b (addr_b), // input[10:0]
634  .en_b (re_odd), // input
635  .regen_b (re_odd_d), // input
636  .we_b (1'b1), // input
637  .data_out_b (data_out_b_w_odd), // output[15:0]
638  .data_in_b (32'b0) // input[15:0]
639  );
640 
641 endmodule
642 
643 
645  input pclk,
646  input [9:0] addr_a_even,
647  input [9:0] addr_a_odd,
648  input [17:0] data_in_a,
649  output [17:0] data_out_a_even,
650  output [17:0] data_out_a_odd,
651  input en_a_even,
652  input en_a_odd,
654  input regen_a_odd,
655  input we_a_even,
656  input we_a_odd,
657 
658  input mclk,
659  input [9:0] addr_b,
660  output reg [31:0] data_out_b,
661  input re_even,
662  input re_odd
663 );
665  reg re_odd_d;
666  reg odd;
667  wire [17:0] data_out_b_w_even;
668  wire [17:0] data_out_b_w_odd;
669  always @(posedge mclk) begin
670  re_even_d <= re_even;
671  re_odd_d <= re_odd;
672  odd <= re_odd;
674  end
675 
677  .REGISTERS_A(1),
678  .REGISTERS_B(1),
679  .LOG2WIDTH_A(4),
680  .LOG2WIDTH_B(4),
681  .WRITE_MODE_A("NO_CHANGE"),
682  .WRITE_MODE_B("READ_FIRST")
683  ) ramt_var_w_var_r_even_i (
684  .clk_a (pclk), // input
685  .addr_a (addr_a_even), // input[10:0]
686  .en_a (en_a_even), // input
687  .regen_a (regen_a_even), // input
688  .we_a (we_a_even), // input
689  .data_out_a (data_out_a_even), // output[15:0]
690  .data_in_a (data_in_a), // input[15:0]
691  .clk_b (mclk), // input
692  .addr_b (addr_b), // input[10:0]
693  .en_b (re_even), // input
694  .regen_b (re_even_d), // input
695  .we_b (1'b1), // input
696  .data_out_b (data_out_b_w_even), // output[15:0]
697  .data_in_b (18'b0) // input[15:0]
698  );
699 
701  .REGISTERS_A(1),
702  .REGISTERS_B(1),
703  .LOG2WIDTH_A(4),
704  .LOG2WIDTH_B(4),
705  .WRITE_MODE_A("NO_CHANGE"),
706  .WRITE_MODE_B("READ_FIRST")
707  ) ramt_var_w_var_r_odd_i (
708  .clk_a (pclk), // input
709  .addr_a (addr_a_odd), // input[10:0]
710  .en_a (en_a_odd), // input
711  .regen_a (regen_a_odd), // input
712  .we_a (we_a_odd), // input
713  .data_out_a (data_out_a_odd), // output[15:0]
714  .data_in_a (data_in_a), // input[15:0]
715  .clk_b (mclk), // input
716  .addr_b (addr_b), // input[10:0]
717  .en_b (re_odd), // input
718  .regen_b (re_odd_d), // input
719  .we_b (1'b1), // input
720  .data_out_b (data_out_b_w_odd), // output[15:0]
721  .data_in_b (18'b0) // input[15:0]
722  );
723 
724 endmodule
725 
727  output hist_rq,
728  output [31:0] hist_do,
729  output hist_dv
730 `ifdef DEBUG_RING
731  , output debug_do,
732  input debug_di
733 `endif
734 );
735  assign hist_rq = 0;
736  assign hist_do = 0;
737  assign hist_dv = 0;
738 `ifdef DEBUG_RING
739  assign debug_do = debug_di;
740 `endif
741 
742 endmodule
10332clk
Definition: dly_16.v:44
sens_hist_ram_snglclk_18_i sens_hist_ram_snglclk_18[generate]
[14-LOG2WIDTH_A:0] 12040addr_a
[WRITE_WIDTH - 1 : 0] 10318wr_data
Definition: debug_slave.v:56
7513HIST_WIDTH(HISTOGRAM_RAM_MODE == "BUF18") ? 18 : 32
[9 << LOG2WIDTH_A-3-1:0] 11800data_in_a
[ADDR_MASK2!=0?2:ADDR_MASK1!=0?1:0:0] 9935we
Definition: cmd_deser.v:60
[1 << LOG2WIDTH_A-1:0] 12045data_in_a
[WIDTH-1:0] 10336dout
Definition: dly_16.v:48
[1 << LOG2WIDTH_B-1:0] 12052data_in_b
[READ_WIDTH - 1 : 0] 10317rd_data
Definition: debug_slave.v:55
7587hist_new_oddwire[HIST_WIDTH-1:0]
sens_hist_ram_snglclk_32_i sens_hist_ram_snglclk_32[generate]
[1 << LOG2WIDTH_A-1:0] 12044data_out_a
[WIDTH-1:0] 10335din
Definition: dly_16.v:47
[DATA_WIDTH-1:0] 9934data
Definition: cmd_deser.v:59
[14-LOG2WIDTH_B:0] 12047addr_b
[7:0] 9931ad
Definition: cmd_deser.v:56
[ADDR_WIDTH-1:0] 9933addr
Definition: cmd_deser.v:58
cmd_deser_sens_histogram_i cmd_deser
[1 << LOG2WIDTH_B-1:0] 12051data_out_b
[9 << LOG2WIDTH_B-3-1:0] 11806data_out_b
ramt_var_w_var_r_odd_i ram18tp_var_w_var_r
7586hist_new_evenwire[HIST_WIDTH-1:0]
[9 << LOG2WIDTH_A-3-1:0] 11799data_out_a
ramt_var_w_var_r_odd_i ramt_var_w_var_r
[13-LOG2WIDTH_B:0] 11802addr_b
dly_16_eq_prev_d3_i dly_16
[9 << LOG2WIDTH_B-3-1:0] 11807data_in_b
[13-LOG2WIDTH_A:0] 11795addr_a
10333rst
Definition: dly_16.v:45
pulse_cross_clock_hist_xfer_done_i pulse_cross_clock
[3:0] 10334dly
Definition: dly_16.v:46