Be busy as soon as the first txn arrives.
[bos2k9.git] / scratch.vhd
1 -- RS232 interface.
2     signal ser_send_s   : std_logic;
3     signal ser_data_s   : std_logic_byte_t;
4     signal ser_busy_s   : std_logic;
5     
6     -- Read and write addressess of the MMU.
7     signal r_address_s    : std_logic_byte_address_t;
8     signal r_address_lo_s : std_logic;
9     signal r_address_hi_s : std_logic;
10     signal w_address_s    : std_logic_byte_address_t;
11     signal w_address_lo_s : std_logic;
12     signal w_address_hi_s : std_logic;
13     
14     signal start_s : std_logic;
15     signal shift_s : std_logic;
16     signal write_s : std_logic;
17
18 sd_start_s <= read_btn_s and not write_s;
19     
20     -------------------------------------------------------------------
21     
22     write_s <= start_s or not r_address_lo_s;
23     
24     starter : process(clock_s, reset_s)
25     begin
26       if reset_s = '1' then
27         start_s <= '0';
28       elsif rising_edge(clock_s) then
29         if write_s = '0' then
30           start_s <= not w_address_lo_s;
31         else
32           start_s <= r_address_lo_s;
33         end if;
34       end if;
35     end process;
36     
37     ser_send_s <= write_s and not shift_s;
38     
39     shifter : process(clock_s, reset_s)
40     begin
41       if reset_s = '1' then
42         shift_s <= '0';
43       elsif rising_edge(clock_s) then
44         shift_s <= write_s and not ser_busy_s and not start_s;
45       end if;
46     end process;
47     
48     trigger : process(clock_s, reset_s)
49     begin
50       if reset_s = '1' then
51         
52       elsif rising_edge(clock_s) then
53         
54       end if;
55     end process;
56     
57     addresser : process(clock_s, reset_s)
58     begin
59       if reset_s = '1' then
60         r_address_s <= (others => '0');
61       elsif rising_edge(clock_s) then
62         if shift_s = '1' then
63           r_address_s <= std_logic_vector(unsigned(r_address_s) + 1);
64         end if;
65       end if;
66     end process;
67       
68       
69 --        if (write_s and not ser_busy_s and not start_s and not shift_s) = '1' then
70 --          
71 --          shift_s <= '1';
72 --        end if;
73 --      end if;    end process;
74     
75     address_net : process(r_address_s, w_address_s)
76       variable r_address_lo_v : std_logic;
77       variable r_address_hi_v : std_logic;
78       variable w_address_lo_v : std_logic;
79       variable w_address_hi_v : std_logic;
80     begin
81       r_address_lo_v := '1';
82       r_address_hi_v := '1';
83       w_address_lo_v := '1';
84       r_address_hi_v := '1';
85       for i in std_logic_byte_address_t'range loop
86         r_address_lo_v := r_address_lo_v and not r_address_s(i);
87         r_address_hi_v := r_address_hi_v and     r_address_s(i);
88         w_address_lo_v := w_address_lo_v and not w_address_s(i);
89         r_address_hi_v := r_address_hi_v and     w_address_s(i);
90       end loop;
91       r_address_lo_s <= r_address_lo_v;
92       r_address_hi_s <= r_address_hi_v;
93       w_address_lo_s <= w_address_lo_v;
94       r_address_hi_s <= r_address_hi_v;
95     end process;