Gradual
Introduction to Verilog Syntax: Basic Sequential
Circuits
E.R.Doering
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) |
reg SlowClock; 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 |
‘ClockDiv’ needs to be sized to accommodate
the value you set for ‘MaxCount’. In the example at
left, a maximum count of 12 means the counter register needs four bits. If
your maximum count was 1000, you would need a 10-bit counter. , where the “ é ù “ operator
(“ceiling operator”) means go to the next higher integer. |