--- Quote Start ---
When valid goes to '0', I need start to go to 0 but I can't just add a "and valid ='0'" to start's when clause because valid might not be '1' right away. I need start to go to 0 when valid goes from 1 to 0. How do I do that?
--- Quote End ---
You need to create a falling edge detector for the valid signal.
process (clk, reset) begin
if (reset ='1') then
reg <= '0';
elsif (clk'event and clk='1') then
reg <= valid;
end if;
--falling edge detect. This produces a one clk wide pulse when valid goes from '1' to '0'
valid_fe <= reg and not valid;