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

Subversion Repositories c16

[/] [c16/] [trunk/] [vhdl/] [cpu_engine.vhd] - Diff between revs 9 and 21

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

Rev 9 Rev 21
Line 205... Line 205...
        signal  C_OPC    : std_logic_vector( 7 downto 0);                -- debug signal
        signal  C_OPC    : std_logic_vector( 7 downto 0);                -- debug signal
        signal  C_RR     : std_logic_vector(15 downto 0);
        signal  C_RR     : std_logic_vector(15 downto 0);
 
 
        signal  RRZ      : std_logic;
        signal  RRZ      : std_logic;
        signal  OC_JD    : std_logic_vector(15 downto 0);
        signal  OC_JD    : std_logic_vector(15 downto 0);
        signal  C_MQ     : std_logic_vector(7 downto 0);
 
 
 
        -- select signals
        -- select signals
        signal  C_SX     : std_logic_vector(1 downto 0);
        signal  C_SX     : std_logic_vector(1 downto 0);
        signal  C_SY     : std_logic_vector(3 downto 0);
        signal  C_SY     : std_logic_vector(3 downto 0);
        signal  C_OP     : std_logic_vector(4 downto 0);
        signal  C_OP     : std_logic_vector(4 downto 0);
Line 364... Line 363...
                        else                                    T2 <= not T2;
                        else                                    T2 <= not T2;
                        end if;
                        end if;
                end if;
                end if;
        end process;
        end process;
 
 
        process(T2, M_PC, ADR, C_IO)
        process(T2, M_PC, ADR, C_IO, C_RD_O, C_WE_O)
        begin
        begin
                if (T2 = '0') then                                                                       -- opcode fetch
                if (T2 = '0') then                                                                       -- opcode fetch
                        EXTERN <= M_PC(15) or M_PC(14) or M_PC(13);             -- 8Kx8  internal memory
                        EXTERN <= M_PC(15) or M_PC(14) or M_PC(13);             -- 8Kx8  internal memory
-- A            EXTERN <= M_PC(15) or M_PC(14) or M_PC(13) or   -- 512x8 internal memory
-- A            EXTERN <= M_PC(15) or M_PC(14) or M_PC(13) or   -- 512x8 internal memory
-- A                              M_PC(12) or M_PC(11) or M_PC(10) or M_PC(9)
-- A                              M_PC(12) or M_PC(11) or M_PC(10) or M_PC(9)
Line 400... Line 399...
 
 
        M_OPC <= LM_OPC  when (OPCS = '0')  else XM_OPC;
        M_OPC <= LM_OPC  when (OPCS = '0')  else XM_OPC;
        ADR_O <= M_PC    when (T2 = '0')    else ADR;
        ADR_O <= M_PC    when (T2 = '0')    else ADR;
        RDAT  <= LM_RDAT when (RDATS = '0') else XM_RDAT;
        RDAT  <= LM_RDAT when (RDATS = '0') else XM_RDAT;
 
 
        process(CLK_I)
        process(CLK_I, RST_I)   -- nuovo (thanks to Riccardo Cerulli-Irelli)
        begin
        begin
                if (rising_edge(CLK_I)) then
 
                        if (RST_I = '1') then
                        if (RST_I = '1') then
                                D_PC    <= X"0000";
 
                                D_OPC   <= X"01";
 
                                D_CYC   <= M1;
 
 
 
                                C_PC    <= X"0000";
                                C_PC    <= X"0000";
                                C_OPC   <= X"01";
                                C_OPC   <= X"01";
                                C_CYC   <= M1;
                                C_CYC   <= M1;
                                C_IMM   <= X"FFFF";
 
 
 
                                C_SX    <= "00";
                                C_SX    <= "00";
                                C_SY    <= "0000";
                                C_SY    <= "0000";
                                C_OP    <= "00000";
                                C_OP    <= "00000";
                                C_SA    <= "00000";
                                C_SA    <= "00000";
Line 425... Line 419...
                                C_WE_SP <= SP_NOP;
                                C_WE_SP <= SP_NOP;
                                C_IO    <= '0';
                                C_IO    <= '0';
                                C_RD_O  <= '0';
                                C_RD_O  <= '0';
                                C_WE_O  <= '0';
                                C_WE_O  <= '0';
                                LM_WE   <= '0';
                                LM_WE   <= '0';
                        elsif (CE = '1' and T2 = '1') then
                elsif ((rising_edge(CLK_I) and T2 = '1') and CE = '1' ) then
                                C_CYC   <= D_CYC;
                                C_CYC   <= D_CYC;
                                Q_CAT   <= D_CAT;
                                Q_CAT   <= D_CAT;
                                C_PC    <= D_PC;
                                C_PC    <= D_PC;
                                C_OPC   <= D_OPC;
                                C_OPC   <= D_OPC;
                                C_SX    <= D_SX;
                                C_SX    <= D_SX;
Line 443... Line 437...
                                C_IO    <= D_IO;
                                C_IO    <= D_IO;
                                C_RD_O  <= D_RD_O;
                                C_RD_O  <= D_RD_O;
                                C_WE_O  <= D_WE_O;
                                C_WE_O  <= D_WE_O;
                                LM_WE   <= D_WE_O and not D_IO;
                                LM_WE   <= D_WE_O and not D_IO;
 
 
 
                end if;
 
        end process;
 
 
 
        process(CLK_I, RST_I)   -- nuovo (thanks to Riccardo Cerulli-Irelli)
 
        begin
 
                if (RST_I = '1') then
 
                        D_PC    <= X"0000";
 
                        D_OPC   <= X"01";
 
                        D_CYC   <= M1;
 
                        C_IMM   <= X"FFFF";
 
 
 
                elsif ((rising_edge(CLK_I) and T2 = '1') and CE = '1' ) then
                                if (D_LAST_M = '1') then        -- D goes to M1
                                if (D_LAST_M = '1') then        -- D goes to M1
                                        -- signals valid for entire opcode...
                                -- signals valid for entire opcode...     PORTATO FUORI
                                        D_OPC <= M_OPC;
                                        D_OPC <= M_OPC;
                                        D_PC  <= M_PC;
                                        D_PC  <= M_PC;
                                        D_CYC <= M1;
                                        D_CYC <= M1;
                                else
                                else
                                        case D_CYC is
                                        case D_CYC is
Line 460... Line 466...
                                                when M4 =>      D_CYC <= M5;
                                                when M4 =>      D_CYC <= M5;
                                                when M5 =>      D_CYC <= M1;
                                                when M5 =>      D_CYC <= M1;
                                        end case;
                                        end case;
                                end if;
                                end if;
                        end if;
                        end if;
                end if;
 
        end process;
        end process;
 
 
end Behavioral;
end Behavioral;
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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