SD card is now recognized as soon as it is put into the slot.
authorMalte S. Stretz <mss@apache.org>
Thu, 16 Jul 2009 11:03:54 +0000 (13:03 +0200)
committerMalte S. Stretz <mss@apache.org>
Thu, 16 Jul 2009 11:03:54 +0000 (13:03 +0200)
bos2k9.vhd
bos2k9_counter.vhd
bos2k9_globals.vhd

index 8d8304b..91c0175 100644 (file)
@@ -144,6 +144,17 @@ architecture board of bos2k9 is
       read_data : out std_logic_byte_t);
   end component;
   
+  component bos2k9_counter is
+    generic(
+      cnt  : positive);
+    port(
+      clk  : in  std_logic;
+      rst  : in  std_logic;
+      en   : in  std_logic;
+      clr  : in  std_logic;
+      done : out std_logic);
+  end component;
+  
   component button
     port(
       clk : in std_logic;
@@ -160,7 +171,6 @@ architecture board of bos2k9 is
   signal error_led_s : std_logic;
   signal dummy_led_s : std_logic;
   
-  signal init_btn_s : std_logic;
   signal read_btn_s : std_logic;
   signal send_btn_s : std_logic;
   
@@ -175,9 +185,6 @@ begin
   clock_s <= CLOCK_50;
   reset_s <= not SW(17);
 
-  init_button : button port map(clock_s, reset_s,
-    input  => KEY(0),
-    output => init_btn_s);
   read_button : button port map(clock_s, reset_s,
     input  => KEY(1),
     output => read_btn_s);
@@ -244,7 +251,6 @@ begin
     ready_led_s <= sd_ready_s;
     error_led_s <= sd_error_s;
     
-    sd_init_s  <= init_btn_s;
     sd_start_s <= read_btn_s;
   
     sd_address_s(std_logic_block_address_t'high downto std_logic_byte_t'high + 1) <= (others => '0');
@@ -274,6 +280,13 @@ begin
       mosi  => spi_s.mosi,
       sck   => spi_s.sck,
       cs    => spi_s.cs);
+    sd_to : bos2k9_counter generic map(
+      cnt  => clock_1ms_div_c) port map(
+      clk  => clock_s,
+      rst  => reset_s,
+      en   => not sd_ready_s,
+      clr  => sd_ready_s,
+      done => sd_init_s);
     ser_io : rs232_send port map(
       clk => clock_s,
       rst => reset_s,
index ec63e60..f99195e 100644 (file)
@@ -2,46 +2,49 @@
 -- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
 --
 -- This is a helper entity implementing a counter. It is driven by
--- `clock` on the rising edge. `reset` is active high.
+-- `clk` on the rising edge. `rst` is active high.
 --
--- While `enable` is high, it counts the number of ticks given via the
+-- While `en` is high, it counts the number of ticks given via the
 -- generic `count`. When reached, `done` is high for exactly one
--- `clock` (even if `enable` goes low).
+-- `clk` (even if `en` goes low). The counter can be cleared via 
+-- `clr`.
 -----------------------------------------------------------------------
 
 library ieee;
 use ieee.std_logic_1164.all;
 
-entity bos2k9_counter_e is
+entity bos2k9_counter is
   generic(
-    count : positive);
+    cnt  : positive);
   port(
-    clock  : in  std_logic;
-    reset  : in  std_logic;
-    enable : in  std_logic;
-    
+    clk  : in  std_logic;
+    rst  : in  std_logic;
+    en   : in  std_logic;
+    clr  : in  std_logic;
     done : out std_logic);
-end bos2k9_counter_e;
+end bos2k9_counter;
 
 -----------------------------------------------------------------------
 
-architecture rtl of bos2k9_counter_e is
+architecture rtl of bos2k9_counter is
   -- Use a subtype to please ModelSim's interpretation of attributes.
-  subtype count_t is natural range 0 to count - 1;
+  subtype count_t is natural range 0 to cnt - 1;
   signal count_s : count_t;
 begin
-  counter : process(clock, reset, enable)
+  counter : process(clk, rst, en)
   begin
-    if reset = '1' then
+    if rst = '1' then
       count_s <= 0;
       done    <= '0';
-    elsif rising_edge(clock) then
-      -- `done` must be high for a single `clock` only, even if
-      -- `enable` is low.
+    elsif rising_edge(clk) then
+      -- `done` must be high for a single `clk` only, even if
+      -- `en` is low.
       done <= '0';
-      -- This could become an Enable line for one of the FFs.
-      if enable = '1' then
-        if count_s = count_t'high then
+      -- This could become an en line for one of the FFs.
+      if (en or clr) = '1' then
+        if clr = '1' then
+          count_s <= count_t'low;
+        elsif count_s = count_t'high then
           count_s <= count_t'low;
           done <= '1';
         else
index c58be1c..e7cb9de 100644 (file)
@@ -12,8 +12,10 @@ use fhw_sd.sd_globals_p.all;
 
 package bos2k9_globals is
 
-  -- The DE2 board runs with 50 MHz.
-  constant clock_interval_c : time   := 20 ns;
+  -- The DE2 board runs at 50 MHz.
+  constant clock_interval_c : time    := 20 ns;
+  constant clock_1us_div_c : positive := 50;
+  constant clock_1ms_div_c : positive := clock_1us_div_c * 1000;
   
   -- The maximum initial rate for the SD card is 400 kHz, which would
   -- result in a clock divider of 125.  To be on the safe side, we'll