extension: entity + splitter zur adressierung
[calu.git] / cpu / src / writeback_stage_b.vhd
index 196af9c5af85f0908ab8695db119737a8374aca9..950681389babc814d256fad2e5b9874bb865b6c9 100644 (file)
@@ -6,13 +6,16 @@ use work.common_pkg.all;
 use work.core_pkg.all;
 
 use work.mem_pkg.all;
+use work.extension_pkg.all;
 
 architecture behav of writeback_stage is
 
-
 signal data_ram_read : word_t;
 
 signal wb_reg, wb_reg_nxt : writeback_rec;
+signal ext_uart,ext_timer,ext_gpm :  extmod_rec;
+
+
 
 begin
 
@@ -118,5 +121,59 @@ begin
        reg_addr <= result_addr;
 end process;
 
+
+addr_de_mult: process(wb_reg_nxt.address)
+
+begin
+
+  ext_uart.sel <='0';
+  ext_uart.wr_en <= '0';
+  ext_uart.byte_en <= (others => '0');
+  ext_uart.data <= (others => '0');
+  ext_uart.addr <= (others => '0');
+                                                 -- wenn ich hier statt dem 4rer die konstante nehme dann gibts an fehler wegen nicht lokaler variable -.-
+ case wb_reg_nxt.address(wb_reg_nxt.address'high downto 4) is
+       when EXT_UART_ADDR => 
+               ext_uart.sel <='1';
+               ext_uart.wr_en <= wb_reg_nxt.dmem_write_en;
+               ext_uart.data <= ram_data;
+               ext_uart.addr <= wb_reg_nxt.address(wb_reg_nxt.address'high downto BYTEADDR);
+               case wb_reg.address(1 downto 0) is
+                               when "00" => ext_uart.byte_en <= "0001";
+                               when "01" => ext_uart.byte_en <= "0010";
+                               when "10" => ext_uart.byte_en <= "0100";
+                               when "11" => ext_uart.byte_en <= "1000";
+                               when others => null;
+                       end case;
+       when EXT_TIMER_ADDR => 
+               ext_timer.sel <='1';
+               ext_timer.wr_en <= wb_reg_nxt.dmem_write_en;
+               ext_timer.data <= ram_data;
+               ext_timer.addr <= wb_reg_nxt.address(wb_reg_nxt.address'high downto BYTEADDR);
+               case wb_reg.address(1 downto 0) is
+                               when "00" => ext_timer.byte_en <= "0001";
+                               when "01" => ext_timer.byte_en <= "0010";
+                               when "10" => ext_timer.byte_en <= "0100";
+                               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);
+               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 others => null;
+                       end case;
+       -- hier kann man weiter extensions adden :) Konstanten sind im extension pkg definiert 
+       when others => null;
+ end case;
+
+end process;
+
 end behav;