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

Subversion Repositories 8051

[/] [8051/] [tags/] [rel_1/] [rtl/] [verilog/] [oc8051_top.v] - Blame information for rev 132

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

Line No. Rev Author Line
1 72 simont
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  8051 cores top level module                                 ////
4
////                                                              ////
5
////  This file is part of the 8051 cores project                 ////
6
////  http://www.opencores.org/cores/8051/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  8051 definitions.                                           ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////    nothing                                                   ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Simon Teran, simont@opencores.org                     ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46 54 simont
// $Log: not supported by cvs2svn $
47 132 simont
// Revision 1.24  2003/04/11 10:05:59  simont
48
// deifne OC8051_ROM added
49
//
50 122 simont
// Revision 1.23  2003/04/10 12:43:19  simont
51
// defines for pherypherals added
52
//
53 120 simont
// Revision 1.22  2003/04/09 16:24:04  simont
54
// change wr_sft to 2 bit wire.
55
//
56 118 simont
// Revision 1.21  2003/04/09 15:49:42  simont
57
// Register oc8051_sfr dato output, add signal wait_data.
58
//
59 117 simont
// Revision 1.20  2003/04/03 19:13:28  simont
60
// Include instruction cache.
61
//
62 107 simont
// Revision 1.19  2003/04/02 15:08:30  simont
63
// raname signals.
64
//
65 102 simont
// Revision 1.18  2003/01/13 14:14:41  simont
66
// replace some modules
67
//
68 82 simont
// Revision 1.17  2002/11/05 17:23:54  simont
69
// add module oc8051_sfr, 256 bytes internal ram
70
//
71 76 simont
// Revision 1.16  2002/10/28 14:55:00  simont
72
// fix bug in interface to external data ram
73
//
74 72 simont
// Revision 1.15  2002/10/23 16:53:39  simont
75
// fix bugs in instruction interface
76
//
77 62 simont
// Revision 1.14  2002/10/17 18:50:00  simont
78
// cahnge interface to instruction rom
79
//
80 54 simont
// Revision 1.13  2002/09/30 17:33:59  simont
81
// prepared header
82 72 simont
//
83
//
84
 
85
// synopsys translate_off
86
`include "oc8051_timescale.v"
87
// synopsys translate_on
88
 
89
 
90 102 simont
module oc8051_top (wb_rst_i, wb_clk_i,
91
//interface to instruction rom
92 120 simont
                wbi_adr_o,
93
                wbi_dat_i,
94
                wbi_stb_o,
95
                wbi_ack_i,
96
                wbi_cyc_o,
97
                wbi_err_i,
98
 
99 102 simont
//interface to data ram
100 120 simont
                wbd_dat_i,
101
                wbd_dat_o,
102
                wbd_adr_o,
103
                wbd_we_o,
104 132 simont
                wbd_ack_i,
105 120 simont
                wbd_stb_o,
106
                wbd_cyc_o,
107
                wbd_err_i,
108
 
109 102 simont
// interrupt interface
110 120 simont
                int0_i,
111
                int1_i,
112
 
113 102 simont
// external access (active low)
114
                ea_in,
115 120 simont
 
116 102 simont
// port interface
117 120 simont
  `ifdef OC8051_PORTS
118
        `ifdef OC8051_PORT0
119
                p0_i,
120
                p0_o,
121
        `endif
122
 
123
        `ifdef OC8051_PORT1
124
                p1_i,
125
                p1_o,
126
        `endif
127
 
128
        `ifdef OC8051_PORT2
129
                p2_i,
130
                p2_o,
131
        `endif
132
 
133
        `ifdef OC8051_PORT3
134
                p3_i,
135
                p3_o,
136
        `endif
137
  `endif
138
 
139 102 simont
// serial interface
140 120 simont
        `ifdef OC8051_UART
141 102 simont
                rxd_i, txd_o,
142 120 simont
        `endif
143
 
144 102 simont
// counter interface
145 120 simont
        `ifdef OC8051_TC01
146
                t0_i, t1_i,
147
        `endif
148 72 simont
 
149 120 simont
        `ifdef OC8051_TC2
150
                t2_i, t2ex_i
151
        `endif
152
                );
153 72 simont
 
154
 
155 120 simont
 
156 102 simont
input         wb_rst_i,         // reset input
157
              wb_clk_i,         // clock input
158
              int0_i,           // interrupt 0
159
              int1_i,           // interrupt 1
160
              ea_in,            // external access
161
              wbd_ack_i,        // data acknowalge
162
              wbi_ack_i,        // instruction acknowlage
163
              wbd_err_i,        // data error
164 120 simont
              wbi_err_i;        // instruction error
165 72 simont
 
166 120 simont
input [7:0]   wbd_dat_i; // ram data input
167 102 simont
input [31:0]  wbi_dat_i; // rom data input
168 72 simont
 
169 102 simont
output        wbd_we_o,         // data write enable
170
              wbd_stb_o,        // data strobe
171
              wbd_cyc_o,        // data cycle
172
              wbi_stb_o,        // instruction strobe
173
              wbi_cyc_o;        // instruction cycle
174 82 simont
 
175 120 simont
output [7:0]  wbd_dat_o; // data output
176 102 simont
 
177
output [15:0] wbd_adr_o, // data address
178
              wbi_adr_o;        // instruction address
179
 
180 120 simont
`ifdef OC8051_PORTS
181 102 simont
 
182 120 simont
`ifdef OC8051_PORT0
183
input  [7:0]  p0_i;              // port 0 input
184
output [7:0]  p0_o;              // port 0 output
185
`endif
186 72 simont
 
187 120 simont
`ifdef OC8051_PORT1
188
input  [7:0]  p1_i;              // port 1 input
189
output [7:0]  p1_o;              // port 1 output
190
`endif
191 72 simont
 
192 120 simont
`ifdef OC8051_PORT2
193
input  [7:0]  p2_i;              // port 2 input
194
output [7:0]  p2_o;              // port 2 output
195
`endif
196 72 simont
 
197 120 simont
`ifdef OC8051_PORT3
198
input  [7:0]  p3_i;              // port 3 input
199
output [7:0]  p3_o;              // port 3 output
200
`endif
201 72 simont
 
202 120 simont
`endif
203 72 simont
 
204
 
205
 
206
 
207
 
208
 
209 120 simont
`ifdef OC8051_UART
210
input         rxd_i;            // receive
211
output        txd_o;            // transnmit
212
`endif
213 72 simont
 
214 120 simont
`ifdef OC8051_TC01
215
input         t0_i,             // counter 0 input
216
              t1_i;             // counter 1 input
217
`endif
218 72 simont
 
219 120 simont
`ifdef OC8051_TC2
220
input         t2_i,             // counter 2 input
221
              t2ex_i;           //
222
`endif
223 72 simont
 
224 120 simont
wire [7:0]  op1_i,
225
            op2_i,
226
            op3_i,
227
            dptr_hi,
228
            dptr_lo,
229
            ri,
230
            rn_mem,
231
            data_out,
232
            op1,
233
            op2,
234
            op3,
235
            acc,
236
            p0_out,
237
            p1_out,
238
            p2_out,
239
            p3_out,
240
            sp,
241
            sp_w;
242 72 simont
 
243 120 simont
wire [15:0] pc;
244 72 simont
 
245 120 simont
assign wbd_cyc_o = wbd_stb_o;
246 72 simont
 
247 120 simont
wire        src_sel3;
248
wire [1:0]  wr_sfr;
249
wire [2:0]  ram_rd_sel,  // ram read
250
            ram_wr_sel, // ram write
251
            src_sel2,
252
            src_sel1;
253
 
254
wire [7:0]  ram_data,
255
            ram_out,    //data from ram
256
            sfr_out,
257
            wr_dat,
258
            wr_addr,    //ram write addres
259
            rd_addr;    //data ram read addres
260
wire        sfr_bit;
261
 
262
wire [1:0]  cy_sel,      //carry select; from decoder to cy_selct1
263
            bank_sel;
264
wire        rom_addr_sel,       //rom addres select; alu or pc
265
            rmw,
266
            ea_int;
267
 
268
wire        reti,
269
            intr,
270
            int_ack,
271
            istb;
272
wire [7:0]  int_src;
273
 
274
wire        mem_wait;
275
wire [2:0]  mem_act;
276
wire [3:0]  alu_op;      //alu operation (from decoder)
277
wire [1:0]  psw_set;    //write to psw or not; from decoder to psw (through register)
278
 
279
wire [7:0]  src1,        //alu sources 1
280
            src2,       //alu sources 2
281
            src3,       //alu sources 3
282
            des1,       //alu destination 1
283 132 simont
            des2;       //alu destinations 2
284 120 simont
wire        desCy,      //carry out
285
            desAc,
286
            desOv,      //overflow
287
            alu_cy,
288
            wr,         //write to data ram
289
            wr_o;
290
 
291
wire        rd,         //read program rom
292
            pc_wr;
293
wire [2:0]  pc_wr_sel;   //program counter write select (from decoder to pc)
294
 
295
wire [7:0]  op1_n, //from memory_interface to decoder
296
            op2_n,
297
            op3_n;
298
 
299
wire [1:0]  comp_sel;    //select source1 and source2 to compare
300
wire        eq,         //result (from comp1 to decoder)
301
            srcAc,
302
            cy,
303
            rd_ind,
304 132 simont
            wr_ind,
305
            comp_wait;
306 120 simont
wire [2:0]  op1_cur;
307
 
308
wire        bit_addr,   //bit addresable instruction
309
            bit_data,   //bit data from ram to ram_select
310
            bit_out,    //bit data from ram_select to alu and cy_select
311
            bit_addr_o,
312
            wait_data;
313
 
314 72 simont
//
315 107 simont
// cpu to cache/wb_interface
316
wire        iack_i,
317
            istb_o,
318
            icyc_o;
319
wire [31:0] idat_i;
320
wire [15:0] iadr_o;
321 72 simont
 
322
 
323
//
324
// decoder
325 120 simont
oc8051_decoder oc8051_decoder1(.clk(wb_clk_i),
326
                               .rst(wb_rst_i),
327
                               .op_in(op1_n),
328
                               .op1_c(op1_cur),
329
                               .ram_rd_sel_o(ram_rd_sel),
330
                               .ram_wr_sel_o(ram_wr_sel),
331
                               .bit_addr(bit_addr),
332 72 simont
 
333 120 simont
                               .src_sel1(src_sel1),
334
                               .src_sel2(src_sel2),
335
                               .src_sel3(src_sel3),
336 72 simont
 
337 120 simont
                               .alu_op_o(alu_op),
338
                               .psw_set(psw_set),
339
                               .cy_sel(cy_sel),
340
                               .wr_o(wr),
341
                               .pc_wr(pc_wr),
342
                               .pc_sel(pc_wr_sel),
343
                               .comp_sel(comp_sel),
344
                               .eq(eq),
345
                               .wr_sfr_o(wr_sfr),
346
                               .rd(rd),
347
                               .rmw(rmw),
348
                               .istb(istb),
349
                               .mem_act(mem_act),
350
                               .mem_wait(mem_wait),
351
                               .wait_data(wait_data));
352
 
353
 
354 72 simont
//
355
//alu
356 120 simont
oc8051_alu oc8051_alu1(.rst(wb_rst_i),
357
                       .clk(wb_clk_i),
358
                       .op_code(alu_op),
359 132 simont
                       .src1(src1),
360 120 simont
                       .src2(src2),
361
                       .src3(src3),
362
                       .srcCy(alu_cy),
363
                       .srcAc(srcAc),
364 132 simont
                       .des1(des1),
365
                       .des2(des2),
366 120 simont
                       .desCy(desCy),
367
                       .desAc(desAc),
368
                       .desOv(desOv),
369
                       .bit_in(bit_out));
370 72 simont
 
371
//
372
//data ram
373 120 simont
oc8051_ram_top oc8051_ram_top1(.clk(wb_clk_i),
374
                               .rst(wb_rst_i),
375
                               .rd_addr(rd_addr),
376
                               .rd_data(ram_data),
377
                               .wr_addr(wr_addr),
378
                               .bit_addr(bit_addr_o),
379
                               .wr_data(wr_dat),
380
                               .wr(wr_o && (!wr_addr[7] || wr_ind)),
381
                               .bit_data_in(desCy),
382
                               .bit_data_out(bit_data));
383 72 simont
 
384
//
385
 
386 120 simont
oc8051_alu_src_sel oc8051_alu_src_sel1(.clk(wb_clk_i),
387
                                       .rst(wb_rst_i),
388
                                       .rd(rd),
389 82 simont
 
390 120 simont
                                       .sel1(src_sel1),
391
                                       .sel2(src_sel2),
392
                                       .sel3(src_sel3),
393 82 simont
 
394 120 simont
                                       .acc(acc),
395
                                       .ram(ram_out),
396
                                       .pc(pc),
397
                                       .dptr({dptr_hi, dptr_lo}),
398
                                       .op1(op1_n),
399
                                       .op2(op2_n),
400
                                       .op3(op3_n),
401
 
402
                                       .src1(src1),
403
                                       .src2(src2),
404
                                       .src3(src3));
405
 
406
 
407 72 simont
//
408
//
409 120 simont
oc8051_comp oc8051_comp1(.sel(comp_sel),
410 132 simont
                         .eq(eq),
411
                         .b_in(bit_out),
412
                         .cy(cy),
413
                         .acc(acc),
414
                         .des(des1)
415
//                       .comp_wait(comp_wait)
416
                         );
417 72 simont
 
418
 
419
//
420
//program rom
421 122 simont
`ifdef OC8051_ROM
422
  oc8051_rom oc8051_rom1(.rst(wb_rst_i),
423
                       .clk(wb_clk_i),
424
                       .ea_int(ea_int),
425 120 simont
                       .addr(iadr_o),
426 122 simont
                       .data1(op1_i),
427
                       .data2(op2_i),
428 120 simont
                       .data3(op3_i));
429 122 simont
`else
430
  assign ea_int = 1'b0;
431
  assign op1_i = 8'h00;
432
  assign op2_i = 8'h00;
433
  assign op3_i = 8'h00;
434
`endif
435 72 simont
 
436
//
437
//
438 120 simont
oc8051_cy_select oc8051_cy_select1(.cy_sel(cy_sel),
439
                                   .cy_in(cy),
440
                                   .data_in(bit_out),
441
                                   .data_out(alu_cy));
442 72 simont
//
443
//
444 120 simont
oc8051_indi_addr oc8051_indi_addr1 (.clk(wb_clk_i),
445
                                    .rst(wb_rst_i),
446
                                    .rd_addr(rd_addr),
447
                                    .wr_addr(wr_addr),
448
                                    .data_in(wr_dat),
449
                                    .wr(wr_o),
450
                                    .wr_bit(bit_addr_o),
451
                                    .rn_out(rn_mem),
452
                                    .ri_out(ri),
453
                                    .sel(op1_cur),
454
                                    .bank(bank_sel));
455 72 simont
 
456
 
457 107 simont
 
458
assign icyc_o = istb_o;
459 72 simont
//
460
//
461 120 simont
oc8051_memory_interface oc8051_memory_interface1(.clk(wb_clk_i),
462
                       .rst(wb_rst_i),
463 107 simont
// internal ram
464 120 simont
                       .wr_i(wr),
465
                       .wr_o(wr_o),
466
                       .wr_bit_i(bit_addr),
467
                       .wr_bit_o(bit_addr_o),
468
                       .wr_dat(wr_dat),
469 132 simont
                       .des1(des1),
470 120 simont
                       .des2(des2),
471
                       .rd_addr(rd_addr),
472
                       .wr_addr(wr_addr),
473
                       .wr_ind(wr_ind),
474
                       .bit_in(bit_data),
475
                       .in_ram(ram_data),
476
                       .sfr(sfr_out),
477
                       .sfr_bit(sfr_bit),
478
                       .bit_out(bit_out),
479
                       .iram_out(ram_out),
480 72 simont
 
481 107 simont
// external instrauction rom
482 120 simont
                       .iack_i(iack_i),
483
                       .iadr_o(iadr_o),
484
                       .idat_i(idat_i),
485
                       .istb_o(istb_o),
486 82 simont
 
487 107 simont
// internal instruction rom
488 120 simont
                       .op1_i(op1_i),
489
                       .op2_i(op2_i),
490
                       .op3_i(op3_i),
491 82 simont
 
492 107 simont
// data memory
493 120 simont
                       .dadr_o(wbd_adr_o),
494
                       .ddat_o(wbd_dat_o),
495
                       .dwe_o(wbd_we_o),
496
                       .dstb_o(wbd_stb_o),
497
                       .ddat_i(wbd_dat_i),
498
                       .dack_i(wbd_ack_i),
499 107 simont
 
500
// from decoder
501 120 simont
                       .rd_sel(ram_rd_sel),
502
                       .wr_sel(ram_wr_sel),
503
                       .rn({bank_sel, op1_n[2:0]}),
504
                       .rd_ind(rd_ind),
505
                       .rd(rd),
506
                       .mem_act(mem_act),
507
                       .mem_wait(mem_wait),
508 107 simont
 
509
// external access
510 120 simont
                       .ea(ea_in),
511
                       .ea_int(ea_int),
512 107 simont
 
513
// instructions outputs to cpu
514 120 simont
                       .op1_out(op1_n),
515
                       .op2_out(op2_n),
516
                       .op3_out(op3_n),
517 82 simont
 
518 107 simont
// interrupt interface
519 120 simont
                       .intr(intr),
520
                       .int_v(int_src),
521
                       .int_ack(int_ack),
522
                       .istb(istb),
523
                       .reti(reti),
524 107 simont
 
525 82 simont
//pc
526 120 simont
                       .pc_wr_sel(pc_wr_sel),
527 132 simont
                       .pc_wr(pc_wr & comp_wait),
528 120 simont
                       .pc(pc),
529 82 simont
 
530 107 simont
// sfr's
531 120 simont
                       .sp_w(sp_w),
532
                       .dptr({dptr_hi, dptr_lo}),
533
                       .ri(ri),
534
                       .rn_mem(rn_mem),
535
                       .acc(acc),
536
                       .sp(sp)
537
                       );
538 82 simont
 
539 107 simont
 
540 72 simont
//
541
//
542
 
543 120 simont
oc8051_sfr oc8051_sfr1(.rst(wb_rst_i),
544
                       .clk(wb_clk_i),
545
                       .adr0(rd_addr[7:0]),
546
                       .adr1(wr_addr[7:0]),
547
                       .dat0(sfr_out),
548
                       .dat1(wr_dat),
549
                       .dat2(des2),
550
                       .we(wr_o && !wr_ind),
551
                       .bit_in(desCy),
552
                       .bit_out(sfr_bit),
553
                       .wr_bit(bit_addr_o),
554
                       .ram_rd_sel(ram_rd_sel),
555
                       .ram_wr_sel(ram_wr_sel),
556
                       .wr_sfr(wr_sfr),
557 132 simont
                       .comp_sel(comp_sel),
558
                       .comp_wait(comp_wait),
559 76 simont
// acc
560 120 simont
                       .acc(acc),
561 76 simont
// sp
562 120 simont
                       .sp(sp),
563
                       .sp_w(sp_w),
564 76 simont
// psw
565 120 simont
                       .bank_sel(bank_sel),
566
                       .desAc(desAc),
567
                       .desOv(desOv),
568
                       .psw_set(psw_set),
569
                       .srcAc(srcAc),
570
                       .cy(cy),
571 76 simont
// ports
572 120 simont
                       .rmw(rmw),
573
 
574
  `ifdef OC8051_PORTS
575
        `ifdef OC8051_PORT0
576
                       .p0_out(p0_o),
577
                       .p0_in(p0_i),
578
        `endif
579
 
580
        `ifdef OC8051_PORT1
581
                       .p1_out(p1_o),
582
                       .p1_in(p1_i),
583
        `endif
584
 
585
        `ifdef OC8051_PORT2
586
                       .p2_out(p2_o),
587
                       .p2_in(p2_i),
588
        `endif
589
 
590
        `ifdef OC8051_PORT3
591
                       .p3_out(p3_o),
592
                       .p3_in(p3_i),
593
        `endif
594
  `endif
595
 
596 76 simont
// uart
597 120 simont
        `ifdef OC8051_UART
598
                       .rxd(rxd_i), .txd(txd_o),
599
        `endif
600
 
601 76 simont
// int
602 120 simont
                       .int_ack(int_ack),
603
                       .intr(intr),
604
                       .int0(int0_i),
605
                       .int1(int1_i),
606
                       .reti(reti),
607
                       .int_src(int_src),
608
 
609
// t/c 0,1
610
        `ifdef OC8051_TC01
611
                       .t0(t0_i),
612
                       .t1(t1_i),
613
        `endif
614
 
615
// t/c 2
616
        `ifdef OC8051_TC2
617
                       .t2(t2_i),
618
                       .t2ex(t2ex_i),
619
        `endif
620
 
621 76 simont
// dptr
622 120 simont
                       .dptr_hi(dptr_hi),
623
                       .dptr_lo(dptr_lo),
624
                       .wait_data(wait_data)
625
                       );
626 72 simont
 
627 82 simont
 
628 107 simont
 
629
 
630
`ifdef OC8051_CACHE
631
 
632
 
633
oc8051_icache oc8051_icache1(.rst(wb_rst_i), .clk(wb_clk_i),
634
// cpu
635
        .adr_i(iadr_o),
636
        .dat_o(idat_i),
637
        .stb_i(istb_o),
638
        .ack_o(iack_i),
639
        .cyc_i(icyc_o),
640
// pins
641
        .dat_i(wbi_dat_i),
642
        .stb_o(wbi_stb_o),
643
        .adr_o(wbi_adr_o),
644
        .ack_i(wbi_ack_i),
645
        .cyc_o(wbi_cyc_o));
646
 
647
defparam oc8051_icache1.ADR_WIDTH = 7;  // cache address wihth
648
defparam oc8051_icache1.LINE_WIDTH = 2; // line address width (2 => 4x32)
649
defparam oc8051_icache1.BL_NUM = 31; // number of blocks (2^BL_WIDTH-1); BL_WIDTH = ADR_WIDTH - LINE_WIDTH
650
defparam oc8051_icache1.CACHE_RAM = 128; // cache ram x 32 (2^ADR_WIDTH)
651
 
652
//
653
//    no cache
654
//
655
`else
656
 
657
oc8051_wb_iinterface oc8051_wb_iinterface(.rst(wb_rst_i), .clk(wb_clk_i),
658
// cpu
659
        .adr_i(iadr_o),
660
        .dat_o(idat_i),
661
        .stb_i(istb_o),
662
        .ack_o(iack_i),
663
        .cyc_i(icyc_o),
664
// external rom
665
        .dat_i(wbi_dat_i),
666
        .stb_o(wbi_stb_o),
667
        .adr_o(wbi_adr_o),
668
        .ack_i(wbi_ack_i),
669
        .cyc_o(wbi_cyc_o));
670
 
671
 
672
`endif
673
 
674
 
675
 
676 72 simont
endmodule

powered by: WebSVN 2.1.0

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