A synchronous counter clocks all the outputs at once (all the flops share a common clock.) This differs from a ripple counter, where the Q out of the previous stage clocks the next one.
To make a synchronous up counter, you need to compute the next (D-inputs) value by taking the present (Q-outputs) value and adding 1. This computation is done by an incrementer. You construct an incrementer from a series of half adders.
So in sum, you need:
- four D flip-flops sharing a common clock
- A 4-bit incrementer (4 half adders) to compute the next value
It is also possible to use JK flops in toggle mode, which simplifies the design somewhat. Example in Falstad These only require that you compute the state where the output bit flips (that is, when the lower-significant bits are all 1’s.) However, the ask is for D flip-flops, so you need to use the more complex logic. (Hint: a D flip-flop can be made into a toggle flop with the addition of an XOR gate.)
How do I make D-flip flops synchronous?
... think about thiswhat keeps a musical orchestra synchronized?
\$\endgroup\$