📄 control_fsm.vhd
字号:
s_pc_inc_en <= "0001"; -- increment program-counter
s_nextstate <= FETCH;
end if;
---------------------------------------------------------------------
when IC_ADDC_A_DATA => -- ADDC A, data
if state=FETCH then
s_pc_inc_en <= "0001"; -- increment program-counter
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -