📄 cop2000.vhd
字号:
-- X2 9
CASE STATUS IS
WHEN "00000000" => X2 <= '0'; -- _FATCH_
WHEN "10111010" => X2 <= '0'; -- _INT_
WHEN "10111001" => X2 <= '0'; -- _INT_
WHEN "10111111" => X2 <= '0'; -- CALL MM
WHEN "10111110" => X2 <= '0'; -- CALL MM
WHEN "11000001" => X2 <= '0'; -- IN
WHEN "11001101" => X2 <= '0'; -- RET
WHEN "11101101" => X2 <= '0'; -- RETI
WHEN "11111101" => X2 <= '0'; -- UNDEF
WHEN OTHERS => X2 <= '1';
END CASE;
-- X1 35
CASE STATUS IS
WHEN "00000000" => X1 <= '0'; -- _FATCH_
WHEN "00001001" => X1 <= '0'; -- MOV MM,#II
WHEN "00010001" => X1 <= '0'; -- ADD A, R?
WHEN "00010101" => X1 <= '0'; -- ADD A, @R?
WHEN "00011001" => X1 <= '0'; -- ADD A, MM
WHEN "00011101" => X1 <= '0'; -- ADD A, #II
WHEN "00100001" => X1 <= '0'; -- ADDC A, R?
WHEN "00100101" => X1 <= '0'; -- ADDC A, @R?
WHEN "00101001" => X1 <= '0'; -- ADDC A, MM
WHEN "00101101" => X1 <= '0'; -- ADDC A, #II
WHEN "00110001" => X1 <= '0'; -- SUB A, R?
WHEN "00110101" => X1 <= '0'; -- SUB A, @R?
WHEN "00111001" => X1 <= '0'; -- SUB A, MM
WHEN "00111101" => X1 <= '0'; -- SUB A, #II
WHEN "01000001" => X1 <= '0'; -- SUBC A, R?
WHEN "01000101" => X1 <= '0'; -- SUBC A, @R?
WHEN "01001001" => X1 <= '0'; -- SUBC A, MM
WHEN "01001101" => X1 <= '0'; -- SUBC A, #II
WHEN "01010001" => X1 <= '0'; -- AND A, R?
WHEN "01010101" => X1 <= '0'; -- AND A, @R?
WHEN "01011001" => X1 <= '0'; -- AND A, MM
WHEN "01011101" => X1 <= '0'; -- AND A, #II
WHEN "01100001" => X1 <= '0'; -- OR A, R?
WHEN "01100101" => X1 <= '0'; -- OR A, @R?
WHEN "01101001" => X1 <= '0'; -- OR A, MM
WHEN "01101101" => X1 <= '0'; -- OR A, #II
WHEN "10000001" => X1 <= '0'; -- MOV R?, A
WHEN "10000101" => X1 <= '0'; -- MOV @R?, A
WHEN "10001001" => X1 <= '0'; -- MOV MM, A
WHEN "10010101" => X1 <= '0'; -- WRITE MM, A
WHEN "10111001" => X1 <= '0'; -- _INT_
WHEN "11000001" => X1 <= '0'; -- IN
WHEN "11000101" => X1 <= '0'; -- OUT
WHEN "11010001" => X1 <= '0'; -- RR A
WHEN "11011001" => X1 <= '0'; -- RRC A
WHEN "11100101" => X1 <= '0'; -- CPL A
WHEN OTHERS => X1 <= '1';
END CASE;
-- X0 37
CASE STATUS IS
WHEN "00000000" => X0 <= '0'; -- _FATCH_
WHEN "00001001" => X0 <= '0'; -- MOV MM,#II
WHEN "00010001" => X0 <= '0'; -- ADD A, R?
WHEN "00010101" => X0 <= '0'; -- ADD A, @R?
WHEN "00011001" => X0 <= '0'; -- ADD A, MM
WHEN "00011101" => X0 <= '0'; -- ADD A, #II
WHEN "00100001" => X0 <= '0'; -- ADDC A, R?
WHEN "00100101" => X0 <= '0'; -- ADDC A, @R?
WHEN "00101001" => X0 <= '0'; -- ADDC A, MM
WHEN "00101101" => X0 <= '0'; -- ADDC A, #II
WHEN "00110001" => X0 <= '0'; -- SUB A, R?
WHEN "00110101" => X0 <= '0'; -- SUB A, @R?
WHEN "00111001" => X0 <= '0'; -- SUB A, MM
WHEN "00111101" => X0 <= '0'; -- SUB A, #II
WHEN "01000001" => X0 <= '0'; -- SUBC A, R?
WHEN "01000101" => X0 <= '0'; -- SUBC A, @R?
WHEN "01001001" => X0 <= '0'; -- SUBC A, MM
WHEN "01001101" => X0 <= '0'; -- SUBC A, #II
WHEN "01010001" => X0 <= '0'; -- AND A, R?
WHEN "01010101" => X0 <= '0'; -- AND A, @R?
WHEN "01011001" => X0 <= '0'; -- AND A, MM
WHEN "01011101" => X0 <= '0'; -- AND A, #II
WHEN "01100001" => X0 <= '0'; -- OR A, R?
WHEN "01100101" => X0 <= '0'; -- OR A, @R?
WHEN "01101001" => X0 <= '0'; -- OR A, MM
WHEN "01101101" => X0 <= '0'; -- OR A, #II
WHEN "10000001" => X0 <= '0'; -- MOV R?, A
WHEN "10000101" => X0 <= '0'; -- MOV @R?, A
WHEN "10001001" => X0 <= '0'; -- MOV MM, A
WHEN "10010101" => X0 <= '0'; -- WRITE MM, A
WHEN "11000001" => X0 <= '0'; -- IN
WHEN "11000101" => X0 <= '0'; -- OUT
WHEN "11001101" => X0 <= '0'; -- RET
WHEN "11010101" => X0 <= '0'; -- RL A
WHEN "11011101" => X0 <= '0'; -- RLC A
WHEN "11100101" => X0 <= '0'; -- CPL A
WHEN "11101101" => X0 <= '0'; -- RETI
WHEN "11111101" => X0 <= '0'; -- UNDEF
WHEN OTHERS => X0 <= '1';
END CASE;
-- WEN 25
CASE STATUS IS
WHEN "00000000" => WEN <= '0'; -- _FATCH_
WHEN "00010010" => WEN <= '0'; -- ADD A, R?
WHEN "00010110" => WEN <= '0'; -- ADD A, @R?
WHEN "00011010" => WEN <= '0'; -- ADD A, MM
WHEN "00011110" => WEN <= '0'; -- ADD A, #II
WHEN "00100010" => WEN <= '0'; -- ADDC A, R?
WHEN "00100110" => WEN <= '0'; -- ADDC A, @R?
WHEN "00101010" => WEN <= '0'; -- ADDC A, MM
WHEN "00101110" => WEN <= '0'; -- ADDC A, #II
WHEN "00110010" => WEN <= '0'; -- SUB A, R?
WHEN "00110110" => WEN <= '0'; -- SUB A, @R?
WHEN "00111010" => WEN <= '0'; -- SUB A, MM
WHEN "00111110" => WEN <= '0'; -- SUB A, #II
WHEN "01000010" => WEN <= '0'; -- SUBC A, R?
WHEN "01000110" => WEN <= '0'; -- SUBC A, @R?
WHEN "01001010" => WEN <= '0'; -- SUBC A, MM
WHEN "01001110" => WEN <= '0'; -- SUBC A, #II
WHEN "01010010" => WEN <= '0'; -- AND A, R?
WHEN "01010110" => WEN <= '0'; -- AND A, @R?
WHEN "01011010" => WEN <= '0'; -- AND A, MM
WHEN "01011110" => WEN <= '0'; -- AND A, #II
WHEN "01100010" => WEN <= '0'; -- OR A, R?
WHEN "01100110" => WEN <= '0'; -- OR A, @R?
WHEN "01101010" => WEN <= '0'; -- OR A, MM
WHEN "01101110" => WEN <= '0'; -- OR A, #II
WHEN OTHERS => WEN <= '1';
END CASE;
-- AEN 36
CASE STATUS IS
WHEN "00000000" => AEN <= '0'; -- _FATCH_
WHEN "00001010" => AEN <= '0'; -- MOV MM,#II
WHEN "00010001" => AEN <= '0'; -- ADD A, R?
WHEN "00010101" => AEN <= '0'; -- ADD A, @R?
WHEN "00011001" => AEN <= '0'; -- ADD A, MM
WHEN "00011101" => AEN <= '0'; -- ADD A, #II
WHEN "00100001" => AEN <= '0'; -- ADDC A, R?
WHEN "00100101" => AEN <= '0'; -- ADDC A, @R?
WHEN "00101001" => AEN <= '0'; -- ADDC A, MM
WHEN "00101101" => AEN <= '0'; -- ADDC A, #II
WHEN "00110001" => AEN <= '0'; -- SUB A, R?
WHEN "00110101" => AEN <= '0'; -- SUB A, @R?
WHEN "00111001" => AEN <= '0'; -- SUB A, MM
WHEN "00111101" => AEN <= '0'; -- SUB A, #II
WHEN "01000001" => AEN <= '0'; -- SUBC A, R?
WHEN "01000101" => AEN <= '0'; -- SUBC A, @R?
WHEN "01001001" => AEN <= '0'; -- SUBC A, MM
WHEN "01001101" => AEN <= '0'; -- SUBC A, #II
WHEN "01010001" => AEN <= '0'; -- AND A, R?
WHEN "01010101" => AEN <= '0'; -- AND A, @R?
WHEN "01011001" => AEN <= '0'; -- AND A, MM
WHEN "01011101" => AEN <= '0'; -- AND A, #II
WHEN "01100001" => AEN <= '0'; -- OR A, R?
WHEN "01100101" => AEN <= '0'; -- OR A, @R?
WHEN "01101001" => AEN <= '0'; -- OR A, MM
WHEN "01101101" => AEN <= '0'; -- OR A, #II
WHEN "01110001" => AEN <= '0'; -- MOV A, R?
WHEN "01110101" => AEN <= '0'; -- MOV A, @R?
WHEN "01111001" => AEN <= '0'; -- MOV A, MM
WHEN "01111101" => AEN <= '0'; -- MOV A, #II
WHEN "10010001" => AEN <= '0'; -- READ A, MM
WHEN "11000001" => AEN <= '0'; -- IN
WHEN "11010001" => AEN <= '0'; -- RR A
WHEN "11010101" => AEN <= '0'; -- RL A
WHEN "11011001" => AEN <= '0'; -- RRC A
WHEN "11011101" => AEN <= '0'; -- RLC A
WHEN "11100101" => AEN <= '0'; -- CPL A
WHEN OTHERS => AEN <= '1';
END CASE;
-- S2 18
CASE STATUS IS
WHEN "00000000" => S2 <= '0'; -- _FATCH_
WHEN "00010001" => S2 <= '0'; -- ADD A, R?
WHEN "00010101" => S2 <= '0'; -- ADD A, @R?
WHEN "00011001" => S2 <= '0'; -- ADD A, MM
WHEN "00011101" => S2 <= '0'; -- ADD A, #II
WHEN "00110001" => S2 <= '0'; -- SUB A, R?
WHEN "00110101" => S2 <= '0'; -- SUB A, @R?
WHEN "00111001" => S2 <= '0'; -- SUB A, MM
WHEN "00111101" => S2 <= '0'; -- SUB A, #II
WHEN "01010001" => S2 <= '0'; -- AND A, R?
WHEN "01010101" => S2 <= '0'; -- AND A, @R?
WHEN "01011001" => S2 <= '0'; -- AND A, MM
WHEN "01011101" => S2 <= '0'; -- AND A, #II
WHEN "01100001" => S2 <= '0'; -- OR A, R?
WHEN "01100101" => S2 <= '0'; -- OR A, @R?
WHEN "01101001" => S2 <= '0'; -- OR A, MM
WHEN "01101101" => S2 <= '0'; -- OR A, #II
WHEN "11111101" => S2 <= '0'; -- UNDEF
WHEN OTHERS => S2 <= '1';
END CASE;
-- S1 18
CASE STATUS IS
WHEN "00000000" => S1 <= '0'; -- _FATCH_
WHEN "00010001" => S1 <= '0'; -- ADD A, R?
WHEN "00010101" => S1 <= '0'; -- ADD A, @R?
WHEN "00011001" => S1 <= '0'; -- ADD A, MM
WHEN "00011101" => S1 <= '0'; -- ADD A, #II
WHEN "00100001" => S1 <= '0'; -- ADDC A, R?
WHEN "00100101" => S1 <= '0'; -- ADDC A, @R?
WHEN "00101001" => S1 <= '0'; -- ADDC A, MM
WHEN "00101101" => S1 <= '0'; -- ADDC A, #II
WHEN "00110001" => S1 <= '0'; -- SUB A, R?
WHEN "00110101" => S1 <= '0'; -- SUB A, @R?
WHEN "00111001" => S1 <= '0'; -- SUB A, MM
WHEN "00111101" => S1 <= '0'; -- SUB A, #II
WHEN "01000001" => S1 <= '0'; -- SUBC A, R?
WHEN "01000101" => S1 <= '0'; -- SUBC A, @R?
WHEN "01001001" => S1 <= '0'; -- SUBC A, MM
WHEN "01001101" => S1 <= '0'; -- SUBC A, #II
WHEN "11111101" => S1 <= '0'; -- UNDEF
WHEN OTHERS => S1 <= '1';
END CASE;
-- S0 15
CASE STATUS IS
WHEN "00000000" => S0 <= '0'; -- _FATCH_
WHEN "00010001" => S0 <= '0'; -- ADD A, R?
WHEN "00010101" => S0 <= '0'; -- ADD A, @R?
WHEN "00011001" => S0 <= '0'; -- ADD A, MM
WHEN "00011101" => S0 <= '0'; -- ADD A, #II
WHEN "00100001" => S0 <= '0'; -- ADDC A, R?
WHEN "00100101" => S0 <= '0'; -- ADDC A, @R?
WHEN "00101001" => S0 <= '0'; -- ADDC A, MM
WHEN "00101101" => S0 <= '0'; -- ADDC A, #II
WHEN "01100001" => S0 <= '0'; -- OR A, R?
WHEN "01100101" => S0 <= '0'; -- OR A, @R?
WHEN "01101001" => S0 <= '0'; -- OR A, MM
WHEN "01101101" => S0 <= '0'; -- OR A, #II
WHEN "11100101" => S0 <= '0'; -- CPL A
WHEN "11111101" => S0 <= '0'; -- UNDEF
WHEN OTHERS => S0 <= '1';
END CASE;
END PROCESS;
-- 计算指令周期数
PROCESS(I_BUS)
VARIABLE INST: STD_LOGIC_VECTOR(7 DOWNTO 2);
BEGIN
INST := I_BUS(7 DOWNTO 2);
CASE INST IS
WHEN "000100" => CT <= "10"; -- ADD A, R?
WHEN "000101" => CT <= "11"; -- ADD A, @R?
WHEN "000110" => CT <= "11"; -- ADD A, MM
WHEN "000111" => CT <= "10"; -- ADD A, #II
WHEN "001000" => CT <= "10"; -- ADDC A, R?
WHEN "001001" => CT <= "11"; -- ADDC A, @R?
WHEN "001010" => CT <= "11"; -- ADDC A, MM
WHEN "001011" => CT <= "10"; -- ADDC A, #II
WHEN "001100" => CT <= "10"; -- SUB A, R?
WHEN "001101" => CT <= "11"; -- SUB A, @R?
WHEN "001110" => CT <= "11"; -- SUB A, MM
WHEN "001111" => CT <= "10"; -- SUB A, #II
WHEN "010000" => CT <= "10"; -- SUBC A, R?
WHEN "010001" => CT <= "11"; -- SUBC A, @R?
WHEN "010010" => CT <= "11"; -- SUBC A, MM
WHEN "010011" => CT <= "10"; -- SUBC A, #II
WHEN "010100" => CT <= "10"; -- AND A, R?
WHEN "010101" => CT <= "11"; -- AND A, @R?
WHEN "010110" => CT <= "11"; -- AND A, MM
WHEN "010111" => CT <= "10"; -- AND A, #II
WHEN "011000" => CT <= "10"; -- OR A, R?
WHEN "011001" => CT <= "11"; -- OR A, @R?
WHEN "011010" => CT <= "11"; -- OR A, MM
WHEN "011011" => CT <= "10"; -- OR A, #II
WHEN "011100" => CT <= "01"; -- MOV A, R?
WHEN "011101" => CT <= "10"; -- MOV A, @R?
WHEN "011110" => CT <= "10"; -- MOV A, MM
WHEN "011111" => CT <= "01"; -- MOV A, #II
WHEN "100000" => CT <= "01"; -- MOV R?, A
WHEN "100001" => CT <= "10"; -- MOV @R?, A
WHEN "100010" => CT <= "10"; -- MOV MM, A
WHEN "100011" => CT <= "01"; -- MOV R?, #II
WHEN "100100" => CT <= "10"; -- READ A, MM
WHEN "100101" => CT <= "10"; -- WRITE MM, A
WHEN "101000" => CT <= "01"; -- JC MM
WHEN "101001" => CT <= "01"; -- JZ MM
WHEN "101011" => CT <= "01"; -- JMP MM
WHEN "101110" => CT <= "10"; -- _INT_
WHEN "101111" => CT <= "11"; -- CALL MM
WHEN "110000" => CT <= "01"; -- IN
WHEN "110001" => CT <= "01"; -- OUT
WHEN "110011" => CT <= "01"; -- RET
WHEN "110100" => CT <= "01"; -- RR A
WHEN "110101" => CT <= "01"; -- RL A
WHEN "110110" => CT <= "01"; -- RRC A
WHEN "110111" => CT <= "01"; -- RLC A
WHEN "111001" => CT <= "01"; -- CPL A
WHEN "111011" => CT <= "01"; -- RETI
WHEN OTHERS => CT <= "00";
END CASE;
END PROCESS;
END behv;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -