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

📄 tmp_regs_fsm.vhd

📁 這是Originl公司出的8051 VHDL source code.
💻 VHD
字号:
---------------------------------------------------- Model        :   8051 Behavioral Model,--                  VHDL Entity mc8051.tmp_regs.interface---- Author       :   Michael Mayer (mrmayer@computer.org),--                  Dr. Hardy J. Pottinger,--                  Department of Electrical Engineering--                  University of Missouri - Rolla---- Created at   :   09/21/98 13:57:58--LIBRARY ieee ;USE ieee.std_logic_1164.all;USE ieee.numeric_std.all;LIBRARY mc8051 ;USE mc8051.cpu_pack.all;USE mc8051.synth_pack.all;ENTITY tmp_regs IS   PORT(       acc : IN     std_logic_vector( 7 DOWNTO 0 )  ;      acknow : IN     std_logic ;      alu_result : IN     std_logic_vector( 7 DOWNTO 0 )  ;      cpu_rst : IN     std_logic ;      data_dest : IN     std_logic_vector( 2 DOWNTO 0 )  ;      data_t1 : IN     std_logic_vector( 2 DOWNTO 0 )  ;      data_t2 : IN     std_logic_vector( 2 DOWNTO 0 )  ;      dest_cmd : IN     std_logic_vector( 3 DOWNTO 0 )  ;      int_clk : IN     std_logic ;      new_ir : IN     std_logic ;      rs : IN     std_logic_vector( 1 DOWNTO 0 )  ;      t1_cmd : IN     std_logic_vector( 3 DOWNTO 0 )  ;      t2_cmd : IN     std_logic_vector( 3 DOWNTO 0 )  ;      two_dests : IN     std_logic ;      addr_gb : OUT    std_logic_vector( 7 DOWNTO 0 )  ;      alu_second_result : OUT    std_logic ;      bit_loc : OUT    std_logic_vector( 2 DOWNTO 0 )  ;      cpu_done : OUT    std_logic ;      dec_rd_sp : OUT    std_logic ;      inc_wr_sp : OUT    std_logic ;      indirect_sel : OUT    std_logic ;      rd_gb : OUT    std_logic ;      rd_pmem1 : OUT    std_logic ;      rd_pmem2 : OUT    std_logic ;      tmp1 : OUT    std_logic_vector( 7 DOWNTO 0 )  ;      tmp1_done : OUT    std_logic ;      tmp2 : OUT    std_logic_vector( 7 DOWNTO 0 )  ;      wr_acc : OUT    std_logic ;      wr_gb : OUT    std_logic ;      wr_out : OUT    std_logic ;      data_gb : INOUT  std_logic_vector( 7 DOWNTO 0 )    );-- DeclarationsEND tmp_regs ;---- VHDL Architecture mc8051.tmp_regs.fsm---- Created:--          by - mrmayer.UNKNOWN (eceultra11.ece.umr.edu)--          at - 13:57:58 09/21/98---- Generated by Mentor Graphics' Renoir(TM) 3.4 (Build 18)------ what will happen if I move this line inLIBRARY ieee ;USE ieee.std_logic_1164.all;LIBRARY mc8051 ;USE mc8051.cpu_pack.all;ARCHITECTURE fsm OF tmp_regs IS   -- Architecture Declarations   SIGNAL data_tmp : std_logic_vector(2 DOWNTO 0) ;   SIGNAL t_cmd : std_logic_vector(3 DOWNTO 0) ;   SIGNAL t1_active : std_logic ;   SIGNAL t2_active : std_logic ;   SIGNAL data_reg : std_logic_vector(7 DOWNTO 0) ;   SIGNAL indir_2nd : std_logic ;   SIGNAL second_result : std_logic ;   TYPE state_type IS (      decode_state,      short,      strobe_gb,      read_gb,      alu_wait,      read2_gb,      strobe2_gb,      put_addr_dst,      output_data,      instr_done,      write_to_gb,      strobe_gb1,      read_gb1   );   -- State vector declaration   ATTRIBUTE state_vector : string;   ATTRIBUTE state_vector OF fsm : architecture IS "current_state" ;   -- Declare current and next state signals   SIGNAL current_state, next_state : state_type ;   -- Declare any pre-registered internal signals   SIGNAL bit_loc_int : std_logic_vector(2 DOWNTO 0) ;BEGIN   ----------------------------------------------------------------------------   clocked : PROCESS (      int_clk,      cpu_rst   )   ----------------------------------------------------------------------------   BEGIN      IF (cpu_rst = '1') THEN         current_state <= decode_state;         -- Reset Values         bit_loc <= "000";         data_reg <= "00000000";         data_tmp <= "000";         indir_2nd <= '0';         second_result <= '0';         t1_active <= '0';         t2_active <= '1';         t_cmd <= "0000";      ELSIF (int_clk'EVENT AND int_clk = '1') THEN         current_state <= next_state;         -- Registered output assignments         bit_loc <= bit_loc_int;         -- Default Assignment To Internals         data_reg <= data_reg;         indir_2nd <= indir_2nd;         second_result <= second_result;         t1_active <= t1_active;         t2_active <= t2_active;         -- State Actions for internal signals only         CASE current_state IS         WHEN short =>            CASE t_cmd IS   WHEN use_acc =>      data_reg <= acc;   WHEN OTHERS =>       data_reg <= "00000000";END CASE;         WHEN read_gb =>            data_reg <= data_gb;         WHEN read2_gb =>            data_reg <= data_gb;         WHEN read_gb1 =>            data_reg <= data_gb;         WHEN OTHERS =>            NULL;         END CASE;         -- Transition Actions for internal signals only         CASE current_state IS         WHEN alu_wait =>            IF (t2_active = '1') THEN               t2_active <= '0';               t1_active <= '1';            ELSIF (dest_cmd = nothing) THEN               t1_active <= '0';            ELSE               t1_active <= '0';               second_result <= '0';            END IF;         WHEN put_addr_dst =>            IF (dest_cmd = indirect_T) THEN               indir_2nd <= '1';            END IF;         WHEN output_data =>            indir_2nd <= '0';         WHEN instr_done =>            IF (new_ir = '1') THEN               t2_active <= '1';            END IF;         WHEN write_to_gb =>            IF (two_dests='1' AND second_result = '0') THEN               second_result <= '1';            END IF;         WHEN OTHERS =>            NULL;         END CASE;      END IF;   END PROCESS clocked;   ----------------------------------------------------------------------------   nextstate : PROCESS (      current_state,      data_tmp,      t_cmd,      t1_active,      t2_active,      data_reg,      indir_2nd,      second_result,      data_gb,      acc,      rs,      acknow,      alu_result,      two_dests,      dest_cmd,      data_dest,      t2_cmd,      data_t2,      data_t1,      new_ir,      t1_cmd   )   ----------------------------------------------------------------------------   BEGIN      CASE current_state IS      WHEN decode_state =>         IF (t_cmd = use_acc OR t_cmd = zeros OR t_cmd = nothing) THEN            next_state <= short;         ELSE            next_state <= strobe_gb;         END IF;      WHEN short =>            next_state <= alu_wait;      WHEN strobe_gb =>         IF (acknow = '1') THEN            next_state <= read_gb;         ELSE            next_state <= strobe_gb;         END IF;      WHEN read_gb =>         IF (t_cmd = bit_addr OR (t_cmd(3) = '1' AND t_cmd(2) = '1')) THEN            next_state <= strobe2_gb;         ELSE            next_state <= alu_wait;         END IF;      WHEN alu_wait =>         IF (t2_active = '1') THEN            next_state <= decode_state;         ELSIF (dest_cmd = nothing) THEN            next_state <= instr_done;         ELSE            next_state <= output_data;         END IF;      WHEN read2_gb =>            next_state <= alu_wait;      WHEN strobe2_gb =>         IF (acknow = '1') THEN            next_state <= read2_gb;         ELSE            next_state <= strobe2_gb;         END IF;      WHEN put_addr_dst =>         IF (dest_cmd = same_as_t1 OR dest_cmd = direct_T ORdest_cmd = use_reg OR indir_2nd = '1') THEN            next_state <= write_to_gb;         ELSIF (dest_cmd = indirect_T) THEN            next_state <= strobe_gb1;         ELSE            next_state <= put_addr_dst;         END IF;      WHEN output_data =>         IF (dest_cmd = use_acc OR dest_cmd = wr_at_sp) THEN            next_state <= write_to_gb;         ELSIF (dest_cmd = direct_T) THEN            next_state <= strobe_gb1;         ELSE            next_state <= put_addr_dst;         END IF;      WHEN instr_done =>         IF (new_ir = '1') THEN            next_state <= decode_state;         ELSE            next_state <= instr_done;         END IF;      WHEN write_to_gb =>         IF (two_dests='1' AND second_result = '0') THEN            next_state <= output_data;         ELSE            next_state <= instr_done;         END IF;      WHEN strobe_gb1 =>         IF (acknow = '1') THEN            next_state <= read_gb1;         ELSE            next_state <= strobe_gb1;         END IF;      WHEN read_gb1 =>            next_state <= put_addr_dst;      END CASE;   END PROCESS nextstate;   ----------------------------------------------------------------------------   output : PROCESS (      current_state,      data_tmp,      t_cmd,      t1_active,      t2_active,      data_reg,      indir_2nd,      second_result,      data_gb,      acc,      rs,      acknow,      alu_result,      two_dests,      dest_cmd,      data_dest,      t2_cmd,      data_t2,      data_t1,      new_ir,      t1_cmd   )   ----------------------------------------------------------------------------   BEGIN      -- Default Assignment      addr_gb <= "ZZZZZZZZ";      cpu_done <= '0';      dec_rd_sp <= 'Z';      inc_wr_sp <= 'Z';      indirect_sel <= 'Z';      rd_gb <= 'Z';      rd_pmem1 <= 'Z';      rd_pmem2 <= 'Z';      tmp1_done <= '0';      wr_acc <= 'Z';      wr_gb <= 'Z';      wr_out <= '0';      -- State Actions      CASE current_state IS      WHEN strobe_gb =>         CASE t_cmd IS   WHEN immed | direct_T | bit_addr =>      rd_pmem1 <= data_tmp(0);      rd_pmem2 <= NOT data_tmp(0);   WHEN rd_at_sp =>      dec_rd_sp <= '1';   WHEN OTHERS =>      addr_gb <= "000" & rs & data_tmp;      rd_gb <= '1';END CASE;      WHEN alu_wait =>         wr_out <= '1';      WHEN strobe2_gb =>         IF t_cmd(3) = '1' AND t_cmd(2) = '1' THEN    addr_gb <= data_reg;ELSIF data_reg(7) = '0' THEN    addr_gb <= "0010" & data_reg(6 DOWNTO 3);    bit_loc_int <= data_reg(2 DOWNTO 0);ELSE    addr_gb <= data_reg(7 DOWNTO 3) & "000";    bit_loc_int <= data_reg(2 DOWNTO 0);END IF;         rd_gb <= '1';      WHEN put_addr_dst =>         IF indir_2nd = '1' THEN   addr_gb <= data_reg;ELSE    CASE dest_cmd IS   WHEN same_as_t1 | direct_T =>        addr_gb <= data_reg;   WHEN OTHERS    =>        addr_gb <= "000"&rs&data_dest;   END CASE;END IF;      WHEN output_data =>         data_gb <= alu_result;      WHEN instr_done =>         cpu_done <= '1';      WHEN write_to_gb =>         CASE dest_cmd IS   WHEN use_acc => wr_acc <= '1';   WHEN wr_at_sp => inc_wr_sp <= '1';   WHEN OTHERS => wr_gb <= '1';END CASE;      WHEN strobe_gb1 =>         IF dest_cmd = indirect_T THEN  rd_gb <= '1';ELSE  rd_pmem1 <= data_tmp(0);  rd_pmem2 <= NOT data_tmp(0);END IF;      WHEN OTHERS =>         NULL;      END CASE;   END PROCESS output;   -- Concurrent Statementsdata_tmp <= data_t2 WHEN t2_active = '1' ELSE            data_t1 WHEN t1_active = '1' ELSE            data_dest;t_cmd    <= t2_cmd WHEN t2_active = '1' ELSE            t1_cmd WHEN t1_active = '1' ELSE            dest_cmd;alu_second_result <= second_result;END fsm;

⌨️ 快捷键说明

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