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

Subversion Repositories plasma_fpu

[/] [plasma_fpu/] [trunk/] [src/] [mips_instruction_set.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 __alexs__
-- --------------------------------------------------------------------------
2
-- >>>>>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<<<
3
-- --------------------------------------------------------------------------
4
-- TITLE:       MIPS Instruction Set Binary
5
-- AUTHOR:      Alex Schoenberger (Alex.Schoenberger@ies.tu-darmstadt.de)
6
-- COMMENT:     This project is based on Plasma CPU core by Steve Rhoads
7
--
8
-- www.ies.tu-darmstadt.de
9
-- TU Darmstadt
10
-- Institute for Integrated Systems
11
-- Merckstr. 25
12
-- 
13
-- 64283 Darmstadt - GERMANY
14
-- --------------------------------------------------------------------------
15
-- PROJECT:       Plasma CPU core with FPU
16
-- FILENAME:      mips_instruction_set.vhd
17
-- --------------------------------------------------------------------------
18
-- COPYRIGHT: 
19
--  This project is distributed by GPLv2.0
20
--  Software placed into the public domain by the author.
21
--  Software 'as is' without warranty.  Author liable for nothing.
22
-- --------------------------------------------------------------------------
23
-- DESCRIPTION:
24
--    selected subset of MIPS instruction set binary
25
----------------------------------------------------------------------------
26
-- Revision History
27
-- --------------------------------------------------------------------------
28
-- Revision   Date    Author     CHANGES
29
-- 1.0      4/2014    AS         initial
30
-- --------------------------------------------------------------------------
31
library IEEE;
32
  use IEEE.std_logic_1164.ALL;
33
 
34
package mips_instruction_set is
35
  -- --------------------------------------------------------------------------------------------------------
36
  --  _____ _   _  _____ _______ _____  _    _  _____ _______ _____ ____  _   _     _____ ______ _______ 
37
  -- |_   _| \ | |/ ____|__   __|  __ \| |  | |/ ____|__   __|_   _/ __ \| \ | |   / ____|  ____|__   __|
38
  --   | | |  \| | (___    | |  | |__) | |  | | |       | |    | || |  | |  \| |  | (___ | |__     | |   
39
  --   | | | . ` |\___ \   | |  |  _  /| |  | | |       | |    | || |  | | . ` |   \___ \|  __|    | |   
40
  --  _| |_| |\  |____) |  | |  | | \ \| |__| | |____   | |   _| || |__| | |\  |   ____) | |____   | |   
41
  -- |_____|_| \_|_____/   |_|  |_|  \_\\____/ \_____|  |_|  |_____\____/|_| \_|  |_____/|______|  |_|   
42
  -- -------------------------------------------------------------------------------------------------------- 
43
  -- _ _  _ ____ ___ ____ _  _ ____ ___ _ ____ _  _    ____ ____ _  _ ___  ____ _  _ ____ _  _ ___ ____ 
44
  -- | |\ | [__   |  |__/ |  | |     |  | |  | |\ |    |    |  | |\/| |__] |  | |\ | |___ |\ |  |  [__  
45
  -- | | \| ___]  |  |  \ |__| |___  |  | |__| | \|    |___ |__| |  | |    |__| | \| |___ | \|  |  ___] 
46
  --
47
  subtype t_mips_opcode         is std_logic_vector( 5 downto 0);                    -- operation code
48
  subtype t_mips_format         is std_logic_vector( 4 downto 0);                    -- format code
49
  subtype t_mips_function       is std_logic_vector( 5 downto 0);                    -- function code
50
  subtype t_mips_reg_addr       is std_logic_vector( 4 downto 0);                    -- register address
51
  subtype t_mips_shamt          is std_logic_vector( 4 downto 0);                    -- shift amount value
52
  subtype t_mips_imm11          is std_logic_vector(10 downto 0);                    -- immediate value for coprocessor
53
  subtype t_mips_imm16          is std_logic_vector(15 downto 0);                    -- immediate value for calculation/memory
54
  subtype t_mips_imm26          is std_logic_vector(25 downto 0);                    -- immmediate value for jumps
55
 
56
  subtype t_mips_fmt            is std_logic_vector( 4 downto 0);                    -- format for coprocessor
57
  subtype t_mips_cond           is std_logic_vector( 3 downto 0);                    -- FPU compare condition
58
  subtype t_mips_cc             is std_logic_vector( 2 downto 0);                    -- FPU condition code address
59
  subtype t_mips_z_branch       is std_logic_vector( 1 downto 0);                    -- FPU branch coding
60
  subtype t_mips_i_ctrl_bit     is std_logic;
61
 
62
 
63
  -- --------------------------------------------------------------------------------------
64
  -- ____ ____ _  _ ____ ___ ____ ___ _  _ ___ ____ 
65
  -- |    |  | |\ | [__   |  |__|  |  |\ |  |  [__  
66
  -- |___ |__| | \| ___]  |  |  |  |  | \|  |  ___] 
67
  --
68
  -- SPECIAL REGISTER
69
  --        
70
  constant MIPS_R_ZERO          : t_mips_reg_addr           := b"0_0000";             -- zero value register        
71
  constant MIPS_R_RA            : t_mips_reg_addr           := b"1_1111";             -- return value register address                              
72
 
73
  -- --------------------------------------------------------------------------------------
74
  -- ____ _  _ _  _ ____ ___ _ ____ _  _ ____ _       ____ _  _ ____ ____ ___  _ _  _ ____ 
75
  -- |___ |  | |\ | |     |  | |  | |\ | |__| |       |___ |\ | |    |  | |  \ | |\ | | __ 
76
  -- |    |__| | \| |___  |  | |__| | \| |  | |___    |___ | \| |___ |__| |__/ | | \| |__] 
77
  -- -------------------------------------------------------------------------------------- 
78
  -- ____ ____ ____    ____ ____ ____ _ ____ ___ ____ ____    ____ ____ ____ _  _ ____ ___ 
79
  -- |___ |  | |__/    |__/ |___ | __ | [__   |  |___ |__/    |___ |  | |__/ |\/| |__|  |  
80
  -- |    |__| |  \    |  \ |___ |__] | ___]  |  |___ |  \    |    |__| |  \ |  | |  |  |  
81
  --
82
  --  opcode(6) & rs(5) & rt(5) & rd(5) & shamt(5) & funct(6)
83
  --
84
  constant MIPS_OPCODE_REG      : t_mips_opcode             := b"00_0000";
85
    --
86
    -- shifter operations
87
    constant MIPS_FUNC_SLL        : t_mips_function           := b"00_0000";      -- rd = rt << sa
88
    constant MIPS_FUNC_SRL        : t_mips_function           := b"00_0010";      -- rd = rt >> sa
89
    constant MIPS_FUNC_SRA        : t_mips_function           := b"00_0011";      -- rd = signed(rt) >> sa
90
    constant MIPS_FUNC_SLLV       : t_mips_function           := b"00_0100";      -- rd = rt << rs
91
    constant MIPS_FUNC_SRLV       : t_mips_function           := b"00_0110";      -- rd = rt >> rs
92
    constant MIPS_FUNC_SRAV       : t_mips_function           := b"00_0111";      -- rd = signed(rt) >> rs
93
 
94
    -- jump register
95
    constant MIPS_FUNC_JR         : t_mips_function           := b"00_1000";      -- pc = rs
96
    constant MIPS_FUNC_JALR       : t_mips_function           := b"00_1001";      -- pc = rs; rd = pc
97
 
98
    -- conditional move
99
    constant MIPS_FUNC_MOVZ       : t_mips_function           := b"00_1010";      -- if (rt = 0) rd = rs
100
    constant MIPS_FUNC_MOVN       : t_mips_function           := b"00_1011";      -- if (rt != 0) rd = rs
101
 
102
    -- syscall and break
103
    constant MIPS_FUNC_SYSCALL    : t_mips_function           := b"00_1100";      -- epc = pc; pc = 0x3c
104
    constant MIPS_FUNC_BREAK      : t_mips_function           := b"00_1101";      -- epc = pc; pc = 0x3c
105
 
106
    -- multiplication register moving
107
    constant MIPS_FUNC_MFHI       : t_mips_function           := b"01_0000";      -- rd = HI
108
    constant MIPS_FUNC_MTHI       : t_mips_function           := b"01_0001";      -- HI = rs
109
    constant MIPS_FUNC_MFLO       : t_mips_function           := b"01_0010";      -- rd = LO
110
    constant MIPS_FUNC_MTLO       : t_mips_function           := b"01_0011";      -- LO = rs
111
 
112
    -- multiplication/division
113
    constant MIPS_FUNC_MULT       : t_mips_function           := b"01_1000";      -- HI,LO = rs * rt
114
    constant MIPS_FUNC_MULTU      : t_mips_function           := b"01_1001";      -- HI,LO = signed(rs) * signed(rt)
115
    constant MIPS_FUNC_DIV        : t_mips_function           := b"01_1010";      -- HI = rs % rt; LO = rs / rt
116
    constant MIPS_FUNC_DIVU       : t_mips_function           := b"01_1011";      -- HI = rs % rt; LO = signed(rs) / sigend(rt)
117
 
118
    -- addition/substraction
119
    constant MIPS_FUNC_ADD        : t_mips_function           := b"10_0000";      -- rd = rs + rt
120
    constant MIPS_FUNC_ADDU       : t_mips_function           := b"10_0001";      -- rd = unsigned(rs) + unsigned(rt)
121
    constant MIPS_FUNC_SUB        : t_mips_function           := b"10_0010";      -- rd = rs - rt
122
    constant MIPS_FUNC_SUBU       : t_mips_function           := b"10_0011";      -- rd = unsigned(rs) - unsigned(rt)
123
 
124
    -- logic manipulation
125
    constant MIPS_FUNC_AND        : t_mips_function           := b"10_0100";      -- rd = rs and rt
126
    constant MIPS_FUNC_OR         : t_mips_function           := b"10_0101";      -- rd = rs or rt
127
    constant MIPS_FUNC_XOR        : t_mips_function           := b"10_0110";      -- rd = rs xor rt
128
    constant MIPS_FUNC_NOR        : t_mips_function           := b"10_0111";      -- rd = rs nor rt
129
 
130
    -- comparison
131
    constant MIPS_FUNC_SLT        : t_mips_function           := b"10_1010";      -- rd = rs < rt
132
    constant MIPS_FUNC_SLTU       : t_mips_function           := b"10_1011";      -- rd = unsigned(rs) < unsigend(rt)
133
 
134
  -- ____ ___  ____ ____ _ ____ _       _ _ 
135
  -- [__  |__] |___ |    | |__| |       | | 
136
  -- ___] |    |___ |___ | |  | |___    | | 
137
  --
138
  --  opcode(6) & rs(5) & rt(5) & rd(5) & shamt(5) & funct(6)
139
  --
140
  constant MIPS_OPCODE_SPECIAL2 : t_mips_opcode             := b"01_1100";     -- special2 insructions
141
 
142
    constant MIPS_FUNC_MADD       : t_mips_function           := b"00_0000";      --(HI,LO) = (HI,LO) + (rs*rt)
143
    constant MIPS_FUNC_MADDU      : t_mips_function           := b"00_0001";      --(HI,LO) = (HI,LO) + unsigned(rs*rt)
144
 
145
    constant MIPS_FUNC_MUL        : t_mips_function           := b"00_0010";      -- rd = rs * rt;
146
 
147
    constant MIPS_FUNC_MSUB       : t_mips_function           := b"00_0100";      -- (HI,LO) = (HI,LO) - (rs*rt)
148
    constant MIPS_FUNC_MSUBU      : t_mips_function           := b"00_0101";      -- (HI,LO) = (HI,LO) - unsigned(rs*rt)
149
 
150
  -- ____ ___  ____ ____ _ ____ _       _ _ _ 
151
  -- [__  |__] |___ |    | |__| |       | | | 
152
  -- ___] |    |___ |___ | |  | |___    | | | 
153
  --
154
  --  opcode(6) & rs(5) & rt(5) & rd(5) & shamt(5) & funct(6)
155
  --
156
  constant MIPS_OPCODE_SPECIAL3 : t_mips_opcode             := b"01_1111";      -- special3 instructions
157
 
158
    constant MIPS_FUNC_INS        : t_mips_function           := b"00_0100";      -- insert bit field
159
    constant MIPS_FUNC_EXT        : t_mips_function           := b"00_0000";      -- extract bit field
160
 
161
    constant MIPS_FUNC_BSHFL      : t_mips_function           := b"10_0000";
162
 
163
      constant MIPS_FUNC_BSHFL_SEB  : t_mips_shamt              := b"1_0000";       -- sign-extend byte
164
      constant MIPS_FUNC_BSHFL_SEH  : t_mips_shamt              := b"1_1000";       -- sign-extend halfword
165
      constant MIPS_FUNC_BSHFL_WSBH : t_mips_shamt              := b"1_0010";       -- Word Swap bytes Within Halfwords
166
 
167
  -- ____ ____ ____ _  _ ____ 
168
  -- |    |__| |    |__| |___ 
169
  -- |___ |  | |___ |  | |___ 
170
  constant MIPS_OPCODE_PREF     : t_mips_opcode             := b"11_0011";      -- prefetch data
171
  constant MIPS_OPCODE_CACHE    : t_mips_opcode             := b"10_1111";      -- update cache
172
 
173
  -- ____ ____ ____ _ _  _ _  _ 
174
  -- |__/ |___ | __ | |\/| |\/| 
175
  -- |  \ |___ |__] | |  | |  | 
176
  --
177
  -- 00_0001 & rs(5) & func & imm16
178
  --
179
  constant MIPS_OPCODE_REGIMM   : t_mips_opcode             := b"00_0001";      -- REGIMM instruction class
180
 
181
    constant MIPS_OPCODE_BLTZ     : t_mips_reg_addr           := b"0_0000";       -- if(rs <   0) pc = imm16 << 2
182
    constant MIPS_OPCODE_BGEZ     : t_mips_reg_addr           := b"0_0001";       -- if(rs >=  0) pc = imm16 << 2
183
    constant MIPS_OPCODE_BLTZAL   : t_mips_reg_addr           := b"1_0000";       -- if(rs <   0) pc = imm16 << 2; r31 = pc
184
    constant MIPS_OPCODE_BGEZAL   : t_mips_reg_addr           := b"1_0001";       -- if(rs >=  0) pc = imm16 << 2; r31 = pc
185
 
186
 
187
  -- --------------------------------------------------------------------------------------
188
  --  _ _  _ _  _ ___     ____ ____ ____ _  _ ____ ___ 
189
  --  | |  | |\/| |__]    |___ |  | |__/ |\/| |__|  |  
190
  -- _| |__| |  | |       |    |__| |  \ |  | |  |  |  
191
  -- --------------------------------------------------------------------------------------
192
  --
193
  -- opcode(6) & immediate(26)
194
  --
195
  constant MIPS_OPCODE_J        : t_mips_opcode             := b"00_0010";       -- pc = imm26 << 2
196
  constant MIPS_OPCODE_JAL      : t_mips_opcode             := b"00_0011";       -- pc = imm26 << 2; r31 = pc
197
 
198
  -- --------------------------------------------------------------------------------------
199
  -- _ _  _ _  _ ____ ___  _ ____ ___ ____    ____ ____ ____ _  _ ____ ___ 
200
  -- | |\/| |\/| |___ |  \ | |__|  |  |___    |___ |  | |__/ |\/| |__|  |  
201
  -- | |  | |  | |___ |__/ | |  |  |  |___    |    |__| |  \ |  | |  |  |  
202
  -- --------------------------------------------------------------------------------------
203
  --
204
  -- opcode(6) & rs(5) & rt(5) & immediate(16)
205
  --
206
  -- ___  ____ ____ _  _ ____ _  _ 
207
  -- |__] |__/ |__| |\ | |    |__| 
208
  -- |__] |  \ |  | | \| |___ |  | 
209
  constant MIPS_OPCODE_BEQ      : t_mips_opcode             := b"00_0100";      -- if(rs == rt) pc = imm16 << 2
210
  constant MIPS_OPCODE_BNE      : t_mips_opcode             := b"00_0101";      -- if(rs != rt) pc = imm16 << 2
211
  constant MIPS_OPCODE_BLEZ     : t_mips_opcode             := b"00_0110";      -- if(rs <=  0) pc = imm16 << 2
212
  constant MIPS_OPCODE_BGTZ     : t_mips_opcode             := b"00_0111";      -- if(rs >   0) pc = imm16 << 2
213
 
214
  -- addition, comparison, logic
215
  constant MIPS_OPCODE_ADDI     : t_mips_opcode             := b"00_1000";      -- rt = rs + imm16
216
  constant MIPS_OPCODE_ADDIU    : t_mips_opcode             := b"00_1001";      -- rt = unsigned(rs) + imm16
217
  constant MIPS_OPCODE_SLTI     : t_mips_opcode             := b"00_1010";      -- rt = rs < imm16
218
  constant MIPS_OPCODE_SLTIU    : t_mips_opcode             := b"00_1011";      -- rt = unsigned(rs) < imm16
219
  constant MIPS_OPCODE_ANDI     : t_mips_opcode             := b"00_1100";      -- rt = rs and imm16
220
  constant MIPS_OPCODE_ORI      : t_mips_opcode             := b"00_1101";      -- rt = rs or imm16
221
  constant MIPS_OPCODE_XORI     : t_mips_opcode             := b"00_1110";      -- rt = rs xor imm16
222
  constant MIPS_OPCODE_LUI      : t_mips_opcode             := b"00_1111";      -- rt = imm16 << 16
223
 
224
  -- ____ ____ ___  ____ ____ ____ ____ ____ ____ ____ ____ 
225
  -- |    |  | |__] |__/ |  | |    |___ [__  [__  |  | |__/ 
226
  -- |___ |__| |    |  \ |__| |___ |___ ___] ___] |__| |  \ 
227
  --
228
  -- 01_00zz & fmt(5) & rt(5) & fs(5) & imm11
229
  --
230
  constant MIPS_OPCODE_COP0     : t_mips_opcode             := b"01_0000";      -- coprocessor0 = interrupt
231
  constant MIPS_OPCODE_COP1     : t_mips_opcode             := b"01_0001";      -- coprocessor1 = FPU
232
  constant MIPS_OPCODE_COP2     : t_mips_opcode             := b"01_0010";      -- coprocessor2
233
 
234
    --
235
    -- 01_0000 & 0_1011 & rt(5) & 0_1100 & 0_0000 & func
236
    --
237
    constant MIPS_OPCODE_MFMC0  : t_mips_reg_addr           := b"01_011";       -- disable/enable interrupts
238
 
239
      constant MIPS_FUNC_DI       : t_mips_function           := b"00_0000";      -- disable interrupts
240
      constant MIPS_FUNC_EI       : t_mips_function           := b"10_0000";      -- enable interrupts
241
 
242
 
243
    --
244
    -- 01_0000 & 1 & 000_0000_0000_0000_0000 & 01_1000
245
    --
246
    constant MIPS_FUNC_ERET       : t_mips_function           := b"01_1000";      -- exception return
247
 
248
    -- exchange between coprocessor and core
249
    constant MIPS_FMT_MFC         : t_mips_fmt                := b"0_0000";       -- rt = fs
250
    constant MIPS_FMT_CFC         : t_mips_fmt                := b"0_0010";       -- rt = cs
251
    constant MIPS_FMT_MTC         : t_mips_fmt                := b"0_0100";       -- fs = rt
252
    constant MIPS_FMT_CTC         : t_mips_fmt                := b"0_0110";       -- cs = rt
253
 
254
    -- branches
255
    constant MIPS_FMT_BRANCH      : t_mips_fmt                := b"0_1000";       -- FPU branch operation
256
 
257
      --
258
      -- FPU BRANCH OREPATIONS
259
      -- 01_0001(6) & 01000(5) & cc(3) & nd(1) & tf(1) & immediate(16)
260
      --
261
      constant MIPS_FUNC_FMT_BCZF   : t_mips_z_branch           := b"00";         -- branch if false
262
      constant MIPS_FUNC_FMT_BCZT   : t_mips_z_branch           := b"01";         -- branch if true
263
      constant MIPS_FUNC_FMT_BCZFL  : t_mips_z_branch           := b"10";         -- branch if false likely
264
      constant MIPS_FUNC_FMT_BCZTL  : t_mips_z_branch           := b"11";         -- branch if true likely
265
 
266
    -- operations
267
    constant MIPS_FMT_FLOAT_SINGLE: t_mips_fmt                := b"1_0000";       -- operations with single precision
268
    constant MIPS_FMT_FLOAT_DOUBLE: t_mips_fmt                := b"1_0001";       -- operations with double precision
269
    constant MIPS_FMT_FIXED_WORD  : t_mips_fmt                := b"1_0100";       -- operations with 32 bit words, fixed point
270
    constant MIPS_FMT_FIXED_LONG  : t_mips_fmt                := b"1_0101";       -- operations with 64 bit words, fixed point
271
 
272
      --
273
      -- OPERATIONS FOR FLOATIN OR FIXED POINT
274
      --
275
      -- ALU OPERATIONS
276
      -- 01_0001(6) & fmt(5) & ft(5) & fs(5) & fd(5) & func
277
      --
278
      constant MIPS_FUNC_FMT_ADD    : t_mips_function           := b"00_0000";      -- fd = fs + ft
279
      constant MIPS_FUNC_FMT_SUB    : t_mips_function           := b"00_0001";      -- fd = fs - ft
280
      constant MIPS_FUNC_FMT_MUL    : t_mips_function           := b"00_0010";      -- fd = fs * ft
281
      constant MIPS_FUNC_FMT_DIV    : t_mips_function           := b"00_0011";      -- fd = fs * ft
282
      constant MIPS_FUNC_FMT_SQRT   : t_mips_function           := b"00_0100";      -- fd = fs * ft
283
      constant MIPS_FUNC_FMT_ABS    : t_mips_function           := b"00_0101";      -- fd = fs * ft
284
      constant MIPS_FUNC_FMT_MOV    : t_mips_function           := b"00_0110";      -- fd = fs * ft
285
      constant MIPS_FUNC_FMT_NEG    : t_mips_function           := b"00_0111";      -- fd = fs * ft
286
 
287
      --
288
      -- CONVERT OPERATIONS
289
      -- 01_0001(6) & fmt(5) & 0_0000(5) & fs(5) & fd(5) & func
290
      --
291
      constant MIPS_FUNC_FMT_CVTS   : t_mips_function           := b"10_0000";      -- fd = convert_and_round(fs) to single precision
292
      constant MIPS_FUNC_FMT_CVTD   : t_mips_function           := b"10_0001";      -- fd = convert_and_round(fs) to double precision
293
      constant MIPS_FUNC_FMT_CVTW   : t_mips_function           := b"10_0100";      -- fd = convert_and_round(fs) to word
294
 
295
      --
296
      -- COMPARE OPERATIONS
297
      -- 01_0001(6) & fmt(5) & ft(5) & fs(5) & cc(3) & 00(2) & 11(2) & cond(4)
298
      --
299
      constant MIPS_FUNC_FMT_COND   : t_mips_function           :=  "11----";        -- general condition command
300
      constant MIPS_FUNC_FMT_C_F    : t_mips_function           := b"11_0000";      -- 
301
      constant MIPS_FUNC_FMT_C_UN   : t_mips_function           := b"11_0001";      -- 
302
      constant MIPS_FUNC_FMT_C_EQ   : t_mips_function           := b"11_0010";      -- 
303
      constant MIPS_FUNC_FMT_C_UEQ  : t_mips_function           := b"11_0011";      -- 
304
      constant MIPS_FUNC_FMT_C_OLT  : t_mips_function           := b"11_0100";      -- 
305
      constant MIPS_FUNC_FMT_C_ULT  : t_mips_function           := b"11_0101";      -- 
306
      constant MIPS_FUNC_FMT_C_OLE  : t_mips_function           := b"11_0110";      -- 
307
      constant MIPS_FUNC_FMT_C_ULE  : t_mips_function           := b"11_0111";      -- 
308
      constant MIPS_FUNC_FMT_C_SF   : t_mips_function           := b"11_1000";      -- 
309
      constant MIPS_FUNC_FMT_C_NGLE : t_mips_function           := b"11_1001";      -- 
310
      constant MIPS_FUNC_FMT_C_SEQ  : t_mips_function           := b"11_1010";      -- 
311
      constant MIPS_FUNC_FMT_C_NGL  : t_mips_function           := b"11_1011";      -- 
312
      constant MIPS_FUNC_FMT_C_LT   : t_mips_function           := b"11_1100";      -- 
313
      constant MIPS_FUNC_FMT_C_NGE  : t_mips_function           := b"11_1101";      -- 
314
      constant MIPS_FUNC_FMT_C_LE   : t_mips_function           := b"11_1110";      -- 
315
      constant MIPS_FUNC_FMT_C_NGT  : t_mips_function           := b"11_1111";      -- 
316
 
317
  -- _  _ ____ _  _ ____ ____ _   _ 
318
  -- |\/| |___ |\/| |  | |__/  \_/  
319
  -- |  | |___ |  | |__| |  \   |   
320
  -- load from memory
321
  constant MIPS_OPCODE_LB       : t_mips_opcode             := b"10_0000";      -- rt = *(char*           )(rs + offset)
322
  constant MIPS_OPCODE_LH       : t_mips_opcode             := b"10_0001";      -- rt = *(short*          )(rs + offset)
323
  constant MIPS_OPCODE_LWL      : t_mips_opcode             := b"10_0010";      -- rt = rt[15:0]|(*(short*)(rs + offset) << 16)
324
  constant MIPS_OPCODE_LW       : t_mips_opcode             := b"10_0011";      -- rt = *(int*            )(rs + offset)
325
  constant MIPS_OPCODE_LBU      : t_mips_opcode             := b"10_0100";      -- rt = *(unsigned char*  )(rs + offset)
326
  constant MIPS_OPCODE_LHU      : t_mips_opcode             := b"10_0101";      -- rt = *(unsigned short* )(rs + offset)
327
  constant MIPS_OPCODE_LWR      : t_mips_opcode             := b"10_0110";      -- rt = rt[31:16]|*(short*)(rs + offset)[15:0]
328
 
329
  -- store to memory
330
  constant MIPS_OPCODE_SB       : t_mips_opcode             := b"10_1000";      -- *(char*  )(rs + offset) = rt
331
  constant MIPS_OPCODE_SH       : t_mips_opcode             := b"10_1001";      -- *(short* )(rs + offset) = rt
332
  constant MIPS_OPCODE_SWL      : t_mips_opcode             := b"10_1010";      -- *(short* )(rs + offset)[31:16] = rt[31:16]
333
  constant MIPS_OPCODE_SW       : t_mips_opcode             := b"10_1011";      -- *(int*   )(rs + offset) = rt
334
  constant MIPS_OPCODE_SWR      : t_mips_opcode             := b"10_1110";      -- *(short* )(rs + offset)[15:0] = rt[15:0]
335
 
336
  -- coprocessor load from memory
337
  constant MIPS_OPCODE_LWC1     : t_mips_opcode             := b"11_0001";      -- ft = *(int*  )(base + offset)
338
  constant MIPS_OPCODE_LWC2     : t_mips_opcode             := b"11_0010";
339
 
340
  -- coprocessor store to memory
341
  constant MIPS_OPCODE_SWC1     : t_mips_opcode             := b"11_1001";      -- *(int*   )(base + offset) = ft
342
 
343
end package mips_instruction_set;

powered by: WebSVN 2.1.0

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