?? control_fsm_rtl.vhd
字號:
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 + -