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 4

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
-- $Id: opc_table.vhd,v 1.1 2004-03-23 21:31:52 arniml Exp $
8
--
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 ANLD --------------------------------------------------------
115
      when "10011100" | "10011101" | "10011110" | "10011111" => -- ANLD PP, A
116
        mnemonic_o    <= MN_ANLD;
117
        multi_cycle_o <= '1';
118
 
119
      -- Mnemonic CALL --------------------------------------------------------
120
      when "00010100" | "00110100" | "01010100" | "01110100" |  -- CALL addr
121
           "10010100" | "10110100" | "11010100" | "11110100" => --
122
        mnemonic_o    <= MN_CALL;
123
        multi_cycle_o <= '1';
124
 
125
      -- Mnemonic CLR_A -------------------------------------------------------
126
      when "00100111" =>                                        -- CLR A
127
        mnemonic_o    <= MN_CLR_A;
128
 
129
      -- Mnemonic CLR_C -------------------------------------------------------
130
      when "10010111" =>                                        -- CLR C
131
        mnemonic_o    <= MN_CLR_C;
132
 
133
      -- Mnemonic CLR_F -------------------------------------------------------
134
      when "10000101" |                                         -- CLR F0
135
           "10100101" =>
136
        mnemonic_o    <= MN_CLR_F;
137
 
138
      -- Mnemonic CPL_A -------------------------------------------------------
139
      when "00110111" =>                                        -- CPL A
140
        mnemonic_o    <= MN_CPL_A;
141
 
142
      -- Mnemonic CPL_C -------------------------------------------------------
143
      when "10100111" =>                                        -- CPL C
144
        mnemonic_o    <= MN_CPL_C;
145
 
146
      -- Mnemonic CPL_F -------------------------------------------------------
147
      when "10010101" |                                         -- CPL F0
148
           "10110101" =>                                        -- CPL F1
149
        mnemonic_o    <= MN_CPL_F;
150
 
151
      -- Mnemonic DA ----------------------------------------------------------
152
      when "01010111" =>                                        -- DA D
153
        mnemonic_o    <= MN_DA;
154
 
155
      -- Mnemonic DEC ---------------------------------------------------------
156
      when "11001000" | "11001001" | "11001010" | "11001011" |  -- DEC Rr
157
           "11001100" | "11001101" | "11001110" | "11001111" |  --
158
           "00000111" =>                                        -- DEC A
159
        mnemonic_o    <= MN_DEC;
160
 
161
      -- Mnemonic DIS_EN_I ----------------------------------------------------
162
      when "00010101" |                                         -- DIS I
163
           "00000101" =>                                        -- EN I
164
        mnemonic_o    <= MN_DIS_EN_I;
165
 
166
      -- Mnemonic DIS_EN_TCNTI ------------------------------------------------
167
      when "00110101" |                                         -- DIS TCNTI
168
           "00100101" =>                                        -- EN TCNTI
169
        mnemonic_o    <= MN_DIS_EN_TCNTI;
170
 
171
      -- Mnemonic DJNZ --------------------------------------------------------
172
      when "11101000" | "11101001" | "11101010" | "11101011" |  -- DJNZ Rr, addr
173
           "11101100" | "11101101" | "11101110" | "11101111" => --
174
        mnemonic_o    <= MN_DJNZ;
175
        multi_cycle_o <= '1';
176
 
177
      -- Mnemonic ENT0_CLK ----------------------------------------------------
178
      when "01110101" =>                                        -- ENT0 CLK
179
        mnemonic_o    <= MN_ENT0_CLK;
180
 
181
      -- Mnemonic IN ----------------------------------------------------------
182
      when "00001001" | "00001010" =>                           -- IN A, Pp
183
        mnemonic_o    <= MN_IN;
184
        multi_cycle_o <= '1';
185
 
186
      -- Mnemonic INC ---------------------------------------------------------
187
      when "00010111" |                                         -- INC A
188
           "00011000" | "00011001" | "00011010" | "00011011" |  -- INC Rr
189
           "00011100" | "00011101" | "00011110" | "00011111" |  --
190
           "00010000" | "00010001" =>                           -- INC @ Rr
191
        mnemonic_o    <= MN_INC;
192
 
193
      -- Mnemonic INS ---------------------------------------------------------
194
      when "00001000" =>                                        -- INS A, BUS
195
        mnemonic_o    <= MN_INS;
196
        multi_cycle_o <= '1';
197
 
198
      -- Mnemonic JBB ---------------------------------------------------------
199
      when "00010010" | "00110010" | "01010010" | "01110010" |  -- JBb addr
200
           "10010010" | "10110010" | "11010010" | "11110010" => --
201
        mnemonic_o    <= MN_JBB;
202
        multi_cycle_o <= '1';
203
 
204
      -- Mnemonic JC ----------------------------------------------------------
205
      when "11110110" |                                         -- JC addr
206
           "11100110" =>                                        -- JNC addr
207
        mnemonic_o    <= MN_JC;
208
        multi_cycle_o <= '1';
209
 
210
      -- Mnemonic JF ----------------------------------------------------------
211
      when "10110110" |                                         -- JF0 addr
212
           "01110110" =>                                        -- JF1 addr
213
        mnemonic_o    <= MN_JF;
214
        multi_cycle_o <= '1';
215
 
216
      -- Mnemonic JMP ---------------------------------------------------------
217
      when "00000100" | "00100100" | "01000100" | "01100100" |  -- JMP addr
218
           "10000100" | "10100100" | "11000100" | "11100100" => --
219
        mnemonic_o    <= MN_JMP;
220
        multi_cycle_o <= '1';
221
 
222
      -- Mnemonic JMPP --------------------------------------------------------
223
      when "10110011" =>                                        -- JMPP @ A
224
        mnemonic_o    <= MN_JMPP;
225
        multi_cycle_o <= '1';
226
 
227
      -- Mnemonic JNI ---------------------------------------------------------
228
      when "10000110" =>                                        -- JNI addr
229
        mnemonic_o    <= MN_JNI;
230
        multi_cycle_o <= '1';
231
 
232
      -- Mnemonic JT ----------------------------------------------------------
233
      when "00100110" |                                         -- JNT0 addr
234
           "01000110" |                                         -- JNT1 addr
235
           "00110110" |                                         -- JT0 addr
236
           "01010110" =>                                        -- JT1 addr
237
        mnemonic_o    <= MN_JT;
238
        multi_cycle_o <= '1';
239
 
240
      -- Mnemonic JTF ---------------------------------------------------------
241
      when "00010110" =>                                        -- JTF addr
242
        mnemonic_o    <= MN_JTF;
243
        multi_cycle_o <= '1';
244
 
245
      -- Mnemonic JZ ----------------------------------------------------------
246
      when "10010110" |                                         -- JNZ addr
247
           "11000110" =>                                        -- JZ addr
248
        mnemonic_o    <= MN_JZ;
249
        multi_cycle_o <= '1';
250
 
251
      -- Mnemonic MOV_A_DATA --------------------------------------------------
252
      when "00100011" =>                                        -- MOV A, data
253
        mnemonic_o    <= MN_MOV_A_DATA;
254
        multi_cycle_o <= '1';
255
 
256
      -- Mnemonic MOV_A_PSW ---------------------------------------------------
257
      when "11000111" =>                                        -- MOV A, PSW
258
        mnemonic_o    <= MN_MOV_A_PSW;
259
 
260
      -- Mnemonic MOV_A_RR ----------------------------------------------------
261
      when "11111000" | "11111001" | "11111010" | "11111011" |  -- MOV A, Rr
262
           "11111100" | "11111101" | "11111110" | "11111111" |  --
263
           "11110000" | "11110001" =>                           -- MOV A, @ Rr
264
        mnemonic_o    <= MN_MOV_A_RR;
265
 
266
      -- Mnemonic MOV_PSW_A ---------------------------------------------------
267
      when "11010111" =>                                        -- MOV PSW, A
268
        mnemonic_o    <= MN_MOV_PSW_A;
269
 
270
      -- Mnemonic MOV_RR ------------------------------------------------------
271
      when "10101000" | "10101001" | "10101010" | "10101011" |  -- MOV Rr, A
272
           "10101100" | "10101101" | "10101110" | "10101111" |  --
273
           "10100000" | "10100001" =>                           -- MOV @ Rr, A
274
        mnemonic_o    <= MN_MOV_RR;
275
 
276
      -- Mnemonic MOV_RR_DATA -------------------------------------------------
277
      when "10111000" | "10111001" | "10111010" | "10111011" |  -- MOV Rr, data
278
           "10111100" | "10111101" | "10111110" | "10111111" |  --
279
           "10110000" | "10110001" =>                           -- MOV @ Rr, data
280
        mnemonic_o    <= MN_MOV_RR_DATA;
281
        multi_cycle_o <= '1';
282
 
283
      -- Mnemonic MOV_T -------------------------------------------------------
284
      when "01100010" |                                         -- MOV T, A
285
           "01000010" =>                                        -- MOV A, T
286
        mnemonic_o    <= MN_MOV_T;
287
 
288
      -- Mnemonic MOV_A_PP ----------------------------------------------------
289
      when "00001100" | "00001101" | "00001110" | "00001111" =>  -- MOV A, Pp
290
        mnemonic_o    <= MN_MOV_A_PP;
291
        multi_cycle_o <= '1';
292
 
293
      -- Mnemonic MOV_PP_A ----------------------------------------------------
294
      when "00111100" | "00111101" | "00111110" | "00111111" =>  -- MOV Pp, A
295
        mnemonic_o    <= MN_MOV_PP_A;
296
        multi_cycle_o <= '1';
297
 
298
      -- Mnemonic MOVP --------------------------------------------------------
299
      when "10100011" |                                          -- MOVP A, @ A
300
           "11100011" =>                                         -- MOVP3 A, @ A
301
        mnemonic_o    <= MN_MOVP;
302
        multi_cycle_o <= '1';
303
 
304
      -- Mnemonic MOVX --------------------------------------------------------
305
      when "10000000" | "10000001" |                             -- MOVX A, @ Rr
306
           "10010000" | "10010001" =>                            -- MOVX @ Rr, A
307
        mnemonic_o    <= MN_MOVX;
308
        multi_cycle_o <= '1';
309
 
310
      -- Mnemonic NOP ---------------------------------------------------------
311
      when "00000000" =>                                         -- NOP
312
        mnemonic_o    <= MN_NOP;
313
 
314
      -- Mnemonic ORL ---------------------------------------------------------
315
      when "01001000" | "01001001" | "01001010" | "01001011" |  -- ORL A, Rr
316
           "01001100" | "01001101" | "01001110" | "01001111" |  --
317
           "01000000" | "01000001" =>                           -- ORL A, @ Rr
318
        mnemonic_o    <= MN_ORL;
319
 
320
      -- Mnemonic ORL_A_DATA --------------------------------------------------
321
      when "01000011" =>                                        -- ORL A, data
322
        mnemonic_o    <= MN_ORL_A_DATA;
323
        multi_cycle_o <= '1';
324
 
325
      -- Mnemonic ORL_EXT -----------------------------------------------------
326
      when "10001000" |                                         -- ORL BUS, data
327
           "10001001" | "10001010" =>                           -- ORL Pp, data
328
        mnemonic_o    <= MN_ORL_EXT;
329
        multi_cycle_o <= '1';
330
 
331
      -- Mnemonic ORLD_PP_A ----------------------------------------------------
332
      when "10001100" | "10001101" | "10001110" | "10001111" => -- ORLD Pp, A
333
        mnemonic_o    <= MN_ORLD_PP_A;
334
        multi_cycle_o <= '1';
335
 
336
      -- Mnemonic OUTL_EXT ----------------------------------------------------
337
      when "00111001" | "00111010" |                            -- OUTL Pp, A
338
           "00000010" =>                                        -- OUTL BUS, A
339
        mnemonic_o    <= MN_OUTL_EXT;
340
        multi_cycle_o <= '1';
341
 
342
      -- Mnemonic RET ---------------------------------------------------------
343
      when "10000011" |                                         -- RET
344
           "10010011" =>                                        -- RETR
345
        mnemonic_o    <= MN_RET;
346
        multi_cycle_o <= '1';
347
 
348
      -- Mnemonic RL ----------------------------------------------------------
349
      when "11100111" |                                         -- RL A
350
           "11110111" =>                                        -- RLC A
351
        mnemonic_o    <= MN_RL;
352
 
353
      -- Mnemonic RR ----------------------------------------------------------
354
      when "01110111" |                                         -- RR A
355
           "01100111" =>                                        -- RRC A
356
        mnemonic_o    <= MN_RR;
357
 
358
      -- Mnemonic SEL_MB ------------------------------------------------------
359
      when "11100101" |                                         -- SEL MB0
360
           "11110101" =>                                        -- SEL MB1
361
        mnemonic_o    <= MN_SEL_MB;
362
 
363
      -- Mnemonic SEL_RB ------------------------------------------------------
364
      when "11000101" |                                         -- SEL RB0
365
           "11010101" =>                                        -- SEL RB1
366
        mnemonic_o    <= MN_SEL_RB;
367
 
368
      -- Mnemonic STOP_TCNT ---------------------------------------------------
369
      when "01100101" =>                                        -- STOP TCNT
370
        mnemonic_o    <= MN_STOP_TCNT;
371
 
372
      -- Mnemonic START -------------------------------------------------------
373
      when "01000101" |                                         -- STRT CNT
374
           "01010101" =>                                        -- STRT T
375
        mnemonic_o    <= MN_STRT;
376
 
377
      -- Mnemonic SWAP --------------------------------------------------------
378
      when "01000111" =>                                        -- SWAP A
379
        mnemonic_o    <= MN_SWAP;
380
 
381
      -- Mnemonic XCH ---------------------------------------------------------
382
      when "00101000" | "00101001" | "00101010" | "00101011" |  -- XCH A, Rr
383
           "00101100" | "00101101" | "00101110" | "00101111" |  --
384
           "00100000" | "00100001" |                            -- XCH A, @ Rr
385
           "00110000" | "00110001" =>                           -- XCHD A, @ Rr
386
        mnemonic_o    <= MN_XCH;
387
 
388
      -- Mnemonic XRL ---------------------------------------------------------
389
      when "11011000" | "11011001" | "11011010" | "11011011" |  -- XRL A, Rr
390
           "11011100" | "11011101" | "11011110" | "11011111" |  --
391
           "11010000" | "11010001" =>                           -- XRL A, @ Rr
392
        mnemonic_o    <= MN_XRL;
393
 
394
      -- Mnemonic XRL_A_DATA --------------------------------------------------
395
      when "11010011" =>                                        -- XRL A, data
396
        mnemonic_o    <= MN_XRL_A_DATA;
397
        multi_cycle_o <= '1';
398
 
399
      when others =>
400
        -- pragma translate_off
401
        assert now = 0 ns
402
          report "Unknown opcode."
403
          severity warning;
404
        -- pragma translate_on
405
 
406
    end case;
407
 
408
  end process opc_decode;
409
  --
410
  -----------------------------------------------------------------------------
411
 
412
end rtl;
413
 
414
 
415
-------------------------------------------------------------------------------
416
-- File History:
417
--
418
-- $Log: not supported by cvs2svn $
419
--
420
-------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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