Veirlog 学习记录(5),循环移位数码管的设计与实现

实现功能:在开发板的数码管上显示特定数字,并且让这些数字循环移位。

总体框图如下:
在这里插入图片描述

代码如下:

分频模块:

module div(
    input clk, //输入自带的系统时钟(100Mhz)
    input rst, //复位
    output scan_clk //输出时钟,用于驱动数码管,让其动态扫描用
    );
    reg [19:0] clkdiv;
    
    always @(posedge clk or posedge rst)
    begin
        if( rst == 1)  clkdiv <=0;
        else  clkdiv <= clkdiv + 1;
    end
    assign scan_clk = clkdiv[15]; //使得san_clk = 190Hz
endmodule

其他模块(显示模块):

module otherModel(
    input rst,
    input scan_clk,
    
    output reg [7:0] an,
    output reg [6:0] seg
    );
    reg [3:0] digit;  //选择位上显示的数字
    reg [2:0] cnt;  //选择哪一位显示
    
    always @(posedge scan_clk or posedge rst)
        begin
        if ( rst == 1) cnt <=0;
        else cnt <=cnt + 1;
        end
    
    always @ (*)
    begin
        case ( cnt )
        3'b000:begin digit = 4'b0000; an = 8'b01111111; end
        3'b001:begin digit = 4'b0001; an = 8'b10111111; end
        3'b010:begin digit = 4'b0010; an = 8'b11011111; end
        3'b011:begin digit = 4'b0011; an = 8'b11101111; end
        3'b100:begin digit = 4'b0100; an = 8'b11110111; end
        3'b101:begin digit = 4'b0101; an = 8'b11111011; end
        3'b110:begin digit = 4'b0110; an = 8'b11111101; end
        3'b111:begin digit = 4'b0111; an = 8'b11111110; end
         default:begin digit= 4'b0000; an = 8'b01111111; end
        endcase
    end
    
    always @ (*)
      begin
         case ( digit )
         4'b0000:seg = 7'b0100100;
         4'b0001:seg = 7'b1000000;
         4'b0010:seg = 7'b1111001;
         4'b0011:seg= 7'b0000000;
         4'b0100:seg =7'b0100100;
         4'b0101:seg =7'b1000000;
         4'b0110:seg =7'b1111000;
         4'b0111:seg =7'b0000000;
         default: seg = 7'b0000001;
         endcase
     end
         
         
         
endmodule

顶层模块:

module top(
    input clk,
    input rst,
    output [7:0] an,
    output [6:0] seg
    );
    
    div u1(clk,rst,scan_clk); //例化模块
    otherModel u2(rst,scan_clk,an,seg);
endmodule

测试文件:
注意:测试文件是针对otherModel文件的。在写测试文件之前,最好不要添加顶层模块,否则测试时会找不到想要测试的那个文件。如果,已经编写完了顶层模块,可以在design列表中,右键要测试的文件,然后点击 设置为顶层文件,这样就会测试到指定的文件了。

module otherModel_tb();
    reg rst,scan_clk; //输入信号要用 reg型
    wire [7:0] an; //输出信号要用 wire型
    wire [6:0] seg; //输出信号
    
    otherModel test(
                     .rst(rst),
                     .scan_clk(scan_clk),
                     .an(an),
                     .seg(seg)
                     
                        );
     initial fork
           scan_clk = 0;
           rst = 1; #50 rst = 0;
     join
                              
     always #10 scan_clk = ~scan_clk; //定义没过10毫秒,信号就会进行翻转
     
endmodule

仿真波形如下:
在这里插入图片描述
我也写了几篇关于Veirlog的文章,感兴趣的同学可以去看看。该模块链接如下:
https://blog.csdn.net/weixin_43877139/article/category/8778400

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值