OpenCores
URL https://opencores.org/ocsvn/dbg_interface/dbg_interface/trunk

Subversion Repositories dbg_interface

[/] [dbg_interface/] [tags/] [rel_15/] [rtl/] [verilog/] [dbg_wb.v] - Blame information for rev 95

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 82 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  dbg_wb.v                                                    ////
4
////                                                              ////
5
////                                                              ////
6
////  This file is part of the SoC/OpenRISC Development Interface ////
7
////  http://www.opencores.org/projects/DebugInterface/           ////
8
////                                                              ////
9
////  Author(s):                                                  ////
10
////       Igor Mohor (igorm@opencores.org)                       ////
11
////                                                              ////
12
////                                                              ////
13
////  All additional information is avaliable in the README.txt   ////
14
////  file.                                                       ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 - 2003 Authors                            ////
19
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46 95 mohor
// Revision 1.11  2004/01/14 12:29:40  mohor
47
// temp version. Resets will be changed in next version.
48
//
49 94 mohor
// Revision 1.10  2004/01/13 11:28:14  mohor
50
// tmp version.
51
//
52 93 mohor
// Revision 1.9  2004/01/10 07:50:24  mohor
53
// temp version.
54
//
55 92 mohor
// Revision 1.8  2004/01/09 12:48:44  mohor
56
// tmp version.
57
//
58 91 mohor
// Revision 1.7  2004/01/08 17:53:36  mohor
59
// tmp version.
60
//
61 90 mohor
// Revision 1.6  2004/01/07 11:58:56  mohor
62
// temp4 version.
63
//
64 89 mohor
// Revision 1.5  2004/01/06 17:15:19  mohor
65
// temp3 version.
66
//
67 88 mohor
// Revision 1.4  2004/01/05 12:16:00  mohor
68
// tmp2 version.
69
//
70 87 mohor
// Revision 1.3  2003/12/23 16:22:46  mohor
71
// Tmp version.
72
//
73 86 mohor
// Revision 1.2  2003/12/23 15:26:26  mohor
74
// Small fix.
75
//
76 83 mohor
// Revision 1.1  2003/12/23 15:09:04  mohor
77
// New directory structure. New version of the debug interface.
78 82 mohor
//
79
//
80 83 mohor
//
81 82 mohor
 
82
// synopsys translate_off
83
`include "timescale.v"
84
// synopsys translate_on
85
`include "dbg_wb_defines.v"
86
 
87
// Top module
88
module dbg_wb(
89
                // JTAG signals
90
                tck_i,
91
                tdi_i,
92
                tdo_o,
93
 
94
                // TAP states
95
                shift_dr_i,
96
                pause_dr_i,
97
                update_dr_i,
98
 
99
                wishbone_ce_i,
100
                crc_match_i,
101
                crc_en_o,
102
                shift_crc_o,
103 95 mohor
                rst_i,
104 82 mohor
 
105
                // WISHBONE common signals
106 95 mohor
                wb_clk_i,
107 82 mohor
 
108
                // WISHBONE master interface
109
                wb_adr_o, wb_dat_o, wb_dat_i, wb_cyc_o, wb_stb_o, wb_sel_o,
110
                wb_we_o, wb_ack_i, wb_cab_o, wb_err_i, wb_cti_o, wb_bte_o
111
 
112
              );
113
 
114
// JTAG signals
115
input   tck_i;
116
input   tdi_i;
117
output  tdo_o;
118
 
119
// TAP states
120
input   shift_dr_i;
121
input   pause_dr_i;
122
input   update_dr_i;
123
 
124
input   wishbone_ce_i;
125
input   crc_match_i;
126
output  crc_en_o;
127
output  shift_crc_o;
128 95 mohor
input   rst_i;
129 82 mohor
// WISHBONE common signals
130
input         wb_clk_i;                   // WISHBONE clock
131
 
132
// WISHBONE master interface
133
output [31:0] wb_adr_o;
134
output [31:0] wb_dat_o;
135
input  [31:0] wb_dat_i;
136
output        wb_cyc_o;
137
output        wb_stb_o;
138
output  [3:0] wb_sel_o;
139
output        wb_we_o;
140
input         wb_ack_i;
141
output        wb_cab_o;
142
input         wb_err_i;
143
output  [2:0] wb_cti_o;
144
output  [1:0] wb_bte_o;
145
 
146
reg           wb_cyc_o;
147
reg    [31:0] wb_adr_o;
148 88 mohor
reg    [31:0] wb_dat_o;
149 82 mohor
reg     [3:0] wb_sel_o;
150
 
151
reg           tdo_o;
152
 
153 88 mohor
reg    [50:0] dr;
154
wire          enable;
155 90 mohor
wire          cmd_cnt_en;
156 88 mohor
reg     [1:0] cmd_cnt;
157
wire          cmd_cnt_end;
158
reg           cmd_cnt_end_q;
159 90 mohor
wire          addr_len_cnt_en;
160 88 mohor
reg     [5:0] addr_len_cnt;
161
reg     [5:0] addr_len_cnt_limit;
162
wire          addr_len_cnt_end;
163 90 mohor
wire          crc_cnt_en;
164 88 mohor
reg     [5:0] crc_cnt;
165
wire          crc_cnt_end;
166
reg           crc_cnt_end_q;
167 90 mohor
wire          data_cnt_en;
168 88 mohor
reg    [18:0] data_cnt;
169
reg    [18:0] data_cnt_limit;
170
wire          data_cnt_end;
171 90 mohor
reg           data_cnt_end_q;
172 88 mohor
reg           status_reset_en;
173 82 mohor
 
174 90 mohor
reg           crc_match_reg;
175 82 mohor
 
176 92 mohor
reg     [2:0] cmd, cmd_old, dr_cmd_latched;
177
reg    [31:0] adr;
178
reg    [15:0] len;
179
reg           start_rd_tck;
180
reg           start_rd_sync1;
181
reg           start_wb_rd;
182
reg           start_wb_rd_q;
183
reg           start_wr_tck;
184
reg           start_wr_sync1;
185
reg           start_wb_wr;
186
reg           start_wb_wr_q;
187 88 mohor
 
188 92 mohor
wire          dr_read;
189
wire          dr_write;
190
wire          dr_go;
191 88 mohor
 
192 92 mohor
reg           dr_write_latched;
193
reg           dr_read_latched;
194
reg           dr_go_latched;
195 82 mohor
 
196 92 mohor
wire          status_cnt_end;
197 89 mohor
 
198 92 mohor
wire          byte, half, long;
199
reg           byte_q, half_q, long_q;
200 94 mohor
reg           byte_q2, half_q2, long_q2;
201 92 mohor
reg           cmd_read;
202
reg           cmd_write;
203
reg           cmd_go;
204 90 mohor
 
205 92 mohor
reg           status_cnt1, status_cnt2, status_cnt3, status_cnt4;
206 90 mohor
 
207 92 mohor
reg [`STATUS_LEN -1:0] status;
208
 
209
reg wb_error, wb_error_sync, wb_error_tck;
210
reg wb_overrun, wb_overrun_sync, wb_overrun_tck;
211
 
212
reg busy_wb;
213
reg busy_tck;
214
reg wb_end;
215
reg wb_end_rst;
216
reg wb_end_rst_sync;
217
reg wb_end_sync;
218 93 mohor
reg wb_end_tck, wb_end_tck_q;
219 92 mohor
reg busy_sync;
220
reg [799:0] TDO_WISHBONE;
221
reg [399:0] latching_data;
222
 
223
reg set_addr, set_addr_sync, set_addr_wb, set_addr_wb_q;
224
reg read_cycle;
225 94 mohor
reg write_cycle;
226 95 mohor
reg [2:0] rw_type;
227 92 mohor
wire [31:0] input_data;
228
 
229 93 mohor
wire len_eq_0;
230
wire crc_cnt_31;
231
 
232 82 mohor
assign enable = wishbone_ce_i & shift_dr_i;
233 90 mohor
assign crc_en_o = enable & crc_cnt_end & (~status_cnt_end);
234 89 mohor
assign shift_crc_o = enable & status_cnt_end;  // Signals dbg module to shift out the CRC
235 82 mohor
 
236 93 mohor
reg [1:0] ptr;
237 82 mohor
 
238 90 mohor
 
239 82 mohor
always @ (posedge tck_i)
240
begin
241 93 mohor
  if (update_dr_i)
242
    ptr <= #1 2'h0;
243 95 mohor
  else if (read_cycle & crc_cnt_31) // first latch
244 93 mohor
    ptr <= #1 ptr + 1'b1;
245 95 mohor
  else if (read_cycle & byte & (~byte_q))
246 93 mohor
    ptr <= ptr + 1'd1;
247
end
248
 
249
 
250
 
251
always @ (posedge tck_i)
252
begin
253 95 mohor
  if (read_cycle & crc_cnt_31)
254 90 mohor
    begin
255 93 mohor
      dr[31:0] <= #1 input_data[31:0];
256
      latching_data = "First latch";
257
    end
258
  else if (read_cycle & crc_cnt_end)
259
    begin
260 95 mohor
      case (rw_type)  // synthesis parallel_case full_case
261 90 mohor
        `WB_READ8 : begin
262
                      if(byte & (~byte_q))
263 92 mohor
                        begin
264 93 mohor
                          case (ptr)    // synthesis parallel_case
265
                            2'b00 : dr[31:24] <= #1 input_data[31:24];
266
                            2'b01 : dr[31:24] <= #1 input_data[23:16];
267
                            2'b10 : dr[31:24] <= #1 input_data[15:8];
268
                            2'b11 : dr[31:24] <= #1 input_data[7:0];
269
                          endcase
270
                          latching_data = "8 bit latched";
271 92 mohor
                        end
272 90 mohor
                      else
273 92 mohor
                        begin
274 93 mohor
                          dr[31:24] <= #1 {dr[30:24], 1'b0};
275
                          latching_data = "8 bit shifted";
276 92 mohor
                        end
277 90 mohor
                    end
278
        `WB_READ16: begin
279
                      if(half & (~half_q))
280 92 mohor
                        begin
281 93 mohor
                          if (ptr[1])
282
                            dr[31:16] <= #1 input_data[31:16];
283
                          else
284
                            dr[31:16] <= #1 input_data[15:0];
285
                          latching_data = "16 bit latched";
286 92 mohor
                        end
287 90 mohor
                      else
288 92 mohor
                        begin
289 93 mohor
                          dr[31:16] <= #1 {dr[30:16], 1'b0};
290
                          latching_data = "16 bit shifted";
291 92 mohor
                        end
292 90 mohor
                    end
293
        `WB_READ32: begin
294
                      if(long & (~long_q))
295 92 mohor
                        begin
296 93 mohor
                          dr[31:0] <= #1 input_data[31:0];
297
                          latching_data = "32 bit latched";
298 92 mohor
                        end
299 90 mohor
                      else
300 92 mohor
                        begin
301 93 mohor
                          dr[31:0] <= #1 {dr[30:0], 1'b0};
302
                          latching_data = "32 bit shifted";
303 92 mohor
                        end
304 90 mohor
                    end
305
      endcase
306
    end
307 94 mohor
  else if (enable & ((~addr_len_cnt_end) | (~cmd_cnt_end) | ((~data_cnt_end) & write_cycle)))
308 92 mohor
    begin
309 88 mohor
    dr <= #1 {dr[49:0], tdi_i};
310 92 mohor
    latching_data = "tdi shifted in";
311
    end
312 94 mohor
  else
313
    latching_data = "nothing";
314 82 mohor
end
315
 
316
 
317 90 mohor
assign cmd_cnt_en = enable & (~cmd_cnt_end);
318 88 mohor
 
319 95 mohor
always @ (posedge tck_i or posedge rst_i)
320 82 mohor
begin
321 95 mohor
  if (rst_i)
322 87 mohor
    cmd_cnt <= #1 'h0;
323 82 mohor
  else if (update_dr_i)
324 87 mohor
    cmd_cnt <= #1 'h0;
325 90 mohor
  else if (cmd_cnt_en)
326 87 mohor
    cmd_cnt <= #1 cmd_cnt + 1'b1;
327 82 mohor
end
328
 
329
 
330 90 mohor
assign addr_len_cnt_en = enable & cmd_cnt_end & (~addr_len_cnt_end);
331
 
332 95 mohor
always @ (posedge tck_i or posedge rst_i)
333 87 mohor
begin
334 95 mohor
  if (rst_i)
335 88 mohor
    addr_len_cnt <= #1 'h0;
336
  else if (update_dr_i)
337
    addr_len_cnt <= #1 'h0;
338 90 mohor
  else if (addr_len_cnt_en)
339 88 mohor
    addr_len_cnt <= #1 addr_len_cnt + 1'b1;
340
end
341
 
342
 
343 95 mohor
assign data_cnt_en = enable & (~data_cnt_end) & (cmd_cnt_end & write_cycle | crc_cnt_end & read_cycle);
344 90 mohor
 
345 95 mohor
always @ (posedge tck_i or posedge rst_i)
346 88 mohor
begin
347 95 mohor
  if (rst_i)
348 87 mohor
    data_cnt <= #1 'h0;
349
  else if (update_dr_i)
350
    data_cnt <= #1 'h0;
351 90 mohor
  else if (data_cnt_en)
352 87 mohor
    data_cnt <= #1 data_cnt + 1'b1;
353
end
354 82 mohor
 
355 87 mohor
 
356 88 mohor
 
357 93 mohor
assign byte = data_cnt[2:0] == 3'd7;
358
assign half = data_cnt[3:0] == 4'd15;
359
assign long = data_cnt[4:0] == 5'd31;
360 88 mohor
 
361
 
362
always @ (posedge tck_i)
363
begin
364 95 mohor
  byte_q <= #1 byte;
365
  half_q <= #1 half;
366
  long_q <= #1 long;
367
  byte_q2 <= #1 byte_q;
368
  half_q2 <= #1 half_q;
369
  long_q2 <= #1 long_q;
370 88 mohor
end
371
 
372
 
373 89 mohor
assign dr_read = (dr[2:0] == `WB_READ8) | (dr[2:0] == `WB_READ16) | (dr[2:0] == `WB_READ32);
374
assign dr_write = (dr[2:0] == `WB_WRITE8) | (dr[2:0] == `WB_WRITE16) | (dr[2:0] == `WB_WRITE32);
375
assign dr_go = dr[2:0] == `WB_GO;
376 88 mohor
 
377
 
378
always @ (posedge tck_i)
379
begin
380
  if (update_dr_i)
381 91 mohor
    begin
382
      dr_cmd_latched = 3'h0;
383
      dr_read_latched  <= #1 1'b0;
384
      dr_write_latched  <= #1 1'b0;
385
      dr_go_latched  <= #1 1'b0;
386
    end
387 88 mohor
  else if (cmd_cnt_end & (~cmd_cnt_end_q))
388 91 mohor
    begin
389
      dr_cmd_latched = dr[2:0];
390
      dr_read_latched <= #1 dr_read;
391
      dr_write_latched <= #1 dr_write;
392
      dr_go_latched <= #1 dr_go;
393
    end
394 88 mohor
end
395
 
396
 
397
always @ (posedge tck_i)
398
begin
399 90 mohor
  if (cmd_cnt == 2'h2)
400 88 mohor
    begin
401 95 mohor
      if ((~dr[0])  & (~tdi_i))                                   // (current command is WB_STATUS or WB_GO)
402 88 mohor
        addr_len_cnt_limit = 6'd0;
403 90 mohor
      else                                                        // (current command is WB_WRITEx or WB_READx)
404 88 mohor
        addr_len_cnt_limit = 6'd48;
405
    end
406
end
407
 
408
 
409 94 mohor
wire go_prelim;
410
 
411
assign go_prelim = (cmd_cnt == 2'h2) & dr[1] & (~dr[0]) & (~tdi_i);
412
 
413 88 mohor
 
414 94 mohor
always @ (posedge tck_i)
415
begin
416
  if (update_dr_i)
417
    data_cnt_limit = {len, 3'b000};
418
end
419 88 mohor
 
420 90 mohor
 
421 94 mohor
assign crc_cnt_en = enable & (~crc_cnt_end) & (cmd_cnt_end & addr_len_cnt_end  & (~write_cycle) | (data_cnt_end & write_cycle));
422
 
423 82 mohor
// crc counter
424 95 mohor
always @ (posedge tck_i or posedge rst_i)
425 82 mohor
begin
426 95 mohor
  if (rst_i)
427 82 mohor
    crc_cnt <= #1 'h0;
428 90 mohor
  else if(crc_cnt_en)
429 82 mohor
    crc_cnt <= #1 crc_cnt + 1'b1;
430
  else if (update_dr_i)
431
    crc_cnt <= #1 'h0;
432
end
433
 
434 87 mohor
assign cmd_cnt_end  = cmd_cnt  == 2'h3;
435 88 mohor
assign addr_len_cnt_end = addr_len_cnt == addr_len_cnt_limit;
436 87 mohor
assign crc_cnt_end  = crc_cnt  == 6'd32;
437 93 mohor
assign crc_cnt_31 = crc_cnt  == 6'd31;
438 89 mohor
assign data_cnt_end = (data_cnt == data_cnt_limit);
439 82 mohor
 
440
always @ (posedge tck_i)
441
begin
442 90 mohor
  crc_cnt_end_q  <= #1 crc_cnt_end;
443
  cmd_cnt_end_q  <= #1 cmd_cnt_end;
444
  data_cnt_end_q <= #1 data_cnt_end;
445 82 mohor
end
446
 
447 90 mohor
 
448
 
449 95 mohor
always @ (posedge tck_i or posedge rst_i)
450 82 mohor
begin
451 95 mohor
  if (rst_i)
452 90 mohor
    status_cnt1 <= #1 1'b0;
453 82 mohor
  else if (update_dr_i)
454 90 mohor
    status_cnt1 <= #1 1'b0;
455 94 mohor
  else if (data_cnt_end & read_cycle |
456 95 mohor
           crc_cnt_end & (~read_cycle)
457 90 mohor
          )
458
    status_cnt1 <= #1 1'b1;
459 82 mohor
end
460
 
461 90 mohor
 
462 95 mohor
always @ (posedge tck_i or posedge rst_i)
463 90 mohor
begin
464 95 mohor
  if (rst_i)
465 90 mohor
    begin
466
      status_cnt2 <= #1 1'b0;
467
      status_cnt3 <= #1 1'b0;
468
      status_cnt4 <= #1 1'b0;
469
    end
470
  else if (update_dr_i)
471
    begin
472
      status_cnt2 <= #1 1'b0;
473
      status_cnt3 <= #1 1'b0;
474
      status_cnt4 <= #1 1'b0;
475
    end
476
  else
477
    begin
478
      status_cnt2 <= #1 status_cnt1;
479
      status_cnt3 <= #1 status_cnt2;
480
      status_cnt4 <= #1 status_cnt3;
481
    end
482
end
483
 
484
 
485
assign status_cnt_end = status_cnt4;
486 82 mohor
 
487 92 mohor
reg [199:0] status_text;
488 95 mohor
always @ (posedge tck_i or posedge rst_i)
489 82 mohor
begin
490 95 mohor
  if (rst_i)
491 92 mohor
    begin
492 82 mohor
    status <= #1 'h0;
493 92 mohor
    status_text <= #1 "reset";
494
    end
495
  else if(crc_cnt_end & (~crc_cnt_end_q) & (~read_cycle))
496
    begin
497 88 mohor
    status <= #1 {crc_match_i, wb_error_tck, wb_overrun_tck, busy_tck}; // igor !!! wb_overrun_tck bo uporabljen skupaj z wb_underrun_tck,
498 92 mohor
    status_text <= #1 "!!!READ";
499
    end
500
  else if (data_cnt_end & (~data_cnt_end_q) & read_cycle)
501
    begin
502 90 mohor
    status <= #1 {crc_match_reg, wb_error_tck, wb_overrun_tck, busy_tck}; // igor !!! wb_overrun_tck bo uporabljen skupaj z wb_underrun_tck,
503 92 mohor
    status_text <= #1 "READ";
504
    end
505 82 mohor
  else if (shift_dr_i & (~status_cnt_end))
506 92 mohor
    begin
507 82 mohor
    status <= #1 {status[0], status[`STATUS_LEN -1:1]};
508 92 mohor
    status_text <= #1 "shift";
509
    end
510 82 mohor
end
511 88 mohor
// Following status is shifted out:
512 82 mohor
// 1. bit:          1 if crc is OK, else 0
513 86 mohor
// 2. bit:          1 while WB access is in progress (busy_tck), else 0
514 88 mohor
// 3. bit:          1 if overrun occured during write (data couldn't be written fast enough)
515 82 mohor
// 4. bit:          1 if WB error occured, else 0
516
 
517
 
518 95 mohor
always @ (pause_dr_i or busy_tck or crc_cnt_end or crc_cnt_end_q or cmd_read or crc_match_i or
519
          data_cnt_end or data_cnt_end_q or read_cycle or crc_match_reg or status or dr or cmd_go)
520 82 mohor
begin
521
  if (pause_dr_i)
522 87 mohor
    begin
523 82 mohor
    tdo_o = busy_tck;
524
    TDO_WISHBONE = "busy_tck";
525 87 mohor
    end
526 95 mohor
  else if (crc_cnt_end & (~crc_cnt_end_q) & (~(read_cycle)))
527 87 mohor
    begin
528
      tdo_o = crc_match_i;
529
      TDO_WISHBONE = "crc_match_i";
530
    end
531 93 mohor
  else if (read_cycle & crc_cnt_end & (~data_cnt_end))
532
    begin
533
    tdo_o = dr[31];
534
    TDO_WISHBONE = "read data";
535
    end
536 94 mohor
  else if (read_cycle & data_cnt_end & (~data_cnt_end_q))     // cmd is already updated
537 87 mohor
    begin
538 90 mohor
      tdo_o = crc_match_reg;
539
      TDO_WISHBONE = "crc_match_reg";
540
    end
541 92 mohor
  else if (crc_cnt_end & data_cnt_end)  // cmd is already updated
542 90 mohor
    begin
543 87 mohor
      tdo_o = status[0];
544
      TDO_WISHBONE = "status";
545
    end
546 82 mohor
  else
547 87 mohor
    begin
548
      tdo_o = 1'b0;
549
      TDO_WISHBONE = "zero while CRC is shifted in";
550
    end
551 82 mohor
end
552
 
553
 
554
 
555
always @ (posedge tck_i)
556
begin
557 90 mohor
  if(crc_cnt_end & (~crc_cnt_end_q))
558
    crc_match_reg <= #1 crc_match_i;
559
end
560
 
561
 
562 95 mohor
always @ (posedge tck_i or posedge rst_i)
563 91 mohor
begin
564 95 mohor
  if (rst_i)
565 91 mohor
    begin
566
      cmd <= #1 'h0;
567
      cmd_old <= #1 'h0;
568
      cmd_read <= #1 1'b0;
569
      cmd_write <= #1 1'b0;
570
      cmd_go <= #1 1'b0;
571
    end
572
  else if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i)
573
    begin
574
      cmd <= #1 dr_cmd_latched;
575
      cmd_old <= #1 cmd;
576
      cmd_read <= #1 dr_read_latched;
577
      cmd_write <= #1 dr_write_latched;
578
      cmd_go <= #1 dr_go_latched;
579
    end
580
end
581 90 mohor
 
582 91 mohor
 
583 90 mohor
always @ (posedge tck_i)
584
begin
585 82 mohor
  if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i)
586
    begin
587 90 mohor
      if (dr_write_latched | dr_read_latched)
588 88 mohor
        begin
589
          adr <= #1 dr[47:16];
590
          set_addr <= #1 1'b1;
591
        end
592 82 mohor
    end
593
  else
594 88 mohor
    set_addr <= #1 1'b0;
595
end
596
 
597 93 mohor
 
598
always @ (posedge tck_i)
599
begin
600
  if(crc_cnt_end & (~crc_cnt_end_q) & crc_match_i & (dr_write_latched | dr_read_latched))
601
    len <= #1 dr[15:0];
602 95 mohor
//  else if (wb_end_tck & (~wb_end_tck_q))
603
  else if (start_rd_tck)
604 93 mohor
    begin
605 95 mohor
      case (rw_type)  // synthesis parallel_case full_case
606 93 mohor
        `WB_READ8 : len <= #1 len - 1'd1;
607
        `WB_READ16: len <= #1 len - 2'd2;
608
        `WB_READ32: len <= #1 len - 3'd4;
609
      endcase
610
    end
611
end
612
 
613
 
614
assign len_eq_0 = len == 16'h0;
615
 
616
 
617 89 mohor
// Start wishbone read cycle
618 88 mohor
always @ (posedge tck_i)
619
begin
620 95 mohor
  if (read_cycle & (~dr_go_latched) & (~len_eq_0))              // First read after cmd is entered
621 89 mohor
    start_rd_tck <= #1 1'b1;
622 95 mohor
  else if (read_cycle & crc_cnt_31 & (~len_eq_0))               // Second read after first data is latched
623 93 mohor
    start_rd_tck <= #1 1'b1;
624
  else if (read_cycle & (~len_eq_0))
625 90 mohor
    begin
626 95 mohor
      case (rw_type)  // synthesis parallel_case full_case
627 90 mohor
        `WB_READ8 : begin
628
                      if(byte & (~byte_q))
629
                        start_rd_tck <= #1 1'b1;
630
                      else
631
                        start_rd_tck <= #1 1'b0;
632
                    end
633
        `WB_READ16: begin
634
                      if(half & (~half_q))
635
                        start_rd_tck <= #1 1'b1;
636
                      else
637
                        start_rd_tck <= #1 1'b0;
638
                    end
639
        `WB_READ32: begin
640
                      if(long & (~long_q))
641
                        start_rd_tck <= #1 1'b1;
642
                      else
643
                        start_rd_tck <= #1 1'b0;
644
                    end
645
      endcase
646
    end
647 89 mohor
  else
648
    start_rd_tck <= #1 1'b0;
649
end
650
 
651
 
652 92 mohor
always @ (posedge tck_i)
653
begin
654
  if (update_dr_i)
655
    read_cycle <= #1 1'b0;
656 94 mohor
  else if (cmd_read & go_prelim)
657 92 mohor
    read_cycle <= #1 1'b1;
658
end
659 89 mohor
 
660 92 mohor
 
661
always @ (posedge tck_i)
662
begin
663 95 mohor
  if ((cmd_read | cmd_write) & go_prelim)
664
    rw_type <= #1 cmd;
665 92 mohor
end
666
 
667
 
668 94 mohor
always @ (posedge tck_i)
669
begin
670
  if (update_dr_i)
671
    write_cycle <= #1 1'b0;
672
  else if (cmd_write & go_prelim)
673
    write_cycle <= #1 1'b1;
674
end
675 92 mohor
 
676
 
677 89 mohor
// Start wishbone write cycle
678
always @ (posedge tck_i)
679
begin
680 95 mohor
  if (write_cycle)
681 88 mohor
    begin
682 95 mohor
      case (rw_type)  // synthesis parallel_case full_case
683 88 mohor
        `WB_WRITE8  : begin
684 94 mohor
                        if (byte_q & (~byte_q2))
685 88 mohor
                          begin
686 89 mohor
                            start_wr_tck <= #1 1'b1;
687 88 mohor
                            wb_dat_o <= #1 {4{dr[7:0]}};
688
                          end
689
                        else
690
                          begin
691 89 mohor
                            start_wr_tck <= #1 1'b0;
692 88 mohor
                          end
693
                      end
694
        `WB_WRITE16 : begin
695 94 mohor
                        if (half_q & (~half_q2))
696 88 mohor
                          begin
697 89 mohor
                            start_wr_tck <= #1 1'b1;
698 88 mohor
                            wb_dat_o <= #1 {2{dr[15:0]}};
699
                          end
700
                        else
701
                          begin
702 89 mohor
                            start_wr_tck <= #1 1'b0;
703 88 mohor
                          end
704
                      end
705
        `WB_WRITE32 : begin
706 94 mohor
                        if (long_q & (~long_q2))
707 88 mohor
                          begin
708 89 mohor
                            start_wr_tck <= #1 1'b1;
709 88 mohor
                            wb_dat_o <= #1 dr[31:0];
710
                          end
711
                        else
712
                          begin
713 89 mohor
                            start_wr_tck <= #1 1'b0;
714 88 mohor
                          end
715
                      end
716
      endcase
717
    end
718
  else
719 89 mohor
    start_wr_tck <= #1 1'b0;
720 82 mohor
end
721
 
722
 
723
always @ (posedge wb_clk_i)
724
begin
725 89 mohor
  start_rd_sync1  <= #1 start_rd_tck;
726
  start_wb_rd     <= #1 start_rd_sync1;
727
  start_wb_rd_q   <= #1 start_wb_rd;
728
 
729
  start_wr_sync1  <= #1 start_wr_tck;
730
  start_wb_wr     <= #1 start_wr_sync1;
731
  start_wb_wr_q   <= #1 start_wb_wr;
732
 
733
  set_addr_sync   <= #1 set_addr;
734
  set_addr_wb     <= #1 set_addr_sync;
735
  set_addr_wb_q   <= #1 set_addr_wb;
736 82 mohor
end
737
 
738
 
739 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
740 82 mohor
begin
741 95 mohor
  if (rst_i)
742 82 mohor
    wb_cyc_o <= #1 1'b0;
743 89 mohor
  else if ((start_wb_wr & (~start_wb_wr_q)) | (start_wb_rd & (~start_wb_rd_q)))
744 82 mohor
    wb_cyc_o <= #1 1'b1;
745 88 mohor
  else if (wb_ack_i | wb_err_i)
746 82 mohor
    wb_cyc_o <= #1 1'b0;
747
end
748
 
749
 
750
 
751
always @ (posedge wb_clk_i)
752
begin
753 88 mohor
  if (set_addr_wb & (~set_addr_wb_q)) // Setting starting address
754 82 mohor
    wb_adr_o <= #1 adr;
755
  else if (wb_ack_i)
756
    begin
757 95 mohor
      if ((rw_type == `WB_WRITE8) | (rw_type == `WB_READ8))
758 82 mohor
        wb_adr_o <= #1 wb_adr_o + 1'd1;
759 95 mohor
      else if ((rw_type == `WB_WRITE16) | (rw_type == `WB_READ16))
760 82 mohor
        wb_adr_o <= #1 wb_adr_o + 2'd2;
761
      else
762
        wb_adr_o <= #1 wb_adr_o + 3'd4;
763
    end
764
end
765
 
766
 
767 89 mohor
 
768 88 mohor
//    adr   byte  |  short  |  long
769
//     0    1000     1100      1111
770
//     1    0100     err       err
771
//     2    0010     0011      err
772
//     3    0001     err       err
773
 
774 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
775 82 mohor
begin
776 95 mohor
  if (rst_i)
777 91 mohor
    wb_sel_o[3:0] <= #1 4'h0;
778 95 mohor
  else
779 88 mohor
    begin
780 95 mohor
      wb_sel_o[0] <= #1 (rw_type[1:0] == 2'b11) & (wb_adr_o[1:0] == 2'b00) | (rw_type[1:0] == 2'b01) & (wb_adr_o[1:0] == 2'b11) |
781
                        (rw_type[1:0] == 2'b10) & (wb_adr_o[1:0] == 2'b10);
782
      wb_sel_o[1] <= #1 (rw_type[1:0] == 2'b11) & (wb_adr_o[1:0] == 2'b00) | (rw_type[1] ^ rw_type[0]) & (wb_adr_o[1:0] == 2'b10);
783
      wb_sel_o[2] <= #1 (rw_type[1]) & (wb_adr_o[1:0] == 2'b00) | (rw_type[1:0] == 2'b01) & (wb_adr_o[1:0] == 2'b01);
784 88 mohor
      wb_sel_o[3] <= #1 (wb_adr_o[1:0] == 2'b00);
785
    end
786 82 mohor
end
787
 
788
 
789 95 mohor
assign wb_we_o = write_cycle;
790 82 mohor
assign wb_cab_o = 1'b0;
791
assign wb_stb_o = wb_cyc_o;
792
assign wb_cti_o = 3'h0;     // always performing single access
793
assign wb_bte_o = 2'h0;     // always performing single access
794
 
795
 
796 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
797 82 mohor
begin
798 95 mohor
  if (rst_i)
799 86 mohor
    wb_end <= #1 1'b0;
800 88 mohor
  else if (wb_ack_i | wb_err_i)
801 86 mohor
    wb_end <= #1 1'b1;
802
  else if (wb_end_rst)
803
    wb_end <= #1 1'b0;
804 82 mohor
end
805
 
806
 
807 95 mohor
always @ (posedge tck_i or posedge rst_i)
808 82 mohor
begin
809 95 mohor
  if (rst_i)
810 82 mohor
    begin
811 86 mohor
      wb_end_sync <= #1 1'b0;
812 93 mohor
      wb_end_tck  <= #1 1'b0;
813
      wb_end_tck_q<= #1 1'b0;
814 82 mohor
    end
815
  else
816
    begin
817 86 mohor
      wb_end_sync <= #1 wb_end;
818
      wb_end_tck  <= #1 wb_end_sync;
819 93 mohor
      wb_end_tck_q<= #1 wb_end_tck;
820 82 mohor
    end
821
end
822
 
823
 
824 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
825 82 mohor
begin
826 95 mohor
  if (rst_i)
827 82 mohor
    busy_wb <= #1 1'b0;
828 86 mohor
  else if (wb_end_rst)
829 82 mohor
    busy_wb <= #1 1'b0;
830
  else if (wb_cyc_o)
831
    busy_wb <= #1 1'b1;
832
end
833
 
834
 
835 95 mohor
always @ (posedge tck_i or posedge rst_i)
836 82 mohor
begin
837 95 mohor
  if (rst_i)
838 82 mohor
    begin
839
      busy_sync <= #1 1'b0;
840
      busy_tck <= #1 1'b0;
841
    end
842
  else
843
    begin
844
      busy_sync <= #1 busy_wb;
845
      busy_tck <= #1 busy_sync;
846
    end
847
end
848
 
849
 
850
always @ (posedge wb_clk_i)
851
begin
852 86 mohor
  wb_end_rst_sync <= #1 wb_end_tck;
853
  wb_end_rst  <= #1 wb_end_rst_sync;
854 82 mohor
end
855
 
856
 
857 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
858 82 mohor
begin
859 95 mohor
  if (rst_i)
860 82 mohor
    wb_error <= #1 1'b0;
861
  else if(wb_err_i)
862
    wb_error <= #1 1'b1;
863 88 mohor
  else if(wb_ack_i & status_reset_en) // error remains active until STATUS read is performed
864 82 mohor
    wb_error <= #1 1'b0;
865
end
866
 
867
always @ (posedge tck_i)
868
begin
869
  wb_error_sync <= #1 wb_error;
870
  wb_error_tck  <= #1 wb_error_sync;
871
end
872
 
873
 
874 88 mohor
 
875 95 mohor
always @ (posedge wb_clk_i or posedge rst_i)
876 82 mohor
begin
877 95 mohor
  if (rst_i)
878 88 mohor
    wb_overrun <= #1 1'b0;
879 89 mohor
  else if(start_wb_wr & (~start_wb_wr_q) & wb_cyc_o)
880 88 mohor
    wb_overrun <= #1 1'b1;
881
  else if((wb_ack_i | wb_err_i) & status_reset_en) // error remains active until STATUS read is performed
882
    wb_overrun <= #1 1'b0;
883 82 mohor
end
884
 
885
always @ (posedge tck_i)
886
begin
887 88 mohor
  wb_overrun_sync <= #1 wb_overrun;
888
  wb_overrun_tck  <= #1 wb_overrun_sync;
889 82 mohor
end
890
 
891
 
892 87 mohor
 
893 88 mohor
 
894
 
895
 
896
// wb_error is locked until WB_STATUS is performed
897 95 mohor
always @ (posedge tck_i or posedge rst_i)
898 87 mohor
begin
899 95 mohor
  if (rst_i)
900 87 mohor
    status_reset_en <= 1'b0;
901
  else if((cmd_old == `WB_STATUS) & (cmd !== `WB_STATUS))
902
    status_reset_en <= #1 1'b1;
903
  else
904
    status_reset_en <= #1 1'b0;
905
end
906 88 mohor
 
907 95 mohor
 
908 92 mohor
reg [7:0] mem [0:3];
909
reg [2:0] mem_ptr;
910
reg wishbone_ce_sync;
911
reg wishbone_ce_rst;
912 88 mohor
 
913 92 mohor
always @ (posedge wb_clk_i)
914
begin
915
  wishbone_ce_sync <= #1  wishbone_ce_i;
916
  wishbone_ce_rst  <= #1 ~wishbone_ce_sync;
917
end
918 88 mohor
 
919
 
920 92 mohor
always @ (posedge wb_clk_i)
921
begin
922
  if(wishbone_ce_rst)
923
    mem_ptr <= #1 'h0;
924
  else if (wb_ack_i)
925
    begin
926 95 mohor
      if (rw_type == `WB_READ8)
927 92 mohor
        mem_ptr <= #1 mem_ptr + 1'd1;
928 95 mohor
      else if (rw_type == `WB_READ16)
929 92 mohor
        mem_ptr <= #1 mem_ptr + 2'd2;
930
    end
931
end
932 88 mohor
 
933
 
934 92 mohor
always @ (posedge wb_clk_i)
935
begin
936
  if (wb_ack_i)
937
    begin
938
      case (wb_sel_o)    // synthesis parallel_case full_case 
939
        4'b1000  :  mem[mem_ptr[1:0]] <= #1 wb_dat_i[31:24];            // byte 
940
        4'b0100  :  mem[mem_ptr[1:0]] <= #1 wb_dat_i[23:16];            // byte
941
        4'b0010  :  mem[mem_ptr[1:0]] <= #1 wb_dat_i[15:08];            // byte
942 93 mohor
        4'b0001  :  mem[mem_ptr[1:0]] <= #1 wb_dat_i[07:00];            // byte
943 88 mohor
 
944 92 mohor
        4'b1100  :                                                      // half
945
                    begin
946
                      mem[mem_ptr[1:0]]      <= #1 wb_dat_i[31:24];
947
                      mem[mem_ptr[1:0]+1'b1] <= #1 wb_dat_i[23:16];
948
                    end
949
        4'b0011  :                                                      // half
950
                    begin
951
                      mem[mem_ptr[1:0]]      <= #1 wb_dat_i[15:08];
952 93 mohor
                      mem[mem_ptr[1:0]+1'b1] <= #1 wb_dat_i[07:00];
953 92 mohor
                    end
954
        4'b1111  :                                                      // long
955
                    begin
956
                      mem[0] <= #1 wb_dat_i[31:24];
957
                      mem[1] <= #1 wb_dat_i[23:16];
958
                      mem[2] <= #1 wb_dat_i[15:08];
959 93 mohor
                      mem[3] <= #1 wb_dat_i[07:00];
960 92 mohor
                    end
961
      endcase
962
    end
963
end
964 88 mohor
 
965 92 mohor
assign input_data = {mem[0], mem[1], mem[2], mem[3]};
966 88 mohor
 
967 92 mohor
 
968
 
969
 
970
 
971
 
972
 
973 82 mohor
endmodule
974
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.