顶层模块代码

module top_seg_led(input         sys_clk ,input          sys_rst_n,output    [5:0]   seg_sel ,output [7:0]   seg_led);wire   [19:0]  data;   //数码管显示的数值wire  [ 5:0]  point;  //数码管小数点的位置wire         en;     //数码管显示始能信号wire         sign;   //数码管显示数据的符号位///*** *** main code *** ***/////计数器模块,每隔0.1秒,数据累加一次,输出累加结果最高999999需要20位二进制数表示count u_count(  .clk        (sys_clk    ),.rst_n        (sys_rst_n  ),
//output.en         (en         ),.data     (data       ),.point        (point      ),.sign     (sign       ));
//数码管动态显示模块seg_led u_led(.clk       (sys_clk    ),.rst_n        (sys_rst_n  ),
//input .en         (en         ),  .data       (data       ),  .point      (point      ),.sign     (sign       ),
//output    .seg_sel    (seg_sel    ),.seg_led  (seg_led    ));
endmodule

计数器输出模块

//模块说明:每隔0.1秒,数据累加一次,输出累加结果最高999999
module count(input              clk,input               rst_n,output    reg         en,     //数码管使能信号output reg [19:0]  data,   //6个数码管要显示的数值"999999"需要20位二进制数表示output    reg [ 5:0]  point,  //小数点的位置,高电平时表示对应位点亮output  reg         sign    //符号位,高电平时数码管显示“-”,低电平不显示);
parameter   MAX_NUM = 23'd5000_000;   //50Mhz时钟一个时钟周期20ns,延时0.1s需要5000_000个时钟周期
reg [22:0]  cnt;                    //存放5000_000个时钟周期
reg         flag;                   //延时信号标志位/*     main code   */
//计数器达到0.1s时,输出一个时钟周期的脉冲信号
always @ (posedge clk or negedge rst_n)beginif (!rst_n) begincnt <= 23'b0;flag<= 1'b0;endelse if (cnt < MAX_NUM - 1'b1) begincnt <= cnt + 1'b1;flag<= 1'b0;endelse begincnt <= 23'b0;flag<= 1'b1;end
end
//数码管需要显示的数,从0累加到999999
always @ (posedge clk or negedge rst_n)beginif (!rst_n)begindata <= 20'd0;point<= 6'b000000;en   <= 1'b0;sign <= 1'b0;endelse beginpoint <= 6'b000000;        //小数点始终不显示en    <= 1'b1;           //数码管使能信号始终开启sign  <= 1'b0;            //始终不显示符号/*data每隔0.1秒累加一次*/if (flag) beginif(data<20'd999999)data <= data+1'b1;elsedata <= 20'b0;endend
end
endmodule

数码管动态扫描显示模块

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date:    11:07:15 10/02/2019
// Design Name:
// Module Name:    seg_led
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module seg_led(input    clk,input rst_n,input                   en          ,   //数码管使能信号input  wire    [19:0]  data        ,   //要显示的0~999999之间的数input     wire    [5:0]   point       ,   //小数点显示的位置input                     sign        ,   //符号位output     reg     [5:0]   seg_sel     ,   //6个数码管位选信号output   reg     [7:0]   seg_led         //数码管包括小数点在内的8个段选信号); localparam    CLK_DIVIDE  =  4'd10      ;       //时钟分频系数
localparam  MAX_NUM     =  13'd5000   ;       //对数码管的驱动时钟(5Mhz)计数1ms所需的计数值reg           [ 3:0]          clk_cnt     ;       //时钟分频计数器
reg                         dri_clk     ;       //数码管驱动时钟,5mhz
reg         [23:0]          num         ;       //6个8421码存放带显示的数
reg         [12:0]          cnt0        ;       //数码管驱动时钟计数器
reg                         flag        ;       //标志信号(标志cnt0计数达到1ms)
reg         [ 2:0]          cnt_sel     ;       //数码管位选计数器
reg         [ 3:0]          num_disp    ;       //当前数码管显示的数据(8421码)
reg                         dot_disp    ;       //当前数码管显示的小数点wire       [ 3:0]          data5       ;       //十万位
wire        [ 3:0]          data4       ;       //万位
wire        [ 3:0]          data3       ;       //千位
wire        [ 3:0]          data2       ;       //百位
wire        [ 3:0]          data1       ;       //十位
wire        [ 3:0]          data0       ;       //个位/*maincode*/
//提取显示数值data的各个位
assign  data0   =  data    %   4'd10;
assign  data1   =  data    /   4'd10 % 4'd10;
assign  data2   =  data    /   7'd100 % 4'd10;
assign  data3   =  data    /   10'd1000 % 4'd10;
assign  data4   =  data    /   14'd10000 % 4'd10;
assign  data5   =  data    /   17'd100000 % 4'd10;//对系统时钟(50mhz)10分频得到数码管驱动时钟dri_clk(5mhz)
always @ (posedge clk or negedge rst_n)beginif(!rst_n) beginclk_cnt <= 4'd0;dri_clk <= 1'b1;endelse if (clk_cnt == CLK_DIVIDE/2-1'd1) beginclk_cnt <= 4'd0;dri_clk <= ~dri_clk;endelse beginclk_cnt <= clk_cnt + 1'b1;dri_clk <= dri_clk;end
end//将20位待显示的数转化成8421码
always @ (posedge dri_clk or negedge rst_n) beginif (!rst_n)num <= 24'b0;else beginif (data5 || point[5])num[23:0] <= {data5,data4,data3,data2,data1,data0};else beginif (data4 || point[4]) beginnum[19:0] <= {data4,data3,data2,data1,data0};//如果需要显示"-",第6位显示"-"if(sign)num[23:20] <= 4'd11;//第6位显示“-”elsenum[23:20] <= 4'd10;//第6位什么都不显示endelse beginif (data3 || point[3]) beginnum[15: 0] <= {data3,data2,data1,data0};num[23:20] <= 4'd10;//第6位什么都不显示//如果需要显示"-",第5位显示"-"if(sign)num[19:16] <= 4'd11;//第5位显示"-"elsenum[19:16] <= 4'd10;//第5位什么都不显示                endelse beginif(data2 || point[2])beginnum[11: 0] <= {data2,data1,data0};num[23:16] <= {2{4'd10}} ;//第5、6位什么都不显示if(sign)num[15:12] <= 4'd11;//第4位显示"-"elsenum[15:12] <= 4'd10;//第4位什么都不显示      endelse beginif (data1 || point[1])beginnum[7:0] <= {data1,data0};num[23:12] <= {3{4'd10}};//第4、5、6位什么都不显示if(sign)num[11:8] <= 4'd11;//第3位显示"-"elsenum[11:8] <= 4'd10;//第3位什么都不显示                              endelse beginnum[3:0] <= data0;num[23:8]<= {4{4'd10}};//第3、4、5、6位什么都不显示if(sign)num[7:4] <= 4'd11;//第2位显示"-"elsenum[7:4] <= 4'd10;//第2位什么都不显示   end end endendendend
end//每当计数器对数码管驱动时钟计数达到1ms,输出一个时钟周期的脉冲信号
always @ (posedge dri_clk or negedge rst_n) beginif(!rst_n)begincnt0 <= 13'b0;flag <= 1'b0;endelse if (cnt0 < MAX_NUM - 1'b1)begincnt0 <= cnt0 + 1'b1;flag <= 1'b0;endelse begincnt0 <= 13'b0;flag<= 1'b1;end
end//cnt_sel从0计数到5,每1ms更换1次
always @ (posedge dri_clk or negedge rst_n) beginif (!rst_n)cnt_sel <= 3'b0;else if (flag) beginif (cnt_sel < 3'd5)cnt_sel <= cnt_sel + 1'b1;elsecnt_sel <= cnt_sel;endelsecnt_sel <= cnt_sel;
end//控制数码管位选信号,使6位数码管轮流显示
always @ (posedge dri_clk or negedge rst_n) beginif(!rst_n) beginseg_sel <= 6'b111111;num_disp<= 4'b0;dot_disp<= 1'b1;endelse beginif(en) begincase (cnt_sel)3'd0 : beginseg_sel  <= 6'b111110 ; //显示数码管最低位num_disp <= num[3:0]  ; //显示的数据dot_disp <= ~point[0] ; //显示的小数点end3'd1 : beginseg_sel  <= 6'b111101 ; //显示数码管第1位num_disp <= num[7:4]  ; dot_disp <= ~point[1] ; end3'd2 : beginseg_sel  <= 6'b111011 ; //显示数码管第2位num_disp <= num[11:8] ; dot_disp <= ~point[2] ; end3'd3 : beginseg_sel  <= 6'b110111 ; //显示数码管第3位num_disp <= num[15:12]; dot_disp <= ~point[3] ; end3'd4 : beginseg_sel  <= 6'b101111 ; //显示数码管第4位num_disp <= num[19:16]; dot_disp <= ~point[4] ; end3'd5 : beginseg_sel  <= 6'b011111 ; //显示数码管最高位num_disp <= num[23:20]; dot_disp <= ~point[5] ; enddefault : beginseg_sel  <= 6'b111111 ; num_disp <= 4'b0; dot_disp <= 1'b1; endendcaseendelse beginseg_sel  <= 6'b111111 ; //使能信号为0时,所有数码管均不显示num_disp <= 4'b0; dot_disp <= 1'b1; end end
end//控制数码管段选信号,显示字符
always @ (posedge dri_clk or negedge rst_n) beginif(!rst_n)seg_led <= 8'hc0;else begincase (num_disp)4'd0    :   seg_led <= {dot_disp,7'b100_0000}; //显示数值04'd1    :   seg_led <= {dot_disp,7'b111_1001}; //显示数值14'd2    :   seg_led <= {dot_disp,7'b010_0100}; //显示数值24'd3    :   seg_led <= {dot_disp,7'b011_0000}; //显示数值34'd4    :   seg_led <= {dot_disp,7'b001_1001}; //显示数值44'd5    :   seg_led <= {dot_disp,7'b001_0010}; //显示数值54'd6    :   seg_led <= {dot_disp,7'b000_0010}; //显示数值64'd7    :   seg_led <= {dot_disp,7'b111_1000}; //显示数值74'd8    :   seg_led <= {dot_disp,7'b000_0000}; //显示数值84'd9    :   seg_led <= {dot_disp,7'b001_0000}; //显示数值94'd10 : seg_led <= 8'b1111_1111;               //不显示任何数字4'd11 :   seg_led <= 8'b1011_1111;               //显示负号default : seg_led <= {dot_disp,7'b100_0000};endcaseend
end
endmodule

管脚配置文件

set_location_assignment PIN_M8 -to seg_led[0]
set_location_assignment PIN_L7 -to seg_led[1]
set_location_assignment PIN_P9 -to seg_led[2]
set_location_assignment PIN_N9 -to seg_led[3]
set_location_assignment PIN_M9 -to seg_led[4]
set_location_assignment PIN_M10 -to seg_led[5]
set_location_assignment PIN_P11 -to seg_led[6]
set_location_assignment PIN_N11 -to seg_led[7]
set_location_assignment PIN_R9 -to sys_clk
set_location_assignment PIN_M1 -to sys_rst_n
set_location_assignment PIN_N8 -to seg_sel[0]
set_location_assignment PIN_P8 -to seg_sel[1]
set_location_assignment PIN_M7 -to seg_sel[2]
set_location_assignment PIN_M6 -to seg_sel[3]
set_location_assignment PIN_P6 -to seg_sel[4]
set_location_assignment PIN_N6 -to seg_sel[5]

数码管动态显示从0显示到999999,每隔0.1s增加1个数相关推荐

  1. 让8只数码管初始显示零,每隔大约1s加一显示,到数码管显示9后,再从一开始显示

    让8只数码管初始显示零,每隔大约1s加一显示,到数码管显示9后,再从一开始显示 用延时函数实现加一显示 程序: #include <reg51.h> void delay(unsigned ...

  2. 定时器中断实现数码管动态显示

    金沙滩51单片机教程,定时器中断实现数码管动态显示. #include <reg52.h>sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 ...

  3. 数码显示实验报告C语言,数码管动态显示实验报告

    数码管动态显示任何数值 实验四 数码管动态显示实验一 一.实验要求 1. 在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路 2. 在电路中增加四个7段数码管(共阳/共阴自选), ...

  4. 51单片机数码管滚动显示学号_静、动态数码管动态显示

    1. 数码管静态.动态显示原理 静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码.当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止.这种方法的优点是占用CPU时间少, ...

  5. 51单片机矩阵按键详解,两位数码管显示(普中HC6800ESV2.0)

    一.简述 本人是一名在校生,这个学期刚好在学单片机,自己也挺有兴趣,前面在写数码管.时钟啥的程序时都没什么大问题,但是做到矩阵按键时碰到了一些问题,不过已经解决,下面我会把碰到的问题和解决方法都写出来 ...

  6. 单片机c语言数码管显示子程序,单片机C语言之两位数码管动态显示

    <单片机C语言之两位数码管动态显示>由会员分享,可在线阅读,更多相关<单片机C语言之两位数码管动态显示(1页珍藏版)>请在人人文库网上搜索. 1.include #define ...

  7. 51单片机教程:数码管动态显示(0~99999999)74hc138驱动

    数码管动态显示0~99999999 一.共阴极8位数码管原理 首先了解一些必要知识 1.多位数码管是扫描显示,也就是同一时刻只有一个数码管显示 2.视觉暂留效果:第一个数码管显示完,第二个数码管接着显 ...

  8. 单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)数码管 (二)八段数码管的字形编码 (三)C51变量定义的四要素 (四)中断源 (五)相关的特殊功能寄存器 1.定时器/计数器控制寄存器TCON 2.中断允许控 ...

  9. 蓝桥杯单片机数码管动态显示_关于蓝桥杯训练小程序 中断控制数码管显示数字的左右移动...

    /******************************************************************************************** 利用数码管在 ...

  10. 怎样用C语言数码管编写E1显示程序,跪求单片机0~99数码管显示用C语言编写的程序...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define uint unsigned int #define uchar unsigned char uint temp; sbi ...

最新文章

  1. windows下把Apache加入系统服务
  2. 第四周实践项目5 猴子选大王(循环链表)
  3. 语言学概论ppt课件_精益生产管理培训PPT课件-精益生产管理概论
  4. centos7 和centos 6的一些区别
  5. SQL Server replication requires the actual server name to make a connection to the server.错误解决...
  6. mysql--innodb索引原理详解_MYSQL索引机制(InnoDB索引原理详解)
  7. python读取一行的函数_Python linecache.getline()读取文件中特定一行的脚本
  8. psenet的eval_ctw1500.py解析
  9. 信号系统与数字信号处理一点点心得
  10. 锂离子电池容量计量之库仑计法
  11. 单片微型计算机原理及应用考试,单片机原理及应用《微机原理及应用》试卷(A卷)附答案...
  12. 机器学习虾扯淡之线性回归No.39
  13. JMeter插件之PerfMon监控服务器性能
  14. Spring Boot实践 | 利用Spring Security快速搞定权限控制
  15. 基于PHP+MYSQL的成绩查询系统(含源码)
  16. 基于java的Android手机通讯录【详细】【完整代码】
  17. C++读取通达信shm.tnf文件股票代码/名称
  18. 第八题:输出 9*9 乘法口诀表
  19. [附源码]Python计算机毕业设计SSM京津冀畅游网设计(程序+LW)
  20. 搞定物联网定位:UWB高精度定位技术原理与实现

热门文章

  1. Swift中数组字典和plist文件的转换
  2. 智协云店通+BitCOO的4WiN.io全球互贸链 | 翼次元空间+Fund++
  3. 人工智能发展历史 考题答案
  4. VMware虚拟机安装Windows XP学习教程
  5. 苹果内存不够怎么办_内存硬盘不够用怎么办?手把手教你给自己的笔记本更换,超实用!...
  6. CTPN OCR目标检测及源码
  7. js实现显示系统时间的表盘
  8. 传世调试之-道士技能《解毒术》、《神光术》:无法正常升级。
  9. 沙场已无李世鹤:论TD-LTE专利
  10. (CCNET)criss-cross attention network学习笔记