Alternatives, you will have to build a circuit that detects if the signal has changed. Almost none of the attributes are synthesisable.
As for transactions - a transaction occurs whenever a signal is assigned. So with this code:
a <= '0';
wait for 0 ns;
a <= '0';
wait for 0 ns;
a <= '0';
3 transactions have occured, but 0 events (changes, but thats the 'event attribute) have occured. But transactions are not synthesisable (they are for simulation purposes).
The code you need will depend on your clock speed.
Method 1: You will need a pipeline long enough to store a 500ns history and then check that all the bits along the pipeline are the same. If the clock speed is high, thats quite a lot of registers.
Method 2: Have a counter running that resets every time the signal changes. When the counter gets to a certain number (high enough to cover 500ns) you know it has not changed for long enough.