I have successfully tested 4 out of the 5 chips I need for the ALU. The multiplexor was giving me some trouble; hopefully I can figure out what was going wrong. I've tried several different chips, and I think whatever's going on is because of me, not faulty chips.
Here's a video of that testing in action, on the 4 good chips. While its not overly exciting, I want to document most of this project. So... enjoy?
Saturday, August 25, 2012
4-bit ALU - Design
Today I finished coding my ALU in Hardware Description Language. I had already implemented a 16-bit ALU, so I didn't have to change much; I just switched all the 16-bit gates to 4-bit gates and substituted NAND gates for NOT gates, as I don't have any NOT gates. Though I came up with this particular implementation, the functionality was detailed in this book. Here's the truth table I used to build it:
IN
x[4], y[4], // 4-bit inputs
zx, // zero the x input?
nx, // negate the x input?
zy, // zero the y input?
ny, // negate the y input?
f, // compute out = x + y (if 1) or out = x & y (if 0)
no; // negate the out output?
OUT
out[4], // 4-bit output
zr, // 1 if (out==0), 0 otherwise
ng; // 1 if (out<0), 0 otherwise
PARTS:
Nand4(a[0]=zx, a[1]=zy, b=true, out[0]=w1, out[1]=w5);
And4(a=x, b[0]=w1, b[1]=w1, b[2]=w1, b[3]=w1, out=w2);
Nand4(a=w2, b=true, out=w3);
Mux4(a=w2, b=w3, sel=nx, out=w4);
And4(a=y, b[0]=w5, b[1]=w5, b[2]=w5, b[3]=w5, out=w6);
Nand4(a=w6, b=true, out=w7);
Mux4(a=w6, b=w7, sel=ny, out=w8);
And4(a=w4, b=w8, out=w9);
Add4(a=w4, b=w8, out=w10);
Mux4(a=w9, b=w10, sel=f, out=w11);
Nand4(a=w11, b=true, out=w12);
Mux4(a=w11, b=w12, sel=no, out=w13, out=w14, out[3]=w15, out=out);
Or4Way(in=w13, out=w16);
Nand(a=w16, b=true, out=zr);
And(a=w15, b=true, out=ng);
}
As you can see, it performs a number of different functions, but it doesn't multiply or divide. While I may add that function to the 16-bit ALU, I'm sticking with these functions for the 4-bit ALU.
I've copied the code I wrote for the 4-bit ALU below. (NOTE: ALU CODE HAS BEEN CHANGED) The language is fairly self explanatory, but I've also included a link to the Hardware Simulator I used and materials explaining how to interpret it.
So far so good!
I've copied the code I wrote for the 4-bit ALU below. (NOTE: ALU CODE HAS BEEN CHANGED) The language is fairly self explanatory, but I've also included a link to the Hardware Simulator I used and materials explaining how to interpret it.
So far so good!
4-Bit ALU HDL Code v1.0
CHIP ALU4 {IN
x[4], y[4], // 4-bit inputs
zx, // zero the x input?
nx, // negate the x input?
zy, // zero the y input?
ny, // negate the y input?
f, // compute out = x + y (if 1) or out = x & y (if 0)
no; // negate the out output?
OUT
out[4], // 4-bit output
zr, // 1 if (out==0), 0 otherwise
ng; // 1 if (out<0), 0 otherwise
PARTS:
Nand4(a[0]=zx, a[1]=zy, b=true, out[0]=w1, out[1]=w5);
And4(a=x, b[0]=w1, b[1]=w1, b[2]=w1, b[3]=w1, out=w2);
Nand4(a=w2, b=true, out=w3);
Mux4(a=w2, b=w3, sel=nx, out=w4);
And4(a=y, b[0]=w5, b[1]=w5, b[2]=w5, b[3]=w5, out=w6);
Nand4(a=w6, b=true, out=w7);
Mux4(a=w6, b=w7, sel=ny, out=w8);
And4(a=w4, b=w8, out=w9);
Add4(a=w4, b=w8, out=w10);
Mux4(a=w9, b=w10, sel=f, out=w11);
Nand4(a=w11, b=true, out=w12);
Mux4(a=w11, b=w12, sel=no, out=w13, out=w14, out[3]=w15, out=out);
Or4Way(in=w13, out=w16);
Nand(a=w16, b=true, out=zr);
And(a=w15, b=true, out=ng);
}
Thursday, August 23, 2012
4-bit ALU
3 840 hole breadboards
3 spools of wire (1 green, 1 red, 1 black)
1 Arduino UNO (power supply)
2 DIP 8 slide switches (CTS 206-8)
4 NAND gates (sn74ls00n)
4 AND gates (sn74ls08n)
1 OR gate (sn74ls32n)
4 MUX gates (sn74hct157n)
1 Full Adder (sn7483n)
*Note: This list may change, if I find I need more parts
Though I planned out what I needed based on a design I had already tested with software, I'm tweaking it a little bit. Once I've written it down in HDL (hardware description language, for those who haven't read the book), I'll probably upload it.
Subscribe to:
Posts (Atom)