// Handel-C decade counter and test with seven-segment display decoder void increment_decade(unsigned 4 *count, unsigned 1 Hold); macro proc SevenSegDecoder (bcd, seg); extern "C++" void printDisplay(unsigned 8 seg1, unsigned 8 seg2); set clock = external "Dummy"; void main (void) { // Declarations unsigned 1 stop; unsigned 8 i; unsigned 4 count[2]; unsigned 1 hold; unsigned 8 seg1, seg2; hold = 0; par { stop = 0; count[0] = 0; count[1] = 0; } par { // Stimulus { // Count a while for (i = 0; i < 8; i++) ; // Takes 9 cycles // => count = "09" // Hold a while hold = 1; // + 1 cycle = 10 // => count = "01" for (i = 0; i < 8; i++) ; // + 9 cycles = 19 // => count = "10" // Count right round hold = 0; // + 1 cycle = 20 // => count = "10" for (i = 0; i < 89; i++) ; // + 90 cycles = 110 // => count = "00" // Stop the simulator stop = 1; } // Simulation output while (!stop) printDisplay(seg1, seg2); // Call the counter while (!stop) increment_decade(count, hold); // First seven segment display while (!stop) SevenSegDecoder(count[1], seg1); // Second seven segment display while (!stop) SevenSegDecoder(count[0], seg2); } } void increment_decade(unsigned 4 *count, unsigned 1 Hold) { if (Hold) count[0] = count[0]; /* You have to do something! */ else if ( count[0] == 9 ) par { /* "par" ensures one cycle */ count[0] = 0; if ( count[1] == 9 ) count[1] = 0; else count[1]++; } else count[0]++; } macro proc SevenSegDecoder (bcd, seg) { switch (bcd) { case 0 : seg = 0b00111111; break; case 1 : seg = 0b00000110; break; case 2 : seg = 0b01011011; break; case 3 : seg = 0b01001111; break; case 4 : seg = 0b01100110; break; case 5 : seg = 0b01101101; break; case 6 : seg = 0b01111100; break; case 7 : seg = 0b00000111; break; case 8 : seg = 0b01111111; break; case 9 : seg = 0b01100111; break; default : seg = 0b10001000; break; } }