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
|