Make the pump a drop-in replacement for ser_send.
[bos2k9.git] / bos2k9_pump.vhd
1 -----------------------------------------------------------------------
2 -- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
3 --
4 -- TODO
5 --
6 -----------------------------------------------------------------------
7
8 library ieee;
9 use ieee.std_logic_1164.all;
10 use ieee.numeric_std.all;
11
12 library fhw_tools;
13 use fhw_tools.types.all;
14
15 use work.bos2k9_globals.all;
16
17 entity bos2k9_pump is
18   generic(
19     clock_divider  : positive;
20     parity_enabled : std_logic := '1');
21   port(
22     clock : in  std_logic;
23     reset : in  std_logic;
24     
25     txn : in  std_logic;
26     txd : in  std_logic_byte_t;
27     txb : out std_logic;
28     tx  : out std_logic);
29 end bos2k9_pump;
30
31 -----------------------------------------------------------------------
32
33 architecture rtl of bos2k9_pump is
34      component rs232_send is
35     generic(
36       clock_divider  : positive  := clock_divider;
37       parity_enabled : std_logic := parity_enabled);
38     port(
39       clk : in  std_logic;
40       rst : in  std_logic;
41       
42       tx  : out std_logic;
43       txd : in  std_logic_byte_t;
44       txn : in  std_logic;
45       txb : out std_logic);
46    end component;
47  
48    component bos2k9_mmu is
49     port(
50       clock : in  std_logic;
51       reset : in  std_logic;
52     
53       write_next : in  std_logic;
54       write_addr : out std_logic_byte_address_t;
55       write_data : in  std_logic_byte_t;
56     
57       read_addr : in  std_logic_byte_address_t;
58       read_data : out std_logic_byte_t);
59   end component;
60
61   signal busy_s : std_logic;
62   
63   signal sout_s : std_logic_byte_t;
64   signal strg_s : std_logic;
65   signal sbsy_s : std_logic;
66
67   signal iaddr_s : std_logic_byte_address_t;
68   signal inull_s : std_logic;
69   signal oaddr_s : std_logic_byte_address_t;
70   signal onull_s : std_logic;
71 begin
72
73   txb <= busy_s;
74
75   busyman : process(clock, reset)
76   begin
77     if reset = '1' then
78       busy_s <= '0';
79     elsif rising_edge(clock) then
80       -- Hold busy line until all data was shifted out.
81       -- Assumption:  foo
82       busy_s <= txn
83              or sbsy_s
84              or (not onull_s and not inull_s);
85     end if;
86   end process;
87
88   null_net : process(iaddr_s, oaddr_s)
89     variable inull_v : std_logic;
90     variable onull_v : std_logic;
91   begin
92     inull_v := '1';
93     onull_v := '1';
94     for i in std_logic_byte_address_t'range loop
95       inull_v := inull_v and not iaddr_s(i);
96       onull_v := onull_v and not oaddr_s(i);
97     end loop;
98     inull_s <= inull_v;
99     onull_s <= onull_v;
100   end process;
101   
102   ser_io : rs232_send port map(
103     clk => clock,
104     rst => reset,
105     
106     tx  => tx,
107     txd => sout_s,
108     txn => strg_s,
109     txb => sbsy_s);
110   mmu : bos2k9_mmu port map(
111     clock => clock,
112     reset => reset,
113     write_next => txn,
114     write_addr => iaddr_s,
115     write_data => txd,
116     read_addr  => oaddr_s,
117     read_data  => sout_s);
118 end rtl;