return added
authorMarkus Hofstätter <markus.hofstaetter@gmx.net>
Sat, 11 Dec 2010 11:22:47 +0000 (12:22 +0100)
committerMarkus Hofstätter <markus.hofstaetter@gmx.net>
Sat, 11 Dec 2010 11:22:47 +0000 (12:22 +0100)
cpu/src/alu.vhd
cpu/src/alu_b.vhd
cpu/src/alu_pkg.vhd
cpu/src/execute_stage_b.vhd
cpu/src/extension.vhd
cpu/src/extension_b.vhd
cpu/src/extension_pkg.vhd

index 4d2e74782873112374ab3a230d4ce327c8c86b09..df26eb15e34b5b1b67b2474aadacb9c6ae8922b9 100755 (executable)
@@ -27,6 +27,7 @@ entity alu is
                        \r
                        alu_state  : in alu_result_rec;\r
                        pval            : in gp_register_t;\r
+                       pval_nxt    : in gp_register_t;\r
                        \r
                        alu_result : out alu_result_rec;\r
             addr : out word_t; --memaddr\r
index de8980d67866bc865dac894842392ba651093736..60d33530cd242e702820d210d48013b33f2efcb9 100755 (executable)
@@ -41,7 +41,7 @@ begin
        shift_inst : entity work.exec_op(shift_op)\r
        port map(clk,reset,left_o, right_o, op_detail, alu_state, shift_result);\r
 \r
-calc: process(left_operand, right_operand,displacement, cond, op_group, op_detail ,alu_state,and_result,add_result,or_result,xor_result,shift_result, prog_cnt,brpr, pval)\r
+calc: process(left_operand, right_operand,displacement, cond, op_group, op_detail ,alu_state,and_result,add_result,or_result,xor_result,shift_result, prog_cnt,brpr, pval, pval_nxt)\r
        variable result_v : alu_result_rec;\r
        variable res_prod : std_logic;\r
        variable cond_met : std_logic;\r
@@ -152,9 +152,12 @@ begin
                \r
                addr <= pval;\r
                data <= prog_cnt_nxt;\r
-               -- if(op_detail(RET_OPT) = '1' then\r
-                       -- null;\r
-               -- end if;\r
+               if op_detail(RET_OPT) = '1' then\r
+                       addr <= pval_nxt;\r
+                       mem_en := '0';\r
+                       pinc_v := '0';\r
+                       res_prod := '0';\r
+               end if;\r
                \r
        end case;\r
        \r
index 57e2dc4b82b7d36a45731834e0c4ef2a614dc10c..2019e83d2cfe926cabd5295f66323a023ed1eed6 100755 (executable)
@@ -84,6 +84,7 @@ package alu_pkg is
                        
                        alu_state  : in alu_result_rec;
                        pval            : in gp_register_t;
+                       pval_nxt   : in gp_register_t;
                        
                        alu_result : out alu_result_rec;
             addr : out word_t; --memaddr
index f2c2dc2a98341f59583b3fe81d138e1bf66b8d98..7221e60a0da726e5d314c313ba4eacc1a91f902f 100644 (file)
@@ -19,7 +19,7 @@ signal psw : status_rec;
                signal ext_gpmp :  extmod_rec;
                signal data_out    : gp_register_t;
 
-signal pval : gp_register_t;
+signal pval, pval_nxt : gp_register_t;
 signal paddr : paddr_t;
 signal pinc, pwr_en : std_logic;
 
@@ -39,7 +39,7 @@ begin
 
 alu_inst : alu
 port map(clk, reset, condition, op_group, 
-         left_operand, right_operand, dec_instr.displacement, dec_instr.prog_cnt, dec_instr.brpr, op_detail, alu_state, pval, alu_nxt,addr,data, pinc, pwr_en, paddr);
+         left_operand, right_operand, dec_instr.displacement, dec_instr.prog_cnt, dec_instr.brpr, op_detail, alu_state, pval, pval_nxt, alu_nxt,addr,data, pinc, pwr_en, paddr);
 
 
 
@@ -55,7 +55,8 @@ port map(clk, reset, condition, op_group,
                        pinc,
                        pwr_en,
                        psw,
-                       pval
+                       pval,
+                       pval_nxt
                );
 
 
index 27513590cefebcef231f05f9ed76f8b7be7ea898..f37f3caa21112967db5b5270351480fc58140496 100644 (file)
@@ -27,7 +27,8 @@ entity extension_gpm is
                        pwr_en  : in std_logic;
                -- Ouput
                         psw     : out status_rec;
-                        pval    : out gp_register_t
+                        pval    : out gp_register_t;
+                        pval_nxt : out gp_register_t
                );
                
 end extension_gpm;
index 46decaf833ef9e78c51a09787f9bfae85984be2f..8ccd6ea2c8edfaed929164d42285c1947d63ecbb 100644 (file)
@@ -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;
@@ -99,9 +100,9 @@ begin
        end if;
 
        sel_pval:= reg_nxt_v.preg(to_integer(unsigned(paddr)));
-       
+       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(to_integer(unsigned(paddr))) := sel_pval_nxt;
        end if;
 
        reg_nxt_v.status := psw_nxt;
@@ -111,6 +112,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;
index 5d3eb12d55f2744a6d250888884a68282c415f19..ba4aec5a8b079ded3c26dec7dd999c1a7cc687aa 100644 (file)
@@ -61,7 +61,8 @@ constant EXT_GPMP_ADDR:    ext_addrid_t := x"FFFFFFF";
                        pwr_en  : in std_logic;
                -- Ouput
                         psw     : out status_rec;
-                        pval    : out gp_register_t
+                        pval    : out gp_register_t;
+                        pval_nxt : out gp_register_t
                );
  end component extension_gpm;