Handle the reset state in the driver, not the parser, triggered by another button.
[bos2k9.git] / bos2k9.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3
4 library fhw_sd;
5 use fhw_sd.sd_host;
6
7 library fhw_tools;
8 use fhw_tools.all;
9 use fhw_tools.types.all;
10
11 use work.bos2k9_globals.all;
12
13 -----------------------------------------------------------------------
14
15 entity bos2k9 is
16   port(
17     CLOCK_50 : in std_logic;
18     
19     --GPIO_0 : inout std_logic_vector(35 downto 0);
20     
21     KEY  : in  std_logic_vector(3 downto 0);
22     SW   : in  std_logic_vector(17 downto 0);
23     LEDR : out std_logic_vector(17 downto 0);
24     LEDG : out std_logic_vector(8 downto 0);
25     
26     SD_DAT  : in  std_logic;
27     SD_DAT3 : out std_logic;
28     SD_CMD  : out std_logic;
29     SD_CLK  : out std_logic);
30 end bos2k9;
31
32 -----------------------------------------------------------------------
33
34 architecture board of bos2k9 is
35
36   component sd_host is
37     generic(
38       clock_interval : time     := clock_interval_c;
39       clock_divider  : positive := sd_clock_div_c);
40     port(
41       clk : in  std_logic;
42       rst : in  std_logic;
43
44       init  : in  std_logic;
45       ready : out std_logic;
46       error : out std_logic;
47       
48       address : in  std_logic_block_address_t;
49       start   : in  std_logic;
50       rxd     : out std_logic_byte_t;
51       shd     : out std_logic;
52       
53       miso  : in  std_logic;
54       mosi  : out std_logic;
55       sck   : out std_logic;
56       cs    : out std_logic);
57   end component;
58   
59   component bos2k9_mmu is
60     port(
61       clock : in  std_logic;
62       reset : in  std_logic;
63     
64       write_next : in  std_logic;
65       write_addr : out std_logic_byte_address_t;
66       write_data : in  std_logic_byte_t;
67     
68       read_addr : in  std_logic_byte_address_t;
69       read_data : out std_logic_byte_t);
70   end component;
71   
72   component button
73     port(
74       input  : in  std_ulogic;
75       output : out std_ulogic);
76   end component;
77
78   signal clock_s : std_logic;
79   signal reset_s : std_logic;
80   
81   signal ready_led_s : std_logic;
82   signal error_led_s : std_logic;
83   
84   signal init_btn_s  : std_logic;
85   signal start_btn_s : std_logic;
86   
87   signal byte_led_s  : std_logic_vector(7 downto 0);
88   signal byte_sw1_s  : std_logic_vector(7 downto 0);
89   signal byte_sw2_s  : std_logic_vector(7 downto 0);
90   
91   signal spi_s : spi_bus_t;
92   
93 begin
94   clock_s <= CLOCK_50;
95   --reset_s <= GPIO_0(15);
96   reset_s <= not SW(17);
97
98   --GPIO_0 <= (others => 'Z');
99   
100   init_button : button port map(
101     input  => KEY(0),
102     output => init_btn_s);
103   start_button : button port map(
104     input  => KEY(1),
105     output => start_btn_s);
106   
107   spi_s.miso <= SD_DAT;
108   SD_CMD     <= spi_s.mosi;
109   SD_CLK     <= spi_s.sck;
110   SD_DAT3    <= spi_s.cs;
111   
112   LEDG <= (
113     7 => spi_s.miso,
114     6 => spi_s.mosi,
115     5 => spi_s.sck,
116     4 => spi_s.cs,
117     1 => ready_led_s,
118     0 => error_led_s,
119     others => '0');
120   LEDR <= (
121    17 => not reset_s,
122     7 => byte_led_s(7),
123     6 => byte_led_s(6),
124     5 => byte_led_s(5),
125     4 => byte_led_s(4),
126     3 => byte_led_s(3),
127     2 => byte_led_s(2),
128     1 => byte_led_s(1),
129     0 => byte_led_s(0),
130     others => '0');
131   byte_sw1_s <= SW(7 downto 0);
132   byte_sw2_s <= SW(15 downto 8);
133   
134   guts : block
135     signal sd_init_s    : std_logic;
136     signal sd_ready_s   : std_logic;
137     signal sd_error_s   : std_logic;
138     signal sd_address_s : std_logic_block_address_t;
139     signal sd_start_s   : std_logic;
140     signal sd_data_s    : std_logic_byte_t;
141     signal sd_latch_s   : std_logic;
142     signal sd_shift_s   : std_logic;
143   
144     signal bl_address_s : std_logic_byte_address_t;
145   begin
146
147     ready_led_s <= sd_ready_s;
148     error_led_s <= sd_error_s;
149     
150     sd_init_s  <= init_btn_s;
151     sd_start_s <= start_btn_s;
152   
153     sd_address_s(std_logic_block_address_t'high downto std_logic_byte_t'high + 1) <= (others => '0');
154     sd_address_s(std_logic_byte_t'range) <= byte_sw1_s;
155     bl_address_s(std_logic_byte_address_t'high downto std_logic_byte_t'high + 1) <= (others => '0');
156     bl_address_s(std_logic_byte_t'range) <= byte_sw2_s;
157   
158     sd_io : sd_host port map(
159       clk => clock_s,
160       rst => reset_s,
161     
162       init    => sd_init_s, 
163       ready   => sd_ready_s,
164       error   => sd_error_s,
165       address => sd_address_s,
166       start   => sd_start_s,
167       rxd     => sd_data_s,
168       shd     => sd_latch_s,
169     
170       miso  => spi_s.miso,
171       mosi  => spi_s.mosi,
172       sck   => spi_s.sck,
173       cs    => spi_s.cs);
174     mmu : bos2k9_mmu port map(
175       clock => clock_s,
176       reset => reset_s,
177       write_next => sd_latch_s,
178       write_addr => open,
179       write_data => sd_data_s,
180       read_addr  => bl_address_s,
181       read_data  => byte_led_s);
182   
183   end block;
184 end board;