x393  1.0
FPGAcodeforElphelNC393camera
mcntrl393_test01.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42  parameter MCNTRL_TEST01_ADDR= 'h0f0,
43  parameter MCNTRL_TEST01_MASK= 'h7f0,
44  parameter FRAME_HEIGHT_BITS= 16, // Maximal frame height
45  parameter MCNTRL_TEST01_CHN1_MODE= 'h2, // set mode register for channel 5
46  parameter MCNTRL_TEST01_CHN1_STATUS_CNTRL= 'h3, // control status reporting for channel 5
47  parameter MCNTRL_TEST01_CHN2_MODE= 'h4, // set mode register for channel 2
48  parameter MCNTRL_TEST01_CHN2_STATUS_CNTRL= 'h5, // control status reporting for channel 2
49  parameter MCNTRL_TEST01_CHN3_MODE= 'h6, // set mode register for channel 3
50  parameter MCNTRL_TEST01_CHN3_STATUS_CNTRL= 'h7, // control status reporting for channel 3
51  parameter MCNTRL_TEST01_CHN4_MODE= 'h8, // set mode register for channel 4
52  parameter MCNTRL_TEST01_CHN4_STATUS_CNTRL= 'h9, // control status reporting for channel 4
53  parameter MCNTRL_TEST01_STATUS_REG_CHN1_ADDR= 'h3c, // status/readback register for channel 2
54  parameter MCNTRL_TEST01_STATUS_REG_CHN2_ADDR= 'h3d, // status/readback register for channel 3
55  parameter MCNTRL_TEST01_STATUS_REG_CHN3_ADDR= 'h3e, // status/readback register for channel 4
56  parameter MCNTRL_TEST01_STATUS_REG_CHN4_ADDR= 'h3f // status/readback register for channel 4
57 )(
58  input mrst,
59  input mclk, // global clock, half DDR3 clock, synchronizes all I/O through the command port
60  // programming interface
61  input [7:0] cmd_ad, // byte-serial command address/data (up to 6 bytes: AL-AH-D0-D1-D2-D3
62  input cmd_stb, // strobe (with first byte) for the command a/d
63  output [7:0] status_ad, // status address/data - up to 5 bytes: A - {seq,status[1:0]} - status[2:9] - status[10:17] - status[18:25]
64  output status_rq, // input request to send status downstream
65  input status_start, // Acknowledge of the first status packet byte (address)
66 
67  output frame_start_chn1, // input
68  output next_page_chn1, // input
69  input page_ready_chn1, // output
70  input frame_done_chn1, // output
71  input [FRAME_HEIGHT_BITS-1:0] line_unfinished_chn1, // output[15:0]
72  output suspend_chn1, // input
73 
74  output frame_start_chn2, // input
75  output next_page_chn2, // input
76  input page_ready_chn2, // output
77  input frame_done_chn2, // output
78  input [FRAME_HEIGHT_BITS-1:0] line_unfinished_chn2, // output[15:0]
79  output suspend_chn2, // input
80 
81  output frame_start_chn3, // input
82  output next_page_chn3, // input
83  input page_ready_chn3, // output
84  input frame_done_chn3, // output
85  input [FRAME_HEIGHT_BITS-1:0] line_unfinished_chn3, // output[15:0]
86  output suspend_chn3, // input
87 
88  output frame_start_chn4, // input
89  output next_page_chn4, // input
90  input page_ready_chn4, // output
91  input frame_done_chn4, // output
92  input [FRAME_HEIGHT_BITS-1:0] line_unfinished_chn4, // output[15:0]
93  output suspend_chn4 // input
94 
95 );
96  localparam PAGE_BITS=4; // number of LSB to indicate pages read/written
98  wire cmd_we;
99  wire [3:0] cmd_a;
100  wire [7:0] cmd_data;
102  wire [7:0] status_chn1_ad;
104  wire status_chn1_start; // input
106  wire [7:0] status_chn2_ad;
108  wire status_chn2_start; // input
110  wire [7:0] status_chn3_ad;
112  wire status_chn3_start; // input
114  wire [7:0] status_chn4_ad;
116  wire status_chn4_start; // input
117 
118  reg [PAGE_BITS-1:0] page_chn1;
119  reg [PAGE_BITS-1:0] page_chn2;
120  reg [PAGE_BITS-1:0] page_chn3;
121  reg [PAGE_BITS-1:0] page_chn4;
134 
135 
136  wire set_chn1_mode= cmd_we && (cmd_a== MCNTRL_TEST01_CHN1_MODE); // set mode register for channel 1
137  wire set_chn1_status= cmd_we && (cmd_a== MCNTRL_TEST01_CHN1_STATUS_CNTRL); // control status reporting for channel 1
138  wire set_chn2_mode= cmd_we && (cmd_a== MCNTRL_TEST01_CHN2_MODE); // set mode register for channel 2
139  wire set_chn2_status= cmd_we && (cmd_a== MCNTRL_TEST01_CHN2_STATUS_CNTRL); // control status reporting for channel 2
140  wire set_chn3_mode= cmd_we && (cmd_a== MCNTRL_TEST01_CHN3_MODE); // set mode register for channel 3
141  wire set_chn3_status= cmd_we && (cmd_a== MCNTRL_TEST01_CHN3_STATUS_CNTRL); // control status reporting for channel 3
142  wire set_chn4_mode= cmd_we && (cmd_a== MCNTRL_TEST01_CHN4_MODE); // set mode register for channel 4
143  wire set_chn4_status= cmd_we && (cmd_a== MCNTRL_TEST01_CHN4_STATUS_CNTRL); // control status reporting for channel 4
155 
164  assign suspend_chn1 = suspend_chn1_r;
165  assign suspend_chn2 = suspend_chn2_r;
166  assign suspend_chn3 = suspend_chn3_r;
167  assign suspend_chn4 = suspend_chn4_r;
172 
173  always @ (posedge mclk) begin
182  end
183 
184  always @ (posedge mclk) begin
185  if (mrst) page_chn1 <= 0;
186  else if (frame_start_chn1_r) page_chn1 <= 0;
187  else if (page_ready_chn1) page_chn1 <= page_chn1 + 1;
188 
189  if (mrst) page_chn2 <= 0;
190  else if (frame_start_chn2_r) page_chn2 <= 0;
191  else if (page_ready_chn2) page_chn2 <= page_chn2 + 1;
192 
193  if (mrst) page_chn3 <= 0;
194  else if (frame_start_chn3_r) page_chn3 <= 0;
195  else if (page_ready_chn3) page_chn3 <= page_chn3 + 1;
196 
197  if (mrst) page_chn4 <= 0;
198  else if (frame_start_chn4_r) page_chn4 <= 0;
199  else if (page_ready_chn4) page_chn4 <= page_chn4 + 1;
200 
201 
202  if (mrst) suspend_chn1_r <= 0;
204 
205  if (mrst) suspend_chn2_r <= 0;
207 
208  if (mrst) suspend_chn3_r <= 0;
210 
211  if (mrst) suspend_chn4_r <= 0;
213 
214  if (mrst) frame_busy_chn1 <= 0;
217 
218  if (mrst) frame_busy_chn2 <= 0;
221 
222  if (mrst) frame_busy_chn3 <= 0;
225 
226  if (mrst) frame_busy_chn4 <= 0;
229 
230  if (mrst) frame_finished_chn1 <= 0;
233 
234  if (mrst) frame_finished_chn2 <= 0;
237 
238  if (mrst) frame_finished_chn3 <= 0;
241 
242  if (mrst) frame_finished_chn4 <= 0;
245  end
246 
247  always @ (posedge mclk) begin
256  end
257 
259  .ADDR (MCNTRL_TEST01_ADDR),
260  .ADDR_MASK (MCNTRL_TEST01_MASK),
261  .NUM_CYCLES (3),
262  .ADDR_WIDTH (4),
263  .DATA_WIDTH (8)
264  ) cmd_deser_mcontr_test01_8bit_i (
265  .rst (1'b0), // rst), // input
266  .clk (mclk), // input
267  .srst (mrst), // input
268  .ad (cmd_ad), // input[7:0]
269  .stb (cmd_stb), // input
270  .addr (cmd_a), // output[15:0]
271  .data (cmd_data), // output[31:0]
272  .we (cmd_we) // output
273  );
274 
275 
276  status_router4 status_router4_i (
277  .rst (1'b0), // rst), // input
278  .clk (mclk), // input
279  .srst (mrst), // input
280  .db_in0 (status_chn1_ad), // input[7:0]
281  .rq_in0 (status_chn1_rq), // input
282  .start_in0 (status_chn1_start), // output
283  .db_in1 (status_chn2_ad), // input[7:0]
284  .rq_in1 (status_chn2_rq), // input
285  .start_in1 (status_chn2_start), // output
286  .db_in2 (status_chn3_ad), // input[7:0]
287  .rq_in2 (status_chn3_rq), // input
288  .start_in2 (status_chn3_start), // output
289  .db_in3 (status_chn4_ad), // input[7:0]
290  .rq_in3 (status_chn4_rq), // input
291  .start_in3 (status_chn4_start), // output
292 
293  .db_out (status_ad), // output[7:0]
294  .rq_out (status_rq), // output
295  .start_out (status_start) // input
296  );
297 
299  .STATUS_REG_ADDR(MCNTRL_TEST01_STATUS_REG_CHN1_ADDR),
300  .PAYLOAD_BITS(STATUS_PAYLOAD_BITS)
301  ) status_generate_chn1_i (
302  .rst (1'b0), // rst), // input
303  .clk (mclk), // input
304  .srst (mrst), // input
305  .we (set_chn1_status), // input
306  .wd (cmd_data[7:0]), // input[7:0]
307  .status (status_chn1), // input[25:0]
308  .ad (status_chn1_ad), // output[7:0]
309  .rq (status_chn1_rq), // output
310  .start (status_chn1_start) // input
311  );
312 
314  .STATUS_REG_ADDR(MCNTRL_TEST01_STATUS_REG_CHN2_ADDR),
315  .PAYLOAD_BITS(STATUS_PAYLOAD_BITS)
316  ) status_generate_chn2_i (
317  .rst (1'b0), // rst), // input
318  .clk (mclk), // input
319  .srst (mrst), // input
320  .we (set_chn2_status), // input
321  .wd (cmd_data[7:0]), // input[7:0]
322  .status (status_chn2), // input[25:0]
323  .ad (status_chn2_ad), // output[7:0]
324  .rq (status_chn2_rq), // output
325  .start (status_chn2_start) // input
326  );
327 
329  .STATUS_REG_ADDR(MCNTRL_TEST01_STATUS_REG_CHN3_ADDR),
330  .PAYLOAD_BITS(STATUS_PAYLOAD_BITS)
331  ) status_generate_chn3_i (
332  .rst (1'b0), // rst), // input
333  .clk (mclk), // input
334  .srst (mrst), // input
335  .we (set_chn3_status), // input
336  .wd (cmd_data[7:0]), // input[7:0]
337  .status (status_chn3), // input[25:0]
338  .ad (status_chn3_ad), // output[7:0]
339  .rq (status_chn3_rq), // output
340  .start (status_chn3_start) // input
341  );
342 
344  .STATUS_REG_ADDR(MCNTRL_TEST01_STATUS_REG_CHN4_ADDR),
345  .PAYLOAD_BITS(STATUS_PAYLOAD_BITS)
346  ) status_generate_chn4_i (
347  .rst (1'b0), // rst), // input
348  .clk (mclk), // input
349  .srst (mrst), // input
350  .we (set_chn4_status), // input
351  .wd (cmd_data[7:0]), // input[7:0]
352  .status (status_chn4), // input[25:0]
353  .ad (status_chn4_ad), // output[7:0]
354  .rq (status_chn4_rq), // output
355  .start (status_chn4_start) // input
356  );
357 
358 endmodule
359 
5120page_chn1reg[PAGE_BITS-1:0]
5100STATUS_PAYLOAD_BITSFRAME_HEIGHT_BITS+PAGE_BITS+2
5105status_chn1_adwire[7:0]
[7:0] 10990db_in2
[FRAME_HEIGHT_BITS-1:0] 5079line_unfinished_chn1
5109status_chn2_adwire[7:0]
[ADDR_MASK2!=0?2:ADDR_MASK1!=0?1:0:0] 9935we
Definition: cmd_deser.v:60
5061MCNTRL_TEST01_CHN3_STATUS_CNTRL'h7
status_router4_i status_router4
5064MCNTRL_TEST01_STATUS_REG_CHN1_ADDR'h3c
5112status_chn3wire[STATUS_PAYLOAD_BITS-1:0]
5108status_chn2wire[STATUS_PAYLOAD_BITS-1:0]
[7:0] 10984db_in0
5116status_chn4wire[STATUS_PAYLOAD_BITS-1:0]
[FRAME_HEIGHT_BITS-1:0] 5097line_unfinished_chn4
5122page_chn3reg[PAGE_BITS-1:0]
[DATA_WIDTH-1:0] 9934data
Definition: cmd_deser.v:59
status_generate_chn4_i status_generate
5065MCNTRL_TEST01_STATUS_REG_CHN2_ADDR'h3d
5121page_chn2reg[PAGE_BITS-1:0]
5066MCNTRL_TEST01_STATUS_REG_CHN3_ADDR'h3e
[FRAME_HEIGHT_BITS-1:0] 5085line_unfinished_chn2
[7:0] 10996db_out
[7:0] 9931ad
Definition: cmd_deser.v:56
[ADDR_WIDTH-1:0] 9933addr
Definition: cmd_deser.v:58
[7:0] 10993db_in3
5113status_chn3_adwire[7:0]
5059MCNTRL_TEST01_CHN2_STATUS_CNTRL'h5
5104status_chn1wire[STATUS_PAYLOAD_BITS-1:0]
[FRAME_HEIGHT_BITS-1:0] 5091line_unfinished_chn3
5117status_chn4_adwire[7:0]
cmd_deser_mcontr_test01_8bit_i cmd_deser
5063MCNTRL_TEST01_CHN4_STATUS_CNTRL'h9
[7:0] 10987db_in1
[ALL_BITS-1:0] 10777status
5123page_chn4reg[PAGE_BITS-1:0]
5067MCNTRL_TEST01_STATUS_REG_CHN4_ADDR'h3f
5057MCNTRL_TEST01_CHN1_STATUS_CNTRL'h3