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

Subversion Repositories xgate

[/] [xgate/] [trunk/] [rtl/] [verilog/] [xgate_jtag.v] - Blame information for rev 88

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 88 rehayes
////////////////////////////////////////////////////////////////////////////////
2
//
3
//  XGATE Coprocessor - XGATE JTAG Module
4
//
5
//  Author: Robert Hayes
6
//          rehayes@opencores.org
7
//
8
//  Downloaded from: http://www.opencores.org/projects/xgate.....
9
//
10
////////////////////////////////////////////////////////////////////////////////
11
// Copyright (c) 2011, Robert Hayes
12
//
13
// This source file is free software: you can redistribute it and/or modify
14
// it under the terms of the GNU Lesser General Public License as published
15
// by the Free Software Foundation, either version 3 of the License, or
16
// (at your option) any later version.
17
//
18
// Supplemental terms.
19
//     * Redistributions of source code must retain the above copyright
20
//       notice, this list of conditions and the following disclaimer.
21
//     * Neither the name of the <organization> nor the
22
//       names of its contributors may be used to endorse or promote products
23
//       derived from this software without specific prior written permission.
24
//
25
// THIS SOFTWARE IS PROVIDED BY Robert Hayes ''AS IS'' AND ANY
26
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28
// DISCLAIMED. IN NO EVENT SHALL Robert Hayes BE LIABLE FOR ANY
29
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
32
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
//
36
// You should have received a copy of the GNU General Public License
37
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
38
////////////////////////////////////////////////////////////////////////////////
39
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
40 87 rehayes
 
41 88 rehayes
// -----------------------------------------------------------------------------
42
// JTAG TAP Controller
43
// -----------------------------------------------------------------------------
44 87 rehayes
module xgate_jtag #(parameter IR_BITS = 4)    // Number of Instruction Register Bits
45
  (
46 88 rehayes
    output  jtag_tdo,      // JTAG Serial Output Data
47
    output  jtag_tdo_en,   // JTAG Serial Output Data tri-state enable
48 87 rehayes
 
49 88 rehayes
    input   jtag_tdi,      // JTAG Serial Input Data
50
    input   jtag_clk,      // JTAG Test clock
51
    input   jtag_reset_n,  // JTAG Async reset signal
52
    input   jtag_tms,      // JTAG Test Mode Select
53
 
54
    output  extest,        // JTAG Command for I/O control
55
    output  clamp,         // JTAG Command for I/O control
56
    output  highz,         // JTAG Command for I/O control
57
    output  force_pul_lo,  // JTAG Command for I/O control
58
    output  force_pul_hi,  // JTAG Command for I/O control
59
 
60
    output  sel_bsd,       // JTAG select the boundary scan register
61
    output  sel_udi_1,     // JTAG select the udi_1 (testmode control) register
62
 
63
    output  capture_clk,   // Shift and input capture clock
64
    output  update_clk,    // Load holding register
65
    output  capture_dr,    // Enable shift/capture register input loading,
66
    output  update_dr,     // Enable holding register input loading
67
    output  shift_dr,      // Select eather shift mode or parallel capture mode
68
    input   bsd_so,        // Serial data input from boundary scan chain
69
    input   user1_so       // Serial data input from user register
70 87 rehayes
  );
71
 
72 88 rehayes
 
73 87 rehayes
  wire [3:0] jtag_state;
74
  wire [3:0] next_jtag_state;
75
 
76 88 rehayes
  wire [IR_BITS-1:0] ir_reg;
77 87 rehayes
 
78
 
79 88 rehayes
 
80
  // Define clocks here, future enhansment would be to add scan clock mux
81
  // update_clk is output I/O clock and control register capture clock
82
  // capture_clock is input I/O clock and shifting clock
83
  assign update_clk  = !jtag_clk;
84
  assign capture_clk = jtag_clk;
85
 
86 87 rehayes
  // ---------------------------------------------------------------------------
87
  xgate_jtag_sm
88
    jtag_sm(
89 88 rehayes
      .jtag_state(jtag_state),
90
      .next_jtag_state(next_jtag_state),
91
      .update_ir(update_ir),
92
      .capture_ir(capture_ir),
93
      .shift_ir(shift_ir),
94
      .update_dr(update_dr),
95
      .capture_dr(capture_dr),
96
      .shift_dr(shift_dr),
97
      .capture_clk(capture_clk),
98
      .jtag_reset_n(jtag_reset_n),
99
      .jtag_tms(jtag_tms)
100 87 rehayes
    );
101
 
102
  // ---------------------------------------------------------------------------
103
  xgate_jtag_ir #(.IR_BITS(IR_BITS))
104
    jtag_ir(
105 88 rehayes
      .ir_reg(ir_reg),
106
      .ir_so(ir_so),
107
      .capture_clk(capture_clk),
108
      .update_clk(update_clk),
109
      .update_ir(update_ir),
110
      .capture_ir(capture_ir),
111
      .shift_ir(shift_ir),
112
      .jtag_tdi(jtag_tdi),
113
      .jtag_reset_n(jtag_reset_n)
114 87 rehayes
    );
115 88 rehayes
 
116 87 rehayes
  // ---------------------------------------------------------------------------
117 88 rehayes
  xgate_instr_decode #(.IR_BITS(IR_BITS))
118
    decoder(
119
      .bypass(bypass),
120
      .clamp(clamp),
121
      .highz(highz),
122
      .extest(extest),
123
      .force_pul_lo(force_pul_lo),
124
      .force_pul_hi(force_pul_hi),
125
      .sample(sample),
126
      .idcode(idcode),
127
      .usercode(usercode),
128
      .udi_1(udi_1),
129 87 rehayes
 
130 88 rehayes
      .sel_bypass(sel_bypass),
131
      .sel_bsd(sel_bsd),
132
      .sel_id(sel_id),
133
      .sel_udi_1(sel_udi_1),
134 87 rehayes
 
135 88 rehayes
      .ir_reg(ir_reg)
136
    );
137
 
138
  // ---------------------------------------------------------------------------
139
  xgate_bypass_reg
140
    tdi_bypass(
141
      .bypass_so(bypass_so),
142
 
143
      .jtag_tdi(jtag_tdi),
144
      .capture_clk(capture_clk),
145
      .jtag_reset_n(jtag_reset_n)
146
    );
147
 
148
  // ---------------------------------------------------------------------------
149
  xgate_id_reg
150
    chip_id(
151
      .id_so(id_so),
152
 
153
      .jtag_tdi(jtag_tdi),
154
      .capture_clk(capture_clk),
155
      .capture_dr(capture_dr),
156
      .shift_dr(shift_dr),
157
      .idcode(idcode),
158
      .usercode(usercode),
159
      .jtag_reset_n(jtag_reset_n)
160
    );
161
 
162
  // ---------------------------------------------------------------------------
163
  xgate_tdo_mux
164
    tdo_out(
165
      .sel_bypass(sel_bypass),
166
      .sel_bsd(sel_bsd),
167
      .sel_id(sel_id),
168
      .sel_udi_1(sel_udi_1),
169
 
170
      .bypass_so(bypass_so),
171
      .bsd_so(bsd_so),
172
      .user1_so(user1_so),
173
      .id_so(id_so),
174
      .ir_so(ir_so),
175
 
176
      .shift_dr(shift_dr),
177
      .shift_ir(shift_ir),
178
      .update_clk(update_clk),
179
      .jtag_reset_n(jtag_reset_n),
180
 
181
      .jtag_tdo(jtag_tdo),
182
      .jtag_tdo_en(jtag_tdo_en)
183
    );
184
 
185 87 rehayes
endmodule  // xgate_jtag
186
 
187
 
188
// -----------------------------------------------------------------------------
189 88 rehayes
// JTAG TAP State Machine
190 87 rehayes
// -----------------------------------------------------------------------------
191
module xgate_jtag_sm
192
  (
193 88 rehayes
    output reg [3:0] jtag_state,        // JTAG State
194
    output reg [3:0] next_jtag_state,   // Pseudo Register for JTAG next state logic
195 87 rehayes
 
196 88 rehayes
    output           update_ir,
197
    output           capture_ir,
198
    output           shift_ir,
199 87 rehayes
 
200 88 rehayes
    output           update_dr,
201
    output           capture_dr,
202
    output           shift_dr,
203 87 rehayes
 
204 88 rehayes
    input            capture_clk,   // JTAG Test clock
205
    input            jtag_reset_n,  // JTAG Async reset signal
206
    input            jtag_tms       // JTAG Test Mode Select
207 87 rehayes
  );
208
 
209 88 rehayes
parameter RESET         = 4'hF,
210
          RUN_TEST_IDLE = 4'hC,
211
          SEL_DR_SCAN   = 4'h7,
212
          CAPTURE_DR    = 4'h6,
213
          SHIFT_DR      = 4'h2,
214
          EXIT1_DR      = 4'h1,
215
          PAUSE_DR      = 4'h3,
216
          EXIT2_DR      = 4'h0,
217
          UPDATE_DR     = 4'h5,
218
          SEL_IR_SCAN   = 4'h4,
219
          CAPTURE_IR    = 4'hE,
220
          SHIFT_IR      = 4'hA,
221
          EXIT1_IR      = 4'h9,
222
          PAUSE_IR      = 4'hB,
223
          EXIT2_IR      = 4'h8,
224
          UPDATE_IR     = 4'hD;
225 87 rehayes
 
226
  assign update_ir  = jtag_state == UPDATE_IR;
227
  assign capture_ir = jtag_state == CAPTURE_IR;
228
  assign shift_ir   = jtag_state == SHIFT_IR;
229
 
230
  assign update_dr  = jtag_state == UPDATE_DR;
231
  assign capture_dr = jtag_state == CAPTURE_DR;
232
  assign shift_dr   = jtag_state == SHIFT_DR;
233
 
234
 
235 88 rehayes
  // Define the JTAG State Register
236
  always @(posedge capture_clk or negedge jtag_reset_n)
237 87 rehayes
    if (!jtag_reset_n)
238
      jtag_state <= RESET;
239
    else
240
      jtag_state <= next_jtag_state;
241
 
242 88 rehayes
  // Define the JTAG State Transitions
243 87 rehayes
  always @*
244
    begin
245
      case(jtag_state)
246
        RESET:
247
          next_jtag_state = jtag_tms ? RESET : RUN_TEST_IDLE;
248
        RUN_TEST_IDLE:
249
          next_jtag_state = jtag_tms ? SEL_DR_SCAN : RUN_TEST_IDLE;
250
        SEL_DR_SCAN:
251
          next_jtag_state = jtag_tms ? SEL_IR_SCAN : CAPTURE_DR;
252
        CAPTURE_DR:
253
          next_jtag_state = jtag_tms ? EXIT1_DR : SHIFT_DR;
254
        SHIFT_DR:
255
          next_jtag_state = jtag_tms ? EXIT1_DR : SHIFT_DR;
256
        EXIT1_DR:
257
          next_jtag_state = jtag_tms ? UPDATE_DR : PAUSE_DR;
258
        PAUSE_DR:
259
          next_jtag_state = jtag_tms ? EXIT2_DR : PAUSE_DR;
260
        EXIT2_DR:
261
          next_jtag_state = jtag_tms ? UPDATE_DR : SHIFT_DR;
262
        UPDATE_DR:
263
          next_jtag_state = jtag_tms ? SEL_DR_SCAN : RUN_TEST_IDLE;
264
 
265
        SEL_IR_SCAN:
266
          next_jtag_state = jtag_tms ? RESET : CAPTURE_IR;
267
        CAPTURE_IR:
268
          next_jtag_state = jtag_tms ? EXIT1_IR : SHIFT_IR;
269
        SHIFT_IR:
270
          next_jtag_state = jtag_tms ? EXIT1_IR : SHIFT_IR;
271
        EXIT1_IR:
272
          next_jtag_state = jtag_tms ? UPDATE_IR : PAUSE_IR;
273
        PAUSE_IR:
274
          next_jtag_state = jtag_tms ? EXIT2_IR : PAUSE_IR;
275
        EXIT2_IR:
276
          next_jtag_state = jtag_tms ? UPDATE_IR : SHIFT_IR;
277
        UPDATE_IR:
278
          next_jtag_state = jtag_tms ? SEL_DR_SCAN : RUN_TEST_IDLE;
279
      endcase
280
    end
281
 
282
endmodule  // xgate_jtag_sm
283
 
284
 
285
// -----------------------------------------------------------------------------
286 88 rehayes
// JTAG TAP Instruction Register
287 87 rehayes
// -----------------------------------------------------------------------------
288
module xgate_jtag_ir #(parameter IR_BITS = 4)    // Number of Instruction Register Bits
289
  (
290 88 rehayes
    output reg [IR_BITS-1:0] ir_reg,
291
    output                   ir_so,    // IR shift out
292 87 rehayes
 
293 88 rehayes
    input            update_ir,
294
    input            capture_ir,
295
    input            shift_ir,
296 87 rehayes
 
297 88 rehayes
    input            jtag_tdi,      // JTAG Serial Input Data
298
    input            capture_clk,   // JTAG Test clock
299
    input            update_clk,
300
    input            jtag_reset_n   // JTAG Async reset signal
301 87 rehayes
  );
302
 
303
  reg [IR_BITS-1:0] ir_shift_reg;
304
 
305 88 rehayes
  assign ir_so = ir_shift_reg[0];
306
 
307
  // JTAG Instruction Shift Register
308
  always @(posedge capture_clk or negedge jtag_reset_n)
309 87 rehayes
    if (!jtag_reset_n)
310
      ir_shift_reg <= 0;
311
    else if (capture_ir)
312
      ir_shift_reg <= ir_reg;
313
    else if (shift_ir)
314
      ir_shift_reg <= {jtag_tdi, ir_shift_reg[(IR_BITS-1):1]};
315
 
316 88 rehayes
  // JTAG Instruction Register
317
  always @(posedge update_clk or negedge jtag_reset_n)
318 87 rehayes
    if (!jtag_reset_n)
319 88 rehayes
      ir_reg <= {IR_BITS{1'b1}};  // Make the default instruction BYPASS
320 87 rehayes
    else if (update_ir)
321
      ir_reg <= ir_shift_reg;
322
 
323
endmodule  // xgate_jtag_ir
324
 
325
 
326
// -----------------------------------------------------------------------------
327 88 rehayes
// JTAG Bypass Register
328 87 rehayes
// -----------------------------------------------------------------------------
329 88 rehayes
module xgate_bypass_reg
330
  (
331
    output reg       bypass_so,
332
 
333
    input            jtag_tdi,      // JTAG Serial Input Data
334
    input            capture_clk,   // JTAG Test clock
335
    input            jtag_reset_n   // JTAG Async reset signal
336
  );
337
 
338
  // JTAG Bypass Register
339
  always @(posedge capture_clk or negedge jtag_reset_n)
340
    if (!jtag_reset_n)
341
      bypass_so <= 0;
342
    else
343
      bypass_so <= jtag_tdi;
344
 
345
endmodule  // xgate_bypass_reg
346
 
347
 
348 87 rehayes
// -----------------------------------------------------------------------------
349 88 rehayes
// JTAG ID Register
350
// -----------------------------------------------------------------------------
351
module xgate_id_reg #(parameter NUM_BITS = 32)
352 87 rehayes
  (
353 88 rehayes
    output id_so,
354 87 rehayes
 
355 88 rehayes
    input  jtag_tdi,      // JTAG Serial Input Data
356
    input  capture_clk,
357
    input  capture_dr,
358
    input  shift_dr,
359
    input  idcode,
360
    input  usercode,
361
    input  jtag_reset_n   // JTAG Async reset signal
362 87 rehayes
  );
363
 
364 88 rehayes
  parameter user_code_val  = 32'ha596_c3f0;
365
  parameter version        = 4'h1;
366
  parameter part_num       = 16'h1105;
367
  parameter manufacture_id = 11'h00f;
368 87 rehayes
 
369 88 rehayes
  reg  [NUM_BITS-1:0] id_shifter;
370 87 rehayes
 
371 88 rehayes
  wire [NUM_BITS-1:0] jtag_id = {version, part_num, manufacture_id, 1'b1};
372
  wire [NUM_BITS-1:0] sel_mux = ({NUM_BITS{idcode}} & jtag_id) | ({NUM_BITS{usercode}} & user_code_val);
373
  wire [NUM_BITS-1:0] din_mux = shift_dr ? {jtag_tdi, id_shifter[(NUM_BITS-1):1]} : jtag_id;
374 87 rehayes
 
375 88 rehayes
  wire capture_en = (idcode || usercode) && (capture_dr || shift_dr);
376 87 rehayes
 
377 88 rehayes
  // JTAG Id Register
378
  always @(posedge capture_clk or negedge jtag_reset_n)
379
    if (!jtag_reset_n)
380
      id_shifter <= 0;
381
    else if (capture_en)
382
      id_shifter <= din_mux;
383 87 rehayes
 
384 88 rehayes
  assign id_so = id_shifter[0];
385 87 rehayes
 
386 88 rehayes
endmodule  // xgate_id_reg
387 87 rehayes
 
388
 
389
// -----------------------------------------------------------------------------
390 88 rehayes
// JTAG Instruction decoder of the IR Register
391 87 rehayes
// -----------------------------------------------------------------------------
392 88 rehayes
module xgate_instr_decode #(parameter IR_BITS = 4)    // Number of Instruction Register Bits
393
  (
394
    output reg bypass,
395
    output reg clamp,
396
    output reg highz,
397
    output reg extest,
398
    output reg force_pul_lo,
399
    output reg force_pul_hi,
400
    output reg sample,
401
    output reg idcode,
402
    output reg usercode,
403
    output reg udi_1,
404
 
405
    output     sel_bypass,
406
    output     sel_bsd,
407
    output     sel_id,
408
    output     sel_udi_1,
409
 
410
    input  [IR_BITS-1:0] ir_reg
411
  );
412
 
413
  assign sel_bypass = bypass || clamp || highz || force_pul_lo || force_pul_hi;
414
  assign sel_bsd = extest || sample;
415
  assign sel_id = idcode || usercode;
416
  assign sel_udi_1 = udi_1;
417
 
418
  always @*
419
    begin
420
      bypass     = 0;
421
      clamp      = 0;
422
      highz      = 0;
423
      extest     = 0;
424
      force_pul_lo = 0;
425
      force_pul_hi = 0;
426
      sample     = 0;
427
      idcode     = 0;
428
      usercode   = 0;
429
      udi_1      = 0;
430
      casez (ir_reg)
431
        4'b0110: clamp = 1;
432
        4'b0101: highz = 1;
433
        4'b0000: extest = 1;
434
        4'b1001: force_pul_lo = 1;
435
        4'b1010: force_pul_hi = 1;
436
        4'b0111: sample = 1;
437
        4'b0001: idcode = 1;
438
        4'b0011: usercode = 1;
439
        4'b1100: udi_1 = 1;
440
        default: bypass = 1;
441
      endcase
442
    end
443
 
444
endmodule  // xgate_instr_decode
445
 
446
 
447 87 rehayes
// -----------------------------------------------------------------------------
448 88 rehayes
// JTAG Test Data Output mux
449
// -----------------------------------------------------------------------------
450
module xgate_tdo_mux
451
  (
452
    input  sel_bypass,
453
    input  sel_bsd,
454
    input  sel_id,
455
    input  sel_udi_1,
456 87 rehayes
 
457 88 rehayes
    input  bypass_so,
458
    input  bsd_so,
459
    input  id_so,
460
    input  user1_so,
461
    input  ir_so,
462
 
463
    input  shift_dr,
464
    input  shift_ir,
465
    input  update_clk,
466
    input  jtag_reset_n,
467
 
468
    output reg jtag_tdo,
469
    output reg jtag_tdo_en
470
  );
471
 
472
  wire bypass_gate = shift_dr && sel_bypass && bypass_so;
473
  wire bsd_gate    = shift_dr && sel_bsd    && bsd_so;
474
  wire id_gate     = shift_dr && sel_id     && id_so;
475
  wire udi_1_gate  = shift_dr && sel_udi_1  && user1_so;
476
  wire ir_gate     = shift_ir && ir_so;
477
 
478
  wire jtag_tdo_mux = bypass_gate || bsd_gate || id_gate || udi_1_gate || ir_gate;
479
 
480
  // JTAG TDO Retiming Register
481
  always @(posedge update_clk or negedge jtag_reset_n)
482
    if (!jtag_reset_n)
483
      jtag_tdo <= 0;
484
    else
485
      jtag_tdo <= jtag_tdo_mux;
486
 
487
  // JTAG Output Enable Register
488
  always @(posedge update_clk or negedge jtag_reset_n)
489
    if (!jtag_reset_n)
490
      jtag_tdo_en <= 0;
491
    else
492
      jtag_tdo_en <= shift_dr || shift_ir;
493
 
494
endmodule  // xgate_tdo_mux
495
 
496
 
497
// -----------------------------------------------------------------------------
498
// Boundary Scan Cell #7
499
// -----------------------------------------------------------------------------
500 87 rehayes
module bc_7
501 88 rehayes
  (
502
    input      capture_clk,  // Shift and input capture clock
503
    input      update_clk,   // Load holding register
504
    input      capture_en,   // Enable shift/capture register parallel input loading,
505
    input      update_en,    // Enable holding register input loading
506
    input      shift_dr,     // Select eather shift mode or parallel capture mode
507
    input      mode,         // Select test mode or mission mode control of pad
508
    input      si,           // Serial data input
509
    input      pin_input,    // Mission mode input from pin
510
    input      control_out,  // Signal from bc_2 module controlling output enable pin
511
    input      output_data,  // mission mode data in from core
512
    input      reset_n,      // reset
513 87 rehayes
 
514 88 rehayes
    output     data_out,     // Final data to pad
515
    output reg so            // Serial data out
516 87 rehayes
  );
517
 
518
  reg data_reg;
519
 
520
  // Shift register
521
  always @(posedge capture_clk or negedge reset_n)
522
    if (!reset_n)
523
      so <= 0;
524
    else if (capture_en)
525 88 rehayes
      so <= shift_dr ? si : ((!control_out || mode) ? pin_input : output_data);
526 87 rehayes
 
527
  // Holding register
528
  always @(posedge update_clk or negedge reset_n)
529
    if (!reset_n)
530
      data_reg <= 0;
531
    else if (update_en)
532
      data_reg <= so;
533
 
534
  assign data_out = mode ? data_reg : output_data;
535
 
536
endmodule  // bc_7
537
 
538
 
539
// -----------------------------------------------------------------------------
540 88 rehayes
// Boundary Scan Cell #2
541 87 rehayes
// -----------------------------------------------------------------------------
542
module bc_2
543 88 rehayes
  (
544
    input      capture_clk,  // Shift and input capture clock
545
    input      update_clk,   // Load holding register
546
    input      capture_en,   // Enable shift/capture register parallel input loading
547
    input      update_en,    // Enable holding register input loading
548
    input      shift_dr,     // Select eather shift mode or parallel capture mode
549
    input      mode,         // Select test mode or mission mode control of pad
550
    input      si,           // Serial data input
551
    input      data_in,      // Mission mode input
552
    input      reset_n,      // reset
553 87 rehayes
 
554 88 rehayes
    output     data_out,     // Final data to pad
555
    output reg so            // Serial data out
556 87 rehayes
  );
557
 
558
  reg data_reg;
559
 
560
  // Shift register
561
  always @(posedge capture_clk or negedge reset_n)
562
    if (!reset_n)
563
      so <= 0;
564
    else if (capture_en)
565
      so <= shift_dr ? si : data_out;
566
 
567
  // Holding register
568
  always @(posedge update_clk or negedge reset_n)
569
    if (!reset_n)
570
      data_reg <= 0;
571
    else if (update_en)
572
      data_reg <= so;
573
 
574
  assign data_out = mode ? data_reg : data_in;
575
 
576
endmodule  // bc_2
577 88 rehayes
 
578
 

powered by: WebSVN 2.1.0

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