modified: interfaces according to SP operation
authorU-Thor\Schakal <Schakal@Thor.(none)>
Fri, 3 Dec 2010 12:56:16 +0000 (13:56 +0100)
committerU-Thor\Schakal <Schakal@Thor.(none)>
Sat, 11 Dec 2010 08:49:46 +0000 (09:49 +0100)
cpu/src/alu.vhd
cpu/src/alu_b.vhd
cpu/src/alu_pkg.vhd
cpu/src/core_pkg.vhd
cpu/src/core_top.vhd
cpu/src/execute_stage.vhd
cpu/src/execute_stage_b.vhd
cpu/src/extension.vhd
cpu/src/extension_b.vhd
cpu/src/extension_pkg.vhd

index e59d268cfd0ca5c605dceee83622d9c462a3d4f7..3df35c9e80b49422b1ddd50a594c7022d67a0255 100755 (executable)
@@ -17,14 +17,23 @@ entity alu is
                        op_group : in op_info_t;\r
                        left_operand : in gp_register_t;\r
                        right_operand : in gp_register_t;\r
-                        displacement : in gp_register_t;\r
+                       \r
+            displacement : in gp_register_t;\r
                        prog_cnt    : in instr_addr_t;\r
                        brpr        : in std_logic;\r
+                       \r
                        op_detail : in op_opt_t;\r
+                       \r
                        alu_state  : in alu_result_rec;\r
+                       pval            : in gp_register_t;\r
+                       \r
                        alu_result : out alu_result_rec;\r
-                        addr : out word_t; --memaddr\r
-                        data : out gp_register_t --mem data --ureg\r
+            addr : out word_t; --memaddr\r
+            data : out gp_register_t; --mem data --ureg\r
+                       \r
+                       pinc : out std_logic;\r
+                       pwr_en : out std_logic;\r
+                       paddr : out paddr_t\r
                );\r
                \r
 end alu;\r
index 696e0f798fb647394689a9e147b3e0522f0a3aa4..c46f9e5a926a1bc1ca9dd2bf4d96caf19f5e08e4 100755 (executable)
@@ -22,24 +22,24 @@ architecture behaviour of alu is
        end component exec_op;\r
        \r
        signal add_result, and_result, or_result, xor_result, shift_result : alu_result_rec;\r
-        signal left, right : gp_register_t;\r
+        signal left_o, right_o : gp_register_t;\r
        \r
 begin\r
 \r
        add_inst : entity work.exec_op(add_op)\r
-       port map(clk,reset,left, right, op_detail, alu_state, add_result);\r
+       port map(clk,reset,left_o, right_o, op_detail, alu_state, add_result);\r
        \r
        and_inst : entity work.exec_op(and_op)\r
-       port map(clk,reset,left, right, op_detail, alu_state, and_result);\r
+       port map(clk,reset,left_o, right_o, op_detail, alu_state, and_result);\r
 \r
        or_inst : entity work.exec_op(or_op)\r
-       port map(clk,reset,left, right, op_detail, alu_state, or_result);\r
+       port map(clk,reset,left_o, right_o, op_detail, alu_state, or_result);\r
 \r
        xor_inst : entity work.exec_op(xor_op)\r
-       port map(clk,reset,left, right, op_detail, alu_state, xor_result);\r
+       port map(clk,reset,left_o, right_o, op_detail, alu_state, xor_result);\r
        \r
        shift_inst : entity work.exec_op(shift_op)\r
-       port map(clk,reset,left, right, op_detail, alu_state, shift_result);\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)\r
        variable result_v : alu_result_rec;\r
@@ -54,11 +54,11 @@ begin
        \r
        res_prod := '1';\r
        mem_en := '0';\r
-        mem_op := '0';\r
+    mem_op := '0';\r
        alu_jump := '0';\r
   \r
-        left <= left_operand;\r
-        right <= right_operand;\r
+        left_o <= left_operand;\r
+        right_o <= right_operand;\r
 \r
         addr <= add_result.result;\r
         data <= right_operand;\r
@@ -124,15 +124,16 @@ begin
                         mem_op := '0';\r
                 end if;\r
                 if op_detail(ST_OPT) = '1' then\r
-                        right <= displacement;\r
+                        right_o <= displacement;\r
                         mem_en := '1';\r
                 end if;\r
        when JMP_OP =>\r
                if op_detail(JMP_REG_OPT) = '0' then\r
-                       left <= prog_cnt;\r
+                       left_o <= prog_cnt;\r
                end if;\r
                alu_jump := '1';\r
        when JMP_ST_OP => null;\r
+               \r
        end case;\r
        \r
 \r
@@ -149,7 +150,7 @@ begin
        \r
        result_v.reg_op := not(op_detail(NO_DST_OPT)) and res_prod and cond_met;\r
        result_v.mem_en := mem_en and cond_met;\r
-        result_v.mem_op := mem_op and cond_met;\r
+    result_v.mem_op := mem_op and cond_met;\r
        result_v.alu_jump := alu_jump and cond_met;\r
        result_v.brpr := brpr and nop;\r
         \r
index 7a9564e913149c6f0b4c25a407f75234b3d5c5df..57e2dc4b82b7d36a45731834e0c4ef2a614dc10c 100755 (executable)
@@ -4,23 +4,12 @@ use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;
 
 use work.common_pkg.all;
+use work.extension_pkg.all;
 --use work.core_extension.all;
 
 
 package alu_pkg is
        
-       type status_rec is record
-               zero : std_logic;
-               oflo : std_logic;
-               sign : std_logic;
-               carry : std_logic;
-       end record;
-
-       constant PADDR_WIDTH : integer := 2; 
-       type pointers_t is array(0 to 2**PADDR_WIDTH-1) of gp_register_t;
-       subtype paddr_t is std_logic_vector(PADDR_WIDTH-1 downto 0);
-       
-       subtype status_t is byte_t;
        --type alu_interal_rec is record
        --      
        --end record alu_internal_rec;
@@ -86,14 +75,23 @@ package alu_pkg is
                        op_group : in op_info_t;
                        left_operand : in gp_register_t;
                        right_operand : in gp_register_t;
-                        displacement : in gp_register_t;
-                       prog_cnt : in instr_addr_t;
-                       brpr    : in std_logic;
+                       
+            displacement : in gp_register_t;
+                       prog_cnt    : in instr_addr_t;
+                       brpr        : in std_logic;
+                       
                        op_detail : in op_opt_t;
+                       
                        alu_state  : in alu_result_rec;
+                       pval            : in gp_register_t;
+                       
                        alu_result : out alu_result_rec;
-                        addr : out word_t; --memaddr
-                        data : out gp_register_t --mem data --ureg
+            addr : out word_t; --memaddr
+            data : out gp_register_t; --mem data --ureg
+                       
+                       pinc : out std_logic;
+                       pwr_en : out std_logic;
+                       paddr : out paddr_t
                );
         end component alu;
        
index 828f61031ac21ec9b8340ff8a826b0c4135f2794..4d318708cdfd760e055dd5c922bac765ca92ca2a 100644 (file)
@@ -93,18 +93,21 @@ package core_pkg is
                        regfile_val : in gp_register_t;
                        reg_we : in std_logic;
                        reg_addr : in gp_addr_t;
-                --System output
-                        result : out gp_register_t;--reg
-                        result_addr : out gp_addr_t;--reg
-                        addr : out word_t; --memaddr
-                        data : out gp_register_t; --mem data --ureg
-                        alu_jump : out std_logic;--reg
-                        brpr  : out std_logic;  --reg
-                        wr_en : out std_logic;--regop --reg
-                        dmem  : out std_logic;--memop
-                        dmem_write_en : out std_logic;
-                        hword  : out std_logic;
-                        byte_s : out std_logic
+                       ext_reg  : in extmod_rec;
+            --System output
+            result : out gp_register_t;--reg
+            result_addr : out gp_addr_t;--reg
+            addr : out word_t; --memaddr
+            data : out gp_register_t; --mem data --ureg
+            alu_jump : out std_logic;--reg
+            brpr  : out std_logic;  --reg
+            wr_en : out std_logic;--regop --reg
+            dmem  : out std_logic;--memop
+            dmem_write_en : out std_logic;
+            hword  : out std_logic;
+            byte_s : out std_logic;
+                               
+                       ext_data_out : out gp_register_t
                );
        end component execute_stage;
 
index bb9578936f77f1307fb83f91b983ddbaf144c095..d67243c4f9e2ae16d4302c47cbe5a7892af6d3ef 100644 (file)
@@ -47,10 +47,12 @@ architecture behav of core_top is
                  signal dmem_wr_en_pin : std_logic;
                  signal hword_pin  : std_logic;
                  signal byte_s_pin : std_logic;
+                                
+                                signal gpm_in_pin : ext_mod_rec;
+                                signal gpm_out_pin : gp_register_t;
                 signal nop_pin : std_logic;
 
 
-
 begin
 
        fetch_st : fetch_stage
@@ -105,8 +107,8 @@ begin
 
           exec_st : execute_stage
                 generic map('0')
-                port map(sys_clk, sys_res,to_next_stage, reg_wr_data_pin, reg_we_pin, reg_w_addr_pin, result_pin, result_addr_pin,addr_pin,
-                data_pin, alu_jump_pin,brpr_pin, wr_en_pin, dmem_pin,dmem_wr_en_pin,hword_pin,byte_s_pin);
+                port map(sys_clk, sys_res,to_next_stage, reg_wr_data_pin, reg_we_pin, reg_w_addr_pin, gpm_in_pin, result_pin, result_addr_pin,addr_pin,
+                data_pin, alu_jump_pin,brpr_pin, wr_en_pin, dmem_pin,dmem_wr_en_pin,hword_pin,byte_s_pin, gpm_out_pin);
 
           writeback_st : writeback_stage
                 generic map('0', '1')
index afcf986d20fb60bb5c898edef34d1139309936e7..ff24942bf61e203400c937c584083cfb8cc921df 100644 (file)
@@ -4,7 +4,8 @@ use IEEE.numeric_std.all;
 
 use work.common_pkg.all;
 use work.alu_pkg.all;
-use work.gpm_pkg.all;
+use work.extension_pkg.all;
+--use work.gpm_pkg.all;
 
 entity execute_stage is
 
@@ -23,18 +24,21 @@ entity execute_stage is
                        regfile_val : in gp_register_t;
                        reg_we : in std_logic;
                        reg_addr : in gp_addr_t;
-                --System output
-                        result : out gp_register_t;--reg
-                        result_addr : out gp_addr_t;--reg
-                        addr : out word_t; --memaddr
-                        data : out gp_register_t; --mem data --ureg
-                        alu_jump : out std_logic;--reg
-                        brpr  : out std_logic;  --reg
-                        wr_en : out std_logic;--regop --reg
-                        dmem  : out std_logic;--memop
-                        dmem_write_en : out std_logic;
-                        hword  : out std_logic;
-                        byte_s : out std_logic
+                       ext_reg  : in extmod_rec;
+            --System output
+            result : out gp_register_t;--reg
+            result_addr : out gp_addr_t;--reg
+            addr : out word_t; --memaddr
+            data : out gp_register_t; --mem data --ureg
+            alu_jump : out std_logic;--reg
+            brpr  : out std_logic;  --reg
+            wr_en : out std_logic;--regop --reg
+            dmem  : out std_logic;--memop
+            dmem_write_en : out std_logic;
+            hword  : out std_logic;
+            byte_s : out std_logic;
+                               
+                       ext_data_out : out gp_register_t
                );
                
 end execute_stage;
index a7809e51786d9deb457f0458de37d3c2b74e1448..ccbfee3ed7cf7ad62fb31f172cb13d0371d2a406 100644 (file)
@@ -19,6 +19,10 @@ signal psw : status_rec;
                signal ext_gpmp :  extmod_rec;
                signal data_out    : gp_register_t;
 
+signal pval : gp_register_t;
+signal paddr : paddr_t;
+signal pinc, pwr_en : std_logic;
+
 
 
 type exec_internal is record
@@ -35,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, alu_nxt,addr,data);
+         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);
 
 
 
@@ -45,10 +49,13 @@ port map(clk, reset, condition, op_group,
                        clk,
                        reset,
                        ext_gpmp,
-                       data_out,
-                       alu_nxt,
-                       psw
-                       
+                       ext_data_out,
+                       alu_nxt.status,
+                       paddr,
+                       pinc,
+                       pwr_en,
+                       psw,
+                       pval
                );
 
 
index aa19e9d95f3fd5cc6df443d2c603039c31d7797a..27513590cefebcef231f05f9ed76f8b7be7ea898 100644 (file)
@@ -4,7 +4,7 @@ use IEEE.numeric_std.all;
 
 use work.common_pkg.all;
 use work.extension_pkg.all;
-use work.alu_pkg.all;
+--use work.alu_pkg.all;
 --use work.gpm_pkg.all;
 
 entity extension_gpm is
@@ -19,16 +19,15 @@ entity extension_gpm is
                        reset : in std_logic;
                -- general extension interface                  
                        ext_reg  : in extmod_rec;
-                       data_out : out gp_register_t;
+                        data_out : out gp_register_t;
                -- Input
-                       alu_nxt : in alu_result_rec;
+                       psw_nxt : in status_rec;
                        paddr   : in paddr_t;
                        pinc    : in std_logic;
                        pwr_en  : in std_logic;
                -- Ouput
                         psw     : out status_rec;
                         pval    : out gp_register_t
-                       
                );
                
 end extension_gpm;
index 0c18a7de2da98d6ab9b8a0348d769442436130f1..d004bbb5c8834396d985d9ee849ea325a3eeaa3a 100644 (file)
@@ -9,8 +9,11 @@ use work.mem_pkg.all;
 use work.extension_pkg.all;
 
 architecture behav of extension_gpm is
+
+type pointers_t is array( 0 to ((2**(paddr_t'length))-1)) of ext_addr_t;
+
 type gpm_internal is record
-        status : status_rec;
+    status : status_rec;
        preg : pointers_t;
 end record gpm_internal;
 
@@ -21,94 +24,94 @@ begin
 syn : process (clk, reset)
 begin
         if (reset = RESET_VALUE) then
-                reg.status <= ('0','0','0','0');
+                reg.status <= (others=>'0');
                reg.pointers <= (others => (std_logic_vector(to_unsigned(DATA_END_ADDR,DATA_ADDR_WIDTH)));
         elsif rising_edge(clk) then
                 reg <= reg_nxt;
         end if;
 end process syn;
 
-asyn : process (clk, reset, reg, alu_nxt, ext_reg, pval, pwr_en, pinc, paddr)
+asyn : process (clk, reset, reg, psw_nxt, ext_reg, pval, pwr_en, pinc, paddr)
        variable reg_nxt_v : gpm_internal;
        variable incb : gp_register_t;
        variable sel_pval : gp_register_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;
 
        psw <= reg.status;
-       data_out <= (others => '0');
+       
+       data_out_v := (others => '0');
 
-       incb := (others => '0');
        incb(0) := '1';
        if pinc = '1' then
-               incb := (others => '1');
+               incb(incb'high downto 1) := (others => '1');
+       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.psw := (ext_reg.data(0),ext_reg.data(1),ext_reg.data(3),ext_reg.data(2));
+                               reg_nxt_v.psw := (data_v(0), data_v(1), data_v(3), data_v(2));
                                psw <= reg_nxt_v.psw;
                        end if;
                when "01" =>
                        --STACK_POINTER
+                       tmp_data := (others =>'0');
+                       tmp_data(tmp_data'high downto BYTE_ADDR) := reg.preg(0);
+                       
                        if ext_reg.byte_en(0) = '1' then
-                               reg_next_v.preg(0)(byte_t'range) := ext_reg.data(byte_t'range);
+                               tmp_data(byte_t'range) := data_v(byte_t'range);
                        end if;
                        if ext_reg.byte_en(1) = '1' then
-                               reg_next_v.preg(0)((byte_t'length*2)-1 downto byte_t'length) :=
-                                       ext_reg.data((byte_t'length*2)-1 downto byte_t'length) ;
+                               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
-                               reg_next_v.preg(0)((byte_t'length*3)-1 downto byte_t'length*2) :=
-                                       ext_reg.data((byte_t'length*3)-1 downto byte_t'length*2) ;
+                               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
-                               reg_next_v.preg(0)((byte_t'length*4)-1 downto byte_t'length*3) :=
-                                       ext_reg.data((byte_t'length*4)-1 downto byte_t'length*3) ;
+                               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 BYTE_ADDR);
                when others => null;
                end case;
        end if;
-
+       
+       
        if (ext_reg.sel = '1') and wr_en = '0' then
                case ext_reg.addr(1 downto 0) is
                when "00" => 
                        if ext_reg.byte_en(0) = '1' then
-                               data_out(3 downto 0) <= (reg.status.sign, reg.status.carry, reg.status.oflo, reg.status.zero);
+                               data_out_v(3 downto 0) <= (reg.status.sign, reg.status.carry, reg.status.oflo, reg.status.zero);
                        end if;
                when "01" =>
                        --STACK_POINTER
-                       if ext_reg.byte_en(0) = '1' then
-                               data_out(byte_t'range) <= reg.preg(0)(byte_t'range);
-                       end if;
-                       if ext_reg.byte_en(1) = '1' then
-                               data_out((byte_t'length*2)-1 downto byte_t'length) <=
-                                       reg_preg(0)((byte_t'length*2)-1 downto byte_t'length) ;
-                       end if;
-                       if ext_reg.byte_en(2) = '1' then
-                               data_out((byte_t'length*3)-1 downto 2*byte_t'length) <=
-                                       reg_preg(0)((byte_t'length*3)-1 downto 2*byte_t'length) ;
-                       end if;
-                       if ext_reg.byte_en(3) = '1' then
-                               data_out((byte_t'length*4)-1 downto 3*byte_t'length) <=
-                                       reg_preg(0)((byte_t'length*4)-1 downto 3*byte_t'length) ;
-                       end if;
+                       data_out_v(data_out_v'high downto BYTE_ADDR) := reg.preg(0);
                when others => null;
                end case;
        end if;
 
 
        sel_pval := reg_nxt_v.preg(unsigned(paddr));
-       pval <= sel_pval;
+       
        if pwr_en = '1' then
                reg_nxt_v.preg(to_integer(unsigned(paddr))) := std_logic_vector(unsigned(sel_pval)+unsigned(incb));
        end if;
 
-       reg_nxt_v.status := alu_nxt.status;
+       reg_nxt_v.status := psw_nxt;
        
        reg_nxt <= reg_nxt_v;
+       data_out <= data_out_v;
+       
+       pval <= (others =>'0');
+       pval(pval'high downto BYTE_ADDR) <= sel_pval;
 end process asyn;
 
 end behav;
index daa23061e03396faad20922c138bcb5e33e2a1ce..5d3eb12d55f2744a6d250888884a68282c415f19 100644 (file)
@@ -4,19 +4,19 @@ use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;
 
 use work.common_pkg.all;
-use work.alu_pkg.all;
+--use work.alu_pkg.all;
 --use work.gpm_pkg.all;
 
 package extension_pkg is
 
 constant EXTWORDL : integer := log2c(4);
 constant BYTEADDR : integer := log2c(4);
-constant PCOUNT   : integer := log2c(4);
+constant PCOUNT   : integer := 3;
 constant EXTWORDS : integer := EXTWORDL + BYTEADDR;
 
 subtype ext_addrid_t  is std_logic_vector(gp_register_t'high - EXTWORDS downto 0);
 subtype ext_addr_t    is std_logic_vector((gp_register_t'high-BYTEADDR) downto 0);    
-subtype pointer_count is std_logic_vector(PCOUNT-1 downto 0);   
+subtype paddr_t is std_logic_vector(log2c(PCOUNT)-1 downto 0);   
 
         type extmod_rec is record
                 sel   : std_logic;
@@ -27,7 +27,12 @@ subtype pointer_count is std_logic_vector(PCOUNT-1 downto 0);
         end record; 
 
 
-
+type status_rec is record
+               zero : std_logic;
+               oflo : std_logic;
+               sign : std_logic;
+               carry : std_logic;
+end record;
 
 constant EXT_7SEG_ADDR:   ext_addrid_t := x"FFFFFFA";
 constant EXT_EXTMEM_ADDR: ext_addrid_t := x"FFFFFFB";
@@ -48,17 +53,15 @@ constant EXT_GPMP_ADDR:    ext_addrid_t := x"FFFFFFF";
                        reset : in std_logic;
                -- general extension interface                  
                        ext_reg  : in extmod_rec;
-                       data_out : out gp_register_t;
+                        data_out : out gp_register_t;
                -- Input
-                       alu_nxt : in alu_result_rec;
+                       psw_nxt : in status_rec;
                        paddr   : in paddr_t;
                        pinc    : in std_logic;
                        pwr_en  : in std_logic;
                -- Ouput
                         psw     : out status_rec;
                         pval    : out gp_register_t
-
-                       
                );
  end component extension_gpm;