- A Logic Circuit Simulation Library in C++ |
The aim of this example is to build and simulate a 4-bit counter using 4 off-the-shelf D-flipflop modules provided in libLCS. The diagram for the circuit is as below. The bit sequence D3D2D1D0 in that order is the output of our counter circuit.
The code which implements the above circuit is as follows.
#include <iostream> #include <lcs/bus.h> #include <lcs/not.h> #include <lcs/clock.h> #include <lcs/changeMonitor.h> #include <lcs/simul.h> #include <lcs/dflipflop.h> using namespace lcs; using namespace std; int main(void) { // Declare single line busses for each node in the // circuit. The flipflop output nodes have been set // to zero to start with. The busses are initialised // with the default template parameter of 1. Bus<> q0(0), q1(0), q2(0), q3(0), d0, d1, d2, d3; // Initialise a clock object. Clock clk = Clock::getClock(); // Initialise the NOT gates in the circuit. The NOT // gates are initialised with the default template // parameter corresponding to a propogation delay of // zero. Not<> n1(d0, q0), n2(d1, q1), n3(d2, q2), n4(d3, q3); // Initialise the 4 positive edge-triggered flipflops // using the default template parameters. DFlipFlop<> ff1(q0, d0, clk), ff2(q1, d1, q0), ff3(q2, d2, q1), ff4(q3, d3, q2); // Initialise a lcs::ChangeMonitor object to monitor // the output bit sequence of our counter circuit. ChangeMonitor<4> count(d0*d1*d2*d3, string("Count")); Simulation::setStopTime(4000); // Set the stop time. Simulation::start(); // Start the simulation. Simulation::terminate(); // Terminate the simulation gracefully. return 0; }
When the above program is compiled and run, the following output is obtained.
At time: 0, Count: 1111 At time: 100, Count: 0000 At time: 300, Count: 0001 At time: 500, Count: 0010 At time: 700, Count: 0011 At time: 900, Count: 0100 At time: 1100, Count: 0101 At time: 1300, Count: 0110 At time: 1500, Count: 0111 At time: 1700, Count: 1000 At time: 1900, Count: 1001 At time: 2100, Count: 1010 At time: 2300, Count: 1011 At time: 2500, Count: 1100 At time: 2700, Count: 1101 At time: 2900, Count: 1110 At time: 3100, Count: 1111 At time: 3300, Count: 0000 At time: 3500, Count: 0001 At time: 3700, Count: 0010 At time: 3900, Count: 0011