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

Subversion Repositories tg68

[/] [tg68/] [trunk/] [VHDL/] [TG68_fast.vhd] - Diff between revs 6 and 7

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 6 Rev 7
Line 20... Line 20...
--                                                                          --
--                                                                          --
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
--
--
--
--
 
-- Revision 1.04 2007/12/29
 
-- size improvement
 
-- change signal "microaddr" to one hot state machine
 
--
-- Revision 1.03 2007/12/21
-- Revision 1.03 2007/12/21
-- Thanks to Andreas Ehliar
-- Thanks to Andreas Ehliar
-- Split regfile to use blockram for registers
-- Split regfile to use blockram for registers
-- insert "WHEN OTHERS => null;" on END CASE; 
-- insert "WHEN OTHERS => null;" on END CASE; 
--
--
Line 91... Line 95...
   signal nextpass            : std_logic;
   signal nextpass            : std_logic;
   signal setnextpass     : std_logic;
   signal setnextpass     : std_logic;
   signal setdispbyte     : std_logic;
   signal setdispbyte     : std_logic;
   signal setdisp             : std_logic;
   signal setdisp             : std_logic;
   signal setdispbrief    : std_logic;
   signal setdispbrief    : std_logic;
   signal prefix              : std_logic;
 
   signal regdirectsource : std_logic;
   signal regdirectsource : std_logic;
   signal endOPC              : std_logic;
   signal endOPC              : std_logic;
   signal postadd             : std_logic;
   signal postadd             : std_logic;
   signal presub              : std_logic;
   signal presub              : std_logic;
   signal addsub_a        : std_logic_vector(31 downto 0);
   signal addsub_a        : std_logic_vector(31 downto 0);
Line 110... Line 113...
   signal addsub_ofl      : std_logic_vector(2 downto 0);
   signal addsub_ofl      : std_logic_vector(2 downto 0);
   signal flag_z          : std_logic_vector(2 downto 0);
   signal flag_z          : std_logic_vector(2 downto 0);
 
 
   signal last_data_read  : std_logic_vector(15 downto 0);
   signal last_data_read  : std_logic_vector(15 downto 0);
   signal data_read       : std_logic_vector(31 downto 0);
   signal data_read       : std_logic_vector(31 downto 0);
   signal microaddr       : std_logic_vector(7 downto 0);
 
   signal micronext       : std_logic_vector(7 downto 0);
 
   signal microstep           : std_logic;
 
   signal microset            : std_logic;
 
 
 
   signal registerin      : std_logic_vector(31 downto 0);
   signal registerin      : std_logic_vector(31 downto 0);
   signal reg_QA          : std_logic_vector(31 downto 0);
   signal reg_QA          : std_logic_vector(31 downto 0);
   signal reg_QB          : std_logic_vector(31 downto 0);
   signal reg_QB          : std_logic_vector(31 downto 0);
   signal Hwrena,Lwrena   : std_logic;
   signal Hwrena,Lwrena   : std_logic;
Line 329... Line 328...
        signal set_PCmarker       : std_logic;
        signal set_PCmarker       : std_logic;
        signal PCmarker       : std_logic;
        signal PCmarker       : std_logic;
        signal set_Z_error        : std_logic;
        signal set_Z_error        : std_logic;
        signal Z_error        : std_logic;
        signal Z_error        : std_logic;
 
 
 
        type micro_states is (idle, nop, ld_nn, st_nn, ld_dAn1, ld_dAn2, ld_AnXn1, ld_AnXn2, ld_AnXn3, st_dAn1, st_dAn2,
 
                                                  st_AnXn1, st_AnXn2, st_AnXn3, bra1, bra2, bsr1, bsr2, dbcc1, dbcc2,
 
                                                  movem, andi, op_AxAy, cmpm, link, int1, int2, int3, int4, rte, trap1, trap2, trap3,
 
                                                  movep1, movep2, movep3, movep4, movep5, init1, init2,
 
                                                  mul1, mul2, mul3, mul4, mul5, mul6, mul7, mul8, mul9, mul10, mul11, mul12, mul13, mul14, mul15,
 
                                                  div1, div2, div3, div4, div5, div6, div7, div8, div9, div10, div11, div12, div13, div14, div15 );
 
        signal micro_state              : micro_states;
 
        signal next_micro_state         : micro_states;
 
 
        type regfile_t is array(0 to 16) of std_logic_vector(15 downto 0);
        type regfile_t is array(0 to 16) of std_logic_vector(15 downto 0);
        signal regfile_low        : regfile_t;
        signal regfile_low        : regfile_t;
        signal regfile_high       : regfile_t;
        signal regfile_high       : regfile_t;
        signal RWindex_A          : integer range 0 to 16;
        signal RWindex_A          : integer range 0 to 16;
        signal RWindex_B          : integer range 0 to 16;
        signal RWindex_B          : integer range 0 to 16;
 
 
 
 
BEGIN
BEGIN
 
 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- Registerfile
-- Registerfile
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
Line 706... Line 715...
                                        PCmarker <= '0';
                                        PCmarker <= '0';
                                END IF;
                                END IF;
                                IF (decodeOPC OR execOPC)='1' THEN
                                IF (decodeOPC OR execOPC)='1' THEN
                                        rot_cnt <= set_rot_cnt;
                                        rot_cnt <= set_rot_cnt;
                                END IF;
                                END IF;
                                IF microstep='0' AND setstate_mux="00" AND (setnextpass='0' OR ea_only='1') AND endOPC='0' AND movem_busy='0' AND set_movem_busy='0' AND set_get_bitnumber='0' THEN
                                IF next_micro_state=idle AND setstate_mux="00" AND (setnextpass='0' OR ea_only='1') AND endOPC='0' AND movem_busy='0' AND set_movem_busy='0' AND set_get_bitnumber='0' THEN
                                        nextpass <= '0';
                                        nextpass <= '0';
                                        IF (exec_write_back='0' OR state="11") AND set_rot_cnt="000001" THEN
                                        IF (exec_write_back='0' OR state="11") AND set_rot_cnt="000001" THEN
                                                endOPC <= '1';
                                                endOPC <= '1';
                                                IF Flags(10 downto 8)<IPL_nr OR IPL_nr="111" THEN
                                                IF Flags(10 downto 8)<IPL_nr OR IPL_nr="111" THEN
                                                        interrupt <= '1';
                                                        interrupt <= '1';
Line 1162... Line 1171...
        END PROCESS;
        END PROCESS;
 
 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- execute opcode
-- execute opcode
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
PROCESS (clk, reset, OP2out, opcode, fetchOPC, decodeOPC, execOPC, endOPC, prefix, nextpass, condition, set_V_flag, trapmake, trapd, interrupt, trap_interrupt,
PROCESS (clk, reset, OP2out, opcode, fetchOPC, decodeOPC, execOPC, endOPC, nextpass, condition, set_V_flag, trapmake, trapd, interrupt, trap_interrupt,
             Z_error, microaddr, c_in, rot_cnt, one_bit_in, bit_number_reg, bit_number, ea_only, get_ea_now, ea_build, datatype, exec_write_back, get_extendedOPC,
             Z_error, c_in, rot_cnt, one_bit_in, bit_number_reg, bit_number, ea_only, get_ea_now, ea_build, datatype, exec_write_back, get_extendedOPC,
             Flags, SVmode, movem_addr, movem_busy, getbrief, set_exec_AND, set_exec_OR, set_exec_EOR, TG68_PC_dec, c_out, OP1out)
             Flags, SVmode, movem_addr, movem_busy, getbrief, set_exec_AND, set_exec_OR, set_exec_EOR, TG68_PC_dec, c_out, OP1out, micro_state)
        BEGIN
        BEGIN
                TG68_PC_br8 <= '0';
                TG68_PC_br8 <= '0';
                TG68_PC_brw <= '0';
                TG68_PC_brw <= '0';
                TG68_PC_nop <= '0';
                TG68_PC_nop <= '0';
                setstate <= "00";
                setstate <= "00";
                Regwrena <= '0';
                Regwrena <= '0';
                microstep <= '0';
 
                microset <= '0';
 
                postadd <= '0';
                postadd <= '0';
                presub <= '0';
                presub <= '0';
                movem_presub <= '0';
                movem_presub <= '0';
                setaddsub <= '1';
                setaddsub <= '1';
                micronext <= "00000001";
 
                setaddrlong <= '0';
                setaddrlong <= '0';
                setnextpass <= '0';
                setnextpass <= '0';
                regdirectsource <= '0';
                regdirectsource <= '0';
                setdisp <= '0';
                setdisp <= '0';
                setdispbyte <= '0';
                setdispbyte <= '0';
Line 1266... Line 1272...
                wait_mem_byte <= '0';
                wait_mem_byte <= '0';
                set_movepl <= '0';
                set_movepl <= '0';
                set_movepw <= '0';
                set_movepw <= '0';
 
 
                trap_chk <= '0';
                trap_chk <= '0';
 
                next_micro_state <= idle;
 
 
------------------------------------------------------------------------------
------------------------------------------------------------------------------
--Sourcepass
--Sourcepass
------------------------------------------------------------------------------          
------------------------------------------------------------------------------          
                IF ea_only='0' AND get_ea_now='1' THEN
                IF ea_only='0' AND get_ea_now='1' THEN
Line 1300... Line 1307...
                                        END IF;
                                        END IF;
                                        IF opcode(4 downto 3)/="10" THEN
                                        IF opcode(4 downto 3)/="10" THEN
                                                regwrena <= '1';
                                                regwrena <= '1';
                                        END IF;
                                        END IF;
                                WHEN "101" =>                           --(d16,An)
                                WHEN "101" =>                           --(d16,An)
                                        microstep <='1';
                                        next_micro_state <= ld_dAn1;
                                        micronext <="00000110";
 
                                        setgetbrief <='1';
                                        setgetbrief <='1';
                                        set_mem_regA <= '1';
                                        set_mem_regA <= '1';
                                WHEN "110" =>                           --(d8,An,Xn)
                                WHEN "110" =>                           --(d8,An,Xn)
                                        microstep <='1';
                                        next_micro_state <= ld_AnXn1;
                                        micronext <="00001000";
 
                                        setgetbrief <='1';
                                        setgetbrief <='1';
                                        set_mem_regA <= '1';
                                        set_mem_regA <= '1';
                                WHEN "111" =>
                                WHEN "111" =>
                                        CASE opcode(2 downto 0) IS
                                        CASE opcode(2 downto 0) IS
                                                WHEN "000" =>                           --(xxxx).w
                                                WHEN "000" =>                           --(xxxx).w
                                                        micronext <="00000010";
                                                        next_micro_state <= ld_nn;
                                                        microstep <='1';
 
                                                WHEN "001" =>                           --(xxxx).l
                                                WHEN "001" =>                           --(xxxx).l
                                                        longreaddirect <= '1';
                                                        longreaddirect <= '1';
                                                        micronext <="00000010";
                                                        next_micro_state <= ld_nn;
                                                        microstep <='1';
 
                                                WHEN "010" =>                           --(d16,PC)
                                                WHEN "010" =>                           --(d16,PC)
                                                        microstep <='1';
                                                        next_micro_state <= ld_dAn1;
                                                        micronext <="00000110";
 
                                                        setgetbrief <= '1';
                                                        setgetbrief <= '1';
                                                        set_PCmarker <= '1';
                                                        set_PCmarker <= '1';
                                                WHEN "011" =>                           --(d8,PC,Xn)
                                                WHEN "011" =>                           --(d8,PC,Xn)
                                                        microstep <='1';
                                                        next_micro_state <= ld_AnXn1;
                                                        micronext <="00001000";
 
                                                        setgetbrief <= '1';
                                                        setgetbrief <= '1';
                                                        set_PCmarker <= '1';
                                                        set_PCmarker <= '1';
                                                WHEN "100" =>                           --#data
                                                WHEN "100" =>                           --#data
                                                        setnextpass <= '1';
                                                        setnextpass <= '1';
                                                        set_direct_data <= '1';
                                                        set_direct_data <= '1';
Line 1381... Line 1382...
                                END IF;
                                END IF;
                                IF decodeOPC='1' THEN
                                IF decodeOPC='1' THEN
                                        IF opcode(7)='0' THEN
                                        IF opcode(7)='0' THEN
                                                set_direct_data <= '1';
                                                set_direct_data <= '1';
                                        END IF;
                                        END IF;
                                        microstep <='1';
                                        next_micro_state <= movep1;
                                        micronext <="01010110";
 
                                        setgetbrief <='1';
                                        setgetbrief <='1';
                                        set_mem_regA <= '1';
                                        set_mem_regA <= '1';
                                END IF;
                                END IF;
                                IF opcode(7)='0' AND endOPC='1' THEN
                                IF opcode(7)='0' AND endOPC='1' THEN
                                        IF opcode(6)='1' THEN
                                        IF opcode(6)='1' THEN
Line 1462... Line 1462...
                                                        IF opcode(11 downto 8)="0010" OR opcode(11 downto 8)="0000" OR opcode(11 downto 8)="0100"       --ANDI, ORI, SUBI
                                                        IF opcode(11 downto 8)="0010" OR opcode(11 downto 8)="0000" OR opcode(11 downto 8)="0100"       --ANDI, ORI, SUBI
                                                           OR opcode(11 downto 8)="0110" OR opcode(11 downto 8)="1010" OR opcode(11 downto 8)="1100" THEN       --ADDI, EORI, CMPI
                                                           OR opcode(11 downto 8)="0110" OR opcode(11 downto 8)="1010" OR opcode(11 downto 8)="1100" THEN       --ADDI, EORI, CMPI
        --                                              IF (set_exec_AND OR set_exec_OR OR set_exec_ADD         --ANDI, ORI, SUBI
        --                                              IF (set_exec_AND OR set_exec_OR OR set_exec_ADD         --ANDI, ORI, SUBI
        --                                                 OR set_exec_EOR OR set_exec_CMP)='1' THEN    --ADDI, EORI, CMPI
        --                                                 OR set_exec_EOR OR set_exec_CMP)='1' THEN    --ADDI, EORI, CMPI
 
 
                                                                microstep <='1';
                                                                next_micro_state <= andi;
                                                                micronext <="00101000";
 
                                                                set_direct_data <= '1';
                                                                set_direct_data <= '1';
                                                                IF datatype="10" THEN
                                                                IF datatype="10" THEN
                                                                        longreaddirect <= '1';
                                                                        longreaddirect <= '1';
                                                                END IF;
                                                                END IF;
                                                        END IF;
                                                        END IF;
Line 1523... Line 1522...
 
 
                                IF decodeOPC='1' THEN
                                IF decodeOPC='1' THEN
                                        ea_build <= '1';
                                        ea_build <= '1';
                                END IF;
                                END IF;
 
 
                                IF prefix='0' AND (nextpass='1' OR (opcode(5 downto 4)="00" AND decodeOPC='1')) THEN
                                IF micro_state=idle AND (nextpass='1' OR (opcode(5 downto 4)="00" AND decodeOPC='1')) THEN
                                        CASE opcode(8 downto 6) IS              --destination
                                        CASE opcode(8 downto 6) IS              --destination
--                                              WHEN "000" =>                                           --Dn
--                                              WHEN "000" =>                                           --Dn
--                                              WHEN "001" =>                                           --An
--                                              WHEN "001" =>                                           --An
                                                WHEN "010"|"011"|"100" =>                                       --destination -(an)+
                                                WHEN "010"|"011"|"100" =>                                       --destination -(an)+
                                                        IF opcode(7)='1' THEN
                                                        IF opcode(7)='1' THEN
Line 1549... Line 1548...
                                                        END IF;
                                                        END IF;
                                                        IF opcode(7 downto 6)/="10" THEN
                                                        IF opcode(7 downto 6)/="10" THEN
                                                                regwrena <= '1';
                                                                regwrena <= '1';
                                                        END IF;
                                                        END IF;
                                                        setstate <= "11";
                                                        setstate <= "11";
                                                        microstep <='1';                --nop
                                                        next_micro_state <= nop;
                                                WHEN "101" =>                           --(d16,An)
                                                WHEN "101" =>                           --(d16,An)
                                                        microstep <='1';
                                                        next_micro_state <= st_dAn1;
                                                        micronext <="00001011";
 
                                                        set_mem_regA <= '1';
                                                        set_mem_regA <= '1';
                                                        setgetbrief <= '1';
                                                        setgetbrief <= '1';
                                                WHEN "110" =>                           --(d8,An,Xn)
                                                WHEN "110" =>                           --(d8,An,Xn)
                                                        microstep <='1';
                                                        next_micro_state <= st_AnXn1;
                                                        micronext <="00001110";
 
                                                        set_mem_regA <= '1';
                                                        set_mem_regA <= '1';
                                                        setgetbrief <= '1';
                                                        setgetbrief <= '1';
                                                WHEN "111" =>
                                                WHEN "111" =>
                                                        CASE opcode(11 downto 9) IS
                                                        CASE opcode(11 downto 9) IS
                                                                WHEN "000" =>                           --(xxxx).w
                                                                WHEN "000" =>                           --(xxxx).w
                                                                        microstep <='1';
                                                                        next_micro_state <= st_nn;
                                                                        micronext <="00000011";
 
                                                                WHEN "001" =>                           --(xxxx).l
                                                                WHEN "001" =>                           --(xxxx).l
                                                                        longreaddirect <= '1';
                                                                        longreaddirect <= '1';
                                                                        microstep <='1';
                                                                        next_micro_state <= st_nn;
                                                                        micronext <="00000011";
 
                                                                WHEN OTHERS =>
                                                                WHEN OTHERS =>
                                                        END CASE;
                                                        END CASE;
                                                WHEN OTHERS =>
                                                WHEN OTHERS =>
                                        END CASE;
                                        END CASE;
                                END IF;
                                END IF;
Line 1758... Line 1753...
                                                                                        set_mem_rega <= '1';
                                                                                        set_mem_rega <= '1';
                                                                                        setstate <= "01";
                                                                                        setstate <= "01";
                                                                                        IF opcode(10)='0' THEN
                                                                                        IF opcode(10)='0' THEN
                                                                                                set_movem_busy <='1';
                                                                                                set_movem_busy <='1';
                                                                                        ELSE
                                                                                        ELSE
                                                                                                micronext <="00100010";
                                                                                                next_micro_state <= movem;
                                                                                                microstep <='1';
 
                                                                                        END IF;
                                                                                        END IF;
                                                                                ELSE
                                                                                ELSE
                                                                                        ea_build <= '1';
                                                                                        ea_build <= '1';
                                                                                END IF;
                                                                                END IF;
 
 
Line 1819... Line 1813...
                                                                                ELSE                                                                    --pea
                                                                                ELSE                                                                    --pea
                                                                                        ea_only <= '1';
                                                                                        ea_only <= '1';
                                                                                        IF decodeOPC='1' THEN
                                                                                        IF decodeOPC='1' THEN
                                                                                                ea_build <= '1';
                                                                                                ea_build <= '1';
                                                                                        END IF;
                                                                                        END IF;
                                                                                        IF nextpass='1' AND prefix='0' THEN
                                                                                        IF nextpass='1' AND micro_state=idle THEN
                                                                                                presub <= '1';
                                                                                                presub <= '1';
                                                                                                setstackaddr <='1';
                                                                                                setstackaddr <='1';
                                                                                                set_mem_addsub <= '1';
                                                                                                set_mem_addsub <= '1';
                                                                                                setstate <="11";
                                                                                                setstate <="11";
                                                                                                microstep <='1';
                                                                                                next_micro_state <= nop;
                                                                                        END IF;
                                                                                        END IF;
                                                                                        IF get_ea_now='1' THEN
                                                                                        IF get_ea_now='1' THEN
                                                                                                setstate <="01";
                                                                                                setstate <="01";
                                                                                        END IF;
                                                                                        END IF;
                                                                                END IF;
                                                                                END IF;
Line 1874... Line 1868...
--                                              WHEN "110"=>
--                                              WHEN "110"=>
                                                WHEN "111"=>                                    --4EXX
                                                WHEN "111"=>                                    --4EXX
                                                        IF opcode(7)='1' THEN           --jsr, jmp
                                                        IF opcode(7)='1' THEN           --jsr, jmp
                                                                datatype <= "10";
                                                                datatype <= "10";
                                                                ea_only <= '1';
                                                                ea_only <= '1';
                                                                IF nextpass='1' AND prefix='0' THEN
                                                                IF nextpass='1' AND micro_state=idle THEN
                                                                        presub <= '1';
                                                                        presub <= '1';
                                                                        setstackaddr <='1';
                                                                        setstackaddr <='1';
                                                                        set_mem_addsub <= '1';
                                                                        set_mem_addsub <= '1';
                                                                        setstate <="11";
                                                                        setstate <="11";
                                                                        microstep <='1';
                                                                        next_micro_state <= nop;
                                                                END IF;
                                                                END IF;
                                                                IF decodeOPC='1' THEN
                                                                IF decodeOPC='1' THEN
                                                                        ea_build <= '1';
                                                                        ea_build <= '1';
                                                                END IF;
                                                                END IF;
                                                                IF get_ea_now='1' THEN                                  --jsr
                                                                IF get_ea_now='1' THEN                                  --jsr
Line 1904... Line 1898...
                                                                                        trap_trap <='1';
                                                                                        trap_trap <='1';
                                                                                        trapmake <= '1';
                                                                                        trapmake <= '1';
                                                                        WHEN "1010000"|"1010001"|"1010010"|"1010011"|"1010100"|"1010101"|"1010110"|"1010111" =>         --link
                                                                        WHEN "1010000"|"1010001"|"1010010"|"1010011"|"1010100"|"1010101"|"1010110"|"1010111" =>         --link
                                                                                datatype <= "10";
                                                                                datatype <= "10";
                                                                                IF decodeOPC='1' THEN
                                                                                IF decodeOPC='1' THEN
                                                                                        micronext <="01000000";
                                                                                        next_micro_state <= link;
                                                                                        microstep <='1';
 
                                                                                        set_exec_MOVE <= '1';                                           --für displacement
                                                                                        set_exec_MOVE <= '1';                                           --für displacement
                                                                                        presub <= '1';
                                                                                        presub <= '1';
                                                                                        setstackaddr <='1';
                                                                                        setstackaddr <='1';
                                                                                        set_mem_addsub <= '1';
                                                                                        set_mem_addsub <= '1';
                                                                                        source_lowbits <= '1';
                                                                                        source_lowbits <= '1';
Line 1992... Line 1985...
                                                                                                setstate <= "10";
                                                                                                setstate <= "10";
                                                                                                postadd <= '1';
                                                                                                postadd <= '1';
                                                                                                setstackaddr <= '1';
                                                                                                setstackaddr <= '1';
                                                                                                set_mem_rega <= '1';
                                                                                                set_mem_rega <= '1';
                                                                                                set_directSR <= '1';
                                                                                                set_directSR <= '1';
                                                                                                microstep <='1';
                                                                                                next_micro_state <= rte;
                                                                                                micronext <= "01001000";
 
                                                                                        END IF;
                                                                                        END IF;
                                                                                ELSE
                                                                                ELSE
                                                                                        trap_priv <= '1';
                                                                                        trap_priv <= '1';
                                                                                        trapmake <= '1';
                                                                                        trapmake <= '1';
                                                                                END IF;
                                                                                END IF;
Line 2008... Line 2000...
                                                                                        setstate <= "10";
                                                                                        setstate <= "10";
                                                                                        postadd <= '1';
                                                                                        postadd <= '1';
                                                                                        setstackaddr <= '1';
                                                                                        setstackaddr <= '1';
                                                                                        set_mem_rega <= '1';
                                                                                        set_mem_rega <= '1';
                                                                                        set_directPC <= '1';
                                                                                        set_directPC <= '1';
                                                                                        microstep <='1';
                                                                                        next_micro_state <= nop;
                                                                                END IF;
                                                                                END IF;
 
 
                                                                        WHEN "1110110" =>                                                                       --trapv
                                                                        WHEN "1110110" =>                                                                       --trapv
                                                                                IF Flags(1)='1' THEN
                                                                                IF Flags(1)='1' THEN
                                                                                        trap_trapv <= '1';
                                                                                        trap_trapv <= '1';
Line 2033... Line 2025...
 
 
                                        IF opcode(7 downto 6)="11" THEN --dbcc
                                        IF opcode(7 downto 6)="11" THEN --dbcc
                                                IF opcode(5 downto 3)="001" THEN --dbcc
                                                IF opcode(5 downto 3)="001" THEN --dbcc
                                                        datatype <= "01";                       --Word
                                                        datatype <= "01";                       --Word
                                                        IF decodeOPC='1' THEN
                                                        IF decodeOPC='1' THEN
 
                                                                next_micro_state <= nop;
                                                                OP2out_one <= '1';
                                                                OP2out_one <= '1';
                                                                IF condition='0' THEN
                                                                IF condition='0' THEN
                                                                        Regwrena <= '1';
                                                                        Regwrena <= '1';
                                                                        IF c_in(2)='1' THEN
                                                                        IF c_in(2)='1' THEN
                                                                                micronext <="00011110";
                                                                                next_micro_state <= dbcc1;
                                                                        END IF;
                                                                        END IF;
                                                                END IF;
                                                                END IF;
                                                                data_is_source <= '1';
                                                                data_is_source <= '1';
                                                                microstep <='1';
 
                                                        END IF;
                                                        END IF;
                                                ELSE                            --Scc
                                                ELSE                            --Scc
                                                        datatype <= "00";                       --Byte
                                                        datatype <= "00";                       --Byte
                                                        write_back <= '1';
                                                        write_back <= '1';
                                                        IF decodeOPC='1' THEN
                                                        IF decodeOPC='1' THEN
Line 2089... Line 2081...
 
 
-- 0110 ----------------------------------------------------------------------------            
-- 0110 ----------------------------------------------------------------------------            
                        WHEN "0110" =>                          --bra,bsr,bcc
                        WHEN "0110" =>                          --bra,bsr,bcc
                                datatype <= "10";
                                datatype <= "10";
 
 
                                IF prefix='0' THEN
                                IF micro_state=idle THEN
                                        IF opcode(11 downto 8)="0001" THEN              --bsr
                                        IF opcode(11 downto 8)="0001" THEN              --bsr
                                                IF opcode(7 downto 0)="00000000" THEN
                                                IF opcode(7 downto 0)="00000000" THEN
                                                        micronext <="00011000";
                                                        next_micro_state <= bsr1;
                                                ELSE
                                                ELSE
                                                        micronext <="00011001";
                                                        next_micro_state <= bsr2;
                                                        setstate <= "01";
                                                        setstate <= "01";
                                                END IF;
                                                END IF;
                                                microstep <='1';
 
                                                presub <= '1';
                                                presub <= '1';
                                                setstackaddr <='1';
                                                setstackaddr <='1';
                                                set_mem_addsub <= '1';
                                                set_mem_addsub <= '1';
                                        ELSE                                                                    --bra
                                        ELSE                                                                    --bra
                                                IF opcode(7 downto 0)="00000000" THEN
                                                IF opcode(7 downto 0)="00000000" THEN
                                                        microstep <='1';
                                                        next_micro_state <= bra1;
                                                        micronext <="00010010";
 
                                                END IF;
                                                END IF;
                                                IF condition='1' THEN
                                                IF condition='1' THEN
                                                        TG68_PC_br8 <= '1';
                                                        TG68_PC_br8 <= '1';
                                                END IF;
                                                END IF;
                                        END IF;
                                        END IF;
Line 2133... Line 2123...
                        WHEN "1000" =>                                                          --or    
                        WHEN "1000" =>                                                          --or    
                                IF opcode(7 downto 6)="11" THEN --divu, divs
                                IF opcode(7 downto 6)="11" THEN --divu, divs
                                        IF opcode(5 downto 4)="00" THEN --Dn, An
                                        IF opcode(5 downto 4)="00" THEN --Dn, An
                                                regdirectsource <= '1';
                                                regdirectsource <= '1';
                                        END IF;
                                        END IF;
                                        IF (prefix='0' AND nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
                                        IF (micro_state=idle AND nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
                                                set_exec_DIVU <= '1';
                                                set_exec_DIVU <= '1';
                                                setstate <="01";
                                                setstate <="01";
                                                microstep <='1';
                                                next_micro_state <= div1;
                                                micronext <="10100000";
 
                                        END IF;
                                        END IF;
                                        IF decodeOPC='1' THEN
                                        IF decodeOPC='1' THEN
                                                ea_build <= '1';
                                                ea_build <= '1';
                                        END IF;
                                        END IF;
                                        IF execOPC='1' AND z_error='0' AND set_V_Flag='0' THEN
                                        IF execOPC='1' AND z_error='0' AND set_V_Flag='0' THEN
                                                regwrena <= '1';
                                                regwrena <= '1';
                                        END IF;
                                        END IF;
                                        IF (prefix='1' AND nextpass='1') OR execOPC='1' THEN
                                        IF (micro_state/=idle AND nextpass='1') OR execOPC='1' THEN
                                                dest_hbits <= '1';
                                                dest_hbits <= '1';
                                                source_lowbits <='1';
                                                source_lowbits <='1';
                                        ELSE
                                        ELSE
                                                datatype <= "01";
                                                datatype <= "01";
                                        END IF;
                                        END IF;
Line 2165... Line 2154...
                                                        IF decodeOPC='1' THEN
                                                        IF decodeOPC='1' THEN
                                                                set_direct_data <= '1';
                                                                set_direct_data <= '1';
                                                                setstate <= "10";
                                                                setstate <= "10";
                                                                set_mem_addsub <= '1';
                                                                set_mem_addsub <= '1';
                                                                presub <= '1';
                                                                presub <= '1';
                                                                microstep <='1';
                                                                next_micro_state <= op_AxAy;
                                                                micronext <="00110000";
 
                                                        END IF;
                                                        END IF;
                                                END IF;
                                                END IF;
                                                IF execOPC='1' THEN
                                                IF execOPC='1' THEN
                                                        ea_data_OP1 <= '1';
                                                        ea_data_OP1 <= '1';
                                                        dest_hbits <= '1';
                                                        dest_hbits <= '1';
Line 2231... Line 2219...
                                                IF decodeOPC='1' THEN
                                                IF decodeOPC='1' THEN
                                                        set_direct_data <= '1';
                                                        set_direct_data <= '1';
                                                        setstate <= "10";
                                                        setstate <= "10";
                                                        set_mem_addsub <= '1';
                                                        set_mem_addsub <= '1';
                                                        presub <= '1';
                                                        presub <= '1';
                                                        microstep <='1';
                                                        next_micro_state <= op_AxAy;
                                                        micronext <="00110000";
 
                                                END IF;
                                                END IF;
                                        END IF;
                                        END IF;
                                        IF execOPC='1' THEN
                                        IF execOPC='1' THEN
                                                ea_data_OP1 <= '1';
                                                ea_data_OP1 <= '1';
                                                dest_hbits <= '1';
                                                dest_hbits <= '1';
Line 2287... Line 2274...
                                        IF decodeOPC='1' THEN
                                        IF decodeOPC='1' THEN
                                                set_direct_data <= '1';
                                                set_direct_data <= '1';
                                                setstate <= "10";
                                                setstate <= "10";
                                                set_mem_rega <= '1';
                                                set_mem_rega <= '1';
                                                postadd <= '1';
                                                postadd <= '1';
                                                microstep <='1';
                                                next_micro_state <= cmpm;
                                                micronext <="00110010";
 
                                        END IF;
                                        END IF;
                                        IF execOPC='1' THEN
                                        IF execOPC='1' THEN
                                                ea_data_OP1 <= '1';
                                                ea_data_OP1 <= '1';
                                                setaddsub <= '0';
                                                setaddsub <= '0';
                                        END IF;
                                        END IF;
Line 2328... Line 2314...
                        WHEN "1100" =>                                                          --and, exg
                        WHEN "1100" =>                                                          --and, exg
                                IF opcode(7 downto 6)="11" THEN --mulu, muls
                                IF opcode(7 downto 6)="11" THEN --mulu, muls
                                        IF opcode(5 downto 4)="00" THEN --Dn, An
                                        IF opcode(5 downto 4)="00" THEN --Dn, An
                                                regdirectsource <= '1';
                                                regdirectsource <= '1';
                                        END IF;
                                        END IF;
                                        IF (prefix='0' AND nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
                                        IF (micro_state=idle AND nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
                                                set_exec_MULU <= '1';
                                                set_exec_MULU <= '1';
                                                setstate <="01";
                                                setstate <="01";
                                                microstep <='1';
                                                next_micro_state <= mul1;
                                                micronext <="10000000";
 
                                        END IF;
                                        END IF;
                                        IF decodeOPC='1' THEN
                                        IF decodeOPC='1' THEN
                                                ea_build <= '1';
                                                ea_build <= '1';
                                        END IF;
                                        END IF;
                                        IF      execOPC='1' THEN
                                        IF      execOPC='1' THEN
                                                regwrena <= '1';
                                                regwrena <= '1';
                                        END IF;
                                        END IF;
                                        IF (prefix='1' AND nextpass='1') OR execOPC='1' THEN
                                        IF (micro_state/=idle AND nextpass='1') OR execOPC='1' THEN
                                                dest_hbits <= '1';
                                                dest_hbits <= '1';
                                                source_lowbits <='1';
                                                source_lowbits <='1';
                                        ELSE
                                        ELSE
                                                datatype <= "01";
                                                datatype <= "01";
                                        END IF;
                                        END IF;
Line 2360... Line 2345...
                                                        IF decodeOPC='1' THEN
                                                        IF decodeOPC='1' THEN
                                                                set_direct_data <= '1';
                                                                set_direct_data <= '1';
                                                                setstate <= "10";
                                                                setstate <= "10";
                                                                set_mem_addsub <= '1';
                                                                set_mem_addsub <= '1';
                                                                presub <= '1';
                                                                presub <= '1';
                                                                microstep <='1';
                                                                next_micro_state <= op_AxAy;
                                                                micronext <="00110000";
 
                                                        END IF;
                                                        END IF;
                                                END IF;
                                                END IF;
                                                IF execOPC='1' THEN
                                                IF execOPC='1' THEN
                                                        ea_data_OP1 <= '1';
                                                        ea_data_OP1 <= '1';
                                                        dest_hbits <= '1';
                                                        dest_hbits <= '1';
Line 2467... Line 2451...
--      END PROCESS;
--      END PROCESS;
 
 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- execute microcode
-- execute microcode
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
--PROCESS (microaddr)
--PROCESS (micro_state)
--      BEGIN
--      BEGIN
                IF Z_error='1'  THEN            -- divu by zero
                IF Z_error='1'  THEN            -- divu by zero
                        trapmake <= '1';                        --wichtig für USP
                        trapmake <= '1';                        --wichtig für USP
                        IF trapd='0' THEN
                        IF trapd='0' THEN
                                writePC <= '1';
                                writePC <= '1';
                                microset <= '1';
 
                        END IF;
                        END IF;
                END IF;
                END IF;
 
 
                IF trapmake='1' AND trapd='0' THEN
                IF trapmake='1' AND trapd='0' THEN
                        microstep <= '1';
                        next_micro_state <= trap1;
                        micronext <= "01010000";
 
                        presub <= '1';
                        presub <= '1';
                        setstackaddr <='1';
                        setstackaddr <='1';
                        set_mem_addsub <= '1';
                        set_mem_addsub <= '1';
                        setstate <= "11";
                        setstate <= "11";
                        datatype <= "10";
                        datatype <= "10";
                END IF;
                END IF;
 
 
                IF interrupt='1' THEN
                IF interrupt='1' THEN
                        microstep <= '1';
                        next_micro_state <= int1;
                        micronext <= "01000100";
 
                        setstate <= "10";
                        setstate <= "10";
--                      datatype <= "01";               --wirkt sich auf Flags aus
--                      datatype <= "01";               --wirkt sich auf Flags aus
                END IF;
                END IF;
 
 
 
 
                IF reset='0' THEN
                IF reset='0' THEN
                        microaddr <= "01100000";                --init
                        micro_state <= init1;
                        prefix <= '1';
 
                ELSIF rising_edge(clk) THEN
                ELSIF rising_edge(clk) THEN
                IF clkena='1' THEN
                IF clkena='1' THEN
                                trapd <= trapmake;
                                trapd <= trapmake;
                                prefix <= (prefix AND ea_build) OR (microstep AND NOT fetchOPC);
                                IF fetchOPC='1' THEN
                                IF prefix='1' AND ea_build='0' AND microset='0' THEN
                                        micro_state <= idle;
                                        microaddr <= microaddr + micronext;
 
                                ELSE
                                ELSE
                                        microaddr <= micronext;
                                        micro_state <= next_micro_state;
                                END IF;
                                END IF;
                        END IF;
                        END IF;
                END IF;
                END IF;
                IF prefix='1' THEN
                        CASE micro_state IS
                        CASE microaddr IS
                                WHEN ld_nn =>           -- (nnnn).w/l=>
                                WHEN "00000001" =>              -- nop
 
 
 
                                WHEN "00000010" =>              -- (nnnn).w/l=>
 
                                        get_ea_now <='1';
                                        get_ea_now <='1';
                                        setnextpass <= '1';
                                        setnextpass <= '1';
                                        setaddrlong <= '1';
                                        setaddrlong <= '1';
 
 
                                WHEN "00000011" =>              -- =>(nnnn).w/l
                                WHEN st_nn =>           -- =>(nnnn).w/l
                                        setstate <= "11";
                                        setstate <= "11";
                                        setaddrlong <= '1';
                                        setaddrlong <= '1';
                                        microstep <='1';
                                        next_micro_state <= nop;
 
 
                                WHEN "00000110" =>              -- d(An)=>, --d(PC)=>
                                WHEN ld_dAn1 =>         -- d(An)=>, --d(PC)=>
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                WHEN "00000111" =>              -- d(An)=>, --d(PC)=>
                                        next_micro_state <= ld_dAn2;
 
                                WHEN ld_dAn2 =>         -- d(An)=>, --d(PC)=>
                                        get_ea_now <='1';
                                        get_ea_now <='1';
                                        setdisp <= '1';         --word
                                        setdisp <= '1';         --word
                                        setnextpass <= '1';
                                        setnextpass <= '1';
 
 
                                WHEN "00001000" =>              -- d(An,Xn)=>, --d(PC,Xn)=>
                                WHEN ld_AnXn1 =>                -- d(An,Xn)=>, --d(PC,Xn)=>
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                WHEN "00001001" =>              -- d(An,Xn)=>, --d(PC,Xn)=>
                                        next_micro_state <= ld_AnXn2;
 
                                WHEN ld_AnXn2 =>                -- d(An,Xn)=>, --d(PC,Xn)=>
                                        setdisp <= '1';         --byte  
                                        setdisp <= '1';         --byte  
                                        setdispbyte <= '1';
                                        setdispbyte <= '1';
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                        setbriefext <= '1';
                                        setbriefext <= '1';
                                WHEN "00001010" =>
                                        next_micro_state <= ld_AnXn3;
 
                                WHEN ld_AnXn3 =>
                                        get_ea_now <='1';
                                        get_ea_now <='1';
                                        setdisp <= '1';         --brief
                                        setdisp <= '1';         --brief
                                        setdispbrief <= '1';
                                        setdispbrief <= '1';
                                        setnextpass <= '1';
                                        setnextpass <= '1';
 
 
                                WHEN "00001011" =>              -- =>d(An)
                                WHEN st_dAn1 =>         -- =>d(An)
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                WHEN "00001100" =>              -- =>d(An)
                                        next_micro_state <= st_dAn2;
 
                                WHEN st_dAn2 =>         -- =>d(An)
                                        setstate <= "11";
                                        setstate <= "11";
                                        setdisp <= '1';         --word
                                        setdisp <= '1';         --word
                                        microstep <='1';
                                        next_micro_state <= nop;
                                WHEN "00001101" =>
 
 
 
                                WHEN "00001110" =>              -- =>d(An,Xn)
                                WHEN st_AnXn1 =>                -- =>d(An,Xn)
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                WHEN "00001111" =>              -- =>d(An,Xn)
                                        next_micro_state <= st_AnXn2;
 
                                WHEN st_AnXn2 =>                -- =>d(An,Xn)
                                        setdisp <= '1';         --byte
                                        setdisp <= '1';         --byte
                                        setdispbyte <= '1';
                                        setdispbyte <= '1';
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                        setbriefext <= '1';
                                        setbriefext <= '1';
                                WHEN "00010000" =>
                                        next_micro_state <= st_AnXn3;
 
                                WHEN st_AnXn3 =>
                                        setstate <= "11";
                                        setstate <= "11";
                                        setdisp <= '1';         --brief 
                                        setdisp <= '1';         --brief 
                                        setdispbrief <= '1';
                                        setdispbrief <= '1';
                                        microstep <='1';
                                        next_micro_state <= nop;
                                WHEN "00010001" =>
 
 
 
                                WHEN "00010010" =>              --bra
                                WHEN bra1 =>            --bra
                                        IF condition='1' THEN
                                        IF condition='1' THEN
                                                TG68_PC_br8 <= '1';     --pc+0000
                                                TG68_PC_br8 <= '1';     --pc+0000
                                                microstep <='1';
 
                                                setstate <= "01";
                                                setstate <= "01";
 
                                                next_micro_state <= bra2;
                                        END IF;
                                        END IF;
                                WHEN "00010011" =>              --bra
                                WHEN bra2 =>            --bra
                                        TG68_PC_brw <= '1';
                                        TG68_PC_brw <= '1';
 
 
                                WHEN "00011000" =>              --bsr
                                WHEN bsr1 =>            --bsr
                                        set_TG68_PC_dec <= '1';         --in 2 Takten -2
                                        set_TG68_PC_dec <= '1';         --in 2 Takten -2
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                WHEN "00011001" =>              --bsr
                                        next_micro_state <= bsr2;
 
                                WHEN bsr2 =>            --bsr
                                        IF TG68_PC_dec(0)='1' THEN
                                        IF TG68_PC_dec(0)='1' THEN
                                                TG68_PC_brw <= '1';
                                                TG68_PC_brw <= '1';
                                        ELSE
                                        ELSE
                                                TG68_PC_br8 <= '1';
                                                TG68_PC_br8 <= '1';
                                        END IF;
                                        END IF;
                                        writePC <= '1';
                                        writePC <= '1';
                                        setstate <= "11";
                                        setstate <= "11";
                                        microstep <='1';
                                        next_micro_state <= nop;
                                WHEN "00011010" =>              --bsr
 
 
 
                                WHEN "00011110" =>              --dbcc
                                WHEN dbcc1 =>           --dbcc
                                        TG68_PC_nop <= '1';
                                        TG68_PC_nop <= '1';
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                WHEN "00011111" =>              --dbcc
                                        next_micro_state <= dbcc2;
 
                                WHEN dbcc2 =>           --dbcc
                                        TG68_PC_brw <= '1';
                                        TG68_PC_brw <= '1';
 
 
                                WHEN "00100010" =>              --movem
                                WHEN movem =>           --movem
                                        set_movem_busy <='1';
                                        set_movem_busy <='1';
                                        setstate <= "10";
                                        setstate <= "10";
 
 
                                WHEN "00101000" =>              --andi
                                WHEN andi =>            --andi
                                        IF opcode(5 downto 4)/="00" THEN
                                        IF opcode(5 downto 4)/="00" THEN
                                                ea_build <= '1';
                                                ea_build <= '1';
                                                setnextpass <= '1';
                                                setnextpass <= '1';
                                        END IF;
                                        END IF;
 
 
                                WHEN "00101100" =>              --jsr
                                WHEN op_AxAy =>         -- op -(Ax),-(Ay)
                                        presub <= '1';
 
                                        setstackaddr <='1';
 
                                        set_mem_addsub <= '1';
 
                                        setstate <= "11";
 
 
 
                                WHEN "00110000" =>              -- op -(Ax),-(Ay)
 
                                        presub <= '1';
                                        presub <= '1';
                                        dest_hbits <= '1';
                                        dest_hbits <= '1';
                                        dest_areg <= '1';
                                        dest_areg <= '1';
                                        set_mem_addsub <= '1';
                                        set_mem_addsub <= '1';
                                        setstate <= "10";
                                        setstate <= "10";
 
 
                                WHEN "00110010" =>              -- cmpm (Ay)+,(Ax)+
                                WHEN cmpm =>            -- cmpm (Ay)+,(Ax)+
                                        postadd <= '1';
                                        postadd <= '1';
                                        dest_hbits <= '1';
                                        dest_hbits <= '1';
                                        dest_areg <= '1';
                                        dest_areg <= '1';
                                        set_mem_rega <= '1';
                                        set_mem_rega <= '1';
                                        setstate <= "10";
                                        setstate <= "10";
 
 
                                WHEN "01000000" =>              -- link
                                WHEN link =>            -- link
                                        setstate <="11";
                                        setstate <="11";
                                        save_memaddr <= '1';
                                        save_memaddr <= '1';
                                        regwrena <= '1';
                                        regwrena <= '1';
 
 
                                WHEN "01000100" =>              -- interrupt
                                WHEN int1 =>            -- interrupt
                                        microstep <= '1';
 
                                        presub <= '1';
                                        presub <= '1';
                                        setstackaddr <='1';
                                        setstackaddr <='1';
                                        set_mem_addsub <= '1';
                                        set_mem_addsub <= '1';
                                        setstate <= "11";
                                        setstate <= "11";
                                        datatype <= "10";
                                        datatype <= "10";
                                WHEN "01000101" =>              -- interrupt
                                        next_micro_state <= int2;
                                        microstep <= '1';
                                WHEN int2 =>            -- interrupt
                                        presub <= '1';
                                        presub <= '1';
                                        setstackaddr <='1';
                                        setstackaddr <='1';
                                        set_mem_addsub <= '1';
                                        set_mem_addsub <= '1';
                                        setstate <= "11";
                                        setstate <= "11";
                                        datatype <= "01";
                                        datatype <= "01";
                                        writeSR <= '1';
                                        writeSR <= '1';
                                WHEN "01000110" =>              -- interrupt
                                        next_micro_state <= int3;
 
                                WHEN int3 =>            -- interrupt
                                        set_vectoraddr <= '1';
                                        set_vectoraddr <= '1';
                                        datatype <= "10";
                                        datatype <= "10";
                                        set_directPC <= '1';
                                        set_directPC <= '1';
                                        microstep <='1';
 
 
 
                                        setstate <= "10";
                                        setstate <= "10";
                                WHEN "01000111" =>              -- interrupt
                                        next_micro_state <= int4;
 
                                WHEN int4 =>            -- interrupt
                                        datatype <= "10";
                                        datatype <= "10";
 
 
                                WHEN "01001000" =>              -- RTE
                                WHEN rte =>             -- RTE
                                        datatype <= "10";
                                        datatype <= "10";
                                        setstate <= "10";
                                        setstate <= "10";
                                        postadd <= '1';
                                        postadd <= '1';
                                        setstackaddr <= '1';
                                        setstackaddr <= '1';
                                        set_mem_rega <= '1';
                                        set_mem_rega <= '1';
                                        set_directPC <= '1';
                                        set_directPC <= '1';
                                        microstep <='1';
                                        next_micro_state <= nop;
 
 
                                WHEN "01010000" =>              -- TRAP
                                WHEN trap1 =>           -- TRAP
                                        microstep <= '1';
 
                                        presub <= '1';
                                        presub <= '1';
                                        setstackaddr <='1';
                                        setstackaddr <='1';
                                        set_mem_addsub <= '1';
                                        set_mem_addsub <= '1';
                                        setstate <= "11";
                                        setstate <= "11";
                                        datatype <= "01";
                                        datatype <= "01";
                                        writeSR <= '1';
                                        writeSR <= '1';
                                WHEN "01010001" =>              -- TRAP
                                        next_micro_state <= trap2;
 
                                WHEN trap2 =>           -- TRAP
                                        set_vectoraddr <= '1';
                                        set_vectoraddr <= '1';
                                        datatype <= "10";
                                        datatype <= "10";
                                        set_directPC <= '1';
                                        set_directPC <= '1';
                                        microstep <='1';
 
--                                      longreaddirect <= '1';
--                                      longreaddirect <= '1';
                                        setstate <= "10";
                                        setstate <= "10";
                                WHEN "01010010" =>              -- TRAP
                                        next_micro_state <= trap3;
 
                                WHEN trap3 =>           -- TRAP
                                        datatype <= "10";
                                        datatype <= "10";
 
 
                                WHEN "01010110" =>              -- MOVEP d(An)
                                WHEN movep1 =>          -- MOVEP d(An)
                                        microstep <='1';
 
                                        setstate <= "01";
                                        setstate <= "01";
                                        IF opcode(6)='1' THEN
                                        IF opcode(6)='1' THEN
                                                set_movepl <= '1';
                                                set_movepl <= '1';
                                        END IF;
                                        END IF;
                                WHEN "01010111" =>
                                        next_micro_state <= movep2;
                                        microstep <='1';
                                WHEN movep2 =>
                                        setdisp <= '1';
                                        setdisp <= '1';
                                        IF opcode(7)='0' THEN
                                        IF opcode(7)='0' THEN
                                                setstate <= "10";
                                                setstate <= "10";
                                        ELSE
                                        ELSE
                                                setstate <= "11";
                                                setstate <= "11";
                                                wait_mem_byte <= '1';
                                                wait_mem_byte <= '1';
                                        END IF;
                                        END IF;
                                WHEN "01011000" =>
                                        next_micro_state <= movep3;
 
                                WHEN movep3 =>
                                        IF opcode(6)='1' THEN
                                        IF opcode(6)='1' THEN
                                                microstep <='1';
 
                                                set_movepw <= '1';
                                                set_movepw <= '1';
 
                                                next_micro_state <= movep4;
                                        END IF;
                                        END IF;
                                        IF opcode(7)='0' THEN
                                        IF opcode(7)='0' THEN
                                                setstate <= "10";
                                                setstate <= "10";
                                        ELSE
                                        ELSE
                                                setstate <= "11";
                                                setstate <= "11";
                                        END IF;
                                        END IF;
                                WHEN "01011001" =>
                                WHEN movep4 =>
                                        microstep <='1';
 
 
 
                                        IF opcode(7)='0' THEN
                                        IF opcode(7)='0' THEN
                                                setstate <= "10";
                                                setstate <= "10";
                                        ELSE
                                        ELSE
                                                wait_mem_byte <= '1';
                                                wait_mem_byte <= '1';
                                                setstate <= "11";
                                                setstate <= "11";
                                        END IF;
                                        END IF;
                                WHEN "01011010" =>
                                        next_micro_state <= movep5;
 
                                WHEN movep5 =>
                                        IF opcode(7)='0' THEN
                                        IF opcode(7)='0' THEN
                                                setstate <= "10";
                                                setstate <= "10";
                                        ELSE
                                        ELSE
                                                setstate <= "11";
                                                setstate <= "11";
                                        END IF;
                                        END IF;
 
 
 
                                WHEN init1 =>           -- init SP
 
 
 
 
 
 
                                WHEN "01100000" =>              -- init SP
 
                                        microstep <='1';
 
                                        longreaddirect <= '1';
                                        longreaddirect <= '1';
                                WHEN "01100001" =>              -- init PC
                                        next_micro_state <= init2;
 
                                WHEN init2 =>           -- init PC
                                        get_ea_now <='1';       --\
                                        get_ea_now <='1';       --\
                                        ea_only <= '1';         ---  OP1in <= memaddr_in
                                        ea_only <= '1';         ---  OP1in <= memaddr_in
                                        setaddrlong <= '1';     --   memaddr_in <= data_read
                                        setaddrlong <= '1';     --   memaddr_in <= data_read
                                        regwrena <= '1';
                                        regwrena <= '1';
                                        setstackaddr <='1';     --   dest_addr <= SP
                                        setstackaddr <='1';     --   dest_addr <= SP
                                        set_directPC <= '1';
                                        set_directPC <= '1';
                                        microstep <='1';
 
                                        longreaddirect <= '1';
                                        longreaddirect <= '1';
--                              WHEN "01100010" =>              -- wr SP
                                        next_micro_state <= nop;
 
 
 
 
 
 
 
                                WHEN mul1       =>              -- mulu
                                WHEN "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|
 
                                         "10000111"|"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"   =>              -- mulu
 
                                        microstep <='1';
 
                                        set_exec_MULU <= '1';
                                        set_exec_MULU <= '1';
                                        setstate <="01";
                                        setstate <="01";
                                WHEN "10001110" =>              -- mulu
                                        next_micro_state <= mul2;
 
                                WHEN mul2       =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul3;
 
                                WHEN mul3       =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul4;
 
                                WHEN mul4       =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul5;
 
                                WHEN mul5       =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul6;
 
                                WHEN mul6       =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul7;
 
                                WHEN mul7       =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul8;
 
                                WHEN mul8       =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul9;
 
                                WHEN mul9       =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul10;
 
                                WHEN mul10      =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul11;
 
                                WHEN mul11      =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul12;
 
                                WHEN mul12      =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul13;
 
                                WHEN mul13      =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul14;
 
                                WHEN mul14      =>              -- mulu
 
                                        set_exec_MULU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= mul15;
 
                                WHEN mul15      =>              -- mulu
                                        set_exec_MULU <= '1';
                                        set_exec_MULU <= '1';
 
 
 
                                WHEN div1 =>            -- divu
                                WHEN "10100000" =>              -- divu
 
                                        IF OP2out(15 downto 0)=x"0000" THEN              --div zero
                                        IF OP2out(15 downto 0)=x"0000" THEN              --div zero
                                                set_Z_error <= '1';
                                                set_Z_error <= '1';
                                                microset <= '1';
 
                                        ELSE
                                        ELSE
                                                set_exec_DIVU <= '1';
                                                set_exec_DIVU <= '1';
 
                                                next_micro_state <= div2;
                                        END IF;
                                        END IF;
                                        setstate <="01";
                                        setstate <="01";
                                        microstep <='1';
                                WHEN div2       =>              -- divu
                                WHEN "10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100110"|"10100111"|
 
                                         "10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101" =>           -- divu
 
                                        microstep <='1';
 
                                        set_exec_DIVU <= '1';
                                        set_exec_DIVU <= '1';
                                        setstate <="01";
                                        setstate <="01";
                                WHEN "10101110" =>              -- divu
                                        next_micro_state <= div3;
 
                                WHEN div3       =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div4;
 
                                WHEN div4       =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div5;
 
                                WHEN div5       =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div6;
 
                                WHEN div6       =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div7;
 
                                WHEN div7       =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div8;
 
                                WHEN div8       =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div9;
 
                                WHEN div9       =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div10;
 
                                WHEN div10      =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div11;
 
                                WHEN div11      =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div12;
 
                                WHEN div12      =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div13;
 
                                WHEN div13      =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div14;
 
                                WHEN div14      =>              -- divu
 
                                        set_exec_DIVU <= '1';
 
                                        setstate <="01";
 
                                        next_micro_state <= div15;
 
                                WHEN div15      =>              -- divu
                                        set_exec_DIVU <= '1';
                                        set_exec_DIVU <= '1';
 
 
 
 
                                WHEN OTHERS => null;
                                WHEN OTHERS => null;
                        END CASE;
                        END CASE;
                END IF;
 
        END PROCESS;
        END PROCESS;
 
 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- Conditions
-- Conditions
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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