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

Subversion Repositories xgate

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

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

Line No. Rev Author Line
1 87 rehayes
 
2
 
3
module xgate_jtag #(parameter IR_BITS = 4)    // Number of Instruction Register Bits
4
  (
5
  output           jtag_tdo,      // JTAG Serial Output Data
6
  output           jtag_tdo_en,   // JTAG Serial Output Data tri-state enable
7
 
8
  input            jtag_tdi,      // JTAG Serial Input Data
9
  input            jtag_clk,      // JTAG Test clock
10
  input            jtag_reset_n,  // JTAG Async reset signal
11
  input            jtag_tms       // JTAG Test Mode Select
12
  );
13
 
14
  wire [3:0] jtag_state;
15
  wire [3:0] next_jtag_state;
16
 
17
  wire           update_ir;
18
  wire           capture_ir;
19
  wire           shift_ir;
20
  wire           update_dr;
21
  wire           capture_dr;
22
  wire           shift_dr;
23
 
24
  assign jtag_tdo = 1'b1;
25
  assign jtag_tdo_en = 1'b0;
26
 
27
  // ---------------------------------------------------------------------------
28
  xgate_jtag_sm
29
    jtag_sm(
30
    .jtag_state(jtag_state),
31
    .next_jtag_state(next_jtag_state),
32
    .update_ir(update_ir),
33
    .capture_ir(capture_ir),
34
    .shift_ir(shift_ir),
35
    .update_dr(update_dr),
36
    .capture_dr(capture_dr),
37
    .shift_dr(shift_dr),
38
    .jtag_clk(jtag_clk),
39
    .jtag_reset_n(jtag_reset_n),
40
    .jtag_tms(jtag_tms)
41
    );
42
 
43
  // ---------------------------------------------------------------------------
44
  xgate_jtag_ir #(.IR_BITS(IR_BITS))
45
    jtag_ir(
46
    .update_ir(update_ir),
47
    .capture_ir(capture_ir),
48
    .shift_ir(shift_ir),
49
    .jtag_clk(jtag_clk),
50
    .jtag_tdi(jtag_tdi),
51
    .jtag_reset_n(jtag_reset_n),
52
    .jtag_tms(jtag_tms)
53
    );
54
 
55
  // ---------------------------------------------------------------------------
56
  bc_2
57
    gpio_0_bc2(
58
    .capture_clk(),
59
    .update_clk(),
60
    .capture_en(bsr_capture),
61
    .update_en(bsr_update),
62
    .shift_dr(bsr_shift),
63
    .mode(),
64
    .si(),
65
    .data_in(from_core_gpio_0),
66
    .reset_n(),
67
    .data_out(to_pad_gpio_0),
68
    .so(gpio_0_bc2_so)
69
  );
70
 
71
 
72
endmodule  // xgate_jtag
73
 
74
 
75
// -----------------------------------------------------------------------------
76
// -----------------------------------------------------------------------------
77
// -----------------------------------------------------------------------------
78
 
79
module xgate_jtag_sm
80
  (
81
  output reg [3:0] jtag_state,        // JTAG State
82
  output reg [3:0] next_jtag_state,   // Pseudo Register for JTAG next state logic
83
 
84
  output           update_ir,
85
  output           capture_ir,
86
  output           shift_ir,
87
 
88
  output           update_dr,
89
  output           capture_dr,
90
  output           shift_dr,
91
 
92
  input            jtag_clk,      // JTAG Test clock
93
  input            jtag_reset_n,  // JTAG Async reset signal
94
  input            jtag_tms       // JTAG Test Mode Select
95
  );
96
 
97
parameter RESET         = 4'b0000,
98
          RUN_TEST_IDLE = 4'b1000,
99
          SEL_DR_SCAN   = 4'b0001,
100
          CAPTURE_DR    = 4'b0010,
101
          SHIFT_DR      = 4'b0011,
102
          EXIT1_DR      = 4'b0100,
103
          PAUSE_DR      = 4'b0101,
104
          EXIT2_DR      = 4'b0110,
105
          UPDATE_DR     = 4'b0111,
106
          SEL_IR_SCAN   = 4'b1001,
107
          CAPTURE_IR    = 4'b1010,
108
          SHIFT_IR      = 4'b1011,
109
          EXIT1_IR      = 4'b1100,
110
          PAUSE_IR      = 4'b1101,
111
          EXIT2_IR      = 4'b1110,
112
          UPDATE_IR     = 4'b1111;
113
 
114
  assign update_ir  = jtag_state == UPDATE_IR;
115
  assign capture_ir = jtag_state == CAPTURE_IR;
116
  assign shift_ir   = jtag_state == SHIFT_IR;
117
 
118
  assign update_dr  = jtag_state == UPDATE_DR;
119
  assign capture_dr = jtag_state == CAPTURE_DR;
120
  assign shift_dr   = jtag_state == SHIFT_DR;
121
 
122
 
123
// Define the JTAG State Register
124
  always @(posedge jtag_clk or negedge jtag_reset_n)
125
    if (!jtag_reset_n)
126
      jtag_state <= RESET;
127
    else
128
      jtag_state <= next_jtag_state;
129
 
130
// Define the JTAG State Transitions
131
  always @*
132
    begin
133
      case(jtag_state)
134
        RESET:
135
          next_jtag_state = jtag_tms ? RESET : RUN_TEST_IDLE;
136
        RUN_TEST_IDLE:
137
          next_jtag_state = jtag_tms ? SEL_DR_SCAN : RUN_TEST_IDLE;
138
        SEL_DR_SCAN:
139
          next_jtag_state = jtag_tms ? SEL_IR_SCAN : CAPTURE_DR;
140
        CAPTURE_DR:
141
          next_jtag_state = jtag_tms ? EXIT1_DR : SHIFT_DR;
142
        SHIFT_DR:
143
          next_jtag_state = jtag_tms ? EXIT1_DR : SHIFT_DR;
144
        EXIT1_DR:
145
          next_jtag_state = jtag_tms ? UPDATE_DR : PAUSE_DR;
146
        PAUSE_DR:
147
          next_jtag_state = jtag_tms ? EXIT2_DR : PAUSE_DR;
148
        EXIT2_DR:
149
          next_jtag_state = jtag_tms ? UPDATE_DR : SHIFT_DR;
150
        UPDATE_DR:
151
          next_jtag_state = jtag_tms ? SEL_DR_SCAN : RUN_TEST_IDLE;
152
 
153
        SEL_IR_SCAN:
154
          next_jtag_state = jtag_tms ? RESET : CAPTURE_IR;
155
        CAPTURE_IR:
156
          next_jtag_state = jtag_tms ? EXIT1_IR : SHIFT_IR;
157
        SHIFT_IR:
158
          next_jtag_state = jtag_tms ? EXIT1_IR : SHIFT_IR;
159
        EXIT1_IR:
160
          next_jtag_state = jtag_tms ? UPDATE_IR : PAUSE_IR;
161
        PAUSE_IR:
162
          next_jtag_state = jtag_tms ? EXIT2_IR : PAUSE_IR;
163
        EXIT2_IR:
164
          next_jtag_state = jtag_tms ? UPDATE_IR : SHIFT_IR;
165
        UPDATE_IR:
166
          next_jtag_state = jtag_tms ? SEL_DR_SCAN : RUN_TEST_IDLE;
167
      endcase
168
    end
169
 
170
endmodule  // xgate_jtag_sm
171
 
172
 
173
// -----------------------------------------------------------------------------
174
// -----------------------------------------------------------------------------
175
// -----------------------------------------------------------------------------
176
 
177
module xgate_jtag_ir #(parameter IR_BITS = 4)    // Number of Instruction Register Bits
178
  (
179
  output reg [IR_BITS-1:0] ir_reg,
180
 
181
  input            update_ir,
182
  input            capture_ir,
183
  input            shift_ir,
184
 
185
  input            jtag_tdi,      // JTAG Serial Input Data
186
  input            jtag_clk,      // JTAG Test clock
187
  input            jtag_reset_n,  // JTAG Async reset signal
188
  input            jtag_tms       // JTAG Test Mode Select
189
  );
190
 
191
  reg [IR_BITS-1:0] ir_shift_reg;
192
 
193
// JTAG Instruction Shift Register
194
  always @(posedge jtag_clk or negedge jtag_reset_n)
195
    if (!jtag_reset_n)
196
      ir_shift_reg <= 0;
197
    else if (capture_ir)
198
      ir_shift_reg <= ir_reg;
199
    else if (shift_ir)
200
      ir_shift_reg <= {jtag_tdi, ir_shift_reg[(IR_BITS-1):1]};
201
 
202
// JTAG Instruction Register
203
  always @(posedge jtag_clk or negedge jtag_reset_n)
204
    if (!jtag_reset_n)
205
      ir_reg <= 0;
206
    else if (update_ir)
207
      ir_reg <= ir_shift_reg;
208
 
209
 
210
endmodule  // xgate_jtag_ir
211
 
212
 
213
// -----------------------------------------------------------------------------
214
// -----------------------------------------------------------------------------
215
// -----------------------------------------------------------------------------
216
 
217
module test_mode_cntrl #(parameter NUM_BITS  = 10)
218
  (
219
   // OUTPUT
220
   output so,
221
   output reg [NUM_BITS-1:0] mode_bits,
222
 
223
   // INPUTs
224
   input [NUM_BITS-1:0] obs_in,
225
   input si,
226
   input capture_clk,
227
   input update_clk,
228
   input capture_en,
229
   input update_en,
230
   input inst_en,
231
   input shift_en,
232
   input reset_n
233
  );
234
 
235
 
236
  reg [NUM_BITS-1:0] shift_reg;
237
 
238
  wire [NUM_BITS-1:0] din_mux = shift_en ? {shift_reg[NUM_BITS-1:1], si} : obs_in;
239
  wire [NUM_BITS-1:0] cap_mux = capture_en ? shift_reg : din_mux;
240
  wire [NUM_BITS-1:0] update_mux = update_en ? shift_reg : mode_bits;
241
 
242
  always @(posedge capture_clk or negedge reset_n)
243
    if (!reset_n)
244
      shift_reg <= 0;
245
    else if (inst_en)
246
      shift_reg <= cap_mux;
247
 
248
  always @(posedge update_clk or negedge reset_n)
249
    if (!reset_n)
250
      mode_bits <= 0;
251
    else if (inst_en)
252
      mode_bits <= update_mux;
253
 
254
  assign so = shift_reg[NUM_BITS-1];
255
 
256
endmodule  //
257
 
258
 
259
// -----------------------------------------------------------------------------
260
// -----------------------------------------------------------------------------
261
// -----------------------------------------------------------------------------
262
 
263
module bc_7
264
(
265
  input capture_clk,
266
  input update_clk,
267
  input capture_en,
268
  input update_en,
269
  input shift_dr,
270
  input mode1,
271
  input si,
272
  input pin_input,
273
  input control_out,
274
  input output_data,
275
  input reset_n,
276
 
277
  output     ic_input,
278
  output     data_out,
279
  output reg so
280
  );
281
 
282
  reg data_reg;
283
  reg enable_reg;
284
  reg control_reg;
285
  reg so_0;
286
 
287
  // Shift register
288
  always @(posedge capture_clk or negedge reset_n)
289
    if (!reset_n)
290
      so <= 0;
291
    else if (capture_en)
292
      so <= shift_dr ? si : ((!control_out || mode1) ? pin_input : output_data);
293
 
294
  // Holding register
295
  always @(posedge update_clk or negedge reset_n)
296
    if (!reset_n)
297
      data_reg <= 0;
298
    else if (update_en)
299
      data_reg <= so;
300
 
301
  assign data_out = mode ? data_reg : output_data;
302
 
303
endmodule  // bc_7
304
 
305
 
306
// -----------------------------------------------------------------------------
307
// -----------------------------------------------------------------------------
308
// -----------------------------------------------------------------------------
309
 
310
module bc_2
311
(
312
  input      capture_clk,  // Shift and input capture clock
313
  input      update_clk,   // Load holding register
314
  input      capture_en,   // Enable shift/capture register input loading,
315
  input      update_en,    // Enable holding register input loading
316
  input      shift_dr,     // Select eather shift mode or parallel capture mode
317
  input      mode,         // Select test mode or mission mode output
318
  input      si,           // Serial data input
319
  input      data_in,      // Mission mode input
320
  input      reset_n,      // reset
321
 
322
  output     data_out,     // Final data to pad
323
  output reg so            // Serial data out
324
  );
325
 
326
  reg data_reg;
327
 
328
  // Shift register
329
  always @(posedge capture_clk or negedge reset_n)
330
    if (!reset_n)
331
      so <= 0;
332
    else if (capture_en)
333
      so <= shift_dr ? si : data_out;
334
 
335
  // Holding register
336
  always @(posedge update_clk or negedge reset_n)
337
    if (!reset_n)
338
      data_reg <= 0;
339
    else if (update_en)
340
      data_reg <= so;
341
 
342
  assign data_out = mode ? data_reg : data_in;
343
 
344
endmodule  // bc_2

powered by: WebSVN 2.1.0

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