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

📄 control_fsm_rtl.vhd

📁 8051核的vhdl原代码。
💻 VHD
📖 第 1 页 / 共 5 页
字号:
              s_nextstate <= EXEC1;            elsif state=EXEC1 then              alu_cmd_o <= ADDC_ACC_ROM;-- addition command (ACC+ROM_DATA_I+CY)              s_data_mux <= "0011";     -- data = aludata_i              s_regs_wr_en <= "011";    -- write ACC and CY,OV,AC              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_AJMP =>               -- AJMP addr11            if state=FETCH then              s_help16_en <= "10";      -- s_help16 = pc+2              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              s_pc_inc_en <= "0100";    -- load PC with 11 bits (2k block)              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_ANL_A_RR =>           -- ANL A,Rr            if state=FETCH then              s_adr_mux <= "0110";      -- adress = RR-adress              s_nextstate <= EXEC1;            elsif state=EXEC1 then              alu_cmd_o <= AND_ACC_RAM; -- AND command (ACC ^ RAM_DATA)              s_data_mux <= "0011";     -- data = aludata_i              s_regs_wr_en <= "010";    -- write ACC              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_ANL_A_D =>            -- ANL A, direct            if state=FETCH then              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              s_adr_mux <= "1000";      -- address = rom_data_i              s_nextstate <= EXEC2;            elsif state=EXEC2 then              alu_cmd_o <= AND_ACC_RAM; -- AND command (ACC ^ RAM_DATA)              s_data_mux <= "0011";     -- data = aludata_i              s_regs_wr_en <= "010";    -- write ACC              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_ANL_A_ATRI =>          -- ANL A,ATRi            if state=FETCH then              s_adr_mux <= "0111";       -- address = Ri-register              s_nextstate <= EXEC1;            elsif state=EXEC1 then              alu_cmd_o <= AND_ACC_RAM;  -- AND command (ACC ^ RAM_DATA)              s_data_mux <= "0011";      -- data = aludata_i              s_regs_wr_en <= "010";     -- write ACC              s_pc_inc_en <= "0001";     -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_ANL_A_DATA =>          -- ANL A, data            if state=FETCH then              s_pc_inc_en <= "0001";     -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              alu_cmd_o <= AND_ACC_ROM;   -- AND command (ACC ^ ROM_DATA_I)              s_data_mux <= "0011";       -- data = aludata_i              s_regs_wr_en <= "010";      -- write ACC              s_pc_inc_en <= "0001";      -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_ANL_D_A =>            -- ANL direct, A            if state=FETCH then              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              s_adr_mux <= "1000";      -- adress = rom_data_i              s_nextstate <= EXEC2;            elsif state=EXEC2 then              alu_cmd_o <= AND_ACC_RAM;  -- AND command (ACC ^ RAM_DATA)              s_adr_mux <= "1000";       -- adress = rom_data_i              s_data_mux <= "0011";      -- data = aludata_i              s_regs_wr_en <= "100";     -- write one byte              s_pc_inc_en <= "0001";     -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_ANL_D_DATA =>         -- ANL direct, DATA            if state=FETCH then              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              s_help_en <= "0001";      -- help = rom_data_i              s_adr_mux <= "1000";      -- adress = rom_data_i              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC2;            elsif state=EXEC2 then              alu_cmd_o <= AND_RAM_ROM;  -- AND command (ROM_DATA_I ^ RAM_DATA)              s_adr_mux <= "1010";       -- adress = help              s_data_mux <= "0011";      -- data = aludata_i              s_regs_wr_en <= "100";     -- write one byte              s_pc_inc_en <= "0001";     -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_ANL_C_BIT =>          -- ANL C, bit            if state=FETCH then              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              s_adr_mux <= "1000";      -- adress = rom_data_i              s_nextstate <= EXEC2;            elsif state=EXEC2 then              s_bdata_mux <= "0001";    -- bdata = s_bit_data and cy              s_regs_wr_en <= "110";    -- write one bit (automatic CY-address)              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_ANL_C_NBIT =>         -- ANL C, /bit            if state=FETCH then              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              s_adr_mux <= "1000";      -- adress = rom_data_i              s_nextstate <= EXEC2;            elsif state=EXEC2 then              s_bdata_mux <= "0010";    -- bdata = not (s_bit_data and cy)              s_regs_wr_en <= "110";    -- write one bit (automatic CY-address)              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_CJNE_A_D =>           -- CJNE A, direct, rel            if state=FETCH then              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              s_adr_mux <= "1000";      -- address = rom_data_i              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC2;            elsif state=EXEC2 then              alu_cmd_o <= COMP_RAM_ACC;  -- Compare RAM_DATA/ACC operation              if unsigned(aludata_i) /= 0 then                s_adr_mux <= "1011";      -- adress of CY                s_bdata_mux <= "0011";    -- bdata = cby_i                s_regs_wr_en <= "110";    -- write one bit                s_pc_inc_en <= "0010";    -- add relativ adress to PC              else                s_pc_inc_en <= "0001";    -- increment program-counter              end if;              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_CJNE_A_DATA =>        -- CJNE A, #data, rel            if state=FETCH then              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              alu_cmd_o <= COMP_ROM_ACC; -- Compare ROM_DATA_I/ACC operation              s_help_en <= "0010";              s_helpb_en <= '1';         -- save new_cy_i              s_pc_inc_en <= "0001";     -- increment program-counter              s_nextstate <= EXEC2;            elsif state=EXEC2 then              if s_help /= 0 then                s_adr_mux <= "1011";     -- adress of CY                s_bdata_mux <= "0100";   -- bdata = s_helpb                s_regs_wr_en <= "110";   -- write one bit                s_pc_inc_en <= "0010";   -- add relativ adress to PC              else                s_pc_inc_en <= "0001";   -- increment program-counter              end if;              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_CJNE_RR_DATA =>        -- CJNE RR, #data, rel            if state=FETCH then              s_adr_mux <= "0110";       -- address = rr-address              s_pc_inc_en <= "0001";     -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              alu_cmd_o <= COMP_ROM_RAM;-- Compare ROM_DATA_I/RAM_DATA operat.              s_help_en <= "0010";      -- save aludata_i              s_helpb_en <= '1';        -- save new_cy_i              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC2;            elsif state=EXEC2 then              if s_help /= 0 then                s_adr_mux <= "1011";     -- adress of CY                s_bdata_mux <= "0100";   -- bdata = s_helpb                s_regs_wr_en <= "110";   -- write one bit                s_pc_inc_en <= "0010";   -- add relativ adress to PC              else                s_pc_inc_en <= "0001";   -- increment program-counter              end if;              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_CJNE_ATRI_DATA =>       -- CJNE @Ri, #data, rel            if state=FETCH then              s_adr_mux <= "0111";        -- address = Ri-register              s_pc_inc_en <= "0001";      -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              alu_cmd_o <= COMP_ROM_RAM;  -- Compare ROM_/RAM_DATA operation              s_help_en <= "0010";        -- save aludata_i              s_helpb_en <= '1';          -- save new_cy_i              s_pc_inc_en <= "0001";      -- increment program-counter              s_nextstate <= EXEC2;            elsif state=EXEC2 then              if s_help /= 0 then                s_adr_mux <= "1011";     -- adress of CY                s_bdata_mux <= "0100";   -- bdata = s_helpb                s_regs_wr_en <= "110";   -- write one bit                s_pc_inc_en <= "0010";   -- add relativ adress to PC              else                s_pc_inc_en <= "0001";   -- increment program-counter              end if;              s_nextstate <= FETCH;            end if;          ---------------------------------------------------------------------          when IC_CLR_A =>              -- CLR A            s_data_mux <= "0000";       -- data = 0            s_regs_wr_en <= "010";      -- write ACC            s_pc_inc_en <= "0001";      -- increment program-counter            s_nextstate <= FETCH;          ---------------------------------------------------------------------          when IC_CLR_C =>              -- CLR C            s_adr_mux <= "1011";        -- adress of CY            s_bdata_mux <= "0000";      -- bdata = 0            s_regs_wr_en <= "110";      -- write one bit            s_pc_inc_en <= "0001";      -- increment program-counter            s_nextstate <= FETCH;          ---------------------------------------------------------------------          when IC_CLR_BIT =>            -- CLR bit            if state=FETCH then              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= EXEC1;            elsif state=EXEC1 then              s_adr_mux <= "1000";      -- address = rom_data_i              s_bdata_mux <= "0000";    -- bdata = 0              s_regs_wr_en <= "110";    -- write one bit              s_pc_inc_en <= "0001";    -- increment program-counter              s_nextstate <= FETCH;            end if;

⌨️ 快捷键说明

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