x393  1.0
FPGAcodeforElphelNC393camera
sens_sync.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
41 module sens_sync#(
42  parameter SENS_SYNC_ADDR = 'h404,
43  parameter SENS_SYNC_MASK = 'h7fc,
44  // 2 locations reserved for control/status (if they will be needed)
45  parameter SENS_SYNC_MULT = 'h2, // relative register address to write number of frames to combine in one (minus 1, '0' - each farme)
46  parameter SENS_SYNC_LATE = 'h3, // number of lines to delay late frame sync
47  parameter SENS_SYNC_FBITS = 16, // number of bits in a frame counter for linescan mode
48  parameter SENS_SYNC_LBITS = 16, // number of bits in a line counter for sof_late output (limited by eof)
49  parameter SENS_SYNC_LATE_DFLT = 15, // number of lines to delay late frame sync
50  parameter SENS_SYNC_MINBITS = 8, // number of bits to enforce minimal frame period
51  parameter SENS_SYNC_MINPER = 130 // minimal frame period (in pclk/mclk?)
52 
53 )(
54 // input rst, // global reset
55  input pclk, // global clock input, pixel rate (96MHz for MT9P006)
56  input mclk, // global system clock, synchronizes commands
57  input mrst, // @mclk sync reset
58  input prst, // @mclk sync reset
59  input en, // @pclk enable channel (0 resets counters)
60  input sof_in, // @pclk start of frame input, single-cycle
61  input eof_in, // @pclk end of frame input, single-cycle (to limit sof_late
62  input hact, // @pclk (use to count lines for delayed pulse)
63  input trigger_mode,// @mclk - 1 - triggered mode, 0 - free running mode
64  input trig_in, // @mclk - single-cycle trigger input
65  output trig, // @pclk trigger signal to the sensor - from trig_in until SOF
66  output reg sof_out_pclk,// @pclk - use in the same sensor_channel module
67  output sof_out, // @mclk - single-cycle frame sync (no delay)
68  output sof_late, // @mclk - single-cycle frame sync (delayed)
69 
70  input [7:0] cmd_ad, // byte-serial command address/data (up to 6 bytes: AL-AH-D0-D1-D2-D3
71  input cmd_stb // strobe (with first byte) for the command a/d
72 
73 );
75  reg [SENS_SYNC_FBITS-1:0] sub_frames_pclk = 0; // sub-frame number ("linescan" mode)
76  reg [SENS_SYNC_LBITS-1:0] line_dly_pclk = SENS_SYNC_LATE_DFLT; // sub-frame number ("linescan" mode)
77  reg [SENS_SYNC_FBITS-1:0] sub_frames_left; // sub-frame number ("linescan" mode)
78  reg [SENS_SYNC_FBITS-1:0] lines_left; //Number of lines left to generate sof_late
80  wire [31:0] cmd_data;
81  wire [1:0] cmd_a;
82  wire cmd_we;
83  reg [1:0] cmd_a_r;
89  reg hact_r;
91  reg sof_dly; // from sof_in to sof_out;
92  wire last_line;
95  reg en_vacts_free=1'b1; // register to allow only one vacts after trigger in triggered mode. Allows first vacts after mode is set
96  reg overdue; // generated at camsync to bypass filtering out second vact after trigger. Needed to prevent lock-up
97  // when exposure > triger period (and trigger is operated as divide-by-2)
98  reg trig_r;
100  reg period_dly; // runnning counter to enforce > min period
101 
102  assign set_data_mclk = cmd_we && ((cmd_a == SENS_SYNC_MULT) || (cmd_a == SENS_SYNC_LATE));
103  assign zero_frames_left = !(|sub_frames_left);
104  assign hact_single = hact && !hact_r;
105  assign last_line = !(|lines_left);
106  assign pre_sof_late = sof_dly && (eof_in || (hact_single && last_line));
107  assign trig = trig_r;
109 
110  always @ (posedge mclk) begin
112  if (set_data_mclk) cmd_a_r <= cmd_a;
113  end
114 
115  always @ (posedge pclk) begin
118 
121 
123  else if (sof_in) sub_frames_left <= sub_frames_left - 1;
124 
125  if (!en) hact_r <= hact;
126 
127  if (!en) sof_dly <= 0;
128  else if (pre_sof_out) sof_dly <= 1;
129  else if (pre_sof_late) sof_dly <= 0;
130 
131  else if (!sof_dly) lines_left <= line_dly_pclk;
132  else if (hact_single) lines_left <= lines_left - 1;
133 
135 
136  if (!trigger_mode_pclk || !en) en_vacts_free<= 1'b1;
137  else if (sof_in) en_vacts_free<= 1'b0;
138 
139  if (pre_sof_out || !trigger_mode_pclk) overdue <= 1'b0;
140  else if (trig_in_pclk) overdue <= trig_r;
141 
142  if (!en || !trigger_mode_pclk || sof_in) trig_r <=0;
143  else if (trig_in_pclk) trig_r <= ~trig_r;
144 
145  // enforce minimal frame period (applies to both normal and delayed pulse (Make it only in free-running mode?)
146  if (!en || !(&period_cntr)) period_dly <= 0;
147  else if (pre_sof_out) period_dly <= 1;
148 
150  else period_cntr <= period_cntr - 1;
151 
153 
154  end
155 
157  .ADDR (SENS_SYNC_ADDR),
158  .ADDR_MASK (SENS_SYNC_MASK),
159  .NUM_CYCLES (6),
160  .ADDR_WIDTH (2),
161  .DATA_WIDTH (32),
162  .ADDR1 (0),
163  .ADDR_MASK1 (0),
164  .ADDR2 (0),
165  .ADDR_MASK2 (0)
166  ) cmd_deser_sens_sync_i (
167  .rst (1'b0), // input
168  .clk (mclk), // input
169  .srst (mrst), // input
170  .ad (cmd_ad), // input[7:0]
171  .stb (cmd_stb), // input
172  .addr (cmd_a), // output[15:0]
173  .data (cmd_data), // output[31:0]
174  .we (cmd_we) // output
175  );
176 
177  // mclk -> pclk
178  pulse_cross_clock pulse_cross_clock_set_data_pclk_i (
179  .rst (mrst), // input
180  .src_clk (mclk), // input
181  .dst_clk (pclk), // input
182  .in_pulse (set_data_mclk), // input
183  .out_pulse (set_data_pclk), // output
184  .busy() // output
185  );
186 
187  pulse_cross_clock pulse_cross_clock_trig_in_pclk_i (
188  .rst (mrst), // input
189  .src_clk (mclk), // input
190  .dst_clk (pclk), // input
191  .in_pulse (trig_in), // input
192  .out_pulse (trig_in_pclk), // output
193  .busy() // output
194  );
195 
196  // pclk -> mclk
197  pulse_cross_clock pulse_cross_clock_sof_out_i (
198  .rst (prst), // input
199  .src_clk (pclk), // input
200  .dst_clk (mclk), // input
201  .in_pulse (pre_sof_out), // input
202  .out_pulse (sof_out), // output
203  .busy() // output
204  );
205  pulse_cross_clock pulse_cross_clock_sof_late_i (
206  .rst (prst), // input
207  .src_clk (pclk), // input
208  .dst_clk (mclk), // input
209  .in_pulse (pre_sof_late), // input
210  .out_pulse (sof_late), // output
211  .busy() // output
212  );
213 
214 endmodule
215 
7821set_data_pclkwire
Definition: sens_sync.v:85
7819cmd_a_rreg[1:0]
Definition: sens_sync.v:83
pulse_cross_clock_sof_late_i pulse_cross_clock
Definition: sens_sync.v:205
7786SENS_SYNC_MASK'h7fc
Definition: sens_sync.v:43
7834period_cntrreg[SENS_SYNC_MINBITS-1:0]
Definition: sens_sync.v:99
cmd_deser_sens_sync_i cmd_deser
Definition: sens_sync.v:156
7814lines_leftreg[SENS_SYNC_FBITS-1:0]
Definition: sens_sync.v:78
7818cmd_wewire
Definition: sens_sync.v:82
7787SENS_SYNC_MULT'h2
Definition: sens_sync.v:45
7825hact_rreg
Definition: sens_sync.v:89
7791SENS_SYNC_LATE_DFLT15
Definition: sens_sync.v:49
[7:0] 7808cmd_ad
Definition: sens_sync.v:70
[ADDR_MASK2!=0?2:ADDR_MASK1!=0?1:0:0] 9935we
Definition: cmd_deser.v:60
7816cmd_datawire[31:0]
Definition: sens_sync.v:80
7823trig_in_pclkwire
Definition: sens_sync.v:87
7827sof_dlyreg
Definition: sens_sync.v:91
7815cmd_data_rreg[DATA_WIDTH-1:0]
Definition: sens_sync.v:79
7833trig_rreg
Definition: sens_sync.v:98
7828last_linewire
Definition: sens_sync.v:92
7831en_vacts_freereg
Definition: sens_sync.v:95
[DATA_WIDTH-1:0] 9934data
Definition: cmd_deser.v:59
7790SENS_SYNC_LBITS16
Definition: sens_sync.v:48
7810DATA_WIDTH(SENS_SYNC_FBITS > SENS_SYNC_LBITS) ? SENS_SYNC_FBITS : SENS_SYNC_LBITS
Definition: sens_sync.v:74
[7:0] 9931ad
Definition: cmd_deser.v:56
reg 7805sof_out_pclk
Definition: sens_sync.v:66
[ADDR_WIDTH-1:0] 9933addr
Definition: cmd_deser.v:58
7817cmd_awire[1:0]
Definition: sens_sync.v:81
7793SENS_SYNC_MINPER130
Definition: sens_sync.v:51
7812line_dly_pclkreg[SENS_SYNC_LBITS-1:0]
Definition: sens_sync.v:76
7789SENS_SYNC_FBITS16
Definition: sens_sync.v:47
7829pre_sof_latewire
Definition: sens_sync.v:93
7824pre_sof_outwire
Definition: sens_sync.v:88
7811sub_frames_pclkreg[SENS_SYNC_FBITS-1:0]
Definition: sens_sync.v:75
7832overduereg
Definition: sens_sync.v:96
7830trigger_mode_pclkreg
Definition: sens_sync.v:94
7820set_data_mclkwire
Definition: sens_sync.v:84
7802trigger_mode
Definition: sens_sync.v:63
7822zero_frames_leftwire
Definition: sens_sync.v:86
7807sof_late
Definition: sens_sync.v:68
7785SENS_SYNC_ADDR'h404
Definition: sens_sync.v:42
7792SENS_SYNC_MINBITS8
Definition: sens_sync.v:50
7788SENS_SYNC_LATE'h3
Definition: sens_sync.v:46
7813sub_frames_leftreg[SENS_SYNC_FBITS-1:0]
Definition: sens_sync.v:77
7826hact_singlewire
Definition: sens_sync.v:90
7835period_dlyreg
Definition: sens_sync.v:100