/* File: Ripple.java
* Copy: Copyright (c) 1998 David Green
* Vers: 1.0.0 1998/10/17 dgg -- original coding based on idea from
* Dennis Smith's OODemo2.cpp
*/
/** Ripple counter (3 bit)
*
* Each flip-flop below is wired as a toggle (D tied to !Q) * * ff[0] ff[1] ff[2] * external clock -> [C 1 Q] -> [C 2 Q] -> [C 3 Q] ** * @author David Green * @note Could/Should be generalized to be n-bit ripple counter */ public class Ripple { private static final int NUMFF = 3; private DFlipFlop[] ff = new DFlipFlop[NUMFF]; Ripple() { // instantiate flip flops for ( int i = 0; i < NUMFF; i++ ) ff[i] = new DFlipFlop(); } // following routine hardcoded to 3 FF's for clarity public void setExternalClock( boolean new_clock ) { ff[0].setD( ! ff[0].getQ() ); ff[0].setClock( new_clock ); ff[1].setD( ! ff[1].getQ() ); ff[1].setClock( ff[0].getQ() ); ff[2].setD( ! ff[2].getQ() ); ff[2].setClock( ff[1].getQ() ); /*************************************** // alternate code for loop clock = new_clock; for ( int i = 0; i < NUMFF; i++ ) { ff[i].setD( ! ff[i].getQ() ); ff[i].setClock( clock ); // propate clock for next stage clock = ff[i].getQ(); } ***************************************/ } public boolean getFFValue( int ff_num ) { return ff[ff_num].getQ(); } public static void main( String [] args ) { Ripple counter = new Ripple(); // set external_clock to match assumption of ff boolean clock = false; System.out.println( "NewClock Q0 Q1 Q2" ); for ( int i = 0; i < 20 ; i++ ) { // toggle clock lead clock = ! clock; // give to ripple counterr counter.setExternalClock( clock ); // print out values System.out.println( clock + " " + counter.getFFValue(0) + " " + counter.getFFValue(1) + " " + counter.getFFValue(2) ); } } }