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

📄 ir_decoder_spec.vhd

📁 一个8051的VHDL代码
💻 VHD
📖 第 1 页 / 共 3 页
字号:
  WHEN "01000110" | "01000111" =>   --   ORL A,@Ri  "46" - "47"
       t1_cmd      <= indirect_T; data_t1 <= "00"&ir(0);
       t2_cmd      <= use_acc; 
       alu_cmd     <= logic;   data_alu <= orl_instr;
       dest_cmd    <= use_acc;

  WHEN "01001000" | "01001001" | "01001010" | "01001011" |
       "01001100" | "01001101" | "01001110" | "01001111" =>   --  ORL 48-4F
       t1_cmd      <= use_reg;  data_t1 <= ir(2 DOWNTO 0);
       t2_cmd      <= use_acc; 
       alu_cmd     <= logic;   data_alu <= orl_instr;
       dest_cmd    <= use_acc;

  WHEN "01010010" =>   --  ANL direct_T,A "52"
       t1_cmd      <= direct_T;  data_t1 <= "001" ;
       t2_cmd      <= use_acc;
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"101"
       dest_cmd    <= same_as_t1; 
       read_latch  <= '1';

  WHEN "01010011" =>   --  ANL "53"
       t1_cmd      <= immed;  data_t1 <= "010" ;
       t2_cmd      <= direct_T;  data_t2 <= "001";  
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"101"
       dest_cmd    <= same_as_t1; 
       read_latch  <= '1';

  WHEN "01010100" =>   --  ANL "54"
       t1_cmd      <= immed;  data_t1 <= "001" ;
       t2_cmd      <= use_acc;
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"101"
       dest_cmd    <= use_acc; 

  WHEN "01010101" =>   --   ANL "55"
       t1_cmd      <= direct_T; data_t1 <= "001";   -- use byte 
       t2_cmd      <= use_acc; 
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"101"
       dest_cmd    <= use_acc;

  WHEN "01010110" | "01010111" =>   --   ANL "56" - "57"
       t1_cmd      <= indirect_T; data_t1 <= "00"&ir(0);
       t2_cmd      <= use_acc; 
       alu_cmd     <= logic;  data_alu <= ir(6 DOWNTO 4); --"101"
       dest_cmd    <= use_acc;

  WHEN "01011000" | "01011001" | "01011010" | "01011011" |
       "01011100" | "01011101" | "01011110" | "01011111"  =>   --  ANL 58-5F
       t1_cmd      <= use_reg;  data_t1 <= ir(2 DOWNTO 0);
       t2_cmd      <= use_acc; 
       alu_cmd     <= logic;  data_alu <= ir(6 DOWNTO 4); --"101"
       dest_cmd    <= use_acc;

  WHEN "01100010" =>   --  XRL "62"
       t1_cmd      <= direct_T;  data_t1 <= "001" ;
       t2_cmd      <= use_acc;
       alu_cmd     <= logic;  data_alu <= ir(6 DOWNTO 4); --"110"
       dest_cmd    <= same_as_t1; 
       read_latch  <= '1';

  WHEN "01100011" =>   --  XRL "63"
       t1_cmd      <= immed;  data_t1 <= "010" ;
       t2_cmd      <= direct_T;  data_t2 <= "001";  
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"110"
       dest_cmd    <= same_as_t1; 
       read_latch  <= '1';

  WHEN "01100100" =>   --  XRL "64"
       t1_cmd      <= immed;  data_t1 <= "001" ;
       t2_cmd      <= use_acc;
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"110"
       dest_cmd    <= use_acc; 

  WHEN "01100101" =>   --   XRL "65"
       t1_cmd      <= direct_T; data_t1 <= "001";   -- use byte 
       t2_cmd      <= use_acc; 
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"110"
       dest_cmd    <= use_acc;

  WHEN "01100110" | "01100111" =>   --   XRL "66" - "67"
       t1_cmd      <= indirect_T; data_t1 <= "00"&ir(0);
       t2_cmd      <= use_acc; 
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"110"
       dest_cmd    <= use_acc;

  WHEN "01101000" | "01101001" | "01101010" | "01101011" |
       "01101100" | "01101101" | "01101110" | "01101111" =>   --  XRL 68-6F
       t1_cmd      <= use_reg;  data_t1 <= ir(2 DOWNTO 0);
       t2_cmd      <= use_acc; 
       alu_cmd     <= logic;   data_alu <= ir(6 DOWNTO 4); --"110"
       dest_cmd    <= use_acc;

  WHEN "00010000" =>   --  JBC "10"
       t1_cmd      <= bit_addr;   data_t1   <= "001";
       t2_cmd      <= nothing;
       alu_cmd     <= clr_bit;    data_alu  <= mov_instr;
       use_cy      <= '0';   
       --dest_cmd    <= bit_addr;   data_dest <= "001";
       dest_cmd    <= same_as_t1;
 
  WHEN "00100000" =>   --  JB "20"     
       t1_cmd      <= bit_addr;   data_t1     <= "001";
       t2_cmd      <= nothing;
       alu_cmd     <= bit_logic;  data_alu    <= mov_instr;
       use_cy      <= '0';   
       dest_cmd    <= nothing;

  WHEN "00110000" =>   --  JNB "30"     
       t1_cmd      <= bit_addr;   data_t1 <= "001";
       t2_cmd      <= nothing;
       alu_cmd     <= cpl_bit_logic;  data_alu    <= mov_instr;
       use_cy      <= '0';   
       dest_cmd    <= nothing;

  WHEN "01000000" =>   --  JC "40"     
       t1_cmd      <= nothing; 
       t2_cmd      <= nothing;
       alu_cmd     <= bit_logic;        data_alu    <= mov_instr;
       use_cy      <= '1';
       dest_cmd    <= nothing;
 
  WHEN "01010000" =>   --  JNC "50"     
       t1_cmd      <= nothing;
       t2_cmd      <= nothing;
       alu_cmd     <= cpl_bit_logic;    data_alu    <= mov_instr;
       use_cy      <= '1';
       dest_cmd    <= nothing;

  WHEN "01100000" =>   --  JZ "60"     
       t1_cmd      <= zeros; 
       t2_cmd      <= use_acc;
       alu_cmd     <= compare_1_2;      data_alu    <= "000";
       dest_cmd    <= nothing;
 
  WHEN "01110000" =>   --  JNZ "70"     
       t1_cmd      <= zeros; 
       t2_cmd      <= use_acc;
       alu_cmd     <= pass_tmp1;       data_alu    <= "000";
       dest_cmd    <= nothing;
 
  WHEN "01110010" =>   --   ORL C, bit "72"
       t1_cmd      <= bit_addr;   data_t1 <= "001";
       t2_cmd      <= zeros; 
       alu_cmd     <= bit_logic;  data_alu <= orl_instr;
       set_cy      <= '1';
       dest_cmd    <= nothing; 
 
  WHEN "10000010" =>   --   ANL C, bit "82"
       t1_cmd      <= bit_addr;   data_t1 <= "001";
       t2_cmd      <= zeros; 
       alu_cmd     <= bit_logic;  data_alu <= anl_instr;
       set_cy      <= '1';
       dest_cmd    <= nothing;
 
  WHEN "10100000" =>   --   ORL C, /bit "A0"
       t1_cmd      <= bit_addr;   data_t1 <= "001";
       t2_cmd      <= zeros; 
       alu_cmd     <= cpl_bit_logic;  data_alu <= orl_instr;
       set_cy      <= '1';
       dest_cmd    <= nothing;
 
  WHEN "10110000" =>   --   ANL C, bit "B0"
       t1_cmd      <= bit_addr;   data_t1 <= "001";
       t2_cmd      <= zeros; 
       alu_cmd     <= cpl_bit_logic;  data_alu <= anl_instr;
       set_cy      <= '1';
       dest_cmd    <= nothing;

  WHEN "01110100" =>   --  MOV A,#data 74     
       t1_cmd      <= immed;     data_t1 <= "001"; 
       t2_cmd      <= zeros; 
       alu_cmd     <= pass_tmp1; data_alu <= "000";
       dest_cmd    <= use_acc; 

  WHEN "01110101" =>   --  MOV 75     
       t1_cmd      <= immed;     data_t1 <= "010"; 
       t2_cmd      <= zeros; 
       alu_cmd     <= pass_tmp1; 
       dest_cmd    <= direct_T;    data_dest <= "001";
 
  WHEN "01110110" | "01110111" =>   --  MOV 76-7     
       t1_cmd      <= immed;     data_t1 <= "001"; 
       t2_cmd      <= zeros; 
       alu_cmd     <= pass_tmp1;   data_alu <= "000";
       dest_cmd    <= indirect_T;  data_dest <="00"&ir(0); 

  WHEN "01111000" | "01111001" | "01111010" | "01111011" |
       "01111100" | "01111101" | "01111110" | "01111111" =>   --  MOV 78-F 
       t1_cmd      <= immed;     data_t1 <= "001"; 
       t2_cmd      <= zeros; 
       alu_cmd     <= pass_tmp1; data_alu <= "000";
       dest_cmd    <= use_reg;   data_dest <= ir(2 DOWNTO 0); 

  WHEN "10000000" =>   --  SJMP rel 80
       t1_cmd      <= zeros;
       t2_cmd      <= zeros;
       alu_cmd     <= compare_1_2;
       dest_cmd    <= nothing; 

  WHEN "10000101" =>   --  MOV direct_T, direct_T 85     
       t1_cmd      <= direct_T;    data_t1 <= "001";
       t2_cmd      <= nothing; 
       alu_cmd     <= pass_tmp1;
       dest_cmd    <= direct_T;    data_dest <= "010"; 

  WHEN "10000110" | "10000111" =>   --  MOV direct_T,ARi 86-7   
       t1_cmd      <= indirect_T;    data_t1 <= "00"&ir(0);
       t2_cmd      <= nothing; 
       alu_cmd     <= pass_tmp1;  
       dest_cmd    <= direct_T;    data_dest <= "001"; 

  WHEN "10001000" | "10001001" | "10001010" | "10001011" |
       "10001100" | "10001101" | "10001110" | "10001111" =>   --  MOV 88-F
       t1_cmd      <= use_reg;    data_t1 <= ir(2 DOWNTO 0); 
       t2_cmd      <= nothing; 
       alu_cmd     <= pass_tmp1;  
       dest_cmd    <= direct_T;    data_dest <= "001"; 

  WHEN "10010010" =>   --  MOV bit, C 92     
       t1_cmd      <= bit_addr;   data_t1 <= "001"; 
       t2_cmd      <= zeros; 
       use_cy      <= '1';
       alu_cmd     <= bit_logic;  data_alu <= mov_instr;
       --dest_cmd    <= bit_addr;   data_dest <= "001";
       dest_cmd    <= same_as_t1;
       read_latch  <= '1';
 
  WHEN "10100010" =>   --  MOV C, bit A2     
       t1_cmd      <= bit_addr;   data_t1 <= "001"; 
       t2_cmd      <= zeros; 
       alu_cmd     <= bit_logic;  data_alu <= mov_instr;
       set_cy      <= '1';
       dest_cmd    <= nothing; 

  WHEN "10110010" =>   --  CPL bit B2     
       t1_cmd      <= bit_addr;   data_t1 <= "001"; 
       t2_cmd      <= zeros; 
       alu_cmd     <= cpl_bit_logic;  data_alu <= mov_instr;
       --dest_cmd    <= bit_addr;   data_dest <= "001";
       dest_cmd    <= same_as_t1;
       read_latch  <= '1';
 
  WHEN "11000010" =>   --  CLR bit C2
       t1_cmd      <= bit_addr;   data_t1 <= "001"; 
       t2_cmd      <= zeros; 
       alu_cmd     <= clr_bit; 
       --dest_cmd    <= bit_addr;   data_dest <= "001";
       dest_cmd    <= same_as_t1;
       read_latch  <= '1';
 
  WHEN "11010010" =>   --  SET bit D2
       t1_cmd      <= bit_addr;   data_t1 <= "001"; 
       t2_cmd      <= zeros; 
       alu_cmd     <= set_bit; 
       --dest_cmd    <= bit_addr;   data_dest <= "001";
       dest_cmd    <= same_as_t1;
       read_latch  <= '1';

  WHEN "10110011" =>   --  CPL Cy 
       t1_cmd      <= zeros; 
       t2_cmd      <= zeros; 
       use_cy      <= '1';     set_cy      <= '1';
       alu_cmd     <= cpl_bit_logic;  data_alu <= mov_instr;
       dest_cmd    <= nothing;

  WHEN "11000011" =>   --  CLR Cy
       t1_cmd      <= zeros;
       t2_cmd      <= zeros; 
       use_cy      <= '1';     set_cy      <= '1';
       alu_cmd     <= clr_bit; 
       dest_cmd    <= nothing;

  WHEN "11010011" =>   --  SET Cy
       t1_cmd      <= zeros;
       t2_cmd      <= zeros; 
       use_cy      <= '1';     set_cy      <= '1';
       alu_cmd     <= set_bit; 
       dest_cmd    <= nothing;

  WHEN "10010100" =>   --  SUBB "94"
       t1_cmd      <= immed;  data_t1 <= "001" ;
       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';
       dest_cmd    <= use_acc; 

  WHEN "10010101" =>   --   SUBB "95"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -