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

Subversion Repositories rv01_riscv_core

[/] [rv01_riscv_core/] [trunk/] [VHDL/] [RV01_hltu.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 madsilicon
-----------------------------------------------------------------
2
--                                                             --
3
-----------------------------------------------------------------
4
--                                                             --
5
-- Copyright (C) 2017 Stefano Tonello                          --
6
--                                                             --
7
-- This source file may be used and distributed without        --
8
-- restriction provided that this copyright statement is not   --
9
-- removed from the file and that any derivative work contains --
10
-- the original copyright notice and the associated disclaimer.--
11
--                                                             --
12
-- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY         --
13
-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   --
14
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   --
15
-- FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      --
16
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         --
17
-- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    --
18
-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   --
19
-- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        --
20
-- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  --
21
-- LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  --
22
-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  --
23
-- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         --
24
-- POSSIBILITY OF SUCH DAMAGE.                                 --
25
--                                                             --
26
-----------------------------------------------------------------
27
 
28
---------------------------------------------------------------
29
-- RV01 Halt unit
30
---------------------------------------------------------------
31
 
32
library IEEE;
33
use IEEE.std_logic_1164.all;
34
use IEEE.numeric_std.all;
35
 
36
library WORK;
37
use WORK.RV01_CONSTS_PKG.all;
38
use WORK.RV01_TYPES_PKG.all;
39
use WORK.RV01_ARITH_PKG.all;
40
use WORK.RV01_FUNCS_PKG.all;
41
use WORK.RV01_OP_PKG.all;
42
use WORK.RV01_CSR_PKG.all;
43
 
44
entity RV01_HLTU is
45
  generic(
46
    PXE : std_logic := '1';
47
    NW : natural := 2
48
  );
49
  port(
50
    CLK_i : in std_logic;
51
    RST_i : in std_logic;
52
    IX1_V_i : in std_logic_vector(NW-1 downto 0);
53
    IX2_V_i : in std_logic_vector(NW-1 downto 0);
54
    NOPR_i : in std_logic; -- no pending read (in sbuf) flag
55
    MMODE_i : in std_logic; -- machine mode flag
56
    HALT_i : in std_logic; -- halt flag
57
    HPC_i : in ADR_T; -- halt PC
58
    -- CSR interface
59
    CS_OP_i : in CS_OP_T;
60
    RS1_i : in RID_T;
61
    ADR_i : in signed(12-1 downto 0);
62
    WE_i : in std_logic;
63
    CSRD_i : in SDWORD_T;
64
    -- Control port
65
    CPRE_i : in std_logic;
66
    CPWE_i : in std_logic;
67
    CPADR_i : in std_logic_vector(17-1 downto 0);
68
    CPD_i : in std_logic_vector(SDLEN-1 downto 0);
69
 
70
    HMODE_o : out std_logic; -- halt mode flag
71
    STRT_o : out std_logic; -- start flag
72
    STRTPC_o : out ADR_T; -- start PC
73
    RSM_o : out std_logic; -- resume flag
74
    HLTURQ_o : out std_logic; -- halt request flag
75
    HLTOBRK_o : out std_logic; -- halt-on-break enable
76
    HLTOADR_o : out std_logic_vector(NW-1 downto 0); -- halt-on-address enable
77
    HLTADR_o : out ADR_T; -- halt address
78
    -- CSR interface
79
    CSRQ_o : out SDWORD_T;
80
    HCSR_o : out std_logic;
81
    ILLG_o : out std_logic;
82
    -- Control port
83
    HCP_o : out std_logic;
84
    CPQ_o : out std_logic_vector(SDLEN-1 downto 0)
85
  );
86
end RV01_HLTU;
87
 
88
architecture ARC of RV01_HLTU is
89
 
90
  constant MAX_CNT : natural := 2147483647; --2**(SDLEN-1)-1;
91
 
92
  constant MRV01HC_HALTSTATE : natural := 0;
93
  constant MRV01HC_START : natural := 1;
94
  constant MRV01HC_RESUME : natural := 2;
95
  constant MRV01HC_HALTU : natural := 3;
96
  constant MRV01HC_HALTOBRK : natural := 4;
97
  constant MRV01HC_HALTOADR : natural := 5;
98
 
99
  signal CS_OP_q : CS_OP_T;
100
  signal CS_OP_V : std_logic;
101
  signal CSRD_q,ICSRD : SDWORD_T;
102
  signal RS1_q : RID_T;
103
  signal WE_q : std_logic;
104
  signal ADR_q : signed(12-1 downto 0);
105
  signal CSRQ,CSRQ_q : SDWORD_T;
106
  signal ILLG : std_logic;
107
  signal HCSR : std_logic;
108
  signal ADR_ERR : std_logic;
109
  signal IADR,IADR_q : unsigned(12-1 downto 0);
110
  signal CPQ : SDWORD_T;
111
  signal CP_RE_q : std_logic;
112
  signal CP_WE_q : std_logic;
113
  signal CP_IADR,CP_IADR_q : unsigned(12-1 downto 0);
114
  signal CP_D_q : SDWORD_T;
115
  signal MRV01HC_q : SDWORD_T;
116
  signal MRV01HA_q : SDWORD_T;
117
  signal MRV01RA_q : SDWORD_T;
118
  signal STRT,STRT_q : std_logic;
119
  signal RSM,RSM_q : std_logic;
120
  signal HLTURQ_q : std_logic;
121
  signal HALT_q : std_logic;
122
  signal HCP : std_logic;
123
  signal HOACLR_q : std_logic;
124
 
125
  function update_csr(
126
    PREVD : SDWORD_T;
127
    MSK : SDWORD_T;
128
    NEWD : SDWORD_T
129
  ) return SDWORD_T is
130
    variable TMP1,TMP2,TMP3 : SDWORD_T;
131
  begin
132
    -- clear new data non-writable bits
133
    TMP1 := NEWD and MSK;
134
    -- clear previous data writable bits
135
    TMP2 := PREVD and not(MSK);
136
    -- build merged data
137
    TMP3 := TMP1 or TMP2;
138
    return(TMP3);
139
  end function;
140
 
141
begin
142
 
143
  ----------------------------------------------
144
 
145
  -- Notes:
146
  -- From instruction execution perspective Halt
147
  -- module acts as an additional CSRU, executing
148
  -- CSR's manipulating instruction on its internal
149
  -- registers.
150
  -- Halt module registers can be accessed as
151
  -- regular CSR's, using CSR instructions, or 
152
  -- through the control port.
153
 
154
  ----------------------------------------------
155
 
156
  -- CS_OP_i, ADR_i, CSRD_i and RS1_i provide
157
  -- access to Halt module internal registers as
158
  -- CSR's.
159
 
160
  IADR <= to_unsigned(ADR_i);
161
 
162
  -- Input signal registers
163
 
164
  process(CLK_i)
165
  begin
166
    if(CLK_i = '1' and CLK_i'event) then
167
      if(RST_i = '1') then
168
        WE_q <= '0';
169
      else
170
        WE_q <= WE_i;
171
      end if;
172
      CS_OP_q <= CS_OP_i;
173
      IADR_q <= IADR;
174
      CSRD_q <= CSRD_i;
175
      RS1_q <= RS1_i;
176
    end if;
177
  end process;
178
 
179
  ----------------------------------------------
180
 
181
  -- Perform operation specified by CSR manipulating
182
  -- instrucion.
183
 
184
  process(CS_OP_q,CSRD_q,RS1_q,CSRQ_q)
185
    variable ZXRS1 : SDWORD_T;
186
  begin
187
 
188
    -- zero-extended RS1
189
    ZXRS1(log2(REGNUM)-1 downto 0) :=
190
      to_signed(RS1_q,log2(REGNUM));
191
    ZXRS1(SDLEN-1 downto log2(REGNUM)) := (others => '0');
192
 
193
    case CS_OP_q is
194
      when CS_RW =>
195
        ICSRD <= CSRD_q;
196
      when CS_RS =>
197
        if(RS1_q = 0) then
198
          ICSRD <= CSRD_q;
199
        else
200
          ICSRD <= CSRQ_q or CSRD_q;
201
        end if;
202
      when CS_RC =>
203
        if(RS1_q = 0) then
204
          ICSRD <= CSRD_q;
205
        else
206
          ICSRD <= CSRQ_q and not(CSRD_q);
207
        end if;
208
      when CS_RWI =>
209
        ICSRD <= ZXRS1;
210
      when CS_RSI =>
211
        if(RS1_q = 0) then
212
          ICSRD <= CSRD_q;
213
        else
214
          ICSRD <= CSRQ_q or ZXRS1;
215
        end if;
216
      when CS_RCI =>
217
        if(RS1_q = 0) then
218
          ICSRD <= CSRD_q;
219
        else
220
          ICSRD <= CSRQ_q and not(ZXRS1);
221
        end if;
222
      when others =>
223
        ICSRD <= CSRD_q;
224
    end case;
225
  end process;
226
 
227
  -- CSR instruction valid flag
228
 
229
  CS_OP_V <= IX1_V_i(0) when (
230
    CS_OP_i = CS_RW or
231
    CS_OP_i = CS_RS or
232
    CS_OP_i = CS_RC or
233
    CS_OP_i = CS_RWI or
234
    CS_OP_i = CS_RSI or
235
    CS_OP_i = CS_RCI
236
  ) else '0';
237
 
238
  ----------------------------------------------
239
 
240
  -- CPADR_i, CPRE_i and CPWE_i provide access to
241
  -- Halt module internal registers from control
242
  -- port.
243
 
244
  CP_IADR <= to_unsigned(CPADR_i(14-1 downto 2));
245
 
246
  process(CLK_i)
247
  begin
248
    if(CLK_i = '1' and CLK_i'event) then
249
      if(RST_i = '1') then
250
        CP_RE_q <= '0';
251
        CP_WE_q <= '0';
252
      else
253
        CP_RE_q <= CPRE_i and CPADR_i(16);
254
        CP_WE_q <= CPWE_i and CPADR_i(16);
255
      end if;
256
    end if;
257
  end process;
258
 
259
  process(CLK_i)
260
  begin
261
    if(CLK_i = '1' and CLK_i'event) then
262
      CP_IADR_q <= CP_IADR;
263
      CP_D_q <= to_signed(CPD_i);
264
    end if;
265
  end process;
266
 
267
  ----------------------------------------------
268
  -- RV01 Halt Control register (MRV01HC)
269
  ----------------------------------------------
270
 
271
  -- This register manages halt interface, allowing
272
  -- to halt instruction execution:
273
  -- 1) immediately (i.e. on next executed
274
  -- instruction), OR
275
  -- 2) on the first break instruction to be 
276
  -- executed, OR
277
  -- 3) on the first instruction which fetch address
278
  -- matches MRV01HA register content.
279
  -- When instruction execution halts, MRV01RA holds
280
  -- the address of the next NON executed instruction.
281
  -- Instruction execution starts from standard
282
  -- reset address when start=1 and resume=0 and
283
  -- from address stored in MRV01RA when start=1 and
284
  -- resume=1.
285
  -- At reset, haltstate=1.
286
 
287
  -- bit  | description
288
  -- 0    | haltstate (R)
289
  -- 1    | start (W)
290
  -- 2    | resume (W)
291
  -- 3    | halt unconditionally (W)
292
  -- 4    | halt on break (R/W)
293
  -- 5    | halt on address (R/W)
294
  -- 6:31 | reserved
295
 
296
  -- This register "holds" HALT_i until
297
  -- store buffer gets emptied.
298
 
299
  process(CLK_i)
300
  begin
301
    if(CLK_i = '1' and CLK_i'event) then
302
      if(RST_i = '1') then
303
        HALT_q <= '0';
304
      elsif(HALT_i = '1' and NOPR_i = '0') then
305
        HALT_q <= '1';
306
      elsif(HALT_q = '1' and NOPR_i = '1') then
307
        HALT_q <= '0';
308
      end if;
309
    end if;
310
  end process;
311
 
312
  process(CLK_i)
313
  begin
314
    if(CLK_i = '1' and CLK_i'event) then
315
      if(RST_i = '1') then
316
        MRV01HC_q <= MRV01HC_RST;
317
      elsif(CP_WE_q = '1' and CP_IADR_q = MRV01HC_ADR) then
318
        -- write register through control port
319
        MRV01HC_q <= update_csr(MRV01HC_q,MRV01HC_WMSK,CP_D_q);
320
      elsif(WE_q = '1' and IADR_q = MRV01HC_ADR and MMODE_i = '1') then
321
        -- write register through CSR instructions
322
        MRV01HC_q <= update_csr(MRV01HC_q,MRV01HC_WMSK,ICSRD);
323
      end if;
324
      -- register haltstate bit is updated by when halting
325
      -- and starting/resuming instruction execution.
326
      if((HALT_i = '1' or HALT_q = '1') and NOPR_i = '1') then
327
        MRV01HC_q(MRV01HC_HALTSTATE) <= '1';
328
      elsif(STRT = '1') then
329
        MRV01HC_q(MRV01HC_HALTSTATE) <= '0';
330
      end if;
331
    end if;
332
  end process;
333
 
334
  -- Output Halt mode flag
335
 
336
  HMODE_o <= MRV01HC_q(MRV01HC_HALTSTATE);
337
 
338
  ----------------------------------------------
339
 
340
  -- Starting and resuming take place immediately,
341
  -- without the need to associate them to a valid
342
  -- instruction, so that it's not necessary to 
343
  -- store them (they're just registered to break
344
  -- the timing path).
345
 
346
  ----------------------------------------------
347
 
348
  -- Internal start flag
349
 
350
  STRT <= CP_WE_q when(
351
    CP_IADR_q = MRV01HC_ADR and
352
    CP_D_q(MRV01HC_START) = '1'
353
  ) else '0';
354
 
355
  -- start flag register
356
 
357
  process(CLK_i)
358
  begin
359
    if(CLK_i = '1' and CLK_i'event) then
360
      if(RST_i = '1') then
361
        STRT_q <= '0';
362
      else
363
        STRT_q <= STRT;
364
      end if;
365
    end if;
366
  end process;
367
 
368
  -- Output Start flag
369
 
370
  STRT_o <= STRT_q;
371
 
372
  -- Start address (set to reset vector, unless execution resumes from
373
  -- MRV01RA content.
374
 
375
  STRTPC_o <= RESET_VA_LO when RSM_q = '0' else to_unsigned(MRV01RA_q);
376
 
377
  ----------------------------------------------
378
 
379
  -- Internal resume flag
380
 
381
  RSM <= CP_WE_q when(
382
    CP_IADR_q = MRV01HC_ADR and
383
    CP_D_q(MRV01HC_RESUME) = '1'
384
  ) else '0';
385
 
386
  -- Resume flag register
387
 
388
  process(CLK_i)
389
  begin
390
    if(CLK_i = '1' and CLK_i'event) then
391
      if(RST_i = '1') then
392
        RSM_q <= '0';
393
      else
394
        RSM_q <= RSM;
395
      end if;
396
    end if;
397
  end process;
398
 
399
  -- Output resume flag
400
 
401
  RSM_o <= RSM_q;
402
 
403
  -- Halt-On-Address Clear flag (used to force
404
  -- HLTOADR_o cleared when resuming execution).
405
 
406
  process(CLK_i)
407
  begin
408
    if(CLK_i = '1' and CLK_i'event) then
409
      if(RST_i = '1') then
410
        HOACLR_q <= '0';
411
      elsif(RSM = '1') then
412
        HOACLR_q <= '1';
413
      elsif(IX2_V_i(0) = '1' or IX2_V_i(1) = '1') then
414
        HOACLR_q <= '0';
415
      end if;
416
    end if;
417
  end process;
418
 
419
  ----------------------------------------------
420
 
421
  -- Halting is associated to a valid instruction
422
  -- (otherwise there would be no address to 
423
  -- resume from) and therefore halt flag must
424
  -- be stored until a valid instruction
425
  -- is retired (this event being marked by
426
  -- HALT_i = '1').
427
 
428
  -- Halt request flag is set when a halt condition
429
  -- become true, and cleared when instruction
430
  -- execution halts (i.e. when the request is
431
  -- aknowledged by the core).
432
 
433
  process(CLK_i)
434
  begin
435
    if(CLK_i = '1' and CLK_i'event) then
436
      if(RST_i = '1') then
437
        HLTURQ_q <= '0';
438
      elsif(
439
        CP_WE_q = '1' and
440
        CP_IADR_q = MRV01HC_ADR and
441
        CP_D_q(MRV01HC_HALTU) = '1'
442
      ) then
443
        -- halt request flag is set by control port
444
        HLTURQ_q <= '1';
445
      elsif(
446
        WE_q = '1' and
447
        IADR_q = MRV01HC_ADR and
448
        ICSRD(MRV01HC_HALTU) = '1'
449
      ) then
450
        -- halt request flag is set via CSR instruction
451
        HLTURQ_q <= '1';
452
      elsif(HALT_i = '1') then
453
        -- core is halted: reset request flag
454
        HLTURQ_q <= '0';
455
      end if;
456
    end if;
457
  end process;
458
 
459
  -- Output Halt request flag
460
  HLTURQ_o <= HLTURQ_q;
461
 
462
  ----------------------------------------------
463
 
464
  -- Output Halt on break flag
465
  HLTOBRK_o <= MRV01HC_q(MRV01HC_HALTOBRK);
466
 
467
  ----------------------------------------------
468
 
469
  -- Note: if halt address and resume address coincide, the first
470
  -- instruction to be executed (i.e. the instruction located
471
  -- at the resume address) must be prevented from triggering
472
  -- a halt-on-address, otherwise the resume would have no
473
  -- practical effect.
474
  -- This is accomplished by having separated halt-on-address
475
  -- flags for the two instructions checked for halting.
476
  -- Slot #0 flag is forced clear, after resuming, until the
477
  -- first valid instruction reaches IX2.
478
  -- Slot #1 flag is forced clear, after resuming, until the
479
  -- first valid instruction reaches IX2, but only if IX2 slot #0
480
  -- instruction is not valid (this additional check is needed
481
  -- in the special case where halt address is equal to resume
482
  -- address plus 4 and the corresponding instructions reach
483
  -- IX2 at the same time, without it, the halt-on-address check
484
  -- on slot #1 instructions would be incorrectly disabled). 
485
 
486
  -- Halt on address flag
487
  HLTOADR_o(0) <= MRV01HC_q(MRV01HC_HALTOADR) and not(HOACLR_q);
488
 
489
  -- Halt on address flag
490
  HLTOADR_o(1) <= MRV01HC_q(MRV01HC_HALTOADR) and (not(HOACLR_q) or IX2_V_i(0));
491
 
492
  ----------------------------------------------
493
  -- RV01 Halt Address register (MRV01HA)
494
  ----------------------------------------------
495
 
496
  -- This register stores the address on which
497
  -- instruction execution halts when halt-on-
498
  -- address mode is enabled. 
499
 
500
  process(CLK_i)
501
  begin
502
    if(CLK_i = '1' and CLK_i'event) then
503
      if(RST_i = '1') then
504
        MRV01HA_q <= (others => '0');
505
      elsif(CP_WE_q = '1' and CP_IADR_q = MRV01HA_ADR) then
506
        -- write register through control port
507
        MRV01HA_q <= CP_D_q;
508
      elsif(WE_q = '1' and IADR_q = MRV01HA_ADR  and MMODE_i = '1') then
509
        -- write register through CSR instructions
510
        MRV01HA_q <= ICSRD;
511
      end if;
512
    end if;
513
  end process;
514
 
515
  -- Output halt-on address
516
 
517
  HLTADR_o <= to_unsigned(MRV01HA_q);
518
 
519
  ----------------------------------------------
520
  -- RV01 Resume Address register (MRV01RA)
521
  ----------------------------------------------
522
 
523
  -- This register also store the address at
524
  -- which instruction execution starts when
525
  -- start=1 and resume=1 (this allows, if
526
  -- needed, to start instruction execution
527
  -- from an arbitrary address).
528
 
529
  process(CLK_i)
530
  begin
531
    if(CLK_i = '1' and CLK_i'event) then
532
      if(RST_i = '1') then
533
        MRV01RA_q <= (others => '0');
534
      elsif(HALT_i = '1') then
535
        -- write register on halt
536
        MRV01RA_q <= to_signed(HPC_i);
537
      elsif(CP_WE_q = '1' and CP_IADR_q = MRV01RA_ADR) then
538
        -- write register through control port
539
        MRV01RA_q <= CP_D_q;
540
      elsif(WE_q = '1' and IADR_q = MRV01RA_ADR  and MMODE_i = '1') then
541
        -- write register through CSR instructions
542
        MRV01RA_q <= ICSRD;
543
      end if;
544
    end if;
545
  end process;
546
 
547
  ----------------------------------------------
548
  -- CSR output mux
549
  ----------------------------------------------
550
 
551
  -- This mux selects Halt module output as a CSRU-like
552
  -- functional unit, sets address error flag in case
553
  -- an internal register access has been attempted 
554
  -- while not in machine mode or to a non-existent
555
  -- registers and sets selector used to merge Halt
556
  -- module outputs with CSRU ones.
557
 
558
  process(IADR,MRV01HC_q,MRV01HA_q,MRV01RA_q,MMODE_i)
559
  begin
560
    case IADR is
561
 
562
      when MRV01HC_ADR =>
563
        CSRQ <= MRV01HC_q;
564
        ADR_ERR <= not(MMODE_i);
565
        HCSR <= '1';
566
      when MRV01HA_ADR =>
567
        CSRQ <= MRV01HA_q;
568
        ADR_ERR <= not(MMODE_i);
569
        HCSR <= '1';
570
      when MRV01RA_ADR =>
571
        CSRQ <= MRV01RA_q;
572
        ADR_ERR <= not(MMODE_i);
573
        HCSR <= '1';
574
 
575
      when others =>
576
        CSRQ <= (others => '0');
577
        ADR_ERR <= '1';
578
        HCSR <= '0';
579
 
580
    end case;
581
  end process;
582
 
583
  -- This register is needed because CSR's are accessed
584
  -- in pipelined fashion (read in ID stage, processed
585
  -- in IX1 stage) like GPR's.
586
 
587
  process(CLK_i)
588
  begin
589
    if(CLK_i = '1' and CLK_i'event) then
590
      CSRQ_q <= CSRQ;
591
    end if;
592
  end process;
593
 
594
  -- Illegal instruction exception must be raised if:
595
  -- 1) an un-existent CSR address is specified, OR
596
  -- 2) access is attempted on a CSR without appropriate
597
  -- privileges.
598
 
599
  ILLG <= CS_OP_V when (ADR_ERR = '1') else '0';
600
 
601
  CSRQ_o <= CSRQ;
602
 
603
  ILLG_o <= ILLG;
604
 
605
  HCSR_o <= HCSR;
606
 
607
  ----------------------------------------------
608
  -- Control port output mux
609
  ----------------------------------------------
610
 
611
  -- This mux selects Halt module output as
612
  -- control port output. The selecting signal
613
  -- HCP is used to merge Halt module output 
614
  -- with CSRU ones.
615
 
616
  process(CP_IADR,MRV01HC_q,MRV01HA_q,MRV01RA_q)
617
  begin
618
 
619
    case CP_IADR is
620
 
621
      when MRV01HC_ADR =>
622
        CPQ <= MRV01HC_q;
623
        HCP <= '1';
624
      when MRV01HA_ADR =>
625
        CPQ <= MRV01HA_q;
626
        HCP <= '1';
627
      when MRV01RA_ADR =>
628
        CPQ <= MRV01RA_q;
629
        HCP <= '1';
630
 
631
      when others =>
632
        CPQ <= (others => '0');
633
        HCP <= '0';
634
 
635
    end case;
636
  end process;
637
 
638
  HCP_o <= HCP;
639
 
640
  CPQ_o <= to_std_logic_vector(CPQ);
641
 
642
end ARC;

powered by: WebSVN 2.1.0

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