X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=cpu%2Fsrc%2Ffetch_stage_b.vhd;h=c975af29702992b673c6c8fce467f19ba2ceeb20;hb=250b78e68b59bb5639dba5f0f3e2b23cbe71f823;hp=b2058a7a03e2c7daed0efc173dbf966576db58e2;hpb=b333da851dda456b48f2a2535c4aeba143c657e1;p=calu.git diff --git a/cpu/src/fetch_stage_b.vhd b/cpu/src/fetch_stage_b.vhd index b2058a7..c975af2 100644 --- a/cpu/src/fetch_stage_b.vhd +++ b/cpu/src/fetch_stage_b.vhd @@ -13,11 +13,12 @@ signal instr_r_addr : instruction_addr_t; signal instr_r_addr_nxt : instruction_addr_t; signal instr_we : std_logic; signal instr_wr_data : instruction_word_t; -signal instr_rd_data : instruction_word_t; +signal instr_rd_data_rom, instr_rd_data : instruction_word_t; +signal rom_ram, rom_ram_nxt : std_logic; begin - instruction_ram : rom --r_w_ram + instruction_ram : r_w_ram --rom generic map ( PHYS_INSTR_ADDR_WIDTH, WORD_WIDTH @@ -25,12 +26,25 @@ begin port map ( clk, - instr_w_addr(PHYS_INSTR_ADDR_WIDTH-1 downto 0), + im_addr(PHYS_INSTR_ADDR_WIDTH-1 downto 0), instr_r_addr_nxt(PHYS_INSTR_ADDR_WIDTH-1 downto 0), - instr_we, - instr_wr_data, + new_im_data_in, + im_data, instr_rd_data ); + + instruction_rom : rom + generic map ( + ROM_INSTR_ADDR_WIDTH, + WORD_WIDTH + ) + + port map ( + clk, + instr_r_addr_nxt(ROM_INSTR_ADDR_WIDTH-1 downto 0), + instr_rd_data_rom + ); + syn: process(clk, reset) @@ -38,35 +52,82 @@ begin if (reset = RESET_VALUE) then instr_r_addr <= (others => '0'); + rom_ram <= ROM_USE; + led2 <= '0'; elsif rising_edge(clk) then instr_r_addr <= instr_r_addr_nxt; + rom_ram <= rom_ram_nxt; + led2 <= rom_ram; --rom_ram_nxt; end if; end process; -asyn: process(reset, instr_r_addr, jump_result, prediction_result, branch_prediction_bit, alu_jump_bit, instr_rd_data) - +asyn: process(reset, s_reset, instr_r_addr, jump_result, prediction_result, branch_prediction_bit, alu_jump_bit, instr_rd_data, rom_ram, instr_rd_data_rom, int_req) +variable instr_pc : instruction_addr_t; begin - - instruction <= instr_rd_data; - instr_r_addr_nxt <= std_logic_vector(unsigned(instr_r_addr) + 1); + rom_ram_nxt <= rom_ram; + +-- if (s_reset = RESET_VALUE) then +-- rom_ram_nxt <= RAM_USE; +-- instr_r_addr_nxt <= (others => '0'); +-- end if; + + case rom_ram is + when ROM_USE => + instruction <= instr_rd_data_rom; + when RAM_USE => + instruction <= instr_rd_data; + when others => + instruction <= x"F0000000"; + end case; + instr_pc := std_logic_vector(unsigned(instr_r_addr) + 1); + instr_r_addr_nxt <= instr_pc; + + if (instr_pc = x"0000007f" and rom_ram = ROM_USE) then + rom_ram_nxt <= RAM_USE; + -- TODO: wenn genau auf adresse 0 im RAM ein br steht kracht es... :/ + instr_r_addr_nxt <= x"00000000"; + end if; if (reset = RESET_VALUE) then instr_r_addr_nxt <= (others => '0'); end if; - if (alu_jump_bit = LOGIC_ACT) then + if (alu_jump_bit = LOGIC_ACT and int_req = IDLE) then instr_r_addr_nxt <= jump_result; instruction(31 downto 28) <= "1111"; elsif (branch_prediction_bit = LOGIC_ACT) then instr_r_addr_nxt <= prediction_result; end if; + case int_req is + when UART => + instruction(31 downto 0) <= (others => '0'); + instruction(31 downto 28) <= "1110"; + instruction(27 downto 23) <= "10110"; + instruction(PHYS_INSTR_ADDR_WIDTH + 7 - 1 downto 7) <= UART_INT_VECTOR; + instruction(6 downto 4) <= "001"; + instruction(3 downto 2) <= "01"; + instruction(1 downto 0) <= "10"; + +-- instr_r_addr_nxt <= instr_r_addr; + when others => null; + end case; + end process; -prog_cnt(10 downto 0) <= std_logic_vector(unsigned(instr_r_addr(PHYS_INSTR_ADDR_WIDTH-1 downto 0))); -prog_cnt(31 downto 11) <= (others => '0'); +out_logic : process (instr_r_addr, alu_jump_bit, int_req, jump_result) + +begin + prog_cnt(10 downto 0) <= std_logic_vector(unsigned(instr_r_addr(PHYS_INSTR_ADDR_WIDTH-1 downto 0))); + prog_cnt(31 downto 11) <= (others => '0'); + + if (int_req /= IDLE and alu_jump_bit = LOGIC_ACT ) then + prog_cnt(10 downto 0) <= jump_result(10 downto 0); + end if; + +end process; end behav;