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

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [rise_pack.vhd] - Blame information for rev 12

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

Line No. Rev Author Line
1 2 jlechner
-------------------------------------------------------------------------------
2
-- File: rise_pack.vhd
3
-- Author: Jakob Lechner, Urban Stadler, Harald Trinkl, Christian Walter
4
-- Created: 2006-11-29
5
-- Last updated: 2006-11-29
6
 
7
-- Description:
8
-- Package for RISE project.
9
-------------------------------------------------------------------------------
10
 
11
 
12
library IEEE;
13
use IEEE.STD_LOGIC_1164.all;
14 8 jlechner
use IEEE.STD_LOGIC_ARITH.all;
15 2 jlechner
 
16
package RISE_PACK is
17
 
18
  constant ARCHITECTURE_WIDTH : integer := 16;
19
  constant REGISTER_COUNT : integer := 16;
20
 
21
  constant PC_WIDTH : integer := ARCHITECTURE_WIDTH;
22
  constant IR_WIDTH : integer := ARCHITECTURE_WIDTH;
23
  constant SR_WIDTH : integer := ARCHITECTURE_WIDTH;
24
  constant OPCODE_WIDTH : integer := 5;
25
  constant COND_WIDTH : integer := 3;
26
  constant MEM_DATA_WIDTH : integer := ARCHITECTURE_WIDTH;
27
  constant MEM_ADDR_WIDTH : integer := ARCHITECTURE_WIDTH;
28
 
29
  constant REGISTER_WIDTH : integer := ARCHITECTURE_WIDTH;
30 5 cwalter
  constant REGISTER_ADDR_WIDTH : integer := 4;
31 2 jlechner
  constant IMMEDIATE_WIDTH : integer := ARCHITECTURE_WIDTH;
32
  constant LOCK_WIDTH : integer := REGISTER_COUNT;
33 8 jlechner
 
34
  constant ALUOP1_WIDTH : integer := 3;
35
  constant ALUOP2_WIDTH : integer := 3;
36 2 jlechner
 
37
  subtype PC_REGISTER_T is std_logic_vector(PC_WIDTH-1 downto 0);
38
  subtype IR_REGISTER_T is std_logic_vector(IR_WIDTH-1 downto 0);
39
  subtype SR_REGISTER_T is std_logic_vector(SR_WIDTH-1 downto 0);
40
  subtype REGISTER_T is std_logic_vector(REGISTER_WIDTH-1 downto 0);
41
  subtype REGISTER_ADDR_T is std_logic_vector(REGISTER_ADDR_WIDTH-1 downto 0);
42
  subtype MEM_DATA_T is std_logic_vector(MEM_DATA_WIDTH-1 downto 0);
43
  subtype MEM_ADDR_T is std_logic_vector(MEM_ADDR_WIDTH-1 downto 0);
44
 
45
  subtype LOCK_REGISTER_T is std_logic_vector(LOCK_WIDTH-1 downto 0);
46
 
47
  subtype IMMEDIATE_T is std_logic_vector(IMMEDIATE_WIDTH-1 downto 0);
48
  subtype OPCODE_T is std_logic_vector(OPCODE_WIDTH-1 downto 0);
49
  subtype COND_T is std_logic_vector(COND_WIDTH-1 downto 0);
50
 
51 8 jlechner
  subtype ALUOP1_T is std_logic_vector(ALUOP1_WIDTH-1 downto 0);
52
  subtype ALUOP2_T is std_logic_vector(ALUOP2_WIDTH-1 downto 0);
53
 
54 5 cwalter
  --
55 12 cwalter
  constant SR_REGISTER_ADDR : REGISTER_ADDR_T := "1111";
56
  constant PC_REGISTER_ADDR : REGISTER_ADDR_T := "1110";
57
  constant LR_REGISTER_ADDR : REGISTER_ADDR_T := "1101";
58
 
59 5 cwalter
  constant SR_REGISTER_DI : INTEGER := 15;
60
  constant SR_REGISTER_IP_MASK : INTEGER := 12;
61
  constant SR_REGISTER_OVERFLOW : INTEGER := 3;
62
  constant SR_REGISTER_NEGATIVE : INTEGER := 2;
63
  constant SR_REGISTER_CARRY : INTEGER := 1;
64
  constant SR_REGISTER_ZERO : INTEGER := 0;
65
  constant RESET_PC_VALUE : PC_REGISTER_T := ( others => '0' );
66
  constant RESET_SR_VALUE : PC_REGISTER_T := ( others => '0' );
67 8 jlechner
 
68
  constant COND_NONE : COND_T := "000";
69
  constant PC_ADDR : REGISTER_ADDR_T := CONV_STD_LOGIC_VECTOR(14, REGISTER_ADDR_WIDTH);
70 5 cwalter
 
71
  -- RISE OPCODES --
72 8 jlechner
  -- load opcodes
73
  constant OPCODE_LD_IMM        : OPCODE_T := "10000";
74
  constant OPCODE_LD_IMM_HB     : OPCODE_T := "10010";
75
  constant OPCODE_LD_DISP       : OPCODE_T := "10100";
76
  constant OPCODE_LD_DISP_MS    : OPCODE_T := "11000";
77
  constant OPCODE_LD_REG        : OPCODE_T := "00001";
78
 
79
  -- store opcodes
80
  constant OPCODE_ST_DISP       : OPCODE_T := "11100";
81
 
82
  -- arithmethic opcodes
83
  constant OPCODE_ADD           : OPCODE_T := "00010";
84
  constant OPCODE_ADD_IMM       : OPCODE_T := "00011";
85
  constant OPCODE_SUB           : OPCODE_T := "00100";
86
  constant OPCODE_SUB_IMM       : OPCODE_T := "00101";
87
  constant OPCODE_NEG           : OPCODE_T := "00110";
88
  constant OPCODE_ARS           : OPCODE_T := "00111";
89
  constant OPCODE_ALS           : OPCODE_T := "01000";
90
 
91
  -- logical opcodes
92
  constant OPCODE_AND : OPCODE_T := "01001";
93
  constant OPCODE_NOT : OPCODE_T := "01010";
94
  constant OPCODE_EOR : OPCODE_T := "01011";
95
  constant OPCODE_LS :  OPCODE_T := "01100";
96
  constant OPCODE_RS :  OPCODE_T := "01101";
97
 
98
  -- program control
99
  constant OPCODE_JMP : OPCODE_T := "01110";
100
 
101
  -- other
102
  constant OPCODE_TST : OPCODE_T := "01111";
103 5 cwalter
  constant OPCODE_NOP : OPCODE_T := "00000";
104 8 jlechner
 
105
  -- CONDITION CODES --
106
  constant COND_UNCONDITIONAL   : COND_T := "000";
107
  constant COND_NOT_ZERO        : COND_T := "001";
108
  constant COND_ZERO            : COND_T := "010";
109
  constant COND_CARRY           : COND_T := "011";
110
  constant COND_NEGATIVE        : COND_T := "100";
111
  constant COND_OVERFLOW        : COND_T := "101";
112
  constant COND_ZERO_NEGATIVE   : COND_T := "110";
113
 
114
  -- STATUS REGISTER BITS --
115
  constant SR_ZERO_BIT          : integer := 0;
116
  constant SR_CARRY_BIT         : integer := 1;
117
  constant SR_NEGATIVE_BIT      : integer := 2;
118
  constant SR_OVERFLOW_BIT      : integer := 3;
119
 
120 2 jlechner
  type IF_ID_REGISTER_T is record
121
                             pc : PC_REGISTER_T;
122
                             ir : IR_REGISTER_T;
123
                           end record;
124
 
125
  type ID_EX_REGISTER_T is record
126
                             sr         : SR_REGISTER_T;
127
                             pc         : PC_REGISTER_T;
128
                             opcode     : OPCODE_T;
129
                             cond       : COND_T;
130
                             rX_addr    : REGISTER_ADDR_T;
131
                             rX         : REGISTER_T;
132
                             rY         : REGISTER_T;
133
                             rZ         : REGISTER_T;
134
                             immediate  : IMMEDIATE_T;
135
                           end record;
136 8 jlechner
 
137
  -- bit positions for aluop1
138
  constant ALUOP1_LD_MEM_BIT : integer := 0;
139
  constant ALUOP1_ST_MEM_BIT : integer := 1;
140
  constant ALUOP1_WB_REG_BIT : integer := 2;
141
 
142
  -- bit positions for aluop2
143
  constant ALUOP2_SR_BIT : integer := 0;
144
  constant ALUOP2_LR_BIT : integer := 1;
145
 
146 2 jlechner
  type EX_MEM_REGISTER_T is record
147 8 jlechner
                              aluop1        : ALUOP1_T;
148
                              aluop2        : ALUOP2_T;
149 2 jlechner
                              reg           : REGISTER_T;
150
                              alu           : REGISTER_T;
151
                              dreg_addr     : REGISTER_ADDR_T;
152
                              lr            : PC_REGISTER_T;
153 8 jlechner
                              sr            : SR_REGISTER_T;
154 2 jlechner
                            end record;
155
 
156
  type MEM_WB_REGISTER_T is record
157 8 jlechner
                              aluop1        : ALUOP1_T;
158
                              aluop2        : ALUOP2_T;
159 2 jlechner
                              reg           : REGISTER_T;
160
                              dreg_addr     : REGISTER_ADDR_T;
161
                              lr            : PC_REGISTER_T;
162
                            end record;
163
 
164
end RISE_PACK;
165
 

powered by: WebSVN 2.1.0

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