Verilog作业(二)

〇、关于本文

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

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

一、将一个波形的频率增大4倍

设计一个周期为10ns的时钟clk1,占空比为50%,并设计一个四分频模块,将clk1分为周期为2.5ns的时钟clk2

文件a.v代码

module clk_mul_4(clk_out, clr, clk1);

    input clk1;      //输入时钟
    input clr;       //复位端
    
    output clk_out; //输出分频时钟
    reg clk_out;
    
    integer counter = 0;
    
    always @(negedge clr or posedge clk1)
    begin
        
        if(!clr)
        begin
            clk_out = 0;
            counter = 0;
        end
        else
        begin
            counter = counter + 1;
            if(counter == 3)
            begin
                clk_out = ~clk_out;
                counter = 1;
            end 
        end
        
    end
    
endmodule

文件b.v代码

module test();

    reg clk1;
    reg clr;
    wire clk_out;
    
    clk_mul_4 dut(.clk_out(clk_out), .clr(clr), .clk1(clk1));
    
    initial 
    begin
        clk1 = 0; clr = 0;
        #5 clr = 1;
    end
    
    always #5 clk1 = ~clk1;
    
    initial begin
        $dumpfile("./test.vcd");
        $dumpvars(-1,test);
        $dumpon();
        #1000
        $dumpoff();
        $finish;
    end
    
    always @(clk1)
        $display("%t:    cout=\t%b\t%b", $time, clk_out, clk1);
    
endmodule

运行结果

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

gtkwave.exe中显示的波形

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

二、将一个波形的频率减小4倍

设计一个周期为10ns的时钟clk1,占空比为50%,并设计一个模块,将clk1分为周期为40ns的时钟clk2

文件a.v代码

`timescale 1ns/100ps
module clk_div_4(clk_out, clk1);

    input clk1;      //输入时钟
    input clr;       //复位端
    
    output clk_out; //输出分频时钟
    reg clk_out;
    
    always @(posedge clk1)
    begin
    
        clk_out = 1;
        #1 clk_out = 0;
        #1 clk_out = 1;
        #1 clk_out = 0;
        #1 clk_out = 1;
        #1 clk_out = 0;
        #1 clk_out = 1;
        #1 clk_out = 0;
        
    end
    
endmodule

文件b.v代码

`timescale 1ns/100ps
module test();

    reg clk1;
    reg clr;
    wire clk_out;
    
    clk_div_4 dut(.clk_out(clk_out), .clk1(clk1));
    
    initial 
    begin
        clk1 = 0;
    end
    
    always #4 clk1 = ~clk1;
    
    initial begin
        $dumpfile("./test.vcd");
        $dumpvars(-1,test);
        $dumpon();
        #100
        $dumpoff();
        $finish;
    end
    
    always @(clk_out)
        $display("%t:    cout=\t%b\t%b", $time, clk_out, clk1);
    
endmodule

运行结果

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

gtkwave.exe中显示的波形

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

三、SRAM模型

设计一个地址宽度为8,数据宽度为8的SRAM模型

文件a.v代码

module sram_8_8(cs,rd,wr,address,din,dout);
    
    input cs,rd,wr;
    input [2:0] address;
    input [7:0] din;
    
    output [7:0] dout;
    reg [7:0] dout;
    
    //临时存储
    reg [7:0] sram [0:7]; 
   
    always @ (cs or rd or wr or address or din)
    begin
        if(wr == 1'b1)  //写
        begin
            if ((cs == 1'b1) && (rd == 1'b0))
            sram[address] <= din;
        end
        else if(rd == 1'b1)  //读
        begin
            if((cs == 1'b1) && (wr == 1'b0))
            dout <= sram[address];
        end
    end
    
endmodule

文件b.v代码

module test();

    reg cs,rd,wr;
    reg [2:0]address;
    reg [7:0] din;
    wire [7:0] dout;
    
    sram_8_8 dut(.cs(cs), .rd(rd), .wr(wr), .address(address), .din(din), .dout(dout));

    initial begin
        cs <= 1;
        rd <= 0;
        wr <= 1;
        address <= 3'b010;
        din <= 8'b00011011;
        # 50
        rd <= 1;
        wr <= 0;
        # 50
        rd <= 0;
        wr <= 1;
        address <= 3'b011;
        din <= 8'b00011010;
        # 50
        rd <= 1;
        wr <= 0;  
    end
    
    initial begin
        $dumpfile("./test.vcd");
        $dumpvars(-1, test);
        $dumpon();
        #200
        $dumpoff();
        $finish;
    end
    
endmodule

运行结果

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

gtkwave.exe中显示的波形

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

END

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