Verilog HDL**两位数码管计数器,关于reg位数的问题

  1. 顶层原理图
    在这里插入图片描述
    /
  2. count.v
module count(
   input sys_clk,
   input sys_rst_n,
   
   output reg [7:0] data);             //累加数
   
parameter MAX_TIME = 25'd25000_000;     //25M频率1s
parameter MAX_NUM = 99;                 //最大计数到99
reg [25:0] cnt;                         //计数    
reg [7:0] data_tmp;
reg [7:0] point_tmp;
reg flag;                               //计数周期标志,1s产生一个脉冲

//分频得出1s
always @(posedge sys_clk or negedge sys_rst_n) begin
   if(!sys_rst_n) begin
       cnt <= 25'd0;
       flag <= 1'b0;
   end
   else if(cnt < MAX_TIME) begin
       cnt <= cnt+1'b1;
       flag <= 1'b0;
   end
   else begin
       flag <= 1'b1;
       cnt <= 25'd0;
   end
end

//data 自加
always @(posedge sys_clk or negedge sys_rst_n) begin
   if(!sys_rst_n)  begin
       data_tmp <= 12'd0;
       point_tmp<= 2'd0;
   end
   else if(flag) begin
       if(data_tmp < MAX_NUM)
           data_tmp <= data_tmp + 1;
       else
           data_tmp <= 12'd0;
   end
   else
       data_tmp <= data_tmp;
       
   data <= data_tmp;
end
   
   
endmodule 

//
3. seg_led_set.v

module seg_led_set(
    input sys_clk,
    input sys_rst_n,
    
    input [7:0] data,
    
    output reg [1:0] sel,
    output reg [7:0] led);    
//
parameter TIME_1ms = 15_000;        //数码管1ms循环闪烁

reg [3:0]   num_dis;                //当前显示的数
reg [1:0]   sel_dis;                //当前显示的位
reg         clk_div;                //1ms 分频
reg [14:0]  clk_cnt;                //1ms 分频 计数器  15000是14位,但是clk_cnt不能定义为reg[13:0],这是为何?

wire [3:0] data0;                   //个位
wire [3:0] data1;                   //十位    

assign data0 = data%10;
assign data1 = data/10%10;

//分频得出1ms翻转一次的clk_div
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        clk_cnt <= 14'd0;
        clk_div <= 1'b0;
    end
    else if(clk_cnt < TIME_1ms)
        clk_cnt <= clk_cnt + 1'b1;
    else begin
        clk_cnt <= 14'd0;
        clk_div <= ~clk_div;
    end
end 

//根据clk_div的状态选择点亮十位或者各位的数码管
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        num_dis <= 4'd0;
        sel <= 2'd0;
    end
    else if(clk_div) begin
        sel <= 2'b10;
        num_dis <= data1;
    end
    else begin
        sel <= 2'b01;
        num_dis <= data0;
    end
end

//译码输出
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        led <= 8'hff;
    else begin
        case (num_dis)
            4'h0: led <= 8'b0011_1111;
            4'h1: led <= 8'b0000_0110;
            4'h2: led <= 8'b0101_1011;
            4'h3: led <= 8'b0100_1111;
            4'h4: led <= 8'b0110_0110;
            4'h5: led <= 8'b0110_1101;
            4'h6: led <= 8'b0111_1101;
            4'h7: led <= 8'b0000_0111;
            4'h8: led <= 8'b0111_1111;
            4'h9: led <= 8'b0110_0111;
            4'ha: led <= 8'b0111_0111;
            4'hb: led <= 8'b0111_1100;
            4'hc: led <= 8'b0011_1001;
            4'hd: led <= 8'b0101_1110;
            4'he: led <= 8'b0111_1001;
            4'hf: led <= 8'b0111_0001;
        default : led <= 8'b0011_1111;
        endcase
    end
end  
endmodule  

实现两位数码管显示从00累加到99的秒计时器,遗留问题是cnt计1ms时在15M晶振频率下要记到15000,15000是14位,在seg_led_set.v中,cnt如果定义为reg [13:0],则无法计到15000,目前尚未查出原因。

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
数码管动态扫描是一种常用的显示方式,通过快速地切换显示的数码管,以人眼无法察觉的速度来实现同时显示多位数的效果。这种方式主要基于一种叫做"时分复用"的技术来实现。 在Verilog HDL中,可以使用以下步骤来实现数码管动态扫描: 1. 首先,需要定义数码管的显示字形。可以使用一个包含7个比特(对应数码管的7个段)的向量来表示一个数字或字母的显示形式。例如,可以定义一个向量`reg [6:0] digit`来存储需要显示的字形。 2. 然后,需要定义一个计数器实现动态扫描。可以使用一个包含n个比特的寄存器来表示计数器的值。例如,可以定义一个8位的寄存器`reg [7:0] count`来实现8位数码管的扫描。 3. 接下来,需要使用一个时钟信号来驱动计数器计数过程。可以使用计数器的值来确定当前应该显示的数字。例如,可以通过定义一个`always`块来实现计数器的自增功能,如`always @(posedge clk) count <= count + 1`。 4. 在时钟的驱动下,计数器的值会不断变化。可以通过使用`case`语句来选择当前计数器值应该显示的字形。例如,可以使用以下代码: ```verilog always @(posedge clk) begin case (count) 0: digit <= 7'b0111111; // 显示数字0 1: digit <= 7'b0000110; // 显示数字1 // 其他数字的显示字形... default: digit <= 7'b0000000; // 不显示 endcase end ``` 5. 最后,需要将计数器的值和字形信号连接到数码管的相应引脚上,以实现动态扫描显示的效果。 总结起来,通过定义数码管的显示字形,使用计数器实现动态扫描,利用时钟信号和`case`语句来选择要显示的字形,最后将计数器的值和字形信号连接到数码管引脚上,就可以实现数码管动态扫描的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值