📄 ir_decoder_spec.vhd
字号:
t1_cmd <= direct_T; data_t1 <= "001"; -- use byte t2_cmd <= use_acc; alu_cmd <= add_instr; IF cy_int = '0' THEN -- no borrow needed data_alu <= "101"; -- cpl & inc (2's complement) ELSE data_alu <= "100"; -- cpl but don't inc to make it 2's cpl - 1 END IF; set_cy <= '1'; set_ac_ov <= '1'; use_cy <= '1'; dest_cmd <= use_acc; WHEN "10010110" | "10010111" => -- SUBB "96" - "97" t1_cmd <= indirect_T; data_t1 <= "00"&ir(0); t2_cmd <= use_acc; alu_cmd <= add_instr; IF cy_int = '0' THEN -- no borrow needed data_alu <= "101"; -- cpl & inc (2's complement) ELSE data_alu <= "100"; -- cpl but don't inc to make it 2's cpl - 1 END IF; set_cy <= '1'; set_ac_ov <= '1'; use_cy <= '1'; dest_cmd <= use_acc; WHEN "10011000" | "10011001" | "10011010" | "10011011" | "10011100" | "10011101" | "10011110" | "10011111" => -- SUBB 98-9F t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0); t2_cmd <= use_acc; alu_cmd <= add_instr; IF cy_int = '0' THEN -- no borrow needed data_alu <= "101"; -- cpl & inc (2's complement) ELSE data_alu <= "100"; -- cpl but don't inc to make it 2's cpl - 1 END IF; set_cy <= '1'; set_ac_ov <= '1'; use_cy <= '1'; dest_cmd <= use_acc; WHEN "10100110" | "10100111" => -- MOV A6-7 t1_cmd <= direct_T; data_t1 <= "001"; t2_cmd <= zeros; alu_cmd <= pass_tmp1; data_alu <= "000"; dest_cmd <= indirect_T; data_dest <= "00"&ir(0); WHEN "10101000" | "10101001" | "10101010" | "10101011" | "10101100" | "10101101" | "10101110" | "10101111" => -- MOV A8-AF t1_cmd <= direct_T; data_t1 <= "001"; t2_cmd <= zeros; alu_cmd <= pass_tmp1; data_alu <= "000"; dest_cmd <= use_reg; data_dest <= ir(2 DOWNTO 0); WHEN "10110100" => -- CJNE A,#data,rel B4 t1_cmd <= immed; data_t1 <= "001"; t2_cmd <= use_acc; alu_cmd <= pass_tmp1; data_alu <= "000"; dest_cmd <= nothing; WHEN "10110101" => -- CJNE B5 t1_cmd <= direct_T; data_t1 <= "001"; t2_cmd <= use_acc; alu_cmd <= pass_tmp1; data_alu <= "000"; dest_cmd <= nothing; WHEN "10110110" | "10110111" => -- CJNE B6-7 t1_cmd <= indirect_T; data_t1 <= "00"&ir(0); t2_cmd <= immed; data_t2 <= "001"; alu_cmd <= pass_tmp1; data_alu <= "000"; dest_cmd <= nothing; WHEN "10111000" | "10111001" | "10111010" | "10111011" | "10111100" | "10111101" | "10111110" | "10111111" => -- CJNE B8-F t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0); t2_cmd <= immed; data_t2 <= "001"; alu_cmd <= pass_tmp1; data_alu <= "000"; dest_cmd <= nothing; WHEN "11000100" => -- SWAP C4 t1_cmd <= zeros; t2_cmd <= use_acc; alu_cmd <= rotate; data_alu <= swap_instr; dest_cmd <= use_acc; WHEN "11000101" => -- XCH C5 t1_cmd <= direct_T; data_t1 <= "001"; t2_cmd <= use_acc; IF alu_second_result = '1' THEN alu_cmd <= pass_tmp1; dest_cmd <= use_acc; ELSE alu_cmd <= pass_tmp2; --dest_cmd <= direct_T; dest_cmd <= same_as_t1; END IF; data_alu <= "000"; data_dest <= "001"; two_dests <= '1'; WHEN "11000110" | "11000111" => -- XCH C6-7 t1_cmd <= indirect_T; data_t1 <= "00"&ir(0); t2_cmd <= use_acc; IF alu_second_result = '1' THEN alu_cmd <= pass_tmp1; dest_cmd <= use_acc; ELSE alu_cmd <= pass_tmp2; --dest_cmd <= indirect_T; dest_cmd <= same_as_t1; END IF; data_alu <= "000"; data_dest <= "00"&ir(0); two_dests <= '1'; WHEN "11001000" | "11001001" | "11001010" | "11001011" | "11001100" | "11001101" | "11001110" | "11001111" => -- XCH C8-F t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0); t2_cmd <= use_acc; IF alu_second_result = '1' THEN alu_cmd <= pass_tmp1; dest_cmd <= use_acc; ELSE alu_cmd <= pass_tmp2; --dest_cmd <= use_reg; dest_cmd <= same_as_t1; END IF; data_alu <= "000"; data_dest <= ir(2 DOWNTO 0); two_dests <= '1'; WHEN "11010110" | "11010111" => -- XCHD A,@Ri D6-7 t1_cmd <= indirect_T; data_t1 <= "00"&ir(0); t2_cmd <= use_acc; -- swap the lower nibbles IF alu_second_result = '1' THEN alu_cmd <= rotate; dest_cmd <= use_acc; ELSE alu_cmd <= xchd1; --dest_cmd <= indirect_T; dest_cmd <= same_as_t1; END IF; data_alu <= xchd2; data_dest <= "00"&ir(0); two_dests <= '1'; WHEN "11010101" => -- DJNZ direct_T,rel D5 t1_cmd <= direct_T; data_t2 <= "001"; t2_cmd <= zeros; alu_cmd <= pass_tmp1; data_alu <= t1_dec; --dest_cmd <= direct_T; data_dest <= "001"; dest_cmd <= same_as_t1; read_latch <= '1'; WHEN "11011000" | "11011001" | "11011010" | "11011011" | "11011100" | "11011101" | "11011110" | "11011111" => -- DJNZ Rn D8-F t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0); t2_cmd <= zeros; alu_cmd <= pass_tmp1; data_alu <= t1_dec; --dest_cmd <= use_reg; data_dest <= ir(2 DOWNTO 0); dest_cmd <= same_as_t1; WHEN "11100100" => -- CLR A E4 t1_cmd <= zeros; t2_cmd <= zeros; alu_cmd <= pass_tmp1; dest_cmd <= use_acc; WHEN "11110100" => -- CPL A F4 t1_cmd <= zeros; t2_cmd <= use_acc; alu_cmd <= logic; data_alu <= cpl_instr; dest_cmd <= use_acc; WHEN "11100101" => -- MOV E5 t1_cmd <= direct_T; data_t1 <= "001"; t2_cmd <= zeros; alu_cmd <= pass_tmp1; dest_cmd <= use_acc; WHEN "11100110" | "11100111" => -- MOV E6-7 t1_cmd <= indirect_T; data_t1 <= "00"&ir(0); t2_cmd <= zeros; alu_cmd <= pass_tmp1; dest_cmd <= use_acc; WHEN "11101000" | "11101001" | "11101010" | "11101011" | "11101100" | "11101101" | "11101110" | "11101111" => -- MOV E8-F t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0); t2_cmd <= zeros; alu_cmd <= pass_tmp1; dest_cmd <= use_acc; WHEN "11110101" => -- MOV F5 t1_cmd <= use_acc; t2_cmd <= zeros; alu_cmd <= pass_tmp1; dest_cmd <= direct_T; data_dest <= "001"; WHEN "11110110" | "11110111" => -- MOV F6-7 t1_cmd <= use_acc; t2_cmd <= zeros; alu_cmd <= pass_tmp1; dest_cmd <= indirect_T; data_dest <= "00"&ir(0); WHEN "11111000" | "11111001" | "11111010" | "11111011" | "11111100" | "11111101" | "11111110" | "11111111" => -- MOV F8-F t1_cmd <= use_acc; t2_cmd <= zeros; alu_cmd <= pass_tmp1; dest_cmd <= use_reg; data_dest <= ir(2 DOWNTO 0); WHEN "10010011" | "10000011" => -- MOVC t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "11100010" | "11100011" => -- MOVX A,@Ri t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "11100000" => -- MOVX A,@DPTR t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "11110010" | "11110011" => -- MOVX @Ri,A t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "11110000" => -- MOVX @DPTR,A t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; -- THE FOLLOWING SIX INSTRUCTIONS ARE NOT IMPLEMENTED WHEN "10010000" => -- MOV DPTR, #data16 t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "01110011" => -- JMP @A + DPTR t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "10100011" => -- INC DPTR t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "10100100" => -- MUL t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "10000100" => -- DIV t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; WHEN "11010100" => -- DA t1_cmd <= nothing; t2_cmd <= nothing; alu_cmd <= pass_tmp1; dest_cmd <= nothing; -- EVERYTHING EXCEPT THESE LAST SIX SHOULD BE IMPLEMENTED END CASE;END PROCESS p1;END ARCHITECTURE spec;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -