vcom -work work ../src/gpm.vhd
vcom -work work ../src/gpm_b.vhd
+vcom -work work ../src/extension_pkg.vhd
+vcom -work work ../src/extension.vhd
+vcom -work work ../src/extension_b.vhd
+
vcom -work work ../src/execute_stage.vhd
vcom -work work ../src/execute_stage_b.vhd
vcom -work work ../src/gpm.vhd
vcom -work work ../src/gpm_b.vhd
+vcom -work work ../src/extension_pkg.vhd
+vcom -work work ../src/extension.vhd
+vcom -work work ../src/extension_b.vhd
+
vcom -work work ../src/execute_stage.vhd
vcom -work work ../src/execute_stage_b.vhd
add wave -group writebackstageregister -radix hexadecimal /pipeline_tb/writeback_st/reg_addr
add wave -group writebackstageregister -radix hexadecimal /pipeline_tb/writeback_st/regfile_val
+
+
run 5000 ns
signal hword_pin : std_logic;
signal byte_s_pin : std_logic;
signal nop_pin : std_logic;
+ -- extension signals
+ signal ext_gpmp : extmod_rec;
+ signal pointer : pointer_count;
+ signal dec_in,p_en : std_logic;
+ signal data_out : gp_register_t;
+ signal pointer_val : gp_register_t;
begin
wr_en_pin, dmem_pin, dmem_wr_en_pin, hword_pin, byte_s_pin,
reg_wr_data_pin, reg_we_pin, reg_w_addr_pin, jump_result_pin, alu_jump_bit_pin);
+
+ gpmp_inst : extension
+ generic map ('0')
+ port map (
+ sys_clk,
+ sys_reset,
+ ext_gpmp,
+ pointer,
+ dec_in,
+ p_en,
+ data_out,
+ pointer_val
+
+ );
+
--init : process(all)
use work.common_pkg.all;
use work.alu_pkg.all;
use work.gpm_pkg.all;
+use work.extension_pkg.all;
architecture behav of execute_stage is
signal alu_state, alu_nxt : alu_result_rec;
signal psw : status_rec;
+
type exec_internal is record
result : gp_register_t;
res_addr : gp_addr_t;
generic map(RESET_VALUE)
port map(clk,reset,alu_nxt,psw);
+
+
+
+
syn: process(clk, reset)
begin
generic (
-- active reset value
- RESET_VALUE : std_logic;
+ RESET_VALUE : std_logic
);
port(
--System inputs
constant EXT_TIMER_ADDR: ext_addrid_t := x"FFFFFFC";
constant EXT_AC97_ADDR: ext_addrid_t := x"FFFFFFD";
constant EXT_UART_ADDR: ext_addrid_t := x"FFFFFFE";
-constant EXT_GPM_ADDR: ext_addrid_t := x"FFFFFFF";
-
-
+constant EXT_GPMP_ADDR: ext_addrid_t := x"FFFFFFF";
+
+ component extension is
+ --some modules won't need all inputs/outputs
+ generic (
+ -- active reset value
+ RESET_VALUE : std_logic
+ );
+ port(
+ --System inputs
+ clk : in std_logic;
+ reset : in std_logic;
+ -- Input
+ ext_reg : in extmod_rec;
+ pointer : in pointer_count;
+ dec_inc : in std_logic;
+ p_en : in std_logic;
+ -- Ouput
+ data_out : out gp_register_t;
+ pointer_val : out gp_register_t
+
+ );
+ end component extension;
use work.common_pkg.all;
use work.core_pkg.all;
+use work.extension_pkg.all;
-------------------------------------------------------------------------------
-- ENTITY
-------------------------------------------------------------------------------
signal hword_pin : std_logic;
signal byte_s_pin : std_logic;
signal nop_pin : std_logic;
+ -- extension signals
+ signal ext_gpmp : extmod_rec;
+ signal pointer : pointer_count;
+ signal dec_in,p_en : std_logic;
+ signal data_out : gp_register_t;
+ signal pointer_val : gp_register_t;
begin
reg_wr_data_pin, reg_we_pin, reg_w_addr_pin, jump_result_pin, alu_jump_bit_pin);
+ gpmp_inst : extension
+ generic map ('0')
+ port map (
+ sys_clk_pin,
+ sys_res_n_pin,
+ ext_gpmp,
+ pointer,
+ dec_in,
+ p_en,
+ data_out,
+ pointer_val
+
+ );
+
+
+
nop_pin <= (alu_jump_bit_pin xor brpr_pin);
-------------------------------------------------------------------------------
signal data_ram_read : word_t;
signal wb_reg, wb_reg_nxt : writeback_rec;
-signal ext_uart,ext_timer,ext_gpm : extmod_rec;
+
+signal ext_uart,ext_timer,ext_gpmp : extmod_rec;
data_ram_read
);
-
+
syn: process(clk, reset)
begin
when "11" => ext_timer.byte_en <= "1000";
when others => null;
end case;
- when EXT_GPM_ADDR =>
- ext_gpm.sel <='1';
- ext_gpm.wr_en <= wb_reg_nxt.dmem_write_en;
- ext_gpm.data <= ram_data;
- ext_gpm.addr <= wb_reg_nxt.address(wb_reg_nxt.address'high downto BYTEADDR);
+ when EXT_GPMP_ADDR =>
+ ext_gpmp.sel <='1';
+ ext_gpmp.wr_en <= wb_reg_nxt.dmem_write_en;
+ ext_gpmp.data <= ram_data;
+ ext_gpmp.addr <= wb_reg_nxt.address(wb_reg_nxt.address'high downto BYTEADDR);
case wb_reg.address(1 downto 0) is
- when "00" => ext_gpm.byte_en <= "0001";
- when "01" => ext_gpm.byte_en <= "0010";
- when "10" => ext_gpm.byte_en <= "0100";
- when "11" => ext_gpm.byte_en <= "1000";
+ when "00" => ext_gpmp.byte_en <= "0001";
+ when "01" => ext_gpmp.byte_en <= "0010";
+ when "10" => ext_gpmp.byte_en <= "0100";
+ when "11" => ext_gpmp.byte_en <= "1000";
when others => null;
end case;
-- hier kann man weiter extensions adden :) Konstanten sind im extension pkg definiert