diff options
author | lshprung <lshprung@yahoo.com> | 2020-10-07 11:35:55 -0700 |
---|---|---|
committer | lshprung <lshprung@yahoo.com> | 2020-10-07 11:35:55 -0700 |
commit | babe8c3702bee5203a0cc062724706c2efbf57ac (patch) | |
tree | 877cd0d24b2303fcc8eccb5384fbd42f1e79618b /8.md | |
parent | 37e17742a145abd0282543dfc0ae8dc8d98e2f6b (diff) |
Post-class 10/07
Diffstat (limited to '8.md')
-rw-r--r-- | 8.md | 206 |
1 files changed, 206 insertions, 0 deletions
@@ -0,0 +1,206 @@ +[\<- Shannon's Expansion and FPGAs](7.md) + +--- + +# Verilog basics + +## Introductory Verilog concepts + +### Verilog + +- A language to specify hardware + - Hardware Description Language (HDL) +- Has many features of other programming languages but it does \*not\* execute sequentially like most languages do +- Can specify structure or behavior + - Structure is like an actual circuit; netlist + - Behavior would be like logic equations or truth table + - Can be synthesized into a specific structure + +### Verilog module + +- HW is always described inside a module + - Like a schematic +- Always at least one output, and then however many inputs the circuit consumes + - Referred to as ports + - Taken together this is called the interface +- Variable names are used to make connections, either from ports to internal circuitry or between circuit elements inside the module + +--- + +## Describing structure of 2:1 mux + +- Example: Inputs x1,x2, and s, and output f + - This is the interface +- Need to describe what's happening inside + - Need to describe how gates are connected + - Use Verilog primitives to describe structure + +![diagram](8.1.png) + +### Interfaces for primitves + +- AND (2-input example): + +``` +module and(y,x1,x2); + input x1,x2; + output y; +``` + +- OR (4-input example): + +``` +module or (y,x1,x2,x3,x4); + input x1,x2,x3,x4; + output y; +``` + +- NOT (always just one input): + +``` +module not (y,x); + input x; + output y; +``` + +### Structural example + +- A gate-level implementation of a 2:1 mux +- Ports connected by name association + - E.g., "k" connects the output of the NOT gate to one of the inputs to the first AND gate + +``` +module example1(x1, x2, s, f); + input x1, x2, s; + output f; + wire k, g, h; + + not(k, s); + and(g, k, x1); + and(h, s, x1); + or(f, g, h); + +endmodule +``` + +![diagram](8.2.png) + +- Note that the declaration of the wires in the above code is optional, but makes for good habit + - If not explicitly declared, `k`, `g`, and `h` would be implicitly considered wires by Verilog + +--- + +## Behavioral description of 2:1 mux + +### Behavioral code + +- Uses syntax like our boolean algebra equations + - `&` instead of `*` + - `|` instead of `+` + - `~` instead of `!` +- Keyword of `assign` means the equation is always evaluated, just like logic gates work + +``` +module example3(x1, x2, s, f); + input x1, x2, s; + output f; + + assign f = (~s & x1) | (s & x2); + +endmodule +``` + +![diagram](8.3.png) + +--- + +## Behavioral description of a more complex module + +- Describe this circuit, with outputs f, g, h + +![diagram](8.4.png) + +- Assign statements don't have to be in the order listed + - Specifying the behavior of a wire +- Also don't have to specify intermediate nodes + +``` +module example4(x1, x2, x3, x4, f, g, h); + input x1, x2, x3, x4; + output f, g, h; + + assign g = (x1 & x3) | (x2 & x4); + assign h = (x1 | ~x3) & (~x2 | x4); + assign f = g | h; + +endmodule +``` + +--- + +## Hierarchy in Verilog + +### Hierarchical design + +- Block diagram of two modules working together + - Outputs of adder module connected to inputs of display module + +![diagram](8.5.png) + +### Code for the adder + +- What is the truth table for a circuit that treats two inputs as numbers and adds them together? + +![diagram](8.6.png) + +``` +//An adder module +module adder(a, b, s1, s0); + input a, b; + output s1, s0; + + assign s1 = a & b; + assign s0 = a ^ b; + +endmodule +``` + +- Note that `^` is XOR in Verilog + +### Code for the display driver + +- Useful to work out the truth table in order to figure out the equations + +``` +//A module for driving a 7-segment display +module display(s1, s0, a, b, c, d, e, f, g); + input s1, s0; + output a, b, c, d, e, f, g; + + assign a = ~s0; + assign b = 1; + assign c = ~s1; + assign d = ~s0; + assign e = ~s0; + assign f = ~s1 & ~s0 + assign g = s1 & ~s0 + +endmodule +``` + +### Instantiating and connecting + +- Note the "wire" declarations for the internal (to this module) connections between adder and display + - Variables not part of interface definition + +``` +module adder_display (x, y, a, b, c, d, e, f, g); + input x, y; + output a, b, c, d, e, f, g; + wire w1, w0; + + adder U1(x, y, w1, w0); + display U2(w1, w0, a, b, c, d, e, f, g); + +endmodule +``` |