Skip to main content

Various examples of RTL design have been given as follows:

Example 1 : Verilog code for a 4-bit gray to binary converter using structure modelling.


module gray2bin( input [3:0] G, output [3:0] B ); assign B[3]=G[3]; xor x1(B[2],B[3],G[2]); xor x2(B[1],B[2],G[1]); xor x3(B[0],B[1],G[0]); endmodule

Test bench



`timescale 1ns / 1ps
module gray_binT;
reg [3:0] G1;
   wire [3:0] B1;
   gray2bin g1(G1,B1);
   initial 
   begin
   $monitor("Gray code values=%b, Binary Values=%b",G1,B1);
   //$monitor("Binary values of grey codes=%b",B1);
   end
   initial
   begin
   G1=4'd0;
   #6 G1=4'b0001;
   #4G1=4'd2;
   #6 G1=4'd3;
   #6 G1=4'd4;
      #4G1=4'd5;
      #6 G1=4'd6;
      #6 G1=4'd7;
         #4G1=4'd8;
         #6 G1=4'd9;
         #6 G1=4'd10;
            #4G1=4'd11;
            #6 G1=4'd12;
             #6 G1=4'd13;
                    #6 G1=4'd14;
                       #4G1=4'd15;
                       #6 G1=4'd0;
                  
   end
   
   endmodule

Example 2 : Verilog code for a 2_2 Binary Multiplier.
module multi_2_2(
    input [1:0] a,
    input [1:0] b,
    output [3:0] y
    );
 
    wire w1,w2,w3,w4;
    assign y[0]=a[0]& b[0];
    assign w1=a[0]& b[1];
    assign w2=a[1]& b[0];
    assign w3=a[1]& b[1];
 
    full_add f0(w1,w2,1'b0,y[1],w4),
             f1(w3,1'b0,w4,y[2],y[3]);
             

endmodule

module full_add(
    input A,
    input B,
    input C,
    input S,
    input Cr
    );
 
    assign {Cr,S}=A+B+C;
 
endmodule

Test Bench for Multiplier


module multi_test;

 reg [1:0] x1,y1;
 wire [3:0]z ;

 initial 
    begin
    $monitor("value of input number x1=%b, value of input number y1=%b, Multiplication output=%b",x1,y1,z);
        end

 multi_2_2 m0(x1,y1,z);
 initial 
 begin
 x1=0;y1=0;
 #1 x1=2'd0; y1=2'd0;
 #5 x1=2'd0 ;y1=2'd1;
 #1 x1=2'd0; y1=2'd2;
 #5 x1=2'd0 ;y1=2'd3;
 #1 x1=2'd1; y1=2'd1;
 #5 x1=2'd1 ;y1=2'd2;
 #1 x1=2'd1; y1=2'd3;
 #5 x1=2'd1 ;y1=2'd4;
  #1 x1=2'd2; y1=2'd1;
  #5 x1=2'd2 ;y1=2'd2;
  #1 x1=2'd2; y1=2'd3;
  #5 x1=2'd2 ;y1=2'd4;
  #1 x1=2'd3; y1=2'd1;
   #5 x1=2'd3 ;y1=2'd2;
   #1 x1=2'd3; y1=2'd3;
   #5 x1=2'd3 ;y1=2'd2;
     
 end
 endmodule

Simulation Output


Synthesized Schematic






Comments

Popular posts from this blog

Verilog HDL: Structured Procedures: Initial Statement

Structured Procedures: used in behavioral modelling There are two structured procedure statements in Verilog: always and initial. These statements are the two most basic statements in behavioral modeling. All other behavioral statements can appear only inside these structured procedure statements. Verilog is a concurrent programming language unlike the C programming language, which is sequential in nature. Activity flows in Verilog run in parallel rather than in sequence. Each always and initial statement represents a separate activity flow in Verilog. Each activity flow starts at simulation time 0. The statements always and initial cannot be nested. 1. Initial Statement All statements inside an initial statement constitute an initial block. An initial block starts at time 0, executes exactly once during a simulation, and then does not execute again. If there are multiple initial blocks, each block starts to execute concurrently at time 0. Each block finishes execution in...

Vrilog HDL: Nonblocking Procedural Assignments

Nonblocking Procedural Assignment Nonblocking assignments allow scheduling of assignments without blocking execution of the statements that follow in a sequential block. A <= operator is used to specify nonblocking assignments. Note that this operator has the same symbol as a relational operator, less_than_equal_to. The operator <= is interpreted as a relational operator in an expression and as an assignment operator in the context of a nonblocking assignment. To illustrate the behavior of nonblocking statements and its difference from blockinglets take an example. Example: reg x, y, z; reg [15:0] reg_a, reg_b; integer count; //All behavioral statements must be inside an initial or always block initial begin x = 0; y = 1; z = 1; //Scalar assignments count = 0; //Assignment to integer variables reg_a = 16'b0; reg_b = reg_a; //Initialize vectors reg_a[2] <= #15 1'b1; //Bit select assignment with delay reg_b[15:13] <= #10 {x, y, z}; //Assign result ...

Part-3 Example of Sequential Circuits

Example-1 A 4-Bit Shift register with asynchronous load. module bit4_SHreg(R,L,w,clk,Q);     input [3:0]R;     input L,w,clk;     output reg [3:0]Q; always@(posedge L,posedge clk) //begin if (L) Q<=R; else begin Q[0]<=Q[1]; Q[1]<=Q[2]; Q[2]<=Q[3]; Q[3]<=w;            /// w is data input                            /// w-> Q3 -> Q2-> Q1->Q0 end endmodule Test Bench module test_bit4SHreg; reg [3:0]R;    reg L,w,clk;   wire [3:0]Q;       bit4_SHreg r0(R,L,w,clk,Q);         initial begin clk=0; L=0;w=0;R=0; $monitor("R=%d,w=%b,Q=%b",R,w,Q); end always #5 clk=~clk; initial begin #1 L=1; R=6; #7 L=0; w=1; #8 w=0;  #9 w=1; #9 w=0; #9 w=1; #9 L=1; R=5; #3 R=4; #5 R=7; end    endmodule Simulation Results ...