nand2/01_Boolean_Logic/Readme.md

135 lines
4.4 KiB
Markdown
Raw Permalink Normal View History

2023-01-11 10:13:09 +00:00
# 01 Boolean Logic
The hardware part of the project nand2tetris-fpga is implemented in verilog, a hardware description language similar to HDL used in the original nand2tetris course. There is no need to learn much verilog, as you can easily translate all your HDL-files into verilog following the given example for `Xor`.
**Note:**
The following modules are considered primitive and thus there is no need to implement them.
| module | description |
| ---------- | --------------------------------------------------------------------- |
| `Nand.v` | Nand-gate. Basic building block for combinatorial logic |
| `DFF.v` | Data Flip Flop. Basic building block for sequential logic |
| `RAM256.v` | uses Block Ram (BRAM) of iCE40 |
| `ROM.v` | uses Block Ram (BRAM) of iCE40 preloaded with HACK-code at startup |
| `InOut.v` | Tristate buffer, used to connect to the bidirectional databus of SRAM |
***
## Example Xor
### Xor.hdl
Yout implementation of Xor in HDL (nand2tetris) should look something like:
```
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/01/Xor.hdl
/**
* Xor (exclusive or) gate:
* If a<>b out=1 else out=0.
*/
CHIP Xor {
IN a, b;
OUT out;
PARTS:
Not(in=a, out=nota);
Not(in=b, out=notb);
And(a=a, b=notb, out=w1);
And(a=nota, b=b, out=w2);
Or(a=w1, b=w2, out=out);
}
```
### Xor.v
`Xor.hdl` can easily be translated into `Xor.v` (verilog):
```
/**
* Xor (exclusive or) gate:
* If a<>b out=1 else out=0.
*/
module Xor(
input a,
input b,
output out
);
wire nota; //new wire must be declared (as wire)
wire notb;
Not NOT1(.in(a), .out(nota)); //Every chip has an instance name (NOT1)
Not NOT2(.in(b), .out(notb)); //this chip is named NOT2
wire w1;
wire w2;
And AND1(.a(a),.b(notb),.out(w1));
And AND2(.a(nota),.b(b),.out(w2));
Or OR(.a(w1),.b(w2),.out(out));
}
```
### Simulation
For every chip wie provide a test folder e.g. `05_Xor`, in which you find a so called testbench (`Xor_tb.v`). To run the test bench cd into the test directory and run apio:
```
$ cd 05_Xor
$ apio clean (used to remove older implementation from cache)
$ apio sim
```
**Attention:** All used chips used in the verilog code must be already implemented and included in the `Include.v` file.
The test bench will produce a graphical represantation `Xor.gtkw` of all signal lines, which can be viewed with gtkwave.
![](05_Xor/Xor.png)
You can see four sections:
* `IN`: the input signals (generated by the test bench)
* `OUT`: the output signals (generated by YOUR chip implementation)
* `CMP`: the output signals (generated by the test bench)
* `Test`: the fail signal. Goes high, when the test fails.
Your chip passes the test, when `out=out_cmp` and `fail=0` over the whole test time.
### iCE40HX1K.pcf
To upload the chip `Xor` onto your fpga board iCE40HX1K-EVB you need two additional files: `top.v` and `iCE40HX1K.pcf` (physical constraints file). The pyhiscal constraints file assigns every io-signal wire of the top level module `top.v` to physical pins of the fpga chip iCE40HX1K. Pin numbering can be checked by consulting the schematic [iCE40HX1K-EVB](../doc/iCE40HX1K-EVB_Rev_B.pdf) in `doc/iCE40HX1K-EVB_Rev_B.pdf`.
```
# physical constrain file
# assign io-pins to pin numbering of iCE40-HX1K on olimex board iCE40-HX1K-EVB
# compare to the schematic of the board and the datasheet of fpga
set_io BUT1 41 # BUT1
set_io BUT2 42 # BUT2
set_io LED1 40 # LED1
set_io LED2 51    # LED2
```
* Now you can build and upload the chip `Xor` to iCE40-HX1K-EVB with:
```
$ apio clean
$ apio build
$ apio upload
```
* Press buttons BUT1 and BUT2 and see the result of your `Xor` chip on LED1.
**Attention:** Due to pull up resistors at the buttons, the signals appear inverted:
| pin | function |
| ------ | ------------------------------------------------- |
| LED1/2 | 0 led is off, 1 led is on |
| BUT1/2 | 0 button is pressed down, 1 button is released up |
Chips with note more than two in- and output signals can be uploaded and tested in real hardware: `Nand`, `Not`, `Buffer`, `And`, `Or`, `Xor` and `DMux`.