x393  1.0
FPGAcodeforElphelNC393camera
sens_histogram_mux.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42  input mclk,
43  input en,
44 
45  input rq0,
46  output grant0,
47  input dav0,
48  input [31:0] din0,
49 
50  input rq1,
51  output grant1,
52  input dav1,
53  input [31:0] din1,
54 
55  input rq2,
56  output grant2,
57  input dav2,
58  input [31:0] din2,
59 
60  input rq3,
61  output grant3,
62  input dav3,
63  input [31:0] din3,
64 
65  output rq,
66  input grant, // grant may stay longer, not masked by rq?
67  output [1:0] chn,
68  output dv,
69  output [31:0] dout
70 );
71 
72  reg [2:0] burst0;
73  reg [2:0] burst1;
74  reg [2:0] burst2;
75  reg [2:0] burst3;
76 
77  wire [3:0] pri_rq;
78  reg [2:0] enc_rq;
79  wire busy_w;
80  reg busy_r;
81  reg [1:0] mux_sel;
82  wire start_w;
83 // reg start_r;
84  reg started;
85  wire dav_in;
86  reg dav_out;
87  wire [31:0] din;
88  reg [31:0] dout_r;
90  wire [3:0] chn_sel;
91  wire [3:0] chn_start;
92  wire [3:0] burst_next;
93  reg [3:0] chn_grant;
94  wire rq_in;
95  reg rq_out;
96 
97  assign pri_rq = {rq3 & ~rq2 & ~rq1 & ~rq0, rq2 & ~rq1 & ~ rq0, rq1 & ~ rq0, rq0};
98  assign busy_w = |burst0 || (|burst1) || (|burst2) || (|burst3);
99  assign start_w = enc_rq[2] && !busy_r && !started;
100  assign dav_in = mux_sel[1] ? (mux_sel[0] ? dav3 : dav2) : (mux_sel[0] ? dav1 : dav0);
101  assign din = mux_sel[1] ? (mux_sel[0] ? din3 : din2) : (mux_sel[0] ? din1 : din0);
102  assign rq_in = mux_sel[1] ? (mux_sel[0] ? rq3 : rq2) : (mux_sel[0] ? rq1 : rq0);
103  assign burst_done_w = dav_out && !dav_in;
104  assign chn_start = {4{start_w}} & {enc_rq[1] & enc_rq[0], enc_rq[1] & ~enc_rq[0], ~enc_rq[1] & enc_rq[0], ~enc_rq[1] & ~enc_rq[0]};
105  assign chn_sel = {mux_sel[1] & mux_sel[0], mux_sel[1] & ~mux_sel[0], ~mux_sel[1] & mux_sel[0], ~mux_sel[1] & ~mux_sel[0]};
106  assign burst_next = {4{burst_done_w}} & chn_sel;
107 
108  assign dout = dout_r;
109  assign grant0 = chn_grant[0];
110  assign grant1 = chn_grant[1];
111  assign grant2 = chn_grant[2];
112  assign grant3 = chn_grant[3];
113  assign rq = rq_out;
114  assign dv = dav_out;
115  assign chn = mux_sel;
116 
117  always @(posedge mclk) begin
118  enc_rq <= {|pri_rq, pri_rq[3] | pri_rq[2], pri_rq[3] | pri_rq[1]};
119  busy_r <= busy_w;
120  if (!en || busy_r) started <= 0;
121  else if (enc_rq[2]) started <= 1;
122  if (start_w) mux_sel <= enc_rq[1:0];
123  dav_out <= dav_in;
124  dout_r <= din;
125 
126  if (!en) burst0 <= 0;
127  else if (chn_start[0]) burst0 <= 4;
128  else if (burst_next[0]) burst0 <= burst0 + 1;
129 
130  if (!en) burst1 <= 0;
131  else if (chn_start[1]) burst1 <= 4;
132  else if (burst_next[1]) burst1 <= burst1 + 1;
133 
134  if (!en) burst2 <= 0;
135  else if (chn_start[2]) burst2 <= 4;
136  else if (burst_next[2]) burst2 <= burst2 + 1;
137 
138  if (!en) burst3 <= 0;
139  else if (chn_start[3]) burst3 <= 4;
140  else if (burst_next[3]) burst3 <= burst3 + 1;
141 
142  if (!en) chn_grant <= 0;
143  else chn_grant <= {4{grant & rq}} & chn_sel;
144 // else chn_grant <= {4{grant & rq}} & chn_sel;
145 // start_r <= en & start_w;
146  if (!en ) rq_out <= 0;
147  else if (started) rq_out <= 1;
148  else if (rq_out) rq_out <= rq_in;
149 // rq_out <= en && rq_in;
150  end
151 
152 endmodule
153