How to Make Your 6.111 Project Work

Tom Knight

There are a few “tricks of the trade” which allow an experienced digital designer to fix problems quickly. This note is an attempt to fill you in on some with which you might not be familiar.

Wiring Errors

Do you have a diagram of your circuit? Not that piece of napkin from common's last night, I mean a DIAGRAM. If you don't, then think about making one. Making the diagram may in itself lead you to finding the problem. A timing diagram is often helpful for finding errors as well.

Now that you have a diagram, it should be easy to have your partner check the wiring. Not you. Your partner. You will make the same mistake that you made in wiring your circuit a second time when you “check” it.

Check each IC package. Is there a wire on each of its pins? There probably should be, in most cases. Explain the cases where there is not (unused section of 74LS00, parallel inputs not used on counter, ...). You would be surprised at how many errors are caught with this simple technique. Be careful especially on the power and ground signals.

The pin assignments of a 74LS02 are not the same as those of a 74LS00. When you use them, double check the pin numbers.

Care and Feeding of the Power Supply

Don't overload the kit power supply. If in doubt, measure the power supply with an OSCILLOSCOPE, not a VOM. Many of the power supply overload problems show themselves as hum or ripple on a supply rather than low voltage output.

“Grid” your power supply distribution. This means construct an X-Y pattern of power interconnections for the ground and power. The extra wires are redundant if you believe you are working with superconducting zero inductance wires. You are not. Recall that KCL requires that signals which force current to flow OUT a wire also cause the SAME CURRENT to flow BACK on the ground and power wires.

This means that if you are, for example, building a project with multiple kits, you should be quite careful to provide enough grounds between the kits. I'd say a conservative minimum is about 1 ground wire for each 3 signal wires. The ground wires should connect diverse points on the grid of each kit, not all be connected to the power supply pin. Don't connect the +5 volt power on adjacent kits together. You can check the adequacy of your grounding between kits by measuring the ground potential difference between points in your project with a scope. Worry about anything more than about 0.5 volts.

You may have heard from an analog course about “ground loops” and the necessity to avoid them. In digital systems it is completely impractical to avoid ground loops, and the opposite approach is taken, best summarized in a phrase which I will pass on: “Let Ground Abound”.

If you take care with the ground distribution in your projects, few bypass capacitors will be necessary, but for conservatism you might consider placing a 0.01 to 0.1 ceramic bypass capacitor between the ground and +5 power grid every half a dozen packages or so. Your oscilloscope is your best friend here. Look at the +5 power runs while your project is running. Does it look like a DC power supply? Anything more than about 1 volt p-p noise needs to be fixed. Sometimes adding power supply bypassing can actually make a project not work. The way this happens is that the ground distribution system is high impedance, and the addition of the decoupling capacitors makes the current in the ground lines higher, leading to ground noise. Since the noise margin in the low state is worse than in the high state, this can be a bad tradeoff.

Unused Inputs

They have to be connected to either ground or to “high”. Ground is easy to come by. “High” can be the output of a grounded input inverter, or a resistor tied to the positive supply. The resistor value is non-critical, somewhere in the range of 1K. Many inputs can be wired in parallel to this resistor. Making the run extremely long can be bad from the standpoint of finding errors. It is common, and the source of difficult problems, for the high run to have some output connected to it. Since you often pull up sets and clears on widely distributed circuits, this can cause very bizarre behavior. Keeping the number of inputs on the high run to a reasonable number (5-10) will help isolate these problems.

Behavior of Ungrounded Parts

The behavior of parts which do not have a ground pin connected can be quite disconcerting. They seem to almost work. The reason for this is that the input signals can provide a source of negative supply. So, if you have a NAND gate, for example, in a package with no other sections used, then it can behave correctly for the case when the inputs are both low, one or the other high, but incorrectly if both are high. This can be MOST confusing, and is even worse if you are using all four sections of some NAND gate, since you are (almost) certain to have some input low, and the gates will almost work. Looking at your logic signals with a scope will discover this and other problems, since the signal levels will look very poor.

Tri-State Logic Signals

Buses which have tri-state signals driving them are tricky to debug at times. Scoping them can give signals which appear to be “middle” due to the parts not driving the bus at all times. One way to counteract this is to explicitly add pullup resistors to the runs, which will force the bus to be a logic “1” even if it is undriven.

A second problem with tri-state buses can happen when two outputs are “fighting” one another over the bus. Large currents and overheating of the design can occur under these circumstances, and the logic levels on the bus will be “middle”.

Thermal debugging of designs is a quite efficient test strategy, since it is very quick and can find some problems with very little work. Check to see that all of your parts are dissipating some power. Are any so hot that you can't touch them? Unless you are using some part with an excuse to be hot, then some output is probably trying to pull down the +5 volt power supply, or fighting with some other part.

Open Collector Signals

Calculate the resistor value carefully. To do this, calculate the total input current of all the loads on the run. Subtract this from the output drive available from the driver part. If more than one type of part is being used, use the lowest output drive. The remaining current is available to pull down the resistor. The resistor value is then given by R = 5/I ohms. This will usually be in the several hundred ohm range.

“PNP” Inputs

Newer TTL parts, those with numbers above 300 for the most part, use a low DC current input circuit using a PNP transistor. These parts have a very low TTL current, which might make you think that you can drive hundreds of them with a single part. This strategy is dangerous if you value the time and signal quality of your design. AC considerations mean that you should limit the number of signals on a run to the 10-15 range regardless of the DC current specification. The same comment applies, with even more force, to the MOS inputs of static memory parts and EPROMS. These parts have high input capacitance which makes driving them with a reasonable number of loads essential.

Handling CMOS Parts

CMOS devices are static sensitive. They have sufficiently high input impedance that the static charge stored on your body capacitance can permanently damage them. Ground yourself to the bench and your project before touching these devices, and they will work when you are finished plugging them in.

Wire Routing

Wires, as we mentioned above in the section on power supplies, are not perfect components. They have a parasitic inductance, resistance, and a mutual inductance with other wires. There are some strategies for minimizing the effect of these imperfections in our ideal wire model.

For many of the signals in a design, the bad properties of the wires are irrelevant, for the same reason that we can afford to ignore combinational logic hazards--we don't look at the wires until they behave well. This works fine except for the wires used for timing signals in our design. Here are some general guidelines if you want to be careful:

  • Keep wires short. The shorter your wires are, the less chance of noise pickup, coupling, and other undesirable behavior.
  • Drive a wire from one end or the other of the string of places it goes, not from the middle.
  • Wire all the places a signal goes sequentially, one after another, not as some sort of tree-structure. This applies to single electrical runs.
  • If you have trouble with making your signals look good on a run, consider resistor termination of the far end of the run. Your friend here is your oscilloscope. Does the signal look like it has clean edges in the positive and negative going directions? Is there ringing or strong over and undershoot? Your termination will have to be a Thevenin equivalent resistor to about +3 volts with an impedance of about 150 ohms (bet you thought you would never hear about those again, didn't you ...).
  • Undershoot on LS series logic, particularly, can lead to drastic changes in the guaranteed Tplh and Tphl speeds for parts. If you can't understand why the part which says it should be a 10ns part takes 20ns to switch, check for the 1.5 volt undershoot on its input. Remember that the spec sheet is your contract with the part manufacturer. He doesn't guarantee the behavior if you are feeding garbage into the part.
  • Bundling wires together makes your kit look neat, but it also makes a good transformer. Unfortunately, you probably didn't want a transformer between you logic signals. For clock signals, route the critical wires far away from other wires, particularly wide parallel busses switching at the same time. You might consider twisted pair, which wraps a ground wire around the signal wire. Ground both ends of the twisted pair ground.\

Clock Distribution

Clocks, and write pulses for RAM's are the most sensitive logic signals in a typical design. The design methodology which we are teaching in this course allows most signals in a machine to have hazards, ringing, and even be slow, without actually making the circuit you are designing not work. The penalty for sloppiness in most signals is simply that the circuit will operate slower, rather than not at all.

This is not the case with clock signals. If a clock has ringing on it, or a slow rise time, then your circuit may not work AT ALL. It pays then to take special care in distributing the clock. Loading rules should be strictly obeyed (they should be anyway, of course).

A more insidious problem sometimes occurs, however, due to the possibility of CLOCK SKEW. This means when the clocks for different portions of your logic design have their rising edges occur at slightly different times. This can happen as a result of long wires in the clock circuit, from different numbers of gates in series with different clocks in the machine, from different loading on different clocks, and from lots of other reasons. Whatever the reasons, clock skew is a common source of problems. To see why, consider a pair of type D flip-flop registers, such as LS374 parts, each clocked by a different clock. It may be your intention to load data first into register 1 on the first clock, and then into register 2 from the outputs of register 1 on a second clock. If the clock on register 1 lags the clock on register 2 by more than the sum of the setup and propagation delays of the part, then the incorrect data will be loaded into register 2: namely, register 2 will receive the data NEWLY clocked into register 1. So it is important to keep the location of the clock edge synchronized over the entire diagram. This is hard sometimes.

One technique to use is to build a “tree” of clock distribution: The main clock generator drives a set of four gates, each of whose outputs fans out to four more gates, whose 16 outputs each drive a section of the machine's clock. Try to keep wire lengths the same and to keep the clock runs as short as possible. Loads should be distributed evenly across all of the clocks available. With the logic family you are using in the course, clock skew should not be a major problem. You should be aware of its existence, though.

Gating the Clock

Don't do it. This is one of the most common problems novice digital designers encounter. Assume you are using positive edge triggered logic. Your clock can be thought of then as a “low asserted” signal. If you were to gate if off, you would use a positive OR gate to hold it high. Unfortunately, you need to start holding it high BEFORE it goes LOW. Gating it off after the clock goes low will actually just make a positive transition of the clock occur slightly early.

Clock skews can also arise from being careless in gating clocks. If you absolutely can't contain yourself, and must gate a clock, use a clock from before the final clock fanout to compensate for the gate delay in the gating circuit.

Gating of a clock can almost always be avoided by using registers with a clock enable input. Counter and shift register parts can also be forced into the “do nothing” state easily.

RAM Write Pulses

Write pulses for static memories are likely to be one of the few areas where you do need to gate a clock-like waveform with a logic signal. Since the RAM parts available act as latches, it is important that the signals used to gate the write enable off, and that the address input and clock enable signals arrive early enough during the clock enable cycle not to cause glitches in the RAM functioning. To help you meet the Thold requirement of some parts, it is often helpful if your timing generator terminates the write pulse slightly prior to the rising edge of the main clock, assuring an adequate Thold. You can often make the clock signal of a design have a short enough Tlow such that it can be used as both the clock edge for registers and as the write-enable for RAM parts. Thold for the RAM address and data lines is sometimes a problem with this strategy, however.

Synchronizer Errors

Whenever you clock a signal which is asynchronous with the clocking waveform, there is a probability of producing a meta-stable state in the clocked flip-flop. For low-frequency clocks the probability of this meta-stable behavior is low. For LS flip-flops, a flip-flop output will have either set or not set by about 200 ns after the clock edge with very high probability. If you are designing a system which depends on synchronizing external signals faster than this, consider using a 74AS74 flip-flop as the synchronizer, since it is much faster than the LS parts.

Testing Strategies

You should be able to help yourself considerably in the testing of your project if you include in the design a means of controlling all of the finite-state machines. This means that you should be able to start the machine in a known state, preferably in any state, so that you can check out subroutines individually. You should be able to single step the machine to track down incorrect behavior. Making the machine loop at full speed doing some repetitive task is also a helpful debugging strategy, since you can then use a scope to examine the timing of the device directly. Those of you working with TV monitors will find that the monitor itself is a good debugging tool.

Driving High Current Devices

Those of you working with stepping motors and other high power devices should take care in the power/ground routing of motor power. The motor should be driven with a power supply other than the logic supply, and here, despite what I said above, you should worry about ground loops. Make the ground pin of the driver parts the common point for the motor and logic grounds, and otherwise strictly segregate them.

You should use power diodes as flyback protection across your motor windings. A 1N4001 would do nicely.