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

📄 ir_decoder_spec.vhd

📁 一个8051的VHDL代码
💻 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 + -