Inside ringcounter, q3 is being assigned by both the concurrent assignment q3<='1' and DFF4. You can't have both at the same time.
To resolve this you should do as you did with the DFF, initialize the output value when the reset signal is asserted (and remove the concurrent assignment).