⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_decoder_spec.vhd

📁 this is a file about vhdl source code realtinf 8051 through 8051
💻 VHD
📖 第 1 页 / 共 3 页
字号:
       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 + -