Design is the most important and critical step in the whole process. One should invest enough amount of time in designing a "digital system", good time invested here really pays you later. Well, Here I would like to give some design tips. If you remember them, you will be in less trouble, in your whole design carrier.

First, Design On Paper : Never rush to code just knowing the specifications, such habits will trouble you and your project lot in long run. First jot down all your specifications on a piece of paper and stick it some where easily visible. Now depending on the requirement break down your design into sub-modules, always remember "divide and rule" principle, divide your design properly so that you can rule them, otherwise they will rule you :).

Architecture : One should invest enough time in deciding the architecture of a design, architecture is nothing but a block level representation of your design, and the hand shakes between these modules/blocks with strict timing information (waveforms). Timing diagrams are must, you cannot ignore or live without it. It provides a concrete support skeleton to your design. Once the block level representation is done you can relax and concentrate on individual blocks. Caution : Make sure that your block level handshakes are in correspondence with the project specifications, hence always keep an eye on the specification/requirement list, otherwise this ignorance may result into lot of rework and nightmares..

Module Level Design : Now we have specifications ready for each modules, Wait.. wait.. Don't rush for coding. We are not yet completely done with the design stuff. Next step is to design logic within each module which satisfies the module's function, and its interface requirement. For this, we will put our module level design in terms of basic components (GATES, FLIP-FLOPS, REGISTERS, COUNTER, SUBTRACTER and ADDER) in such a way that it agrees with the module specification.
Here also first design on paper, I mean put these components on paper with proper connections. Once you feel that components placed fulfills function and timing requirement, you can move to your favorite part...YES! coding..

Coding : This is the most fun part, take each module and start replacing each component with code. Yes! in next topics we will see how to code each component, and how to connect them using signals (you can say signals are vhdl representation of wires). We will also discuss the structure in which each individual entity (module) should be coded..