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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Verilog语言实现的电梯控制器的示例代码: ```verilog module ElevatorController( input wire clk, // 时钟信号 input wire reset, // 复位信号 input wire up_button, // 上行按钮信号 input wire down_button, // 下行按钮信号 input wire floor1_button, // 1楼按钮信号 input wire floor2_button, // 2楼按钮信号 input wire floor3_button, // 3楼按钮信号 output wire[4:0] led, // LED指示灯信号 output wire[1:0] display // 数码管显示信号 ); reg [2:0] current_floor; // 当前楼层 reg [2:0] target_floor; // 目标楼层 reg [2:0] next_floor; // 下一楼层 always @(posedge clk or posedge reset) begin if (reset) begin current_floor <= 3'b000; // 初始楼层为1楼 target_floor <= 3'b000; // 初始目标楼层为1楼 next_floor <= 3'b000; // 初始下一楼层为1楼 end else begin // 根据按钮信号更新目标楼层 if (up_button && current_floor < 3'b110) begin target_floor <= current_floor + 1; end else if (down_button && current_floor > 3'b000) begin target_floor <= current_floor - 1; end else if (floor1_button) begin target_floor <= 3'b000; end else if (floor2_button) begin target_floor <= 3'b010; end else if (floor3_button) begin target_floor <= 3'b100; end // 根据当前楼层和目标楼层计算下一楼层 if (current_floor < target_floor) begin next_floor <= current_floor + 1; end else if (current_floor > target_floor) begin next_floor <= current_floor - 1; end else begin next_floor <= current_floor; end // 更新当前楼层 current_floor <= next_floor; end end // 根据当前楼层和目标楼层更新LED指示灯和数码管显示 always @(current_floor, target_floor) begin case (current_floor) 3'b000: begin led <= 5'b00001; // LED1亮,其余熄灭 display <= 2'b00; // 数码管显示00 end 3'b010: begin led <= 5'b00010; // LED2亮,其余熄灭 display <= 2'b01; // 数码管显示01 end 3'b100: begin led <= 5'b00100; // LED3亮,其余熄灭 display <= 2'b10; // 数码管显示10 end default: begin led <= 5'b00000; // 所有LED熄灭 display <= 2'b11; // 数码管显示11 end endcase end endmodule ``` 该代码实现了一个简单的电梯控制器,根据按钮信号控制电梯的运行和指示灯的亮灭。根据当前楼层和目标楼层,更新LED指示灯和数码管显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值