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

Subversion Repositories t48

[/] [t48/] [tags/] [rel_0_5_beta/] [rtl/] [vhdl/] [opc_table.vhd] - Blame information for rev 22

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

Line No. Rev Author Line
1 4 arniml
-------------------------------------------------------------------------------
2
--
3
-- The Opcode Decoder Table.
4
-- Decodes the given opcode to instruction mnemonics.
5
-- Also derives the multicycle information.
6
--
7 22 arniml
-- $Id: opc_table.vhd,v 1.2 2004-03-28 13:10:48 arniml Exp $
8 4 arniml
--
9
-- All rights reserved
10
--
11
-- Redistribution and use in source and synthezised forms, with or without
12
-- modification, are permitted provided that the following conditions are met:
13
--
14
-- Redistributions of source code must retain the above copyright notice,
15
-- this list of conditions and the following disclaimer.
16
--
17
-- Redistributions in synthesized form must reproduce the above copyright
18
-- notice, this list of conditions and the following disclaimer in the
19
-- documentation and/or other materials provided with the distribution.
20
--
21
-- Neither the name of the author nor the names of other contributors may
22
-- be used to endorse or promote products derived from this software without
23
-- specific prior written permission.
24
--
25
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
29
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
-- POSSIBILITY OF SUCH DAMAGE.
36
--
37
-- Please report bugs to the author, but before you do so, please
38
-- make sure that this is not a derivative work and that
39
-- you have the latest version of this file.
40
--
41
-- The latest version of this file can be found at:
42
--      http://www.opencores.org/cvsweb.shtml/t48/
43
--
44
-------------------------------------------------------------------------------
45
 
46
library ieee;
47
use ieee.std_logic_1164.all;
48
 
49
use work.t48_pack.word_t;
50
use work.decoder_pack.mnemonic_t;
51
 
52
entity opc_table is
53
 
54
  port (
55
    opcode_i      : in  word_t;
56
    multi_cycle_o : out std_logic;
57
    mnemonic_o    : out mnemonic_t
58
  );
59
 
60
end opc_table;
61
 
62
 
63
use work.decoder_pack.all;
64
 
65
architecture rtl of opc_table is
66
 
67
begin
68
 
69
  -----------------------------------------------------------------------------
70
  -- Process opc_decode
71
  --
72
  -- Purpose:
73
  --  Decode the opcode to the set of mnemonics.
74
  --
75
  opc_decode: process (opcode_i)
76
  begin
77
    -- default assignment
78
    mnemonic_o    <= MN_NOP;
79
    multi_cycle_o <= '0';
80
 
81
    case opcode_i is
82
      -- Mnemonic ADD ---------------------------------------------------------
83
      when "01101000" | "01101001" | "01101010" | "01101011" |  -- ADD A, Rr
84
           "01101100" | "01101101" | "01101110" | "01101111" |  --
85
           "01100000" | "01100001" |                            -- ADD A, @ Rr
86
           "01111000" | "01111001" | "01111010" | "01111011" |  -- ADDC A, Rr
87
           "01111100" | "01111101" | "01111110" | "01111111" |  --
88
           "01110000" | "01110001" =>                           -- ADDC A, @ Rr
89
        mnemonic_o    <= MN_ADD;
90
 
91
      -- Mnemonic ADD_A_DATA --------------------------------------------------
92
      when "00000011" |                                         -- ADD A, data
93
           "00010011" =>                                        -- ADDC A, data
94
        mnemonic_o    <= MN_ADD_A_DATA;
95
        multi_cycle_o <= '1';
96
 
97
      -- Mnemonic ANL ---------------------------------------------------------
98
      when "01011000" | "01011001" | "01011010" | "01011011" |  -- ANL A, Rr
99
           "01011100" | "01011101" | "01011110" | "01011111" |  --
100
           "01010000" | "01010001" =>                           -- ANL A, @ Rr
101
        mnemonic_o    <= MN_ANL;
102
 
103
      -- Mnemonic ANL_A_DATA --------------------------------------------------
104
      when "01010011" =>                                        -- ANL A, data
105
        mnemonic_o    <= MN_ANL_A_DATA;
106
        multi_cycle_o <= '1';
107
 
108
      -- Mnemonic ANL_EXT -----------------------------------------------------
109
      when "10011000" |                                         -- ANL BUS, data
110
           "10011001" | "10011010" =>                           -- ANL PP, data
111
        mnemonic_o    <= MN_ANL_EXT;
112
        multi_cycle_o <= '1';
113
 
114
      -- Mnemonic CALL --------------------------------------------------------
115
      when "00010100" | "00110100" | "01010100" | "01110100" |  -- CALL addr
116
           "10010100" | "10110100" | "11010100" | "11110100" => --
117
        mnemonic_o    <= MN_CALL;
118
        multi_cycle_o <= '1';
119
 
120
      -- Mnemonic CLR_A -------------------------------------------------------
121
      when "00100111" =>                                        -- CLR A
122
        mnemonic_o    <= MN_CLR_A;
123
 
124
      -- Mnemonic CLR_C -------------------------------------------------------
125
      when "10010111" =>                                        -- CLR C
126
        mnemonic_o    <= MN_CLR_C;
127
 
128
      -- Mnemonic CLR_F -------------------------------------------------------
129
      when "10000101" |                                         -- CLR F0
130
           "10100101" =>
131
        mnemonic_o    <= MN_CLR_F;
132
 
133
      -- Mnemonic CPL_A -------------------------------------------------------
134
      when "00110111" =>                                        -- CPL A
135
        mnemonic_o    <= MN_CPL_A;
136
 
137
      -- Mnemonic CPL_C -------------------------------------------------------
138
      when "10100111" =>                                        -- CPL C
139
        mnemonic_o    <= MN_CPL_C;
140
 
141
      -- Mnemonic CPL_F -------------------------------------------------------
142
      when "10010101" |                                         -- CPL F0
143
           "10110101" =>                                        -- CPL F1
144
        mnemonic_o    <= MN_CPL_F;
145
 
146
      -- Mnemonic DA ----------------------------------------------------------
147
      when "01010111" =>                                        -- DA D
148
        mnemonic_o    <= MN_DA;
149
 
150
      -- Mnemonic DEC ---------------------------------------------------------
151
      when "11001000" | "11001001" | "11001010" | "11001011" |  -- DEC Rr
152
           "11001100" | "11001101" | "11001110" | "11001111" |  --
153
           "00000111" =>                                        -- DEC A
154
        mnemonic_o    <= MN_DEC;
155
 
156
      -- Mnemonic DIS_EN_I ----------------------------------------------------
157
      when "00010101" |                                         -- DIS I
158
           "00000101" =>                                        -- EN I
159
        mnemonic_o    <= MN_DIS_EN_I;
160
 
161
      -- Mnemonic DIS_EN_TCNTI ------------------------------------------------
162
      when "00110101" |                                         -- DIS TCNTI
163
           "00100101" =>                                        -- EN TCNTI
164
        mnemonic_o    <= MN_DIS_EN_TCNTI;
165
 
166
      -- Mnemonic DJNZ --------------------------------------------------------
167
      when "11101000" | "11101001" | "11101010" | "11101011" |  -- DJNZ Rr, addr
168
           "11101100" | "11101101" | "11101110" | "11101111" => --
169
        mnemonic_o    <= MN_DJNZ;
170
        multi_cycle_o <= '1';
171
 
172
      -- Mnemonic ENT0_CLK ----------------------------------------------------
173
      when "01110101" =>                                        -- ENT0 CLK
174
        mnemonic_o    <= MN_ENT0_CLK;
175
 
176
      -- Mnemonic IN ----------------------------------------------------------
177
      when "00001001" | "00001010" =>                           -- IN A, Pp
178
        mnemonic_o    <= MN_IN;
179
        multi_cycle_o <= '1';
180
 
181
      -- Mnemonic INC ---------------------------------------------------------
182
      when "00010111" |                                         -- INC A
183
           "00011000" | "00011001" | "00011010" | "00011011" |  -- INC Rr
184
           "00011100" | "00011101" | "00011110" | "00011111" |  --
185
           "00010000" | "00010001" =>                           -- INC @ Rr
186
        mnemonic_o    <= MN_INC;
187
 
188
      -- Mnemonic INS ---------------------------------------------------------
189
      when "00001000" =>                                        -- INS A, BUS
190
        mnemonic_o    <= MN_INS;
191
        multi_cycle_o <= '1';
192
 
193
      -- Mnemonic JBB ---------------------------------------------------------
194
      when "00010010" | "00110010" | "01010010" | "01110010" |  -- JBb addr
195
           "10010010" | "10110010" | "11010010" | "11110010" => --
196
        mnemonic_o    <= MN_JBB;
197
        multi_cycle_o <= '1';
198
 
199
      -- Mnemonic JC ----------------------------------------------------------
200
      when "11110110" |                                         -- JC addr
201
           "11100110" =>                                        -- JNC addr
202
        mnemonic_o    <= MN_JC;
203
        multi_cycle_o <= '1';
204
 
205
      -- Mnemonic JF ----------------------------------------------------------
206
      when "10110110" |                                         -- JF0 addr
207
           "01110110" =>                                        -- JF1 addr
208
        mnemonic_o    <= MN_JF;
209
        multi_cycle_o <= '1';
210
 
211
      -- Mnemonic JMP ---------------------------------------------------------
212
      when "00000100" | "00100100" | "01000100" | "01100100" |  -- JMP addr
213
           "10000100" | "10100100" | "11000100" | "11100100" => --
214
        mnemonic_o    <= MN_JMP;
215
        multi_cycle_o <= '1';
216
 
217
      -- Mnemonic JMPP --------------------------------------------------------
218
      when "10110011" =>                                        -- JMPP @ A
219
        mnemonic_o    <= MN_JMPP;
220
        multi_cycle_o <= '1';
221
 
222
      -- Mnemonic JNI ---------------------------------------------------------
223
      when "10000110" =>                                        -- JNI addr
224
        mnemonic_o    <= MN_JNI;
225
        multi_cycle_o <= '1';
226
 
227
      -- Mnemonic JT ----------------------------------------------------------
228
      when "00100110" |                                         -- JNT0 addr
229
           "01000110" |                                         -- JNT1 addr
230
           "00110110" |                                         -- JT0 addr
231
           "01010110" =>                                        -- JT1 addr
232
        mnemonic_o    <= MN_JT;
233
        multi_cycle_o <= '1';
234
 
235
      -- Mnemonic JTF ---------------------------------------------------------
236
      when "00010110" =>                                        -- JTF addr
237
        mnemonic_o    <= MN_JTF;
238
        multi_cycle_o <= '1';
239
 
240
      -- Mnemonic JZ ----------------------------------------------------------
241
      when "10010110" |                                         -- JNZ addr
242
           "11000110" =>                                        -- JZ addr
243
        mnemonic_o    <= MN_JZ;
244
        multi_cycle_o <= '1';
245
 
246
      -- Mnemonic MOV_A_DATA --------------------------------------------------
247
      when "00100011" =>                                        -- MOV A, data
248
        mnemonic_o    <= MN_MOV_A_DATA;
249
        multi_cycle_o <= '1';
250
 
251
      -- Mnemonic MOV_A_PSW ---------------------------------------------------
252
      when "11000111" =>                                        -- MOV A, PSW
253
        mnemonic_o    <= MN_MOV_A_PSW;
254
 
255
      -- Mnemonic MOV_A_RR ----------------------------------------------------
256
      when "11111000" | "11111001" | "11111010" | "11111011" |  -- MOV A, Rr
257
           "11111100" | "11111101" | "11111110" | "11111111" |  --
258
           "11110000" | "11110001" =>                           -- MOV A, @ Rr
259
        mnemonic_o    <= MN_MOV_A_RR;
260
 
261
      -- Mnemonic MOV_PSW_A ---------------------------------------------------
262
      when "11010111" =>                                        -- MOV PSW, A
263
        mnemonic_o    <= MN_MOV_PSW_A;
264
 
265
      -- Mnemonic MOV_RR ------------------------------------------------------
266
      when "10101000" | "10101001" | "10101010" | "10101011" |  -- MOV Rr, A
267
           "10101100" | "10101101" | "10101110" | "10101111" |  --
268
           "10100000" | "10100001" =>                           -- MOV @ Rr, A
269
        mnemonic_o    <= MN_MOV_RR;
270
 
271
      -- Mnemonic MOV_RR_DATA -------------------------------------------------
272
      when "10111000" | "10111001" | "10111010" | "10111011" |  -- MOV Rr, data
273
           "10111100" | "10111101" | "10111110" | "10111111" |  --
274
           "10110000" | "10110001" =>                           -- MOV @ Rr, data
275
        mnemonic_o    <= MN_MOV_RR_DATA;
276
        multi_cycle_o <= '1';
277
 
278
      -- Mnemonic MOV_T -------------------------------------------------------
279
      when "01100010" |                                         -- MOV T, A
280
           "01000010" =>                                        -- MOV A, T
281
        mnemonic_o    <= MN_MOV_T;
282
 
283 22 arniml
      -- Mnemonic MOVD_A_PP ---------------------------------------------------
284
      when "00001100" | "00001101" | "00001110" | "00001111" => -- MOVD A, Pp
285
        mnemonic_o    <= MN_MOVD_A_PP;
286 4 arniml
        multi_cycle_o <= '1';
287
 
288
      -- Mnemonic MOVP --------------------------------------------------------
289 22 arniml
      when "10100011" |                                         -- MOVP A, @ A
290
           "11100011" =>                                        -- MOVP3 A, @ A
291 4 arniml
        mnemonic_o    <= MN_MOVP;
292
        multi_cycle_o <= '1';
293
 
294
      -- Mnemonic MOVX --------------------------------------------------------
295 22 arniml
      when "10000000" | "10000001" |                            -- MOVX A, @ Rr
296
           "10010000" | "10010001" =>                           -- MOVX @ Rr, A
297 4 arniml
        mnemonic_o    <= MN_MOVX;
298
        multi_cycle_o <= '1';
299
 
300
      -- Mnemonic NOP ---------------------------------------------------------
301 22 arniml
      when "00000000" =>                                        -- NOP
302 4 arniml
        mnemonic_o    <= MN_NOP;
303
 
304
      -- Mnemonic ORL ---------------------------------------------------------
305
      when "01001000" | "01001001" | "01001010" | "01001011" |  -- ORL A, Rr
306
           "01001100" | "01001101" | "01001110" | "01001111" |  --
307
           "01000000" | "01000001" =>                           -- ORL A, @ Rr
308
        mnemonic_o    <= MN_ORL;
309
 
310
      -- Mnemonic ORL_A_DATA --------------------------------------------------
311
      when "01000011" =>                                        -- ORL A, data
312
        mnemonic_o    <= MN_ORL_A_DATA;
313
        multi_cycle_o <= '1';
314
 
315
      -- Mnemonic ORL_EXT -----------------------------------------------------
316
      when "10001000" |                                         -- ORL BUS, data
317
           "10001001" | "10001010" =>                           -- ORL Pp, data
318
        mnemonic_o    <= MN_ORL_EXT;
319
        multi_cycle_o <= '1';
320
 
321 22 arniml
      -- Mnemonic OUTD_PP_A ---------------------------------------------------
322
      when "00111100" | "00111101" | "00111110" | "00111111" |  -- MOVD Pp, A
323
           "10011100" | "10011101" | "10011110" | "10011111" |  -- ANLD PP, A
324
           "10001100" | "10001101" | "10001110" | "10001111" => -- ORLD Pp, A
325
        mnemonic_o    <= MN_OUTD_PP_A;
326 4 arniml
        multi_cycle_o <= '1';
327
 
328
      -- Mnemonic OUTL_EXT ----------------------------------------------------
329
      when "00111001" | "00111010" |                            -- OUTL Pp, A
330
           "00000010" =>                                        -- OUTL BUS, A
331
        mnemonic_o    <= MN_OUTL_EXT;
332
        multi_cycle_o <= '1';
333
 
334
      -- Mnemonic RET ---------------------------------------------------------
335
      when "10000011" |                                         -- RET
336
           "10010011" =>                                        -- RETR
337
        mnemonic_o    <= MN_RET;
338
        multi_cycle_o <= '1';
339
 
340
      -- Mnemonic RL ----------------------------------------------------------
341
      when "11100111" |                                         -- RL A
342
           "11110111" =>                                        -- RLC A
343
        mnemonic_o    <= MN_RL;
344
 
345
      -- Mnemonic RR ----------------------------------------------------------
346
      when "01110111" |                                         -- RR A
347
           "01100111" =>                                        -- RRC A
348
        mnemonic_o    <= MN_RR;
349
 
350
      -- Mnemonic SEL_MB ------------------------------------------------------
351
      when "11100101" |                                         -- SEL MB0
352
           "11110101" =>                                        -- SEL MB1
353
        mnemonic_o    <= MN_SEL_MB;
354
 
355
      -- Mnemonic SEL_RB ------------------------------------------------------
356
      when "11000101" |                                         -- SEL RB0
357
           "11010101" =>                                        -- SEL RB1
358
        mnemonic_o    <= MN_SEL_RB;
359
 
360
      -- Mnemonic STOP_TCNT ---------------------------------------------------
361
      when "01100101" =>                                        -- STOP TCNT
362
        mnemonic_o    <= MN_STOP_TCNT;
363
 
364
      -- Mnemonic START -------------------------------------------------------
365
      when "01000101" |                                         -- STRT CNT
366
           "01010101" =>                                        -- STRT T
367
        mnemonic_o    <= MN_STRT;
368
 
369
      -- Mnemonic SWAP --------------------------------------------------------
370
      when "01000111" =>                                        -- SWAP A
371
        mnemonic_o    <= MN_SWAP;
372
 
373
      -- Mnemonic XCH ---------------------------------------------------------
374
      when "00101000" | "00101001" | "00101010" | "00101011" |  -- XCH A, Rr
375
           "00101100" | "00101101" | "00101110" | "00101111" |  --
376
           "00100000" | "00100001" |                            -- XCH A, @ Rr
377
           "00110000" | "00110001" =>                           -- XCHD A, @ Rr
378
        mnemonic_o    <= MN_XCH;
379
 
380
      -- Mnemonic XRL ---------------------------------------------------------
381
      when "11011000" | "11011001" | "11011010" | "11011011" |  -- XRL A, Rr
382
           "11011100" | "11011101" | "11011110" | "11011111" |  --
383
           "11010000" | "11010001" =>                           -- XRL A, @ Rr
384
        mnemonic_o    <= MN_XRL;
385
 
386
      -- Mnemonic XRL_A_DATA --------------------------------------------------
387
      when "11010011" =>                                        -- XRL A, data
388
        mnemonic_o    <= MN_XRL_A_DATA;
389
        multi_cycle_o <= '1';
390
 
391
      when others =>
392
        -- pragma translate_off
393
        assert now = 0 ns
394
          report "Unknown opcode."
395
          severity warning;
396
        -- pragma translate_on
397
 
398
    end case;
399
 
400
  end process opc_decode;
401
  --
402
  -----------------------------------------------------------------------------
403
 
404
end rtl;
405
 
406
 
407
-------------------------------------------------------------------------------
408
-- File History:
409
--
410
-- $Log: not supported by cvs2svn $
411 22 arniml
-- Revision 1.1  2004/03/23 21:31:52  arniml
412
-- initial check-in
413 4 arniml
--
414
-------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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