Verilog作业(一)

〇、关于本文

本文我的Verilog课程作业,由于我尚处在初学阶段,并且这门课和我实际工作的关系并不大,因此代码仅供参考。

我使用的编译环境为iverilog,在Windows下运行。

一、4-1选择器

文件a.v代码

module mux4_1(out, in0, in1, in2, in3, sel);

    output out;
    input in0, in1, in2, in3;
    input [1:0] sel;
    reg out;

    always @(in0 or in1 or in2 or in3 or sel)
    case(sel)
        2'b00: out = in0;
        2'b01: out = in1;
        2'b10: out = in2;
        2'b11: out = in3;
        default: out = 2'bx;
    endcase
    
endmodule

文件b.v代码

module test();

    wire out;
    reg in0, in1, in2, in3;
    reg [1:0] sel;
    
    mux4_1 dut(.out(out), .in0(in0), .in1(in1), .in2(in2), .in3(in3), .sel(sel));
    
    initial begin
        in0 = 2'b00;
        in1 = 2'b01;
        in2 = 2'b10;
        in3 = 2'b11;
        #1 sel = 2'b00;
        #1 sel = 2'b01;
        #1 sel = 2'b10;
        #1 sel = 2'b11;
    end
    
    initial begin
        $dumpfile("./test.vcd");
        $dumpvars(-1, test);
        $dumpon();
        #6
        $dumpoff();
        $finish;
    end
    
    always #1
    $display("%t:    cout=%b %h %h %h %h %b", $time, out, in0, in1, in2, in3, sel);
    
endmodule

运行结果

Verilog作业(一)_第1张图片

gtkwave.exe中显示的波形

Verilog作业(一)_第2张图片

二、8位计数器

文件a.v代码

module count_en(clock, reset, out);

  input clock, reset;
  output [7:0] out;
  reg [7:0] out;
  
  always @(posedge clock or negedge reset)
    if(!reset)
      out = 8'b0;           
    else 
      out = out + 1;

endmodule

文件b.v代码

module test();

    reg clock, reset;
    wire[7:0] out;
    
    count_en dut(.clock(clock), .reset(reset), .out(out));
    
    initial begin
        #1 reset = 0;
        #1 reset = 1;
    end
    
    always begin
        #1 clock = 0;
        #1 clock = 1;
    end
    
    initial begin
        $dumpfile("./test.vcd");
        $dumpvars(-1, test);
        $dumpon();
        #40
        $dumpoff();
        $finish;
    end
    
    always #2
    $display("%t:    out=%b", $time, out);
    
endmodule

运行结果

Verilog作业(一)_第3张图片

gtkwave.exe中显示的波形

Verilog作业(一)_第4张图片

三、设计一个通过函数完成的模块,实现16位无符号数乘法

文件a.v代码

module mult16(product,a,b);

    output [15:0] product;
    input [15:0] a;
    input [15:0] b;
    reg [15:0] product;

    always @(a,b)
        product = multiply(a, b);

    function [15:0] multiply;
        input [15:0] a;
        input [15:0] b;
        multiply = a * b;
    endfunction
    
endmodule

文件b.v代码

module test();

    reg [15:0] a, b;
    wire [15:0] product;
    
    mult16 dut(.a(a), .b(b), .product(product));
    
    initial begin
        #1 a = 16'b00000000; b = 16'b00000000;
        #1 a = 16'b00000010; b = 16'b00000011;
        #1 a = 16'b00010010; b = 16'b01000011;
        #1 a = 16'b01101010; b = 16'b00101011;
        #1 a = 16'b01111111; b = 16'b00001111;
    end
    
    initial begin
        $dumpfile("./test.vcd");
        $dumpvars(-1, test);
        $dumpon();
        #5
        $dumpoff();
        $finish;
    end
    
    always #1
    $display("%t:    a=%h    b=%h    product=%b", $time, a, b, product);
    
endmodule

运行结果

Verilog作业(一)_第5张图片

gtkwave.exe中显示的波形

Verilog作业(一)_第6张图片

你可能感兴趣的:(Verilog作业(一))