I'm having trouble understand exactly how to use flip flops, what they are doing, and how to implement them in a practical application. I understand combinational logic, boolean algebra, etc. I just want a very basic explanation of what a flip flop does, for example a D flip flop vs a JK flip flop.