Make the pump a drop-in replacement for ser_send.
authorMalte S. Stretz <mss@apache.org>
Wed, 26 Aug 2009 15:01:07 +0000 (17:01 +0200)
committerMalte S. Stretz <mss@apache.org>
Wed, 26 Aug 2009 15:01:07 +0000 (17:01 +0200)
bos2k9.vhd
bos2k9_pump.vhd

index d173158..f034ad7 100644 (file)
@@ -138,11 +138,10 @@ architecture board of bos2k9 is
       clock : in  std_logic;
       reset : in  std_logic;
     
-      busy  : out std_logic;
-    
       txn : in  std_logic;
       txd : in  std_logic_byte_t;
-      tx : out std_logic);
+      txb : out std_logic;
+      tx  : out std_logic);
   end component;
   
   component button
@@ -231,7 +230,7 @@ begin
     sd_address_s(std_logic_block_address_t'high downto std_logic_byte_t'high + 1) <= (others => '0');
     sd_address_s(std_logic_byte_t'range) <= byte_sw1_s;
     
-    sd_start_s <= read_btn_s and not pumping_s;
+    sd_start_s <= read_btn_s and sd_ready_s and not pumping_s;
   
     sd_io : sd_host port map(
       clk => clock_s,
@@ -261,10 +260,9 @@ begin
       clock => clock_s,
       reset => reset_s,
       
-      busy  => pumping_s,
-      
       txd   => sd_data_s,
       txn   => sd_latch_s,
+      txb   => pumping_s,
       tx    => ser_s.tx);
   end block;
 end board;
index 650ada1..afeb02d 100644 (file)
@@ -22,11 +22,10 @@ entity bos2k9_pump is
     clock : in  std_logic;
     reset : in  std_logic;
     
-    busy  : out std_logic;
-    
     txn : in  std_logic;
     txd : in  std_logic_byte_t;
-    tx : out std_logic);
+    txb : out std_logic;
+    tx  : out std_logic);
 end bos2k9_pump;
 
 -----------------------------------------------------------------------
@@ -59,14 +58,47 @@ architecture rtl of bos2k9_pump is
       read_data : out std_logic_byte_t);
   end component;
 
+  signal busy_s : std_logic;
+  
   signal sout_s : std_logic_byte_t;
   signal strg_s : std_logic;
   signal sbsy_s : std_logic;
 
   signal iaddr_s : std_logic_byte_address_t;
+  signal inull_s : std_logic;
   signal oaddr_s : std_logic_byte_address_t;
+  signal onull_s : std_logic;
 begin
 
+  txb <= busy_s;
+
+  busyman : process(clock, reset)
+  begin
+    if reset = '1' then
+      busy_s <= '0';
+    elsif rising_edge(clock) then
+      -- Hold busy line until all data was shifted out.
+      -- Assumption:  foo
+      busy_s <= txn
+             or sbsy_s
+             or (not onull_s and not inull_s);
+    end if;
+  end process;
+
+  null_net : process(iaddr_s, oaddr_s)
+    variable inull_v : std_logic;
+    variable onull_v : std_logic;
+  begin
+    inull_v := '1';
+    onull_v := '1';
+    for i in std_logic_byte_address_t'range loop
+      inull_v := inull_v and not iaddr_s(i);
+      onull_v := onull_v and not oaddr_s(i);
+    end loop;
+    inull_s <= inull_v;
+    onull_s <= onull_v;
+  end process;
+  
   ser_io : rs232_send port map(
     clk => clock,
     rst => reset,