x393  1.0
FPGAcodeforElphelNC393camera
cmd_deser.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
41 module cmd_deser#(
42  parameter ADDR=0,
43  parameter ADDR_MASK = 'hffff,
44  parameter NUM_CYCLES = 6,
45  parameter ADDR_WIDTH = 16,
46  parameter DATA_WIDTH = 32,
47  parameter ADDR1 = 0, // optional second address
48  parameter ADDR_MASK1 = 0, // optional second mask
49  parameter ADDR2 = 0, // optional third address
50  parameter ADDR_MASK2 = 0, // optional third mask
51  parameter WE_EARLY = 0 // if 1 - we and addr will be valid 1 cycle before data
52 )(
53  input rst,
54  input clk,
55  input srst, // sync reset
56  input [7:0] ad,
57  input stb,
58  output [ADDR_WIDTH-1:0] addr,
59  output [DATA_WIDTH-1:0] data,
60  output [(ADDR_MASK2!=0)?2:((ADDR_MASK1!=0)?1:0):0] we
61 );
62  localparam WE_WIDTH=(ADDR_MASK2!=0)?3:((ADDR_MASK1!=0)?2:1);
63  generate
64  if (NUM_CYCLES==1)
66  .ADDR (ADDR),
70  .ADDR1 (ADDR1),
72  .ADDR2 (ADDR2),
74  .WE_WIDTH (WE_WIDTH),
76  ) i_cmd_deser_single (
77  .rst(rst),
78  .clk(clk),
79  .srst(srst),
80  .ad(ad),
81  .stb(stb),
82  .addr(addr),
83  .data(data),
84  .we(we)
85  );
86  else if (NUM_CYCLES==2)
88  .ADDR(ADDR),
92  .ADDR1 (ADDR1),
94  .ADDR2 (ADDR2),
96  .WE_WIDTH (WE_WIDTH),
98  ) i_cmd_deser_dual (
99  .rst(rst),
100  .clk(clk),
101  .srst(srst),
102  .ad(ad),
103  .stb(stb),
104  .addr(addr),
105  .data(data),
106  .we(we)
107  );
108  else
110  .ADDR(ADDR),
115  .ADDR1 (ADDR1),
117  .ADDR2 (ADDR2),
119  .WE_WIDTH (WE_WIDTH),
120  .WE_EARLY (WE_EARLY)
121  ) i_cmd_deser_multi (
122  .rst(rst),
123  .clk(clk),
124  .srst(srst),
125  .ad(ad),
126  .stb(stb),
127  .addr(addr),
128  .data(data),
129  .we(we)
130  );
131 
132  endgenerate
133 
134 endmodule
135 
137  parameter ADDR=0,
138  parameter ADDR_MASK='hffff,
139  parameter ADDR_WIDTH=8, // <=8
140  parameter DATA_WIDTH=1, // will 0 work?
141  parameter ADDR1=0,
142  parameter ADDR_MASK1=0,
143  parameter ADDR2=0,
144  parameter ADDR_MASK2=0,
145  parameter WE_WIDTH=1,
146  parameter WE_EARLY = 0 //
147 
148 )(
149  input rst,
150  input clk,
151  input srst, // sync reset
152  input [7:0] ad,
153  input stb,
154  output [ADDR_WIDTH-1:0] addr,
155  output [DATA_WIDTH-1:0] data,
156  output [WE_WIDTH-1:0] we
157 );
158  localparam ADDR_LOW= ADDR & 8'hff;
159  localparam ADDR_MASK_LOW= ADDR_MASK & 8'hff;
160  localparam ADDR_LOW1= ADDR1 & 8'hff;
161  localparam ADDR_MASK_LOW1= ADDR_MASK1 & 8'hff;
162  localparam ADDR_LOW2= ADDR2 & 8'hff;
163  localparam ADDR_MASK_LOW2= ADDR_MASK2 & 8'hff;
164  reg [7:0] deser_r;
165  wire [2:0] match_low;
166  reg [2:0] we_r;
167 
168  assign we = (WE_EARLY > 0)?(match_low[WE_WIDTH-1:0] & {WE_WIDTH{stb}}):we_r[WE_WIDTH-1:0];
169  assign match_low= { // unused bits will be optimized
170  ((ad ^ ADDR_LOW2) & (8'hff & ADDR_MASK_LOW2)) == 0,
171  ((ad ^ ADDR_LOW1) & (8'hff & ADDR_MASK_LOW1)) == 0,
172  ((ad ^ ADDR_LOW ) & (8'hff & ADDR_MASK_LOW )) == 0};
173  always @ (posedge rst or posedge clk) begin
174  if (rst) we_r <= 0;
175  else if (srst) we_r <= 0;
176  else we_r <= match_low & {3{stb}};
177  if (rst) deser_r <= 0;
178  else if (srst) deser_r <= 0;
179  else if ((|match_low) && stb) deser_r <= ad;
180  end
181  assign data={DATA_WIDTH{1'b0}};
182 // assign addr=deser_r[ADDR_WIDTH-1:0];
183  assign addr=(WE_EARLY>0) ? ad[ADDR_WIDTH-1:0]: deser_r[ADDR_WIDTH-1:0];
184 endmodule
185 
187  parameter ADDR=0,
188  parameter ADDR_MASK='hffff,
189  parameter ADDR_WIDTH=12, // <=16
190  parameter DATA_WIDTH=1, // will 0 work?
191  parameter ADDR1=0,
192  parameter ADDR_MASK1=0,
193  parameter ADDR2=0,
194  parameter ADDR_MASK2=0,
195  parameter WE_WIDTH=1,
196  parameter WE_EARLY = 0 // if 1 - we and addr will be valid 1 cycle before data
197 )(
198  input rst,
199  input clk,
200  input srst, // sync reset
201  input [7:0] ad,
202  input stb,
203  output [ADDR_WIDTH-1:0] addr,
204  output [DATA_WIDTH-1:0] data,
205  output [WE_WIDTH-1:0] we
206 );
207  localparam ADDR_LOW= ADDR & 8'hff;
208  localparam ADDR_HIGH=(ADDR>>8) & 8'hff;
209  localparam ADDR_MASK_LOW= ADDR_MASK & 8'hff;
210  localparam ADDR_MASK_HIGH=(ADDR_MASK>>8) & 8'hff;
211 
212  localparam ADDR_LOW1= ADDR1 & 8'hff;
213  localparam ADDR_MASK_LOW1= ADDR_MASK1 & 8'hff;
214  localparam ADDR_LOW2= ADDR2 & 8'hff;
215  localparam ADDR_MASK_LOW2= ADDR_MASK2 & 8'hff;
216 
217  localparam ADDR_HIGH1=(ADDR1>>8) & 8'hff;
218  localparam ADDR_MASK_HIGH1=(ADDR_MASK1>>8) & 8'hff;
219  localparam ADDR_HIGH2=(ADDR2>>8) & 8'hff;
220  localparam ADDR_MASK_HIGH2=(ADDR_MASK2>>8) & 8'hff;
221 
222 
223  reg [15:0] deser_r;
224 // reg stb_d;
225  reg [2:0] stb_d;
226  wire [2:0] match_low;
227  wire [2:0] match_high;
228 
229  wire [2:0] we3;
230  reg [2:0] we_r;
231 
232 // assign we=we_r;
233  assign we3 = (WE_EARLY > 0) ? (match_high & stb_d):we_r; // 3 bits wide - for each possible output
234  assign we = we3[WE_WIDTH-1:0]; // truncate
235 
236  assign match_low= {((ad ^ ADDR_LOW2) & (8'hff & ADDR_MASK_LOW2)) == 0,
237  ((ad ^ ADDR_LOW1) & (8'hff & ADDR_MASK_LOW1)) == 0,
238  ((ad ^ ADDR_LOW ) & (8'hff & ADDR_MASK_LOW )) == 0};
239  assign match_high= {((ad ^ ADDR_HIGH2) & (8'hff & ADDR_MASK_HIGH2)) == 0,
240  ((ad ^ ADDR_HIGH1) & (8'hff & ADDR_MASK_HIGH1)) == 0,
241  ((ad ^ ADDR_HIGH ) & (8'hff & ADDR_MASK_HIGH )) == 0};
242 
243  always @ (posedge rst or posedge clk) begin
244  if (rst) stb_d <= 3'b0;
245  else if (srst) stb_d <= 3'b0;
246  else stb_d <= stb?match_low:3'b0;
247 
248  if (rst) we_r <= 3'b0;
249  else if (srst) we_r <= 3'b0;
250  else we_r <= match_high & stb_d;
251 
252  if (rst) deser_r[15:0] <= 0;
253  else if (srst) deser_r[15:0] <= 0;
254  else if ((match_low && stb) || (match_high && stb_d)) deser_r[15:0] <= {ad,deser_r[15:8]};
255  end
256  assign data=0; // {DATA_WIDTH{1'b0}};
257 // assign addr=deser_r[ADDR_WIDTH-1:0];
258  assign addr=deser_r[8*WE_EARLY +: ADDR_WIDTH];
259 endmodule
260 
262  parameter ADDR=0,
263  parameter ADDR_MASK='hffff,
264  parameter NUM_CYCLES=6, // >=3
265  parameter ADDR_WIDTH=16,
266  parameter DATA_WIDTH=32,
267  parameter ADDR1=0,
268  parameter ADDR_MASK1=0,
269  parameter ADDR2=0,
270  parameter ADDR_MASK2=0,
271  parameter WE_WIDTH=1,
272  parameter WE_EARLY = 0 // if 1 - we and addr will be valid 1 cycle before data
273 )(
274  input rst,
275  input clk,
276  input srst, // sync reset
277  input [7:0] ad,
278  input stb,
279  output [ADDR_WIDTH-1:0] addr,
280  output [DATA_WIDTH-1:0] data,
281  output [WE_WIDTH-1:0] we
282 );
283  localparam ADDR_LOW= ADDR & 8'hff;
284  localparam ADDR_HIGH=(ADDR>>8) & 8'hff;
285  localparam ADDR_MASK_LOW= ADDR_MASK & 8'hff;
286  localparam ADDR_MASK_HIGH=(ADDR_MASK>>8) & 8'hff;
287 
288  localparam ADDR_LOW1= ADDR1 & 8'hff;
289  localparam ADDR_MASK_LOW1= ADDR_MASK1 & 8'hff;
290  localparam ADDR_LOW2= ADDR2 & 8'hff;
291  localparam ADDR_MASK_LOW2= ADDR_MASK2 & 8'hff;
292 
293  localparam ADDR_HIGH1=(ADDR1>>8) & 8'hff;
294  localparam ADDR_MASK_HIGH1=(ADDR_MASK1>>8) & 8'hff;
295  localparam ADDR_HIGH2=(ADDR2>>8) & 8'hff;
296  localparam ADDR_MASK_HIGH2=(ADDR_MASK2>>8) & 8'hff;
297 
298 
299  reg [8*NUM_CYCLES-1:0] deser_r;
300  reg [2:0] stb_d;
301  wire [2:0] match_low;
302  wire [2:0] match_high;
303  reg [NUM_CYCLES-2:0] sr;
304  reg [NUM_CYCLES-2:0] sr1;
305  reg [NUM_CYCLES-2:0] sr2;
306  wire [2:0] we3;
307 
308  assign we3={sr2[WE_EARLY],sr1[WE_EARLY],sr[WE_EARLY]};
309 // assign we=sr[WE_WIDTH-1:0]; // we_r;
310  assign we=we3[WE_WIDTH-1:0]; // truncate to required number of bits
311 
312  assign match_low= {((ad ^ ADDR_LOW2) & (8'hff & ADDR_MASK_LOW2)) == 0,
313  ((ad ^ ADDR_LOW1) & (8'hff & ADDR_MASK_LOW1)) == 0,
314  ((ad ^ ADDR_LOW ) & (8'hff & ADDR_MASK_LOW )) == 0};
315  assign match_high= {((ad ^ ADDR_HIGH2) & (8'hff & ADDR_MASK_HIGH2)) == 0,
316  ((ad ^ ADDR_HIGH1) & (8'hff & ADDR_MASK_HIGH1)) == 0,
317  ((ad ^ ADDR_HIGH ) & (8'hff & ADDR_MASK_HIGH )) == 0};
318  always @ (posedge rst or posedge clk) begin
319  if (rst) stb_d <= 0;
320  else if (srst) stb_d <= 0;
321  else stb_d <= stb?match_low:3'b0;
322 
323  if (rst) sr <= 0;
324  else if (srst) sr <= 0;
325  else if (match_high[0] && stb_d[0]) sr <= 1 << (NUM_CYCLES-2);
326  else sr <= {1'b0,sr[NUM_CYCLES-2:1]};
327 
328  if (rst) sr1 <= 0;
329  else if (srst) sr1 <= 0;
330  else if (match_high[1] && stb_d[1]) sr1 <= 1 << (NUM_CYCLES-2);
331  else sr1 <= {1'b0,sr1[NUM_CYCLES-2:1]};
332 
333  if (rst) sr2 <= 0;
334  else if (srst) sr2 <= 0;
335  else if (match_high[2] && stb_d[2]) sr2 <= 1 << (NUM_CYCLES-2);
336  else sr2 <= {1'b0,sr2[NUM_CYCLES-2:1]};
337 
338  if (rst) deser_r[8*NUM_CYCLES-1:0] <= 0;
339  else if (srst) deser_r[8*NUM_CYCLES-1:0] <= 0;
340  else if ((match_low && (|stb)) ||
341  (match_high && (|stb_d)) ||
342  (|sr) || (|sr1) || (|sr2)) deser_r[8*NUM_CYCLES-1:0] <= {ad,deser_r[8*NUM_CYCLES-1:8]};
343 
344  end
345  assign data=deser_r[DATA_WIDTH+15:16];
346 // assign addr=deser_r[ADDR_WIDTH-1:0];
347  assign addr=deser_r[8*WE_EARLY +: ADDR_WIDTH];
348 endmodule
9955ADDR_LOWADDR & 8'hff
Definition: cmd_deser.v:158
9957ADDR_LOW1ADDR1 & 8'hff
Definition: cmd_deser.v:160
10029ADDR_HIGH2(ADDR2>>8) & 8'hff
Definition: cmd_deser.v:295
10025ADDR_LOW2ADDR2 & 8'hff
Definition: cmd_deser.v:290
[7:0] 10014ad
Definition: cmd_deser.v:277
10037sr2reg[NUM_CYCLES-2:0]
Definition: cmd_deser.v:305
9962match_lowwire[2:0]
Definition: cmd_deser.v:165
i_cmd_deser_multi cmd_deser_multi[generate]
Definition: cmd_deser.v:109
10038we3wire[2:0]
Definition: cmd_deser.v:306
9991ADDR_MASK_HIGH1(ADDR_MASK1>>8) & 8'hff
Definition: cmd_deser.v:218
9987ADDR_MASK_LOW1ADDR_MASK1 & 8'hff
Definition: cmd_deser.v:213
10021ADDR_MASK_LOWADDR_MASK & 8'hff
Definition: cmd_deser.v:285
9921ADDR_WIDTH16
Definition: cmd_deser.v:45
10030ADDR_MASK_HIGH2(ADDR_MASK2>>8) & 8'hff
Definition: cmd_deser.v:296
9986ADDR_LOW1ADDR1 & 8'hff
Definition: cmd_deser.v:212
9919ADDR_MASK'hffff
Definition: cmd_deser.v:43
9927WE_EARLY0
Definition: cmd_deser.v:51
[WE_WIDTH-1:0] 10018we
Definition: cmd_deser.v:281
i_cmd_deser_single cmd_deser_single[generate]
Definition: cmd_deser.v:65
10026ADDR_MASK_LOW2ADDR_MASK2 & 8'hff
Definition: cmd_deser.v:291
10033match_lowwire[2:0]
Definition: cmd_deser.v:301
9958ADDR_MASK_LOW1ADDR_MASK1 & 8'hff
Definition: cmd_deser.v:161
9996match_lowwire[2:0]
Definition: cmd_deser.v:226
[ADDR_WIDTH-1:0] 9952addr
Definition: cmd_deser.v:154
9956ADDR_MASK_LOWADDR_MASK & 8'hff
Definition: cmd_deser.v:159
10020ADDR_HIGH(ADDR>>8) & 8'hff
Definition: cmd_deser.v:284
9990ADDR_HIGH1(ADDR1>>8) & 8'hff
Definition: cmd_deser.v:217
[ADDR_MASK2!=0?2:ADDR_MASK1!=0?1:0:0] 9935we
Definition: cmd_deser.v:60
9924ADDR_MASK10
Definition: cmd_deser.v:48
[DATA_WIDTH-1:0] 9953data
Definition: cmd_deser.v:155
9984ADDR_MASK_LOWADDR_MASK & 8'hff
Definition: cmd_deser.v:209
9994deser_rreg[15:0]
Definition: cmd_deser.v:223
9925ADDR20
Definition: cmd_deser.v:49
9999we_rreg[2:0]
Definition: cmd_deser.v:230
[WE_WIDTH-1:0] 9954we
Definition: cmd_deser.v:156
10022ADDR_MASK_HIGH(ADDR_MASK>>8) & 8'hff
Definition: cmd_deser.v:286
10019ADDR_LOWADDR & 8'hff
Definition: cmd_deser.v:283
9993ADDR_MASK_HIGH2(ADDR_MASK2>>8) & 8'hff
Definition: cmd_deser.v:220
10034match_highwire[2:0]
Definition: cmd_deser.v:302
9985ADDR_MASK_HIGH(ADDR_MASK>>8) & 8'hff
Definition: cmd_deser.v:210
9989ADDR_MASK_LOW2ADDR_MASK2 & 8'hff
Definition: cmd_deser.v:215
9926ADDR_MASK20
Definition: cmd_deser.v:50
10027ADDR_HIGH1(ADDR1>>8) & 8'hff
Definition: cmd_deser.v:293
10036sr1reg[NUM_CYCLES-2:0]
Definition: cmd_deser.v:304
[DATA_WIDTH-1:0] 9934data
Definition: cmd_deser.v:59
10032stb_dreg[2:0]
Definition: cmd_deser.v:300
9961deser_rreg[7:0]
Definition: cmd_deser.v:164
9998we3wire[2:0]
Definition: cmd_deser.v:229
i_cmd_deser_dual cmd_deser_dual[generate]
Definition: cmd_deser.v:87
[DATA_WIDTH-1:0] 10017data
Definition: cmd_deser.v:280
9995stb_dreg[2:0]
Definition: cmd_deser.v:225
10024ADDR_MASK_LOW1ADDR_MASK1 & 8'hff
Definition: cmd_deser.v:289
9959ADDR_LOW2ADDR2 & 8'hff
Definition: cmd_deser.v:162
[7:0] 9977ad
Definition: cmd_deser.v:201
[7:0] 9931ad
Definition: cmd_deser.v:56
[ADDR_WIDTH-1:0] 9933addr
Definition: cmd_deser.v:58
[WE_WIDTH-1:0] 9981we
Definition: cmd_deser.v:205
10023ADDR_LOW1ADDR1 & 8'hff
Definition: cmd_deser.v:288
9983ADDR_HIGH(ADDR>>8) & 8'hff
Definition: cmd_deser.v:208
9920NUM_CYCLES6
Definition: cmd_deser.v:44
9922DATA_WIDTH32
Definition: cmd_deser.v:46
10035srreg[NUM_CYCLES-2:0]
Definition: cmd_deser.v:303
[DATA_WIDTH-1:0] 9980data
Definition: cmd_deser.v:204
9938ADDR_MASK'hffff
Definition: cmd_deser.v:138
9960ADDR_MASK_LOW2ADDR_MASK2 & 8'hff
Definition: cmd_deser.v:163
[ADDR_WIDTH-1:0] 9979addr
Definition: cmd_deser.v:203
9965ADDR_MASK'hffff
Definition: cmd_deser.v:188
9963we_rreg[2:0]
Definition: cmd_deser.v:166
9923ADDR10
Definition: cmd_deser.v:47
10031deser_rreg[8*NUM_CYCLES-1:0]
Definition: cmd_deser.v:299
9936WE_WIDTH(ADDR_MASK2!=0)?3:((ADDR_MASK1!=0)?2:1
Definition: cmd_deser.v:62
10028ADDR_MASK_HIGH1(ADDR_MASK1>>8) & 8'hff
Definition: cmd_deser.v:294
10001ADDR_MASK'hffff
Definition: cmd_deser.v:263
[ADDR_WIDTH-1:0] 10016addr
Definition: cmd_deser.v:279
9988ADDR_LOW2ADDR2 & 8'hff
Definition: cmd_deser.v:214
9982ADDR_LOWADDR & 8'hff
Definition: cmd_deser.v:207
9992ADDR_HIGH2(ADDR2>>8) & 8'hff
Definition: cmd_deser.v:219
9997match_highwire[2:0]
Definition: cmd_deser.v:227