Gradual
Introduction to Verilog Syntax: Basic Sequential Circuits
E.R.Doering
August 9, 2001
 
 
Key to typestyle: Italics =>
Verilog keyword; Bold => new concept introduced
 
| Visualize
  the Hardware: | Describe the
  Hardware: | Comments: | 
| D flip-flop, positive-edge triggered | module D_FF
  (D,Clock,Q); | 
 | 
| T flip-flop, negative-edge triggered | module
  T_FF (T,Clock,Q); | T (“toggle”) flip-flop behavior is such that applying a 1
  to the T input causes the output to change state on the clock edge, and
  applying a 0 maintains the state. | 
| T flip-flop, negative-edge triggered, with inverted and
  noninverted outputs | module
  T_FF (T,Clock,Q,_Q); | In this example the ‘assign’ technique is put to good use. | 
| D flip-flop, negative-edge triggered, with inverted and
  noninverted outputs, and asynchronous reset (active high) | module
  D_FF (D,Clock,Q,_Q,Reset); | “Asynchronous reset” means that asserting the reset will
  instantly set the Q output to zero, regardless of the activity of D or Clock.
  Q will remain zero as long as Reset is asserted. This behavior matches
  standard flip-flop circuits. | 
| D flip-flop, positive-edge triggered, and asynchronous preset
  (active low) | module
  D_FF (D,Clock,Q,_Preset); | “Asynchronous preset” behaves similarly to “reset”, except
  that the Q output is set to 1 instead of zero. | 
| D flip-flop, positive-edge triggered, with synchronous reset (active high) | module
  D_FF (D,Clock,Q,Reset); | “Synchronous reset” means that the reset action does not occur
  until the next clock edge. | 
|   |   | NOTE: Avoid the temptation to design arbitrary flip-flop behavior,
  e.g., ability to trigger on both edges of the clock, ability to trigger on
  multiple clock signals, etc. The hardware synthesis tool does not “magically”
  create new hardware from thin air! You have to write circuit descriptions
  that are realizable, that is, can be mapped onto existing (known)
  hardware elements such as standard D flip-flops. Bottom line: Use the constructs listed above exactly as
  shown... don’t invent your own!! | 
| 16-bit data register | module
  Reg16 (D,Clock,Q,Reset); | A register is
  typically composed of an array of D flip-flops. | 
| N-bit data
  register | module
  RegN (D,Clock,Q,Reset); | The ‘parameter’ keyword is used to declare a global
  constant for register width. This is a simple example of parameterized description. Changing only a single number can
  update the entire design. | 
| 8-bit up counter with asynchronous reset | module
  CountUp (Clock,Reset,Q); | Free-running up counter | 
| 8-bit up counter with count enable, and asynchronous reset | module
  CountUp (Clock,Reset,Enable,Q); | Counter only increments when ENABLE signal is asserted. | 
| 8-bit down counter with count enable and initialize
  control inputs, asynchronous reset | module
  CountDown (Clock,Reset,Enable,Init,Q); | Counter is similar to previous example, except it counts
  down. An additional control input initializes the counter to 8’hFF. | 
| 8-bit loadable shift register | module
  Shifter (Clock,Reset,Load,D,Q); | Right-shifts the data, filling the MSB with zero. | 
| Clock divider (produces a pulse every N clock cycles) | parameter MaxCount = 12;   always @ (posedge Clock or posedge Reset)    if
  (Reset) begin      
  ClockDiv <= 0;      
  SlowClock <= 0;    end    else
  if (ClockDiv == MaxCount)      
  begin         
  SlowClock <= 1;         
  ClockDiv <= 0;      
  end       else
  begin          SlowClock <= 0;          ClockDiv <= ClockDiv+1;       end   |   |