Fix up error handling and testing.
authorMalte S. Stretz <mss@apache.org>
Tue, 30 Jun 2009 13:21:56 +0000 (15:21 +0200)
committerMalte S. Stretz <mss@apache.org>
Tue, 30 Jun 2009 13:21:56 +0000 (15:21 +0200)
fhw_sd/sd_parser_e.vhd
fhw_sd_t/sd_parser_t.vhd

index 7541751..5cc7e80 100644 (file)
@@ -93,8 +93,8 @@ begin
   spi_start <= '1' when state_s = send_state_c
           else '0';
   
-  break_s <= spi_rxd(7) when get_cmd_type(command) = cmd_type_std_c
-        else spi_rxd(0) when command = cmd_do_seek_c
+  break_s <= not spi_rxd(7) when get_cmd_type(command) = cmd_type_std_c
+        else not spi_rxd(0) when command = cmd_do_seek_c
         else '0';
   
   status : process(clock)
@@ -140,7 +140,13 @@ begin
             error_s <= '0';
           end if;
         else
-          error_s <= '1';
+          if get_cmd_type(command) = cmd_type_std_c then
+            error_s <= '1';
+          elsif command = cmd_do_seek_c then
+            error_s <= '1';
+          else
+            error_s <= '0';
+          end if;
         end if;
       end if;
     end if;
index 1a33a27..3a68ac7 100644 (file)
@@ -102,6 +102,7 @@ begin
       wait until rising_edge(clock_s);
       trigger_i_s  <= '0';
       wait until falling_edge(shifting_o_s);
+      wait until rising_edge(clock_s);
     end send;
   begin
     wait for clock_interval / 4;
@@ -111,7 +112,9 @@ begin
     trigger_i_s  <= '0';
     wait until falling_edge(reset_s);
     
-    -- Test internal command with argument shorter than frame size.
+    -- Test the internal command with an argument shorter than frame 
+    -- size which ignores the input and thus always runs into a 
+    -- (non-fatal) timeout.
     send(cmd_do_skip_c,
       arg_do_skip_c,
       1, x"00");
@@ -136,7 +139,9 @@ begin
     wait until rising_edge(start_o_s);
     
     while shifting_o_s = '1' loop
-      if counter_s = delay_s then
+      if start_o_s = '1' then
+        rxd_i_s <= (others => 'U');
+      elsif counter_s = delay_s then
         rxd_i_s <= data_s;
       else
         rxd_i_s <= (others => '1');
@@ -148,21 +153,31 @@ begin
   io_flow : process
   begin
     busy_i_s  <= '0';
-    counter_s <= 0;
     
     wait until rising_edge(start_o_s);
     busy_i_s  <= '1';
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+    wait until rising_edge(clock_s);
+  end process;
+  
+  io_count : process
+    variable busy_v : std_logic;
+  begin
+    counter_s <= 0;
+    busy_v    := '0';
+    
+    wait until rising_edge(shifting_o_s);
     while shifting_o_s = '1' loop
-      wait until rising_edge(clock_s);
-      wait until rising_edge(clock_s);
-      wait until rising_edge(clock_s);
-      wait until rising_edge(clock_s);
-      wait until rising_edge(clock_s);
-      wait until rising_edge(clock_s);
-      wait until rising_edge(clock_s);
-      wait until rising_edge(clock_s);
-      wait until rising_edge(clock_s);
-      counter_s <= counter_s + 1;
+      if busy_i_s = '1' and not busy_i_s = busy_v then
+        counter_s <= counter_s + 1;
+      end if;
+      busy_v := busy_i_s;
       wait until rising_edge(clock_s);
     end loop;
   end process;