nand2/01_Boolean_Logic/Readme.md
Michael Schröder 971b323822 added v2.0
2023-01-11 23:04:57 +01:00

135 lines
4.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`.