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