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

Subversion Repositories plasma

[/] [plasma/] [tags/] [arelease/] [vhdl/] [mips_pack.vhd] - Blame information for rev 397

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

Line No. Rev Author Line
1 2 rhoads
---------------------------------------------------------------------
2
-- TITLE: MIPS Misc. Package
3
-- AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4
-- DATE CREATED: 2/15/01
5
-- FILENAME: mips_pack.vhd
6
-- PROJECT: MIPS CPU core
7
-- COPYRIGHT: Software placed into the public domain by the author.
8
--    Software 'as is' without warranty.  Author liable for nothing.
9
-- DESCRIPTION:
10
--    Data types, constants, and add functions needed for the MIPS CPU.
11
---------------------------------------------------------------------
12
library ieee;
13
use ieee.std_logic_1164.all;
14
 
15
package mips_pack is
16
   constant ZERO          : std_logic_vector(31 downto 0) :=
17
      "00000000000000000000000000000000";
18
   constant ONES          : std_logic_vector(31 downto 0) :=
19
      "11111111111111111111111111111111";
20
 
21
--   type alu_function_type is (alu_nothing, alu_add, alu_subtract, 
22
--      alu_less_than, alu_less_than_signed, alu_equal, alu_not_equal,
23
--      alu_ltz, alu_lez, alu_eqz, alu_nez, alu_gez, alu_gtz,
24
--      alu_or, alu_and, alu_xor, alu_nor);
25
   subtype alu_function_type is std_logic_vector(4 downto 0);
26
   constant alu_nothing   : alu_function_type := "00000";
27
   constant alu_add       : alu_function_type := "00010";
28
   constant alu_subtract  : alu_function_type := "00011";
29
   constant alu_less_than : alu_function_type := "00100";
30
   constant alu_less_than_signed : alu_function_type := "00101";
31
   constant alu_equal     : alu_function_type := "00110";
32
   constant alu_not_equal : alu_function_type := "00111";
33
   constant alu_ltz       : alu_function_type := "01000";
34
   constant alu_lez       : alu_function_type := "01001";
35
   constant alu_eqz       : alu_function_type := "01010";
36
   constant alu_nez       : alu_function_type := "01011";
37
   constant alu_gez       : alu_function_type := "01100";
38
   constant alu_gtz       : alu_function_type := "01101";
39
   constant alu_or        : alu_function_type := "01110";
40
   constant alu_and       : alu_function_type := "01111";
41
   constant alu_xor       : alu_function_type := "10001";
42
   constant alu_nor       : alu_function_type := "10010";
43
 
44
--   type shift_function_type is (
45
--      shift_nothing, shift_left_unsigned,
46
--      shift_right_signed, do_right_unsigned);
47
   subtype shift_function_type is std_logic_vector(1 downto 0);
48
   constant shift_nothing        : shift_function_type := "00";
49
   constant shift_left_unsigned  : shift_function_type := "01";
50
   constant shift_right_signed   : shift_function_type := "11";
51
   constant shift_right_unsigned : shift_function_type := "10";
52
 
53
--   type mult_function_type is (
54
--      mult_nothing, mult_read_lo, mult_read_hi, mult_write_lo, 
55
--      mult_write_hi, mult_mult, mult_divide, mult_signed_divide);
56
   subtype mult_function_type is std_logic_vector(2 downto 0);
57
   constant mult_nothing       : mult_function_type := "000";
58
   constant mult_read_lo       : mult_function_type := "001";
59
   constant mult_read_hi       : mult_function_type := "010";
60
   constant mult_write_lo      : mult_function_type := "011";
61
   constant mult_write_hi      : mult_function_type := "100";
62
   constant mult_mult          : mult_function_type := "101";
63
   constant mult_divide        : mult_function_type := "110";
64
   constant mult_signed_divide : mult_function_type := "111";
65
 
66
--   type a_source_type is (from_reg_source, from_imm10_6);
67
   subtype a_source_type is std_logic_vector(1 downto 0);
68
   constant a_from_reg_source : a_source_type := "00";
69
   constant a_from_imm10_6    : a_source_type := "01";
70
   constant a_from_pc         : a_source_type := "10";
71
 
72
--   type b_source_type is (from_reg_target, from_imm, from_signed_imm);
73
   subtype b_source_type is std_logic_vector(1 downto 0);
74
   constant b_from_reg_target : b_source_type := "00";
75
   constant b_from_imm        : b_source_type := "01";
76
   constant b_from_signed_imm : b_source_type := "10";
77
   constant b_from_immX4      : b_source_type := "11";
78
 
79
--   type c_source_type is (from_null, from_alu, from_shift, 
80
--      from_mult, from_memory, from_pc, from_imm_shift16,
81
--      from_reg_source_nez, from_reg_source_eqz);
82
   subtype c_source_type is std_logic_vector(2 downto 0);
83
   constant c_from_alu        : c_source_type := "000";
84
   constant c_from_shift      : c_source_type := "001";
85
   constant c_from_mult       : c_source_type := "010";
86
   constant c_from_memory     : c_source_type := "011";
87
   constant c_from_pc         : c_source_type := "100";
88
   constant c_from_imm_shift16: c_source_type := "101";
89
   constant c_from_reg_sourcen: c_source_type := "110";
90
   constant c_from_null       : c_source_type := "111";
91
 
92
--   type pc_source_type is (from_inc4, from_inc8, from_reg_source, 
93
--      from_opcode25_0, from_branch, from_lbranch);
94
   subtype pc_source_type is std_logic_vector(1 downto 0);
95
   constant from_inc4       : pc_source_type := "00";
96
   constant from_opcode25_0 : pc_source_type := "01";
97
   constant from_branch     : pc_source_type := "10";
98
   constant from_lbranch    : pc_source_type := "11";
99
 
100
   subtype branch_function_type is std_logic_vector(2 downto 0);
101
   constant branch_ltz : branch_function_type := "000";
102
   constant branch_lez : branch_function_type := "001";
103
   constant branch_eq  : branch_function_type := "010";
104
   constant branch_ne  : branch_function_type := "011";
105
   constant branch_gez : branch_function_type := "100";
106
   constant branch_gtz : branch_function_type := "101";
107
   constant branch_yes : branch_function_type := "110";
108
 
109
   -- mode(32=1,16=2,8=3), signed, write
110
   subtype mem_source_type is std_logic_vector(3 downto 0);
111
   constant mem_none    : mem_source_type := "0000";
112
   constant mem_read32  : mem_source_type := "0100";
113
   constant mem_write32 : mem_source_type := "0101";
114
   constant mem_read16  : mem_source_type := "1000";
115
   constant mem_read16s : mem_source_type := "1010";
116
   constant mem_write16 : mem_source_type := "1001";
117
   constant mem_read8   : mem_source_type := "1100";
118
   constant mem_read8s  : mem_source_type := "1110";
119
   constant mem_write8  : mem_source_type := "1101";
120
 
121
   function bv_to_integer(bv: in std_logic_vector) return integer;
122
   function bv_adder(a     : in std_logic_vector(32 downto 0);
123
                     b     : in std_logic_vector(32 downto 0);
124
                     do_sub: in std_logic) return std_logic_vector;
125
   function bv_adder_lookahead(
126
                     a     : in std_logic_vector(32 downto 0);
127
                     b     : in std_logic_vector(32 downto 0);
128
                     do_sub: in std_logic) return std_logic_vector;
129
   function bv_negate(a : in std_logic_vector) return std_logic_vector;
130
   function bv_increment(a : in std_logic_vector(31 downto 2)
131
                     ) return std_logic_vector;
132
   function bv_inc6(a : in std_logic_vector
133
                     ) return std_logic_vector;
134
end; --package mips_pack
135
 
136
package body mips_pack is
137
 
138
function add_1(a:integer) return integer is
139
begin
140
   return a+1;
141
end; --function
142
 
143
function bv_to_integer(bv: in std_logic_vector) return integer is
144
   variable result : integer;
145
   variable b      : integer;
146
begin
147
   result := 0;
148
   b := 0;
149
   for index in bv'range loop
150
      if bv(index) = '1' then
151
         b := 1;
152
      else
153
         b := 0;
154
      end if;
155
      result := result * 2 + b;
156
   end loop;
157
   return result;
158
end; --function bv_to_integer
159
 
160
function bv_adder(a     : in std_logic_vector(32 downto 0);
161
                  b     : in std_logic_vector(32 downto 0);
162
                  do_sub: in std_logic) return std_logic_vector is
163
   variable carry_in : std_logic;
164
   variable bb       : std_logic_vector(32 downto 0);
165
   variable result   : std_logic_vector(32 downto 0);
166
begin
167
   result := "000000000000000000000000000000000";
168
   if do_sub = '0' then
169
      bb := b;
170
      carry_in := '0';
171
   else
172
      bb := not b;
173
      carry_in := '1';
174
   end if;
175
   for index in 0 to 32 loop
176
      result(index) := a(index) xor bb(index) xor carry_in;
177
      carry_in := (carry_in and (a(index) or bb(index))) or
178
                  (a(index) and bb(index));
179
   end loop;
180
   return result;
181
end; --function
182
 
183
function bv_adder_lookahead(
184
                  a     : in std_logic_vector(32 downto 0);
185
                  b     : in std_logic_vector(32 downto 0);
186
                  do_sub: in std_logic) return std_logic_vector is
187
   variable carry    : std_logic_vector(32 downto 0);
188
   variable p, g     : std_logic_vector(32 downto 0);
189
   variable bb       : std_logic_vector(32 downto 0);
190
   variable result   : std_logic_vector(32 downto 0);
191
   variable i        : natural;
192
begin
193
   carry := "000000000000000000000000000000000";
194
   if do_sub = '0' then
195
      bb := b;
196
      carry(0) := '0';
197
   else
198
      bb := not b;
199
      carry(0) := '1';
200
   end if;
201
 
202
   p := a or bb;   --propogate
203
   g := a and bb;  --generate
204
   for index in 0 to 7 loop
205
      i := index*4;
206
      carry(i+1) := g(i) or
207
                    (p(i) and carry(i));
208
      i := index*4+1;
209
      carry(i+1) := g(i) or
210
                    (p(i) and g(i-1)) or
211
                    ((p(i) and p(i-1)) and carry(i-1));
212
      i := index*4+2;
213
      carry(i+1) := g(i) or
214
                    (p(i) and g(i-1)) or
215
                    (p(i) and p(i-1) and g(i-2)) or
216
                    ((p(i) and p(i-1) and p(i-2)) and carry(i-2));
217
      i := index*4+3;
218
      carry(i+1) := g(i) or
219
                    (p(i) and g(i-1)) or
220
                    (p(i) and p(i-1) and g(i-2)) or
221
                    (p(i) and p(i-1) and p(i-2) and g(i-3)) or
222
                    (((p(i) and p(i-1)) and (p(i-2) and p(i-3)))
223
                       and carry(i-3));
224
   end loop;
225
   result := (a xor bb) xor carry;
226
   return result;
227
end; --function
228
 
229
function bv_negate(a : in std_logic_vector) return std_logic_vector is
230
   variable carry_in : std_logic;
231
   variable not_a    : std_logic_vector(31 downto 0);
232
   variable result   : std_logic_vector(31 downto 0);
233
begin
234
   result := ZERO;
235
   not_a := not a;
236
   carry_in := '1';
237
   for index in a'reverse_range loop
238
      result(index) := not_a(index) xor carry_in;
239
      carry_in := carry_in and not_a(index);
240
   end loop;
241
   return result;
242
end; --function
243
 
244
function bv_increment(a : in std_logic_vector(31 downto 2)
245
                     ) return std_logic_vector is
246
   variable carry_in : std_logic;
247
   variable result   : std_logic_vector(31 downto 2);
248
begin
249
   result := "000000000000000000000000000000";
250
   carry_in := '1';
251
   for index in 2 to 31 loop
252
      result(index) := a(index) xor carry_in;
253
      carry_in := a(index) and carry_in;
254
   end loop;
255
   return result;
256
end; --function
257
 
258
function bv_inc6(a : in std_logic_vector
259
                     ) return std_logic_vector is
260
   variable carry_in : std_logic;
261
   variable result   : std_logic_vector(5 downto 0);
262
begin
263
   result := "000000";
264
   carry_in := '1';
265
   for index in 0 to 5 loop
266
      result(index) := a(index) xor carry_in;
267
      carry_in := a(index) and carry_in;
268
   end loop;
269
   return result;
270
end; --function
271
 
272
end; --package body
273
 
274
 

powered by: WebSVN 2.1.0

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