--- Quote Start ---
Its all a question of scope. Calling a procedure the way you have done, or any code outside a process, implicitly declares a process.
Procedures and functions are supposed to be re-useble, but self contained bits of code.
--- Quote End ---
But procedure does not behave like equivalent replacement with process. In this example if you replace the procedure with equivalent process then it works with process but not with procedure.
try and replace the procedure with this code:
process(reset,clk)
TYPE state_machine IS (check_empty, clear_rdreq);
VARIABLE state : state_machine;
BEGIN
IF(reset = '1') THEN
state := check_empty;
rdreq_signal <= '0';
ELSIF(clk = '1' AND clk'EVENT) THEN
CASE state IS
WHEN check_empty =>
IF(empty_signal = '0') THEN
rdreq_signal <= '1';
state := clear_rdreq;
END IF;
WHEN clear_rdreq =>
rdreq_signal <= '0';
state := check_empty;
END CASE;
END IF;
END PROCESS;