X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=cpu%2Fsrc%2Fextension_b.vhd;h=bff38e9a11c80fa38e1044e0c1560f932ebde021;hb=0b3367ce6428a2e3e553fae6a7098b6f9d2ab93f;hp=46decaf833ef9e78c51a09787f9bfae85984be2f;hpb=023418808afb411268c084fbed0de10838144063;p=calu.git diff --git a/cpu/src/extension_b.vhd b/cpu/src/extension_b.vhd index 46decaf..bff38e9 100644 --- a/cpu/src/extension_b.vhd +++ b/cpu/src/extension_b.vhd @@ -34,11 +34,12 @@ end process syn; asyn : process (clk, reset, reg, psw_nxt, ext_reg, pwr_en, pinc, paddr) variable reg_nxt_v : gpm_internal; variable incb : ext_addr_t; - variable sel_pval : ext_addr_t; + variable sel_pval, sel_pval_nxt : ext_addr_t; variable data_out_v : gp_register_t; variable data_v : gp_register_t; variable tmp_data : gp_register_t; + begin reg_nxt_v := reg; data_v := ext_reg.data; @@ -53,55 +54,11 @@ begin else incb(incb'high downto 1) := (others => '0'); end if; - - if (ext_reg.sel = '1') and ext_reg.wr_en = '1' then - case ext_reg.addr(1 downto 0) is - when "00" => - if ext_reg.byte_en(0) = '1' then - reg_nxt_v.status := (data_v(0), data_v(1), data_v(3), data_v(2)); - psw <= reg_nxt_v.status; - end if; - when "01" => - --STACK_POINTER - tmp_data := (others =>'0'); - tmp_data(tmp_data'high downto BYTEADDR) := reg.preg(0); - - if ext_reg.byte_en(0) = '1' then - tmp_data(byte_t'range) := data_v(byte_t'range); - end if; - if ext_reg.byte_en(1) = '1' then - tmp_data((2*byte_t'length-1) downto byte_t'length) := data_v((2*byte_t'length-1) downto byte_t'length); - end if; - if ext_reg.byte_en(2) = '1' then - tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := data_v((3*byte_t'length-1) downto 2*byte_t'length); - end if; - if ext_reg.byte_en(3) = '1' then - tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := data_v((4*byte_t'length-1) downto 3*byte_t'length); - end if; - - reg_nxt_v.preg(0) := tmp_data(tmp_data'high downto BYTEADDR); - when others => null; - end case; - end if; - - - if (ext_reg.sel = '1') and ext_reg.wr_en = '0' then - case ext_reg.addr(1 downto 0) is - when "00" => - if ext_reg.byte_en(0) = '1' then - data_out_v(3 downto 0) := (reg.status.sign, reg.status.carry, reg.status.oflo, reg.status.zero); - end if; - when "01" => - --STACK_POINTER - data_out_v(data_out_v'high downto BYTEADDR) := reg.preg(0); - when others => null; - end case; - end if; - sel_pval:= reg_nxt_v.preg(to_integer(unsigned(paddr))); - + sel_pval:= reg_nxt_v.preg(0); + sel_pval_nxt := std_logic_vector(unsigned(sel_pval)+unsigned(incb)); if pwr_en = '1' then - reg_nxt_v.preg(to_integer(unsigned(paddr))) := std_logic_vector(unsigned(sel_pval)+unsigned(incb)); + reg_nxt_v.preg(0) := sel_pval_nxt; end if; reg_nxt_v.status := psw_nxt; @@ -111,6 +68,8 @@ begin pval <= (others =>'0'); pval(pval'high downto BYTEADDR) <= sel_pval; + pval_nxt <= (others =>'0'); + pval_nxt(pval'high downto BYTEADDR) <= sel_pval_nxt; end process asyn; end behav;