Counter (digital)

Last updated
Integrated circuit containing a digital counter (synchronous 4-bit decade counter, Signetics 74162N) Signetics 74162N.jpg
Integrated circuit containing a digital counter (synchronous 4-bit decade counter, Signetics 74162N)

In digital logic, a counter is an electronic device which stores the number of times a particular event or process has occurred as indicated by a clock signal. The most common type is a sequential digital logic circuit with an input signal called the clock, and multiple output signals which collectively represent a number in the binary or BCD number system. Each pulse applied to the clock input causes the value stored in the counter to increment or decrement (increase or decrease by one).

Contents

A counter circuit is usually constructed of flip-flops, which store the count value, and in many cases, additional logic to effect particular counting sequences, qualify clocks and perform other functions.

Counters are widely used in digital circuits, and are implemented as stand-alone integrated circuits and also commonly incorporated into larger integrated circuits.

Common characteristics

An electronic counter is a sequential logic circuit that has a clock input signal and a group of output signals that represent an integer "count" value. Upon each qualified clock edge, the circuit will increment (or decrement, depending on circuit design) the stored count. When the count reaches the end of the counting sequence (maximum count when incrementing; zero count when decrementing), the next clock will cause the count to overflow or underflow and the counting sequence will start over.

Digital counters use flip-flops to represent the current count and to retain the count between clocks. Depending on the type of counter, the output may be a direct representation of the count (a binary number), or it may be encoded. Examples of the latter include ring counters and counters that output Gray codes.

Many counters provide additional input signals to facilitate dynamic control of the counting sequence, such as:

Some counters provide a Terminal Count output which indicates that the next clock will cause overflow or underflow. This is commonly used to implement counter cascading (combining two or more counters to create a single, larger counter) by connecting the Terminal Count output of one counter to the Enable input of the next counter.

Modulus

The modulus of a counter is the number of states in its count sequence. A counter that has modulus value n is commonly referred to as a modulo-n or MOD-n counter. For example, a counter that counts up from 0 to 5 and then overflows is a MOD-6 counter because it has six states.

The maximum possible modulus of a counter is determined by the number of flip-flops. More specifically, a counter with n flip-flops has a maximum possible modulus of 2n. For example, a four-bit counter can have a modulus of up to 16 (24). Some counters (e.g., binary counters) include all possible states in their count sequences. Other counters, such as decade counters, omit one or more possible states from their counting sequences.

Binary counter

A binary counter is a digital counter that counts and represents the count in binary. A binary counter is a MOD-2n counter, where n is the number of flip-flops used to store the count. For example, the illustrations below show the behavior of a 5-bit counter, which has 32 (25) states and is therefore a MOD-32 counter:

Decade counter

A decade counter has ten states (0 to 9) and thus is a MOD-10 counter. Depending on its design, a decade counter may represent the count in binary-coded decimal or other binary encodings.

Synchronous vs. asynchronous

Counters are broadly categorized as either synchronous or asynchronous. In synchronous counters, all flip-flops share a common clock and change state at the same time. In asynchronous counters, each flip-flop has a unique clock, and the flip-flop states change at different times.

Up/down counting

An up/down counter is a digital counter which counts up or down as directed by a special input signal. In synchronous up/down counters, the control signal is a single digital input whose state indicates count direction (e.g., '1' = count up; '0' = count down). In asynchronous up/down counters the direction control may alternatively consist of two separate "up" and "down" clock inputs.

Counter types

Counters are typically categorized by general architecture. For example:

Asynchronous binary (ripple) counter

An asynchronous binary counter, or binary ripple counter, is a "chain" of toggle (T) flip-flops in which the least-significant flip-flop (bit 0) is clocked by an external signal (the counter input clock), and all other flip-flops are clocked by the output of the nearest, less significant flip-flop (e.g., bit 0 clocks the bit 1 flip-flop, bit 1 clocks bit 2, etc.). When implemented with discrete flip-flops, ripple counters are commonly implemented with JK flip-flops, with each flip-flop configured to toggle when clocked (i.e., J and K are both connected to logic high).

Async counter JK nbit.svg

Each flip-flop is effectively a one-bit counter which increments its count (by toggling its output) once per clock cycle. It counts from zero to one and then, when the next clock arrives, it will overflow and start its count sequence over again at zero. Each output state persists for a full input clock cycle, and consequently the frequency of each flip-flop's output signal is exactly half that of its input clock. Additional flip-flops may be added to the chain to form a counter of any arbitrary word size (number of bits), with the output frequency of each bit equal to exactly half the frequency of its nearest, less significant bit.

Each flip-flop introduces a delay from input clock edge to output toggle. This causes the counter bits to change at different times, thus producing a ripple effect and making the count unstable as the counter input clock propagates through the circuit. The duration of this instability (the output settling time) is proportional to the number of flip-flops. This makes ripple counters unsuitable for use in synchronous circuits that require the counter to have a fast output settling time. Also, it is often impractical to use ripple counter output bits as clocks for external circuits because the ripple effect causes timing skew between the bits. Ripple counters are commonly used as general-purpose counters and clock frequency dividers in applications where the instantaneous count and timing skew is unimportant.

Synchronous binary counter

The circuit shown below is an ascending (up-counting) four-bit synchronous binary counter implemented with JK flip-flops. Each bit of this counter is allowed to toggle when all of its less significant bits are at a logic high state. For example, upon clock rising edge bit 1 toggles if bit 0 is logic high; bit 2 toggles if bits 0 and 1 are both high; bit 3 toggles if bits 2, 1, and 0 are all high.

4-bit-jk-flip-flop V1.1.svg

Decade counter

A decade counter is a MOD-10 up-counter that counts from 0 to 9 and then overflows to zero. Depending on the design, the count may be output directly in binary (0000 to 1001) or using other binary encoding.

For example, the schematic shown below is a modified 4-bit binary ripple counter that uses a NAND gate to reset the count to zero (by resetting all flip-flops) when the binary count increments to 10 (binary 1010), thus resulting in 10 output states. As in all asynchronous counters, the clock propagation through the flip-flop chain (including the reset upon reaching count 10) results in output instability for some time after each input clock.

DecadeCounter.jpg

Ring counter

A ring counter is a circular shift register that is initiated such that only one of its flip-flops is the state one while others are in their zero states.

A ring counter is a shift register (a cascade connection of flip-flops) with the output of the last one connected to the input of the first, that is, in a ring. Typically, a pattern consisting of a single bit is circulated, so the state repeats every n clock cycles if n flip-flops are used.

Overbeck Counter 4bit.svg

Johnson counter

A Johnson counter (or switch-tail ring counter, twisted ring counter, walking ring counter, or Möbius counter) is a modified ring counter, where the output from the last stage is inverted and fed back as input to the first stage. [1] [2] [3] The register repeatedly cycles through a sequence of bit-patterns, whose length is equal to twice that of the shift register.

Johnson Counter 4bit.svg

Johnson counters are commonly used in finite state machines and specialized applications such as digital-to-analog conversion, etc. For example, the CMOS 4017 integrated circuit uses a 5-bit Johnson counter to cycle through 10 states, and thus implement a decade counter with encoded outputs:

Implementation

Counters are implemented in a variety of ways, including as dedicated MSI and LSI integrated circuits, as embedded counters within ASICs, as general-purpose counter and timer peripherals in microcontrollers, and as IP blocks in FPGAs. In the latter case, a counter is typically instantiated by synthesizing it from a description written in VHDL, Verilog or some other hardware description language. For example, the following VHDL code describes a 32-bit up/down counter with clock enable and load capability:

entitybidirectional_counterisport(-- counter input/output signals:CLK:instd_logic;--   clockRESET:instd_logic;--   asynchronous resetENABLE:instd_logic;--   clock enableLOAD_ENABLE:instd_logic;--   load enableCOUNT_UP:instd_logic;--   '1' for up, '0' for down countingDATA_IN:inunsigned(31downto0);--   value to load into counterDATA_OUT:outunsigned(31downto0)--   current counter value);endbidirectional_counter;architecturebehavioralofbidirectional_counterissignalcounter:unsigned(31downto0):=(others=>'0');-- counter registerbeginprocess(CLK,RESET)beginifRESET='1'then-- if counter reset is requestedcounter<=(others=>'0');--   reset the counterelsifrising_edge(CLK)then-- else upon rising clock edgeifENABLE='0'then--   if clock is disablednull;--     do nothingelsifLOAD_ENABLE='1'then--   else if load is requestedcounter<=DATA_IN;--     jam new value into counterelsifCOUNT_UP='1'then--   else if up-countingcounter<=counter+1;--     increment counterelse--   else down-counting, socounter<=counter-1;--     decrement counterendif;endif;endprocess;DATA_OUT<=counter;-- output current counter valueendbehavioral;

See also

References

  1. Singh, Arun Kumar (2006). Digital Principles Foundation of Circuit Design and Application. New Age Publishers. ISBN   81-224-1759-0.
  2. Horowitz, Paul; Hill, Winfield (1989). The Art of Electronics. Cambridge University Press. ISBN   0-521-37095-7.
  3. Graf, Rudolf F (1999). Modern Dictionary of Electronics. Newnes. ISBN   0-7506-9866-7.