110 likes | 232 Views
This web-based tutorial provides a detailed overview of Digital System Design using Verilog, focusing on both structural and behavioral descriptions. Key topics include primitive instantiation, Boolean equation modeling, continuous and cyclic behaviors, and testbench examples. Learn to represent multi-bit numbers, use module hierarchies, implement logical conditions with `if-else` and `case` statements, and explore looping structures in Verilog. Perfect for students and professionals looking to build a strong foundation in digital design.
E N D
ENEE 408C LabCapstone Project: Digital System DesignVerilog Tutorial Class Web Site: http://www.ece.umd.edu/class/enee408c
Structure Description • primitive instantiation (AND, NAND, OR, NOR, XOR, XNOR, BUF, NOT, BUFIF, NOTIF) • parameter value assignment
Structural Description Example module weird_logic (a,b,c,d); output a; input b,c,d; wire w; nand g1(w,b,c); nor g2(a,w,d); endmodule don’t forget primitive
Behavioral Description 1 • Boolean-Equation-Based Model module weird_logic (a,b,c,d); output a; input b,c,d; wire w; assign w = ~(b & c); assign a = ~(w | d); endmodule • continuous assignment • level-sensitive • normally used for combinational circuits continuous assignment
Behavioral Description 2 • Cyclic Behavior Model module weird_logic (a,b,c,d); output a; input b,c,d; reg w,a; always@(b or c) w = ~(b & c); always@(d or posedge w) a = ~(w | d); endmodule • always block • can be both level and edge sensitive • do not expire after the last statements
Behavioral Description 2 • Cyclic Behavior Model module weird_logic (a,b,c,d); output a; input b,c,d; wire w; always@(b or c) w = ~(b & c); always@(d or posedge w) a = ~(w | d); endmodule • always block • can be both level and edge sensitive • do not expire after the last statements
Testbench Example module tb_weird_logic; wire A; reg B, C, D; weird_logic instance1(A, C, D, B); initial // two slashes introduce a single line comment begin $monitor ($time,,, "A = %b B = %b C = %b D = %b", A, B, C, D); //waveform for simulating the binaryToESeg driver #10 B = 0; C = 0; D = 0; #10 D = 1; #10 C = 1; D = 0; #10 $finish; end endmodule
Using vectors to represent multi-bit numbers in Verilog • One dimensional: describe data with multiple bits. e.g. reg [3:0] a; a = 4’b1011; a = 4’d11; a = 4’hb; • Two dimension: describe a register array. e.g. reg [3:0] b [0:2]; b[0] = 4’d11; b[1] = 4’d12; b[2] = 4’d13 represents the width of the data (from MSB to LSB) represents the depth of the array (from address 0)
Module Hierarchy and Module Instantiation • A module uses other defined modules to implement a function. • Example: • module fulladder (sum,cout,a,b,cin); • input a, b, cin; • output sum, cout; • assign sum = a ^ b ^ cin; • assign cout = a&b | b&cin | a&cin; • endmodule • module halfadder (sum, cout, a,b); • input a, b; • output sum, cout; • assign sum = a ^ b; • assign cout = a & b; • endmodule • module fulladder (sum,cout,a,b,cin); • input a, b, cin; • output sum, cout; • halfadder A1(.sum(w1), .cout(w2), .a(a), .b(b)); • halfadder A2(.sum(sum), .cout(w3), .a(w1), .b(cin)); • assign cout = w2 | w3; • endmodule
Representing Logical Conditions • if-else statement reg n, m, p; if (n == m) begin p = 1’b0; end else begin p = 1’b1; end • case statement case (n) begin 1’b0: begin m= 1’b0; end 1’b1: begin m= 1’b1; end endcase • ? in continuous assignment wire w1, w2, w3 assign w1 = (w2==1’b1) ? w3: 1’bx;
Loop Structure in Verilog • while while ( i < 4’d10) begin … end • for for ( i = 0; i < 4’d10; i = i+1) • forever All the loops are used ONLY in procedural assignments