📄 pm_fetch_dec.vhd
字号:
signal nret_st0 : std_logic := '0';
signal ret_st1 : std_logic := '0';
signal ret_st2 : std_logic := '0';
signal ret_st3 : std_logic := '0';
signal nreti_st0 : std_logic := '0';
signal reti_st1 : std_logic := '0';
signal reti_st2 : std_logic := '0';
signal reti_st3 : std_logic := '0';
signal brxx_st : std_logic := '0'; -- BRANCHES
signal adiw_st : std_logic := '0';
signal sbiw_st : std_logic := '0';
signal nskip_inst_st0 : std_logic := '0';
signal skip_inst_st1 : std_logic := '0';
signal skip_inst_st2 : std_logic := '0'; -- ALL SKIP INSTRUCTIONS SBRS/SBRC/SBIS/SBIC/CPSE
signal skip_inst_start : std_logic := '0';
signal nlpm_st0 : std_logic := '0';
signal lpm_st1 : std_logic := '0';
signal lpm_st2 : std_logic := '0';
signal nelpm_st0 : std_logic := '0';
signal elpm_st1 : std_logic := '0';
signal elpm_st2 : std_logic := '0';
signal nsts_st0 : std_logic := '0';
signal sts_st1 : std_logic := '0';
signal sts_st2 : std_logic := '0';
signal nlds_st0 : std_logic := '0';
signal lds_st1 : std_logic := '0';
signal lds_st2 : std_logic := '0';
signal st_st : std_logic := '0';
signal ld_st : std_logic := '0';
signal sbi_st : std_logic := '0';
signal cbi_st : std_logic := '0';
signal push_st : std_logic := '0';
signal pop_st : std_logic := '0';
-- INTERNAL STATE MACHINES
signal nop_insert_st : std_logic := '0';
signal cpu_busy : std_logic :='0';
-- INTERNAL COPIES OF OUTPUTS
signal pc_int : std_logic_vector (15 downto 0):=(others =>'0');
signal adr_int : std_logic_vector (5 downto 0):=(others =>'0');
signal iore_int : std_logic := '0';
signal iowe_int : std_logic := '0';
signal ramadr_int : std_logic_vector (15 downto 0):=(others =>'0');
signal ramre_int : std_logic := '0';
signal ramwe_int : std_logic := '0';
signal dbusout_int : std_logic_vector (7 downto 0):=(others =>'0');
-- COMMAND REGISTER
signal instruction_reg : std_logic_vector (15 downto 0):=(others =>'0'); -- OUTPUT OF THE INSTRUCTION REGISTER
signal instruction_code_reg : std_logic_vector (15 downto 0):=(others =>'0'); -- OUTPUT OF THE INSTRUCTION REGISTER WITH NOP INSERTION
signal instruction_reg_ena : std_logic := '0'; -- CLOCK ENABLE
-- IRQ INTERNAL LOGIC
signal irq_int : std_logic;
signal irq_vector_adr : std_logic_vector(15 downto 0):=(others =>'0');
signal irq_pr_encoder : std_logic_vector(6 downto 0):=(others =>'0');
-- INTERRUPT RELATING REGISTERS
signal pc_for_interrupt : std_logic_vector(15 downto 0):=(others =>'0');
-- DATA EXTRACTOR SIGNALS
signal dex_dat8_immed : std_logic_vector (7 downto 0):=(others =>'0'); -- IMMEDIATE CONSTANT (DATA) -> ANDI,ORI,SUBI,SBCI,CPI,LDI
signal dex_dat6_immed : std_logic_vector (5 downto 0):=(others =>'0'); -- IMMEDIATE CONSTANT (DATA) -> ADIW,SBIW
signal dex_adr12mem_s : std_logic_vector (11 downto 0):=(others =>'0'); -- RELATIVE ADDRESS (SIGNED) -> RCALL,RJMP
signal dex_adr6port : std_logic_vector (5 downto 0):=(others =>'0'); -- I/O PORT ADDRESS -> IN,OUT
signal dex_adr5port : std_logic_vector (4 downto 0):=(others =>'0'); -- I/O PORT ADDRESS -> CBI,SBI,SBIC,SBIS
signal dex_adr_disp : std_logic_vector (5 downto 0):=(others =>'0'); -- DISPLACEMENT FO ADDDRESS -> STD,LDD
signal dex_condition : std_logic_vector (2 downto 0):=(others =>'0'); -- CONDITION -> BRBC,BRBS
signal dex_bitnum_sreg : std_logic_vector (2 downto 0):=(others =>'0'); -- NUMBER OF BIT IN SREG -> BCLR,BSET
signal dex_adrreg_r : std_logic_vector (4 downto 0):=(others =>'0'); -- SOURCE REGISTER ADDRESS -> .......
signal dex_adrreg_d : std_logic_vector (4 downto 0):=(others =>'0'); -- DESTINATION REGISTER ADDRESS -> ......
signal dex_bitop_bitnum : std_logic_vector(2 downto 0):=(others =>'0'); -- NUMBER OF BIT FOR BIT ORIENTEDE OPERATION -> BST/BLD+SBI/CBI+SBIC/SBIS+SBRC/SBRS !! CHECKED
signal dex_brxx_offset : std_logic_vector (6 downto 0):=(others =>'0'); -- RELATIVE ADDRESS (SIGNED) -> BRBC,BRBS !! CHECKED
signal dex_adiw_sbiw_reg_adr : std_logic_vector (1 downto 0):=(others =>'0'); -- ADDRESS OF THE LOW REGISTER FOR ADIW/SBIW INSTRUCTIONS
signal dex_adrreg_d_latched : std_logic_vector (4 downto 0):=(others =>'0'); -- STORE ADDRESS OF DESTINATION REGISTER FOR LDS/STS/POP INSTRUCTIONS
signal gp_reg_tmp : std_logic_vector (7 downto 0):=(others =>'0'); -- STORE DATA FROM THE REGISTERS FOR STS,ST INSTRUCTIONS
signal cbi_sbi_io_adr_tmp : std_logic_vector (4 downto 0):=(others =>'0'); -- STORE ADDRESS OF I/O PORT FOR CBI/SBI INSTRUCTION
signal cbi_sbi_bit_num_tmp : std_logic_vector (2 downto 0):=(others =>'0'); -- STORE ADDRESS OF I/O PORT FOR CBI/SBI INSTRUCTION
-- INSTRUCTIONS DECODER SIGNALS
signal idc_adc : std_logic; -- INSTRUCTION ADC
signal idc_add : std_logic; -- INSTRUCTION ADD
signal idc_adiw : std_logic; -- INSTRUCTION ADIW
signal idc_and : std_logic; -- INSTRUCTION AND
signal idc_andi : std_logic; -- INSTRUCTION ANDI
signal idc_asr : std_logic; -- INSTRUCTION ASR
signal idc_bclr : std_logic; -- INSTRUCTION BCLR
signal idc_bld : std_logic; -- INSTRUCTION BLD
signal idc_brbc : std_logic; -- INSTRUCTION BRBC
signal idc_brbs : std_logic; -- INSTRUCTION BRBS
signal idc_bset : std_logic; -- INSTRUCTION BSET
signal idc_bst : std_logic; -- INSTRUCTION BST
signal idc_call : std_logic; -- INSTRUCTION CALL
signal idc_cbi : std_logic; -- INSTRUCTION CBI
signal idc_com : std_logic; -- INSTRUCTION COM
signal idc_cp : std_logic; -- INSTRUCTION CP
signal idc_cpc : std_logic; -- INSTRUCTION CPC
signal idc_cpi : std_logic; -- INSTRUCTION CPI
signal idc_cpse : std_logic; -- INSTRUCTION CPSE
signal idc_dec : std_logic; -- INSTRUCTION DEC
signal idc_elpm : std_logic; -- INSTRUCTION ELPM
signal idc_eor : std_logic; -- INSTRUCTION EOR
signal idc_icall : std_logic; -- INSTRUCTION ICALL
signal idc_ijmp : std_logic; -- INSTRUCTION IJMP
signal idc_in : std_logic; -- INSTRUCTION IN
signal idc_inc : std_logic; -- INSTRUCTION INC
signal idc_jmp : std_logic; -- INSTRUCTION JMP
signal idc_ld_x : std_logic; -- INSTRUCTION LD Rx,X ; LD Rx,X+ ;LD Rx,-X
signal idc_ld_y : std_logic; -- INSTRUCTION LD Rx,Y ; LD Rx,Y+ ;LD Rx,-Y
signal idc_ldd_y : std_logic; -- INSTRUCTION LDD Rx,Y+q
signal idc_ld_z : std_logic; -- INSTRUCTION LD Rx,Z ; LD Rx,Z+ ;LD Rx,-Z
signal idc_ldd_z : std_logic; -- INSTRUCTION LDD Rx,Z+q
signal idc_ldi : std_logic; -- INSTRUCTION LDI
signal idc_lds : std_logic; -- INSTRUCTION LDS
signal idc_lpm : std_logic; -- INSTRUCTION LPM
signal idc_lsr : std_logic; -- INSTRUCTION LSR
signal idc_mov : std_logic; -- INSTRUCTION MOV
signal idc_mul : std_logic; -- INSTRUCTION MUL
signal idc_neg : std_logic; -- INSTRUCTION NEG
signal idc_nop : std_logic; -- INSTRUCTION NOP
signal idc_or : std_logic; -- INSTRUCTION OR
signal idc_ori : std_logic; -- INSTRUCTION ORI
signal idc_out : std_logic; -- INSTRUCTION OUT
signal idc_pop : std_logic; -- INSTRUCTION POP
signal idc_push : std_logic; -- INSTRUCTION PUSH
signal idc_rcall : std_logic; -- INSTRUCTION RCALL
signal idc_ret : std_logic; -- INSTRUCTION RET
signal idc_reti : std_logic; -- INSTRUCTION RETI
signal idc_rjmp : std_logic; -- INSTRUCTION RJMP
signal idc_ror : std_logic; -- INSTRUCTION ROR
signal idc_sbc : std_logic; -- INSTRUCTION SBC
signal idc_sbci : std_logic; -- INSTRUCTION SBCI
signal idc_sbi : std_logic; -- INSTRUCTION SBI
signal idc_sbic : std_logic; -- INSTRUCTION SBIC
signal idc_sbis : std_logic; -- INSTRUCTION SBIS
signal idc_sbiw : std_logic; -- INSTRUCTION SBIW
signal idc_sbrc : std_logic; -- INSTRUCTION SBRC
signal idc_sbrs : std_logic; -- INSTRUCTION SBRS
signal idc_sleep : std_logic; -- INSTRUCTION SLEEP
signal idc_st_x : std_logic; -- INSTRUCTION LD X,Rx ; LD X+,Rx ;LD -X,Rx
signal idc_st_y : std_logic; -- INSTRUCTION LD Y,Rx ; LD Y+,Rx ;LD -Y,Rx
signal idc_std_y : std_logic; -- INSTRUCTION LDD Y+q,Rx
signal idc_st_z : std_logic; -- INSTRUCTION LD Z,Rx ; LD Z+,Rx ;LD -Z,Rx
signal idc_std_z : std_logic; -- INSTRUCTION LDD Z+q,Rx
signal idc_sts : std_logic; -- INSTRUCTION STS
signal idc_sub : std_logic; -- INSTRUCTION SUB
signal idc_subi : std_logic; -- INSTRUCTION SUBI
signal idc_swap : std_logic; -- INSTRUCTION SWAP
signal idc_wdr : std_logic; -- INSTRUCTION WDR
-- ADDITIONAL SIGNALS
signal idc_psinc : std_logic; -- POST INCREMENT FLAG FOR LD,ST INSTRUCTIONS
signal idc_prdec : std_logic; -- PRE DECREMENT FLAG FOR LD,ST INSTRUCTIONS
-- ##################################################
-- SREG FLAGS WRITE ENABLE SIGNALS
signal sreg_c_wr_en : std_logic := '0';
signal sreg_z_wr_en : std_logic := '0';
signal sreg_n_wr_en : std_logic := '0';
signal sreg_v_wr_en : std_logic := '0';
signal sreg_s_wr_en : std_logic := '0';
signal sreg_h_wr_en : std_logic := '0';
signal sreg_t_wr_en : std_logic := '0';
signal sreg_i_wr_en : std_logic := '0';
signal sreg_bop_wr_en : std_logic_vector (7 downto 0);
-- &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
begin
-- INSTRUCTION FETCH
instruction_reg_ena <= '1'; -- FOR TEST
instruction_fetch:process(clk,nrst)
begin
if nrst='0' then -- RESET
instruction_reg <= (others => '0');
elsif (clk='1' and clk'event) then -- CLOCK
if instruction_reg_ena='1' then -- CLOCK ENABLE
instruction_reg <= inst;
end if;
end if;
end process;
-- TOW WORDS INSTRUCTION DETECTOR (CONNECTED DIRECTLY TO THE INSTRUCTION REGISTER)
two_word_inst <= '1' when
((instruction_reg(15 downto 9)&instruction_reg(3 downto 1)="1001010111") or -- CALL
(instruction_reg(15 downto 9)&instruction_reg(3 downto 1)="1001010110")) -- JMP
else '0'; -- TO DETECT CALL OR JUMP INSTRUCTIONS FOR SBRS/SBRC/SBIS/SBIC/CPSE
-- DATA EXTRACTOR (CONNECTED DIRECTLY TO THE INSTRUCTION REGISTER)
dex_dat8_immed <= instruction_reg(11 downto 8) & instruction_reg(3 downto 0);
dex_dat6_immed <= instruction_reg(7 downto 6) & instruction_reg(3 downto 0);
dex_adr12mem_s <= instruction_reg(11 downto 0);
dex_adr6port <= instruction_reg(10 downto 9) & instruction_reg(3 downto 0);
dex_adr5port <= instruction_reg(7 downto 3);
dex_adr_disp <= instruction_reg(13) & instruction_reg(11 downto 10) & instruction_reg(2 downto 0);
dex_condition <= instruction_reg(2 downto 0);
dex_bitop_bitnum <= instruction_reg(2 downto 0); -- NUMBER(POSITION) OF TESTING BIT IN SBRC/SBRS/SBIC/SBIS INSTRUCTION
dex_bitnum_sreg <= instruction_reg(6 downto 4);
dex_adrreg_r <= instruction_reg(9) & instruction_reg(3 downto 0);
dex_adrreg_d <= instruction_reg(8 downto 4);
dex_brxx_offset <= instruction_reg(9 downto 3); -- OFFSET FOR BRBC/BRBS
dex_adiw_sbiw_reg_adr <= instruction_reg(5 downto 4); -- ADDRESS OF THE LOW REGISTER FOR ADIW/SBIW INSTRUCTIONS
--dex_adrindreg <= instruction_reg(3 downto 2);
-- LATCH Rd ADDDRESS FOR LDS/STS/POP INSTRUCTIONS
latcht_rd_adr:process(clk,nrst)
begin
if nrst ='0' then
dex_adrreg_d_latched <= (others => '0');
elsif (clk='1' and clk'event) then
if ((idc_ld_x or idc_ld_y or idc_ldd_y or idc_ld_z or idc_ldd_z) or idc_sts or
(idc_st_x or idc_st_y or idc_std_y or idc_st_z or idc_std_z)or idc_lds or
idc_pop)='1' then -- CLOCK ENABLE
dex_adrreg_d_latched <= dex_adrreg_d;
end if;
end if;
end process;
-- +++++++++++++++++++++++++++++++++++++++++++++++++
-- R24:R25/R26:R27/R28:R29/R30:R31 ADIW/SBIW ADDRESS CONTROL LOGIC
adiw_sbiw_encoder_out <= "11"&dex_adiw_sbiw_reg_adr&'0';
adiw_sbiw_high_reg_adr:process(clk,nrst)
begin
if nrst ='0' then
adiw_sbiw_encoder_mux_out <= (others=>'0');
elsif(clk='1' and clk'event) then
adiw_sbiw_encoder_mux_out <= adiw_sbiw_encoder_out +1;
end if;
end process;
-- ##########################
-- NOP INSERT STATE MACHINE
instruction_code_reg <= instruction_reg when nop_insert_st='0' else (others => '0');
--nop_insertion:process(clk,nrst)
--begin
--if nrst='0' then -- RESET
--nop_insert_st <='0';
--elsif (clk='1' and clk'event) then -- CLOCK
--end if;
--end process;
nop_insert_st <= adiw_st or sbiw_st or cbi_st or sbi_st or rjmp_st or ijmp_st or pop_st or push_st or
brxx_st or ld_st or st_st or ncall_st0 or nirq_st0 or nret_st0 or nreti_st0 or nlpm_st0 or njmp_st0 or
nrcall_st0 or nicall_st0 or nsts_st0 or nlds_st0 or nskip_inst_st0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -