/* 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) );
		}
	}
}