📄 cop2000.vhd
字号:
BEGIN
IF (EINT = '0') OR (rst = '1') THEN
R_REQ <= '0';
ELSIF i_req'EVENT AND i_req = '1' THEN
R_REQ <= '1';
END IF;
END PROCESS;
PROCESS(clk, rst, EINT, IREN, R_REQ, R_ACK, ICEN)
BEGIN
IF (IREN = '0') AND (R_REQ = '1') AND (R_ACK = '0') THEN
ICEN <= '0';
ELSE
ICEN <= '1';
END IF;
IF (EINT = '0') OR (rst = '1') THEN
R_ACK <= '0';
ELSIF clk'EVENT AND clk = '1' THEN
IF ICEN = '0' THEN
R_ACK <= R_REQ;
END IF;
END IF;
END PROCESS;
-- 地址总线
A_BUS <= PC WHEN PCOE = '0' ELSE
MAR; -- WHEN MAROE = '0'
-- 指令总线
I_BUS <= INT_CODE WHEN ICEN = '0' ELSE mem_d;
-- 数据总线
PROCESS(X2, X1, X0, RRD, keyin, IA, ST, PC, D, R, L, R0, R1, R2, R3, IR, I_BUS)
BEGIN
IF (X2 = '0') AND (X1 = '0') AND (X0 = '0') THEN
D_BUS <= keyin;
ELSIF (X2 = '0') AND (X1 = '0') AND (X0 = '1') THEN
D_BUS <= IA;
ELSIF (X2 = '0') AND (X1 = '1') AND (X0 = '0') THEN
D_BUS <= ST;
ELSIF (X2 = '0') AND (X1 = '1') AND (X0 = '1') THEN
D_BUS <= PC;
ELSIF (X2 = '1') AND (X1 = '0') AND (X0 = '0') THEN
D_BUS <= D;
ELSIF (X2 = '1') AND (X1 = '0') AND (X0 = '1') THEN
D_BUS <= R;
ELSIF (X2 = '1') AND (X1 = '1') AND (X0 = '0') THEN
D_BUS <= L;
ELSIF (RRD = '0') AND (IR(1) = '0') AND (IR(0) = '0') THEN
D_BUS <= R0;
ELSIF (RRD = '0') AND (IR(1) = '0') AND (IR(0) = '1') THEN
D_BUS <= R1;
ELSIF (RRD = '0') AND (IR(1) = '1') AND (IR(0) = '0') THEN
D_BUS <= R2;
ELSIF (RRD = '0') AND (IR(1) = '1') AND (IR(0) = '1') THEN
D_BUS <= R3;
ELSE
D_BUS <= I_BUS; -- (EMRD = '0') AND (EMEN = '0')
END IF;
END PROCESS;
-- 主存贮器EM
mem_bh <= '0';
mem_bl <= '0';
mem_cs <= '0';
mem_a(DataWidth-1 DOWNTO 0) <= A_BUS;
-- mem_ah <= (OTHERS=>'0'); -- 八位机时,高位地址为0
mem_rd <= '0' WHEN (EMRD = '0') AND (ICEN = '1') ELSE '1';
mem_wr <= NOT clk WHEN EMWR = '0' ELSE '1';
mem_d <= D_BUS WHEN EMWR = '0' ELSE (OTHERS=>'Z');
-- 指令周期
PROCESS(clk, rst)
BEGIN
IF rst = '1' THEN
RT <= "00";
ELSIF clk'EVENT AND clk = '1' THEN
IF RT = "00" THEN
RT <= CT; -- 取下一条指令时同时算出下一条指令的周期数CT
ELSE
RT <= RT - 1;
END IF;
END IF;
END PROCESS;
-- 24 位微控制信号
PROCESS(IR, RT)
VARIABLE STATUS: STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
STATUS(7 DOWNTO 2) := IR(7 DOWNTO 2);
STATUS(1 DOWNTO 0) := RT(1 DOWNTO 0);
-- XRD 3
CASE STATUS IS
WHEN "00000000" => XRD <= '0'; -- _FATCH_
WHEN "10010001" => XRD <= '0'; -- READ A, MM
WHEN "11111101" => XRD <= '0'; -- UNDEF
WHEN OTHERS => XRD <= '1';
END CASE;
-- EMWR 4
CASE STATUS IS
WHEN "00000000" => EMWR <= '0'; -- _FATCH_
WHEN "00001001" => EMWR <= '0'; -- MOV MM,#II
WHEN "10000101" => EMWR <= '0'; -- MOV @R?, A
WHEN "10001001" => EMWR <= '0'; -- MOV MM, A
WHEN "11111101" => EMWR <= '0'; -- UNDEF
WHEN OTHERS => EMWR <= '1';
END CASE;
-- EMRD 100
CASE STATUS IS
WHEN "00000000" => EMRD <= '0'; -- _FATCH_
WHEN "00000100" => EMRD <= '0'; -- MOV R?,MM
WHEN "00000101" => EMRD <= '0'; -- MOV R?,MM
WHEN "00000110" => EMRD <= '0'; -- MOV R?,MM
WHEN "00001011" => EMRD <= '0'; -- MOV MM,#II
WHEN "00001010" => EMRD <= '0'; -- MOV MM,#II
WHEN "00001000" => EMRD <= '0'; -- MOV MM,#II
WHEN "00001100" => EMRD <= '0'; -- UNDEF
WHEN "00010000" => EMRD <= '0'; -- ADD A, R?
WHEN "00010110" => EMRD <= '0'; -- ADD A, @R?
WHEN "00010100" => EMRD <= '0'; -- ADD A, @R?
WHEN "00011011" => EMRD <= '0'; -- ADD A, MM
WHEN "00011010" => EMRD <= '0'; -- ADD A, MM
WHEN "00011000" => EMRD <= '0'; -- ADD A, MM
WHEN "00011110" => EMRD <= '0'; -- ADD A, #II
WHEN "00011100" => EMRD <= '0'; -- ADD A, #II
WHEN "00100000" => EMRD <= '0'; -- ADDC A, R?
WHEN "00100110" => EMRD <= '0'; -- ADDC A, @R?
WHEN "00100100" => EMRD <= '0'; -- ADDC A, @R?
WHEN "00101011" => EMRD <= '0'; -- ADDC A, MM
WHEN "00101010" => EMRD <= '0'; -- ADDC A, MM
WHEN "00101000" => EMRD <= '0'; -- ADDC A, MM
WHEN "00101110" => EMRD <= '0'; -- ADDC A, #II
WHEN "00101100" => EMRD <= '0'; -- ADDC A, #II
WHEN "00110000" => EMRD <= '0'; -- SUB A, R?
WHEN "00110110" => EMRD <= '0'; -- SUB A, @R?
WHEN "00110100" => EMRD <= '0'; -- SUB A, @R?
WHEN "00111011" => EMRD <= '0'; -- SUB A, MM
WHEN "00111010" => EMRD <= '0'; -- SUB A, MM
WHEN "00111000" => EMRD <= '0'; -- SUB A, MM
WHEN "00111110" => EMRD <= '0'; -- SUB A, #II
WHEN "00111100" => EMRD <= '0'; -- SUB A, #II
WHEN "01000000" => EMRD <= '0'; -- SUBC A, R?
WHEN "01000110" => EMRD <= '0'; -- SUBC A, @R?
WHEN "01000100" => EMRD <= '0'; -- SUBC A, @R?
WHEN "01001011" => EMRD <= '0'; -- SUBC A, MM
WHEN "01001010" => EMRD <= '0'; -- SUBC A, MM
WHEN "01001000" => EMRD <= '0'; -- SUBC A, MM
WHEN "01001110" => EMRD <= '0'; -- SUBC A, #II
WHEN "01001100" => EMRD <= '0'; -- SUBC A, #II
WHEN "01010000" => EMRD <= '0'; -- AND A, R?
WHEN "01010110" => EMRD <= '0'; -- AND A, @R?
WHEN "01010100" => EMRD <= '0'; -- AND A, @R?
WHEN "01011011" => EMRD <= '0'; -- AND A, MM
WHEN "01011010" => EMRD <= '0'; -- AND A, MM
WHEN "01011000" => EMRD <= '0'; -- AND A, MM
WHEN "01011110" => EMRD <= '0'; -- AND A, #II
WHEN "01011100" => EMRD <= '0'; -- AND A, #II
WHEN "01100000" => EMRD <= '0'; -- OR A, R?
WHEN "01100110" => EMRD <= '0'; -- OR A, @R?
WHEN "01100100" => EMRD <= '0'; -- OR A, @R?
WHEN "01101011" => EMRD <= '0'; -- OR A, MM
WHEN "01101010" => EMRD <= '0'; -- OR A, MM
WHEN "01101000" => EMRD <= '0'; -- OR A, MM
WHEN "01101110" => EMRD <= '0'; -- OR A, #II
WHEN "01101100" => EMRD <= '0'; -- OR A, #II
WHEN "01110000" => EMRD <= '0'; -- MOV A, R?
WHEN "01110101" => EMRD <= '0'; -- MOV A, @R?
WHEN "01110100" => EMRD <= '0'; -- MOV A, @R?
WHEN "01111010" => EMRD <= '0'; -- MOV A, MM
WHEN "01111001" => EMRD <= '0'; -- MOV A, MM
WHEN "01111000" => EMRD <= '0'; -- MOV A, MM
WHEN "01111101" => EMRD <= '0'; -- MOV A, #II
WHEN "01111100" => EMRD <= '0'; -- MOV A, #II
WHEN "10000000" => EMRD <= '0'; -- MOV R?, A
WHEN "10000100" => EMRD <= '0'; -- MOV @R?, A
WHEN "10001010" => EMRD <= '0'; -- MOV MM, A
WHEN "10001000" => EMRD <= '0'; -- MOV MM, A
WHEN "10001101" => EMRD <= '0'; -- MOV R?, #II
WHEN "10001100" => EMRD <= '0'; -- MOV R?, #II
WHEN "10010010" => EMRD <= '0'; -- READ A, MM
WHEN "10010000" => EMRD <= '0'; -- READ A, MM
WHEN "10010110" => EMRD <= '0'; -- WRITE MM, A
WHEN "10010100" => EMRD <= '0'; -- WRITE MM, A
WHEN "10011000" => EMRD <= '0'; -- UNDEF
WHEN "10011100" => EMRD <= '0'; -- UNDEF
WHEN "10100001" => EMRD <= '0'; -- JC MM
WHEN "10100000" => EMRD <= '0'; -- JC MM
WHEN "10100101" => EMRD <= '0'; -- JZ MM
WHEN "10100100" => EMRD <= '0'; -- JZ MM
WHEN "10101000" => EMRD <= '0'; -- UNDEF
WHEN "10101101" => EMRD <= '0'; -- JMP MM
WHEN "10101100" => EMRD <= '0'; -- JMP MM
WHEN "10110000" => EMRD <= '0'; -- UNDEF
WHEN "10110100" => EMRD <= '0'; -- UNDEF
WHEN "10111000" => EMRD <= '0'; -- _INT_
WHEN "10111101" => EMRD <= '0'; -- CALL MM
WHEN "10111100" => EMRD <= '0'; -- CALL MM
WHEN "11000000" => EMRD <= '0'; -- IN
WHEN "11000100" => EMRD <= '0'; -- OUT
WHEN "11001000" => EMRD <= '0'; -- UNDEF
WHEN "11001100" => EMRD <= '0'; -- RET
WHEN "11010000" => EMRD <= '0'; -- RR A
WHEN "11010100" => EMRD <= '0'; -- RL A
WHEN "11011000" => EMRD <= '0'; -- RRC A
WHEN "11011100" => EMRD <= '0'; -- RLC A
WHEN "11100000" => EMRD <= '0'; -- NOP
WHEN "11100100" => EMRD <= '0'; -- CPL A
WHEN "11101000" => EMRD <= '0'; -- UNDEF
WHEN "11101100" => EMRD <= '0'; -- RETI
WHEN "11110000" => EMRD <= '0'; -- UNDEF
WHEN "11110100" => EMRD <= '0'; -- UNDEF
WHEN "11111000" => EMRD <= '0'; -- UNDEF
WHEN "11111100" => EMRD <= '0'; -- UNDEF
WHEN OTHERS => EMRD <= '1';
END CASE;
-- PCOE 87
CASE STATUS IS
WHEN "00000000" => PCOE <= '0'; -- _FATCH_
WHEN "00000100" => PCOE <= '0'; -- MOV R?,MM
WHEN "00000110" => PCOE <= '0'; -- MOV R?,MM
WHEN "00000100" => PCOE <= '0'; -- UNDEF
WHEN "00001000" => PCOE <= '0'; -- UNDEF
WHEN "00001011" => PCOE <= '0'; -- MOV MM,#II
WHEN "00001010" => PCOE <= '0'; -- MOV MM,#II
WHEN "00001000" => PCOE <= '0'; -- MOV MM,#II
WHEN "00001100" => PCOE <= '0'; -- UNDEF
WHEN "00010000" => PCOE <= '0'; -- ADD A, R?
WHEN "00010100" => PCOE <= '0'; -- ADD A, @R?
WHEN "00011011" => PCOE <= '0'; -- ADD A, MM
WHEN "00011000" => PCOE <= '0'; -- ADD A, MM
WHEN "00011110" => PCOE <= '0'; -- ADD A, #II
WHEN "00011100" => PCOE <= '0'; -- ADD A, #II
WHEN "00100000" => PCOE <= '0'; -- ADDC A, R?
WHEN "00100100" => PCOE <= '0'; -- ADDC A, @R?
WHEN "00101011" => PCOE <= '0'; -- ADDC A, MM
WHEN "00101000" => PCOE <= '0'; -- ADDC A, MM
WHEN "00101110" => PCOE <= '0'; -- ADDC A, #II
WHEN "00101100" => PCOE <= '0'; -- ADDC A, #II
WHEN "00110000" => PCOE <= '0'; -- SUB A, R?
WHEN "00110100" => PCOE <= '0'; -- SUB A, @R?
WHEN "00111011" => PCOE <= '0'; -- SUB A, MM
WHEN "00111000" => PCOE <= '0'; -- SUB A, MM
WHEN "00111110" => PCOE <= '0'; -- SUB A, #II
WHEN "00111100" => PCOE <= '0'; -- SUB A, #II
WHEN "01000000" => PCOE <= '0'; -- SUBC A, R?
WHEN "01000100" => PCOE <= '0'; -- SUBC A, @R?
WHEN "01001011" => PCOE <= '0'; -- SUBC A, MM
WHEN "01001000" => PCOE <= '0'; -- SUBC A, MM
WHEN "01001110" => PCOE <= '0'; -- SUBC A, #II
WHEN "01001100" => PCOE <= '0'; -- SUBC A, #II
WHEN "01010000" => PCOE <= '0'; -- AND A, R?
WHEN "01010100" => PCOE <= '0'; -- AND A, @R?
WHEN "01011011" => PCOE <= '0'; -- AND A, MM
WHEN "01011000" => PCOE <= '0'; -- AND A, MM
WHEN "01011110" => PCOE <= '0'; -- AND A, #II
WHEN "01011100" => PCOE <= '0'; -- AND A, #II
WHEN "01100000" => PCOE <= '0'; -- OR A, R?
WHEN "01100100" => PCOE <= '0'; -- OR A, @R?
WHEN "01101011" => PCOE <= '0'; -- OR A, MM
WHEN "01101000" => PCOE <= '0'; -- OR A, MM
WHEN "01101110" => PCOE <= '0'; -- OR A, #II
WHEN "01101100" => PCOE <= '0'; -- OR A, #II
WHEN "01110000" => PCOE <= '0'; -- MOV A, R?
WHEN "01110100" => PCOE <= '0'; -- MOV A, @R?
WHEN "01111010" => PCOE <= '0'; -- MOV A, MM
WHEN "01111000" => PCOE <= '0'; -- MOV A, MM
WHEN "01111101" => PCOE <= '0'; -- MOV A, #II
WHEN "01111100" => PCOE <= '0'; -- MOV A, #II
WHEN "10000000" => PCOE <= '0'; -- MOV R?, A
WHEN "10000100" => PCOE <= '0'; -- MOV @R?, A
WHEN "10001010" => PCOE <= '0'; -- MOV MM, A
WHEN "10001000" => PCOE <= '0'; -- MOV MM, A
WHEN "10001101" => PCOE <= '0'; -- MOV R?, #II
WHEN "10001100" => PCOE <= '0'; -- MOV R?, #II
WHEN "10010010" => PCOE <= '0'; -- READ A, MM
WHEN "10010000" => PCOE <= '0'; -- READ A, MM
WHEN "10010110" => PCOE <= '0'; -- WRITE MM, A
WHEN "10010100" => PCOE <= '0'; -- WRITE MM, A
WHEN "10011000" => PCOE <= '0'; -- UNDEF
WHEN "10011100" => PCOE <= '0'; -- UNDEF
WHEN "10100001" => PCOE <= '0'; -- JC MM
WHEN "10100000" => PCOE <= '0'; -- JC MM
WHEN "10100101" => PCOE <= '0'; -- JZ MM
WHEN "10100100" => PCOE <= '0'; -- JZ MM
WHEN "10101000" => PCOE <= '0'; -- UNDEF
WHEN "10101101" => PCOE <= '0'; -- JMP MM
WHEN "10101100" => PCOE <= '0'; -- JMP MM
WHEN "10110000" => PCOE <= '0'; -- UNDEF
WHEN "10110100" => PCOE <= '0'; -- UNDEF
WHEN "10111000" => PCOE <= '0'; -- _INT_
WHEN "10111111" => PCOE <= '0'; -- CALL MM
WHEN "10111100" => PCOE <= '0'; -- CALL MM
WHEN "11000000" => PCOE <= '0'; -- IN
WHEN "11000100" => PCOE <= '0'; -- OUT
WHEN "11001000" => PCOE <= '0'; -- UNDEF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -