Adapt bos2k9_t to sd_host_t.
[bos2k9.git] / bos2k9_mmu.vhd
1 -----------------------------------------------------------------------
2 -- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
3 --
4 -- A simple shift register with separate read and write addresses
5 -- around a single 512 Byte M5K block implemented in the
6 -- MegaWizard generated entity `mf_block_ram'.
7 --
8 -- Input data applied to `write_data` is latched in by a high signal
9 -- `write_next`.  The current `write_addr` is increased by one.
10 --
11 -- Output data at the current `read_addr` can be read via `read_data`.
12 --
13 -- Writing to and reading from the same address will result in the old 
14 -- data.
15 --
16 -----------------------------------------------------------------------
17
18 library ieee;
19 use ieee.std_logic_1164.all;
20 use ieee.numeric_std.all;
21
22 library fhw_tools;
23 use fhw_tools.types.all;
24
25 use work.bos2k9_globals.all;
26
27 entity bos2k9_mmu is
28   port(
29     clock : in  std_logic;
30     reset : in  std_logic;
31     
32     write_next : in  std_logic;
33     write_addr : out std_logic_byte_address_t;
34     write_data : in  std_logic_byte_t;
35     
36     read_addr : in  std_logic_byte_address_t;
37     read_data : out std_logic_byte_t);
38 end bos2k9_mmu;
39
40 -----------------------------------------------------------------------
41
42 architecture rtl of bos2k9_mmu is
43   component mf_block_ram is
44     port(
45       clock : in  std_logic;
46       wraddress : in  std_logic_byte_address_t;
47       wren      : in  std_logic;
48       data      : in  std_logic_byte_t;
49       rdaddress : in  std_logic_byte_address_t;
50       q         : out std_logic_byte_t);
51   end component;
52   signal write_addr_s : std_logic_byte_address_t;
53   signal write_enab_s : std_logic;
54 begin
55   write_addr <= write_addr_s;
56   shifter : process(clock, reset, write_next)
57   begin
58     if reset = '1' then
59       write_enab_s <= '0';
60       write_addr_s <= (others => '0');
61     elsif rising_edge(clock) then
62       if write_next = '1' then
63         write_enab_s <= '1';
64       elsif write_enab_s = '1' then
65         write_enab_s <= '0';
66         if not (unsigned(write_addr_s) = 511) then
67           write_addr_s <= std_logic_vector(unsigned(write_addr_s) + 1);
68         else
69           write_addr_s <= (others => '0');
70         end if;
71       end if;
72     end if;
73   end process;
74   ram : mf_block_ram port map(
75     clock => clock,
76     wraddress => write_addr_s,
77     wren      => write_enab_s,
78     data      => write_data,
79     rdaddress => read_addr,
80     q         => read_data);
81 end rtl;