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 14 and 15

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

Rev 14 Rev 15
Line 96... Line 96...
                        -- 0000 0000 0000 0000 - NOP
                        -- 0000 0000 0000 0000 - NOP
                        -- 0000 0000 001v vvvv - INTERRUPT
                        -- 0000 0000 001v vvvv - INTERRUPT
                        --
                        --
                        if (I_OPC(5)) = '1' then   -- interrupt
                        if (I_OPC(5)) = '1' then   -- interrupt
                            Q_ALU_OP <= ALU_INTR;
                            Q_ALU_OP <= ALU_INTR;
                            Q_AMOD <= AMOD_ddSP;
                            Q_AMOD <= AMOD_SPdd;
                            Q_JADR <= "0000000000" & I_OPC(4 downto 0) & "0";
                            Q_JADR <= "0000000000" & I_OPC(4 downto 0) & "0";
                            Q_PC_OP <= PC_LD_I;
                            Q_PC_OP <= PC_LD_I;
                            Q_WE_F <= '1';
                            Q_WE_F <= '1';
                            Q_WE_M <= "11";
                            Q_WE_M <= "11";
                        end if;
                        end if;
Line 329... Line 329...
                        when "1001" => Q_AMOD <= AMOD_Yi;
                        when "1001" => Q_AMOD <= AMOD_Yi;
                        when "1010" => Q_AMOD <= AMOD_dY;
                        when "1010" => Q_AMOD <= AMOD_dY;
                        when "1100" => Q_AMOD <= AMOD_X;    Q_WE_XYZS <= '0';
                        when "1100" => Q_AMOD <= AMOD_X;    Q_WE_XYZS <= '0';
                        when "1101" => Q_AMOD <= AMOD_Xi;
                        when "1101" => Q_AMOD <= AMOD_Xi;
                        when "1110" => Q_AMOD <= AMOD_dX;
                        when "1110" => Q_AMOD <= AMOD_dX;
                        when "1111" => Q_AMOD <= AMOD_SPi;
                        when "1111" => Q_AMOD <= AMOD_iSP;
                        when others =>                      Q_WE_XYZS <= '0';
                        when others =>                      Q_WE_XYZS <= '0';
                    end case;
                    end case;
                else                        -- STD / PUSH
                else                        -- STD / PUSH
                    --
                    --
                    -- 1001 00-1r rrrr 0000 - STS
                    -- 1001 00-1r rrrr 0000 - STS
Line 357... Line 357...
                        when "1001" => Q_AMOD <= AMOD_Yi;
                        when "1001" => Q_AMOD <= AMOD_Yi;
                        when "1010" => Q_AMOD <= AMOD_dY;
                        when "1010" => Q_AMOD <= AMOD_dY;
                        when "1100" => Q_AMOD <= AMOD_X;    Q_WE_XYZS <= '0';
                        when "1100" => Q_AMOD <= AMOD_X;    Q_WE_XYZS <= '0';
                        when "1101" => Q_AMOD <= AMOD_Xi;
                        when "1101" => Q_AMOD <= AMOD_Xi;
                        when "1110" => Q_AMOD <= AMOD_dX;
                        when "1110" => Q_AMOD <= AMOD_dX;
                        when "1111" => Q_AMOD <= AMOD_dSP;
                        when "1111" => Q_AMOD <= AMOD_SPd;
                        when others =>
                        when others =>
                    end case;
                    end case;
                end if;
                end if;
 
 
            when "100101" =>                            -- 1001 01xx xxxx xxxx
            when "100101" =>                            -- 1001 01xx xxxx xxxx
Line 411... Line 411...
                                    --  1001 0101 1111 1000 - SPM #2
                                    --  1001 0101 1111 1000 - SPM #2
                                    --  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_SPii;
                                            Q_AMOD <= AMOD_iiSP;
                                            if (I_T0 = '1') then
                                            if (I_T0 = '1') then
                                                Q_RD_M <= '1';
                                                Q_RD_M <= '1';
                                            else
                                            else
                                                Q_PC_OP <= PC_LD_S;
                                                Q_PC_OP <= PC_LD_S;
                                                Q_WE_XYZS <= not I_T0;
                                                Q_WE_XYZS <= not I_T0;
                                            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_SPii;
                                            Q_AMOD <= AMOD_iiSP;
                                            if (I_T0 = '1') then
                                            if (I_T0 = '1') then
                                                Q_RD_M <= '1';
                                                Q_RD_M <= '1';
                                            else
                                            else
                                                Q_PC_OP <= PC_LD_S;
                                                Q_PC_OP <= PC_LD_S;
                                                Q_WE_XYZS <= not I_T0;
                                                Q_WE_XYZS <= not I_T0;
Line 459... Line 459...
                                --  1001 0101 0001 1001 EICALL   -- not mega8
                                --  1001 0101 0001 1001 EICALL   -- not mega8
                                --
                                --
                                Q_PC_OP <= PC_LD_Z;
                                Q_PC_OP <= PC_LD_Z;
                                if (I_OPC(8) = '1') then        -- ICALL
                                if (I_OPC(8) = '1') then        -- ICALL
                                    Q_ALU_OP <= ALU_PC_1;
                                    Q_ALU_OP <= ALU_PC_1;
                                    Q_AMOD <= AMOD_ddSP;
                                    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 "010"  =>               -- 1001 010x xxxx 1010
Line 490... Line 490...
                                --
                                --
                                --  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;
                                Q_AMOD <= AMOD_ddSP;
                                Q_AMOD <= AMOD_SPdd;
                                Q_PC_OP <= PC_LD_I;
                                Q_PC_OP <= PC_LD_I;
                                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 =>
Line 594... Line 594...
                -- 1101 kkkk kkkk kkkk - RCALL
                -- 1101 kkkk kkkk kkkk - RCALL
                --
                --
                Q_JADR <= I_PC + (I_OPC(11) & I_OPC(11) & I_OPC(11) & I_OPC(11)
                Q_JADR <= I_PC + (I_OPC(11) & I_OPC(11) & I_OPC(11) & I_OPC(11)
                                & I_OPC(11 downto 0)) + X"0001";
                                & I_OPC(11 downto 0)) + X"0001";
                Q_ALU_OP <= ALU_PC_1;
                Q_ALU_OP <= ALU_PC_1;
                Q_AMOD <= AMOD_ddSP;
                Q_AMOD <= AMOD_SPdd;
                Q_PC_OP <= PC_LD_I;
                Q_PC_OP <= PC_LD_I;
                Q_WE_M <= "11";     -- both PC bytes
                Q_WE_M <= "11";     -- both PC bytes
                Q_WE_XYZS <= '1';
                Q_WE_XYZS <= '1';
 
 
            when "111000" | "111001" | "111010" | "111011" => -- LDI
            when "111000" | "111001" | "111010" | "111011" => -- LDI

powered by: WebSVN 2.1.0

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