The fundamental issue here is that you don't know the timing relationship between your start / stop signals and the master clock that drives your state machine. This is very common, and needs handling correctly. (The same is also true of every other signal that's an input to the FPGA and that's not properly synchronised to the master clock that's driving your logic, of course).
Every logic gate, whether discrete or built into an FPGA, has setup and hold times that must be respected relative to the clock. If they're met, the gate will work reliably. If they're not, the behaviour of the gate will be unpredictable. Strange things can happen, like the output changing briefly to one state before settling some time later to another even without a further clock pulse arriving. This is termed 'metastability' and it's guaranteed to cause flaky behaviour in your FPGA.
To handle this effect - which is fundamental to the device physics, and not something that can be simply 'designed out' by the FPGA manufacturer - we use a thing called a synchroniser chain. This consists of one or more clocked D-type latches, connected in series (like a shift register). The non-synchronous input (your start or stop signal) connects to the first D input, and we know that the Q output may indeed go metastable, which would risk causing complex logic to misbehave if it were used directly in multiple places.
(As an aside - imagine, for example, the case where the metastable signal is used in two places, one physically near the latch and one on the other side of the die. If it changes state at an unexpected time, the difference in propagation delay could easily mean that one subsequent logic input sees it as a '0' while the other sees a '1', with hilarious consequences).
Instead, we ensure that the potentially metastable output feeds exactly one input (the next D-type in the chain), so this can't happen. We also work on the assumption - and it is just an assumption - that even if it goes metastable, it'll have settled to either a 0 or a 1 in good time before the next active clock edge. The output of the second D-type should, therefore, be reliable.
There is, of course, a couple of clocks' worth of latency. This is inevitable. You'll need to find a way to deal with this, if the delay matters at all.
I speak VHDL, not Verilog, so I'd implement this as something along the following lines:
IF rising_edge (fclk) THEN
start_meta <= p_start_signal;
start_reliable <= start_meta;
stop_meta <= p_stop_signal;
stop_reliable <= stop_meta;
IF start_reliable = '1' THEN
start_seen <= '1';
END IF;
IF stop_reliable = '1' THEN
start_seen <= '0';
END IF;
END IF;