Verilog作业(二)

本文介绍了使用Verilog实现的几个设计实例,包括时钟频率的放大和缩小,以及一个简单的SRAM模型。通过这些实例,展示了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

运行结果

134223_GzSS_1425762.png

gtkwave.exe中显示的波形

134236_0rh9_1425762.png

二、将一个波形的频率减小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

运行结果

134327_hFPP_1425762.png

gtkwave.exe中显示的波形

134336_YI5t_1425762.png

三、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

运行结果

134444_GnDX_1425762.png

gtkwave.exe中显示的波形

134500_wG9S_1425762.png

END

转载于:https://my.oschina.net/Tsybius2014/blog/278351

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值