1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
[\<- Verilog basics](8.md)
---
# Number systems and adders
## Hexadecimal numbers
### Binary and hexadecimal
- Binary is base-2, digits range from 0->1
- Decimal is base-10, digit range: 0->9
- Hexadecimal (hex) is base-16, 0->15
- Need digits for 11-15
- Use, A, B, C, D, E, F
- Hex range in binary is exactly 4 bits
- Used as a convenience for expressing 4 bit groupings for values that are a large number of bits
### Comparison
- Convention is to preced hex with 0x
- e.g., 0x10 means 16, not 10
|Decimal|Binary|Octal|Hexadecimal|
|-------|------|-----|-----------|
|00 |00000 |00 |00 |
|01 |00001 |01 |01 |
|02 |00010 |02 |02 |
|03 |00011 |03 |03 |
|04 |00100 |04 |04 |
|05 |00101 |05 |05 |
|06 |00110 |06 |06 |
|07 |00111 |07 |07 |
|08 |01000 |10 |08 |
|09 |01001 |11 |09 |
|10 |01010 |12 |0A |
|11 |01011 |13 |0B |
|12 |01100 |14 |0C |
|13 |01101 |15 |0D |
|14 |01110 |16 |0E |
|15 |01111 |17 |0F |
|16 |10000 |20 |10 |
|17 |10001 |21 |11 |
|18 |10010 |22 |12 |
---
## Converting binary to hex and vice versa
- No need to understand base-16 arithmetic
- Easy conversion from one form to another
- Example binary to hex
- 0011011010001110 would compress to
- 0011 -> 3
- 0110 -> 6
- 1000 -> 8
- 1110 -> E
- 368E or 0x368E
- Going the other way, hex to binary
- 0x407B would expand out to 0100000001111011
---
## Adding binary numbers, and the Full Adder (FA) circuit
### The Process of Addition
- A 2N-input truth table? Ouch
- Let's decompose instead
- Add numbers in the same position, including the "carry-in" -> 3 inputs
- Result is a sum and carry-out -> 2 outputs
![diagram](9.1.png)
### The Full Adder (FA) Circuit
![diagram](9.2.png)
![diagram](9.3.png)
![diagram](9.4.png)
---
## The ripple carry adder
- Use full adders and connect the carry-out to the carry-in of the next position
- The carry ripples thru the addrs
- Set c0 to 0 (unless we want to add 1...)
- This is one approach; many ways to add
![diagram](9.5.png)
---
## 4-bit adder, abstraction and hierarchical Verilog description
### A 4-bit adder
- 4-bit inputs => 4-bit output
- A hardware contruct, with wires and gates
![diagram](9.6.png)
### A 4-bit adder in verilog
```
module adder4(carryin, x3, x2, x1, x0, y3, y2, y1, y0, s3, s2, s1, s0, carryout);
input carryin, x3, x2, x1, x0, y3, y2, y1, y0;
output s3, s2, s1, s0, carryout;
fulladd stage0(carryin, x0, y0, s0, c1);
fulladd stage1(c1, x1, y1, s1, c2);
fulladd stage2(c2, x2, y2. s2, c3);
fulladd stage3(c3, x3, y3, s3, carryout);
endmodule
module fulladd(Cin, x, y, s, Cout);
input Cin, x, y;
output s, Cout;
assign s = x ^ y ^ Cin;
assign Cout = (x & y) | (x & Cin) | (y & Cin);
endmodule
```
|