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

Subversion Repositories cpu_lecture

[/] [cpu_lecture/] [trunk/] [src/] [opc_deco.vhd] - Diff between revs 16 and 20

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

Rev 16 Rev 20
Line 168... Line 168...
                Q_ALU_OP <= ALU_ADD;
                Q_ALU_OP <= ALU_ADD;
                Q_WE_D <= "01";
                Q_WE_D <= "01";
                Q_WE_F <= '1';
                Q_WE_F <= '1';
 
 
            when "000100" =>                            -- 0001 00xx xxxx xxxx
            when "000100" =>                            -- 0001 00xx xxxx xxxx
 
                --
 
                -- 0001 00rd dddd rrrr - CPSE
 
                --
                Q_ALU_OP <= ALU_SUB;
                Q_ALU_OP <= ALU_SUB;
                Q_RD_M <= I_T0;
 
                if (I_T0 = '0') then        -- second cycle.
                if (I_T0 = '0') then        -- second cycle.
                    Q_PC_OP <= PC_SKIP_Z;
                    Q_PC_OP <= PC_SKIP_Z;
                end if;
                end if;
 
 
            when "000101" | "000110" =>
            when "000101" | "000110" =>
Line 303... Line 305...
                if (I_OPC(9) = '0') then        -- LDD / POP
                if (I_OPC(9) = '0') then        -- LDD / POP
                    --
                    --
                    -- 1001 00-0d dddd 0000 - LDS
                    -- 1001 00-0d dddd 0000 - LDS
                    -- 1001 00-0d dddd 0001 - LD Rd, Z+
                    -- 1001 00-0d dddd 0001 - LD Rd, Z+
                    -- 1001 00-0d dddd 0010 - LD Rd, -Z
                    -- 1001 00-0d dddd 0010 - LD Rd, -Z
                    -- 1001 00-0d dddd 0100 - (ii)  LPM Rd, (Z)
                    -- 1001 00-0d dddd 0100 - LPM  Rd, (Z)      (ii)
                    -- 1001 00-0d dddd 0101 - (iii) LPM Rd, (Z+)
                    -- 1001 00-0d dddd 0101 - LPM  Rd, (Z+)     (iii)
                    -- 1001 00-0d dddd 0110 - ELPM Z        --- not mega8
                    -- 1001 00-0d dddd 0110 - ELPM Z        --- not mega8
                    -- 1001 00-0d dddd 0111 - ELPM Z+       --- not mega8
                    -- 1001 00-0d dddd 0111 - ELPM Z+       --- not mega8
                    -- 1001 00-0d dddd 1001 - LD Rd, Y+
                    -- 1001 00-0d dddd 1001 - LD Rd, Y+
                    -- 1001 00-0d dddd 1010 - LD Rd, -Y
                    -- 1001 00-0d dddd 1010 - LD Rd, -Y
                    -- 1001 00-0d dddd 1100 - LD Rd, X
                    -- 1001 00-0d dddd 1100 - LD Rd, X
Line 364... Line 366...
                    end case;
                    end case;
                end if;
                end if;
 
 
            when "100101" =>                            -- 1001 01xx xxxx xxxx
            when "100101" =>                            -- 1001 01xx xxxx xxxx
                if (I_OPC(9) = '0') then                -- 1001 010
                if (I_OPC(9) = '0') then                -- 1001 010
                    if (I_OPC(3) = '0') then            -- 1001 010x xxxx 0xxx
                    case I_OPC(3 downto 0) is
 
                        when "0000" =>
                        --
                        --
                        --  1001 010d dddd 0000 - COM
                            --  1001 010d dddd 0000 - COM Rd
                        --  1001 010d dddd 0001 - NEG
                            --
                        --  1001 010d dddd 0010 - SWAP
                            Q_ALU_OP <= ALU_COM;
                        --  1001 010d dddd 0011 - INC
                            Q_WE_D <= "01";
                        --  1001 010d dddd 0101 - ASR
                            Q_WE_F <= '1';
                        --  1001 010d dddd 0110 - LSR
 
                        --  1001 010d dddd 0111 - ROR
                        when "0001" =>
                        --
                            --
                        case I_OPC(2 downto 0) is
                            --  1001 010d dddd 0001 - NEG Rd
                            when "000"  => Q_ALU_OP <= ALU_COM;
                            --
                            when "001"  => Q_ALU_OP <= ALU_NEG;
                            Q_ALU_OP <= ALU_NEG;
                            when "010"  => Q_ALU_OP <= ALU_SWAP;
                            Q_WE_D <= "01";
                            when "011"  => Q_ALU_OP <= ALU_INC;
                            Q_WE_F <= '1';
                            when "101"  => Q_ALU_OP <= ALU_ASR;
 
                            when "110"  => Q_ALU_OP <= ALU_LSR;
                        when "0010" =>
                            when "111"  => Q_ALU_OP <= ALU_ROR;
                            --
                            when others =>
                            --  1001 010d dddd 0010 - SWAP Rd
                        end case;
                            --
 
                            Q_ALU_OP <= ALU_SWAP;
 
                            Q_WE_D <= "01";
 
                            Q_WE_F <= '1';
 
 
 
                        when "0011" =>
 
                            --
 
                            --  1001 010d dddd 0011 - INC Rd
 
                            --
 
                            Q_ALU_OP <= ALU_INC;
 
                            Q_WE_D <= "01";
 
                            Q_WE_F <= '1';
 
 
 
                        when "0101" =>
 
                            --
 
                            --  1001 010d dddd 0101 - ASR Rd
 
                            --
 
                            Q_ALU_OP <= ALU_ASR;
 
                            Q_WE_D <= "01";
 
                            Q_WE_F <= '1';
 
 
 
                        when "0110" =>
 
                            --
 
                            --  1001 010d dddd 0110 - LSR Rd
 
                            --
 
                            Q_ALU_OP <= ALU_LSR;
                        Q_WE_D <= "01";
                        Q_WE_D <= "01";
                        Q_WE_F <= '1';
                        Q_WE_F <= '1';
                    else                                -- 1001 010x xxxx 1xxx
 
                        case I_OPC(2 downto 0) is
                        when "0111" =>
                            when "000"  =>              -- 1001 010x xxxx 1000
                            --
 
                            --  1001 010d dddd 0111 - ROR Rd
 
                            --
 
                            Q_ALU_OP <= ALU_ROR;
 
                                        Q_WE_D <= "01";
 
                                        Q_WE_F <= '1';
 
 
 
                        when "1000"  =>             -- 1001 010x xxxx 1000
                                if I_OPC(8) = '0' then  -- 1001 0100 xxxx 1000
                                if I_OPC(8) = '0' then  -- 1001 0100 xxxx 1000
                                    --
                                    --
                                    --  1001 0100 0sss 1000 - BSET
                                    --  1001 0100 0sss 1000 - BSET
                                    --  1001 0100 1sss 1000 - BCLR
                                    --  1001 0100 1sss 1000 - BCLR
                                    --
                                    --
Line 412... Line 447...
                                    --  1001 0101 1010 1000 - WDR
                                    --  1001 0101 1010 1000 - WDR
                                    --
                                    --
                                    case I_OPC(7 downto 4) is
                                    case I_OPC(7 downto 4) is
                                        when "0000" =>  -- RET
                                        when "0000" =>  -- RET
                                            Q_AMOD <= AMOD_iiSP;
                                            Q_AMOD <= AMOD_iiSP;
                                            if (I_T0 = '1') then
                                        Q_RD_M <= I_T0;
                                                Q_RD_M <= '1';
 
                                            else
 
                                                Q_PC_OP <= PC_LD_S;
 
                                                Q_WE_XYZS <= not I_T0;
                                                Q_WE_XYZS <= not I_T0;
 
                                        if (I_T0 = '0') then
 
                                            Q_PC_OP <= PC_LD_S;
                                            end if;
                                            end if;
 
 
                                        when "0001" =>  -- RETI
                                        when "0001" =>  -- RETI
                                            Q_ALU_OP <= ALU_INTR;
                                            Q_ALU_OP <= ALU_INTR;
                                            Q_IMM(6) <= '1';
                                            Q_IMM(6) <= '1';
                                            Q_AMOD <= AMOD_iiSP;
                                            Q_AMOD <= AMOD_iiSP;
                                            if (I_T0 = '1') then
                                        Q_RD_M <= I_T0;
                                                Q_RD_M <= '1';
 
                                            else
 
                                                Q_PC_OP <= PC_LD_S;
 
                                                Q_WE_XYZS <= not I_T0;
                                                Q_WE_XYZS <= not I_T0;
 
                                        if (I_T0 = '0') then
 
                                            Q_PC_OP <= PC_LD_S;
                                            end if;
                                            end if;
 
 
                                        when "1000" =>  -- (i) LPM R0, (Z)
                                    when "1100" =>  -- (i) LPM R0, (Z)
                                            Q_DDDDD <= "00000";
                                            Q_DDDDD <= "00000";
                                            Q_AMOD <= AMOD_Z;
                                            Q_AMOD <= AMOD_Z;
                                            Q_PMS <= '1';
                                            Q_PMS <= '1';
                                            Q_WE_D <= '0' & not I_T0;
                                            Q_WE_D <= '0' & not I_T0;
 
 
                                        when "1110" =>  -- SPM
                                        when "1110" =>  -- SPM
 
                                        Q_ALU_OP <= ALU_D_MV_Q;
                                            Q_DDDDD <= "00000";
                                            Q_DDDDD <= "00000";
                                            Q_AMOD <= AMOD_Z;
                                            Q_AMOD <= AMOD_Z;
                                            Q_PMS <= '1';
                                            Q_PMS <= '1';
                                            Q_WE_M <= "01";
                                            Q_WE_M <= "01";
 
 
                                        when "1111" =>  -- SPM #2
                                        when "1111" =>  -- SPM #2
                                            -- page write: not su[pported
                                        -- page write: not supported
 
 
                                        when others =>
                                        when others =>
                                    end case;
                                    end case;
                                end if;
                                end if;
 
 
                            when "001" =>               -- 1001 010x xxxx 1001
                        when "1001" =>               -- 1001 010x xxxx 1001
                                --
                                --
                                --  1001 0100 0000 1001 IJMP
                                --  1001 0100 0000 1001 IJMP
                                --  1001 0100 0001 1001 EIJMP   -- not mega8
                                --  1001 0100 0001 1001 EIJMP   -- not mega8
                                --  1001 0101 0000 1001 ICALL
                                --  1001 0101 0000 1001 ICALL
                                --  1001 0101 0001 1001 EICALL   -- not mega8
                                --  1001 0101 0001 1001 EICALL   -- not mega8
Line 464... Line 498...
                                    Q_AMOD <= AMOD_SPdd;
                                    Q_AMOD <= AMOD_SPdd;
                                    Q_WE_M <= "11";
                                    Q_WE_M <= "11";
                                    Q_WE_XYZS <= '1';
                                    Q_WE_XYZS <= '1';
                                end if;
                                end if;
 
 
                            when "010"  =>               -- 1001 010x xxxx 1010
                        when "1010"  =>              -- 1001 010x xxxx 1010
                                --
                                --
                                --  1001 010d dddd 1010 - DEC
                            --  1001 010d dddd 1010 - DEC Rd
                                --
                                --
                                Q_ALU_OP <= ALU_DEC;
                                Q_ALU_OP <= ALU_DEC;
                                Q_WE_D <= "01";
                                Q_WE_D <= "01";
                                Q_WE_F <= '1';
                                Q_WE_F <= '1';
 
 
                            when "011"  =>               -- 1001 010x xxxx 1011
                        when "1011"  =>              -- 1001 010x xxxx 1011
                                --
                                --
                                --  1001 0100 KKKK 1011 - DES   -- not mega8
                                --  1001 0100 KKKK 1011 - DES   -- not mega8
                                --
                                --
 
 
                            when "100" | "101"  =>
                        when "1100" | "1101"  =>
                                --
                                --
                                --  1001 010k kkkk 110k - JMP (k = 0 for 16 bit)
                                --  1001 010k kkkk 110k - JMP (k = 0 for 16 bit)
                                --  kkkk kkkk kkkk kkkk
                                --  kkkk kkkk kkkk kkkk
                                --
                                --
                                Q_PC_OP <= PC_LD_I;
                                Q_PC_OP <= PC_LD_I;
 
 
                            when "110" | "111"  =>      -- 1001 010x xxxx 111x
                        when "1110" | "1111"  =>      -- 1001 010x xxxx 111x
                                --
                                --
                                --  1001 010k kkkk 111k - CALL (k = 0)
                                --  1001 010k kkkk 111k - CALL (k = 0)
                                --  kkkk kkkk kkkk kkkk
                                --  kkkk kkkk kkkk kkkk
                                --
                                --
                                Q_ALU_OP <= ALU_PC_2;
                                Q_ALU_OP <= ALU_PC_2;
Line 497... Line 531...
                                Q_WE_M <= "11";     -- both PC bytes
                                Q_WE_M <= "11";     -- both PC bytes
                                Q_WE_XYZS <= '1';
                                Q_WE_XYZS <= '1';
 
 
                            when others =>
                            when others =>
                        end case;
                        end case;
                    end if;
 
                else            -- 1001 011
                else            -- 1001 011
                    --
                    --
                    --  1001 0110 KKdd KKKK - ADIW
                    --  1001 0110 KKdd KKKK - ADIW
                    --  1001 0111 KKdd KKKK - SBIW
                    --  1001 0111 KKdd KKKK - SBIW
                    --
                    --

powered by: WebSVN 2.1.0

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