📄 controlfsm.vhd.bak
字号:
LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;ENTITY ControlFSM ISPORT (clk, rst_n : IN std_ulogic;instr_31_26 : IN std_ulogic_vector(5 downto 0);RegDst, RegWrite, ALUSrcA, MemRead, MemWrite, MemtoReg, IorD, IRWrite, PCWrite,PCWriteCond : OUT std_ulogic;ALUOp, ALUSrcB, PCSource : OUT std_ulogic_vector(1 downto 0));END ControlFSM;ARCHITECTURE behave OF ControlFSM IS--------------------------------------------------------------------------------- Definition of the state namesTYPE state_type IS (InstDec, MemAddComp, MemAccL, MemReadCompl, MemAccS, Exec, RCompl,BranchCompl, JumpCompl, ErrState, InstFetch);SIGNAL state, next_state : state_type;BEGIN--------------------------------------------------------------------------------- State processstate_reg : PROCESS(clk, rst_n)BEGINIF rst_n = '0' THENstate <= InstFetch;ELSIF RISING_EDGE(clk) THENstate <= next_state;END IF;END PROCESS;--------------------------------------------------------------------------------- Logic Processlogic_process : PROCESS(state, instr_31_26)-- RegDst RegWrite ALUSrcA MemRead MemWrite MemtoReg IorD IRWrite PCWrite PCWriteCond--10x1bit-- ALUOp ALUSrcB PCSource--3x2bitVARIABLE control_signals : std_ulogic_vector(15 downto 0);-- Defintion of Constants for the value of the Inst_Funct_FieldConstant LOADWORD : std_ulogic_vector(5 Downto 0) := "100011";Constant STOREWORD : std_ulogic_vector(5 Downto 0) := "101011";Constant RTYPE : std_ulogic_vector(5 Downto 0) := "000000";Constant BEQ : std_ulogic_vector(5 Downto 0) := "000100";Constant JMP : std_ulogic_vector(5 Downto 0) := "000010";BEGINCASE state IS-- Instruction FetchWHEN InstFetch =>control_signals := "0001000110000100";next_state <= InstDec;-- Instruction Decode and Register FetchWHEN InstDec =>control_signals := "0000000000001100";IF instr_31_26 = LOADWORD OR instr_31_26 = STOREWORD THENnext_state <= MemAddComp;ELSIF instr_31_26 = RTYPE THENnext_state <= Exec;ELSIF instr_31_26 = BEQ THENnext_state <= BranchCompl;ELSIF instr_31_26 = JMP THENnext_state <= JumpCompl;ELSEnext_state <= ErrState;END IF;-- Memory Address ComputationWHEN MemAddComp =>control_signals := "0010000000001000";if instr_31_26 = LOADWORD THENnext_state <= MemAccL;ELSIF instr_31_26 = STOREWORD THENnext_state <= MemAccS;ELSEnext_state <= ErrState;END IF;-- Memory Access Load WordWHEN MemAccL =>control_signals := "0011001000001000";next_state <= MemReadCompl;-- Memory Read CompletionWHEN MemReadCompl =>control_signals := "0110010000001000";next_state <= InstFetch;-- Memory Access Store WordWHEN MemAccS =>control_signals := "0010101000001000";next_state <= InstFetch;-- ExecutionWHEN Exec =>control_signals := "0010000000100000";next_state <= RCompl;-- R-type CompletionWHEN RCompl =>control_signals := "1110000000100000";next_state <= InstFetch;-- Branch CompletionWHEN BranchCompl =>control_signals := "0010000001010001";next_state <= InstFetch;-- Jump CompletionWHEN JumpCompl =>control_signals := "0000000010001110";next_state <= InstFetch;WHEN OTHERS =>control_signals := (others => 'X');next_state <= ErrState;END case;RegDst <= control_signals(15);RegWrite <= control_signals(14);ALUSrcA <= control_signals(13);MemRead <= control_signals(12);MemWrite <= control_signals(11);MemtoReg <= control_signals(10);IorD <= control_signals(9);IRWrite <= control_signals(8);PCWrite <= control_signals(7);PCWriteCond <= control_signals(6);ALUOp <= control_signals(5 downto 4);ALUSrcB <= control_signals(3 downto 2);PCSource <= control_signals(1 downto 0);END process;END behave;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -