将数码管各段发光元件的正极连在一起称为共阳数码管,且该共点击链接电路电源的正极,而各段的负极连接驱动电路。它适用于低电平有效的驱动电路,当某段的驱动电平为低电平时,该段发亮;将数码管各段发光元件的负极连在一起称为共阴数码管,且该电平连接电源的负极,而各段元件的正极驱动电路,它适用于高电平有效的驱动电路,当某段的驱动电平为高电平,该段发光。

1.数码管的动态显示 驱动多位数码管需要动态扫描显示,假如是8位数码管显示,则需要先设计一个计数器,8位计数器,不断扫描。动态扫描显示时刷新频率最好大于50HZ,即显示一轮的时间不要超过20ms,每个数码管显示时间不能太长也不能太短,时间太长会影响刷新频率,导致整体出现闪烁的现象,时间太短发生二极管的电流导通时间也就短,会影响总体的显示亮度。一般控制在1ms左右。

  1. module seg(clk,wei,duan);//50MHZ时钟输入,duan:数码管位吗,wei:数码管段码,‘0’led亮
  2. input clk;
  3. output [7:0]wei;
  4. output [7:0]duan;
  5. reg [7:0]wei;
  6. reg [7:0]duan;
  7. integer count;//分频计数器,每计数到50000下clk_1k时钟翻转
  8. reg clk_1k;//数码管扫描时钟2ms
  9. reg [2:0]wei_count;//位码计数器
  10.  
  11. always @(posedge clk)//分频进程
  12. begin
  13. if(count==500000)
  14. begin
  15. count=0;
  16. clk_1k=~clk_1k;
  17. end
  18. else
  19. count=count+1;
  20. end
  21.  
  22. always @(posedge clk_1k)//数码管扫描进程
  23. begin
  24. case(wei_count)
  25. 3'b000: begin wei=8'b11111110; duan=8'b0000_0000;wei_count=wei_count+1'b1;end
  26. 3'b001: begin wei=8'b11111101; duan=8'b0000_0000;wei_count=wei_count+1'b1;end
  27. 3'b010: begin wei=8'b11111011; duan=8'b0000_0000;wei_count=wei_count+1'b1;end
  28. 3'b011: begin wei=8'b11110111; duan=8'b0000_0000;wei_count=wei_count+1'b1;end
  29. 3'b100: begin wei=8'b11101111; duan=8'b0000_0000;wei_count=wei_count+1'b1;end
  30. 3'b101: begin wei=8'b11011111; duan=8'b0000_0000;wei_count=wei_count+1'b1;end
  31. 3'b110: begin wei=8'b10111111; duan=8'b0000_0000;wei_count=wei_count+1'b1;end
  32. 3'b111: begin wei=8'b01111111; duan=8'b0000_0000;wei_count=wei_count+1'b1;end
  33. endcase
  34. end
  35. endmodule

2.秒表数码管显示 :秒表的设计原理:首先通过分频器产生一个频率为1HZ的时钟座位计数源,设置两个寄存器分别用来存储计数值,一个为寄存个位数,一个寄存十位数,同时同时产生一个数码管位选时钟,用来对数码管的位选进行扫描。(0到60,秒表)

  1. module second(clk,duan,wei);//clk:50MHZ时钟输入,duan:数码管段码,wei:数码管位码
  2. input clk;
  3. output [7:0]duan;
  4. output [1:0]wei;
  5. reg [7:0]duan;
  6. reg [1:0]wei;
  7.  
  8. integer count;//1HZ时钟计数器
  9. integer count2;//扫描时钟计数器
  10. reg clk_1hz;//1HZ时钟信号
  11.  
  12. reg [3:0]ge;//数码管个位数BCD码
  13. reg [2:0]shi;//数码管十位BCD二进制码
  14.  
  15. reg clk_scan;//数码管扫描时钟
  16. reg select;
  17.  
  18. always @(posedge clk)//1HZ时钟进程
  19. begin
  20. if(count==25000000)
  21. begin
  22. clk_1hz=~clk_1hz;
  23. count=0;
  24. end
  25. else
  26. count=count+1'b1;
  27. end
  28.  
  29. always @(posedge clk_1hz)//秒表功能进程
  30. begin
  31. if(ge==4'b1001)
  32. begin
  33. ge=4'b0000;
  34. if(shi==3'b101)
  35. shi=3'b000;
  36. else
  37. shi=shi+1'b1;
  38. end
  39.  
  40. else
  41. ge=ge+1'b1;
  42. end
  43.  
  44. always @(posedge clk)//数码管扫描时钟产生进程
  45. begin
  46. if(count2==50000)
  47. begin
  48. count2=0;
  49. clk_scan=~clk_scan;
  50. end
  51. else
  52. count2=count2+1;
  53. end
  54.  
  55. always @(posedge clk_scan)
  56. begin
  57. select=select+1'b1;
  58. end
  59.  
  60. always @(ge or shi or select)
  61. begin
  62. if(select==1'b1)
  63. begin
  64. wei=2'b10;//秒表个位数显示
  65. case(ge)
  66. 4'b0000:begin duan=8'b1100_0000;end
  67. 4'b0001:begin duan=8'b1111_1001;end
  68. 4'b0010:begin duan=8'b1010_0100;end
  69. 4'b0011:begin duan=8'b1011_0000;end
  70. 4'b0100:begin duan=8'b1001_1001;end
  71. 4'b0101:begin duan=8'b1001_0010;end
  72. 4'b0110:begin duan=8'b1000_0011;end
  73. 4'b0111:begin duan=8'b1111_1000;end
  74. 4'b1000:begin duan=8'b1000_0000;end
  75. 4'b1001:begin duan=8'b1001_1000;end
  76. default duan=8'bx;
  77. endcase
  78. end
  79. else
  80. begin
  81.  
  82. wei=2'b01;//秒表十位数显示
  83. case(shi)
  84. 3'b000:duan=8'b1100_0000;
  85. 3'b001:duan=8'b1111_1001;
  86. 3'b010:duan=8'b1010_0100;
  87. 3'b011:duan=8'b1011_0000;
  88. 3'b100:duan=8'b1001_1001;
  89. 3'b101:duan=8'b1001_0010;
  90. 3'b110:duan=8'b1000_0011;
  91. default duan=8'bx;
  92. endcase
  93. end
  94. end
  95. endmodule

3.时钟数码管显示:首先通过分频器产生一个频率为1HZ的时钟作为计数源,设置六个寄存器分别用来存储竖直,时分秒各用两个寄存器,一个为寄存个位数,另一个寄存十位数。当秒计数到达59时便向分进一,同时秒清零;当分计数达到59时,便向时进一,同时分清零;当时计数到达24时将时分秒计数寄存器同时清零。产生一个数码管位选时钟,用来对数码管的位选进行扫描。

  1. module time_clock(clk,duan,wei);//clk:50MHZ时钟输入,duan:数码管段码,wei:数码管位码
  2. input clk;
  3. output [7:0]duan;
  4. output [5:0]wei;
  5. reg [7:0]duan;
  6. reg [5:0]wei;
  7.  
  8. integer count;//1HZ时钟计数器
  9. integer count2;//扫描时钟计数器
  10. reg clk_1hz;//1HZ时钟信号
  11.  
  12. reg [3:0]miao_ge;//秒个位数BCD码
  13. reg [2:0]miao_shi;//秒十位BCD二进制码
  14. reg [3:0]fen_ge;//分钟个位数
  15. reg [2:0]fen_shi;//分钟十位数
  16. reg [1:0]shi_ge;//时钟个位数
  17. reg [1:0]shi_shi;//时钟十位数
  18.  
  19. reg clk_scan;//数码管扫描时钟
  20. reg [2:0]select; //用于扫描时选择显示位码
  21.  
  22. always @(posedge clk)//1HZ时钟进程
  23. begin
  24. if(count==25000000)
  25. begin
  26. clk_1hz<=~clk_1hz;
  27. count<=0;
  28. end
  29. else
  30. count<=count+1'b1;
  31. end
  32.  
  33. always @(posedge clk_1hz)//秒分时各位累加功能进程
  34. begin
  35. if(miao_ge==4'b1001)
  36. begin
  37. miao_ge<=4'b0000;
  38. if(miao_shi==3'b101)
  39. begin
  40. miao_shi<=3'b000;
  41. if(fen_ge==4'b1001)
  42. begin
  43. fen_ge<=4'b0000;
  44. if(fen_shi==3'b101)
  45. begin
  46. fen_shi<=3'b000;
  47. if(shi_ge==2'b11)
  48. begin
  49. shi_ge<=2'b00;
  50. if(shi_shi==2'b10)
  51. shi_shi<=2'b00;
  52. else
  53. shi_shi<=shi_shi+1'b1;
  54. end
  55. else
  56. shi_ge<=shi_ge+1'b1;
  57. end
  58. else
  59. fen_shi<=fen_shi+1'b1;
  60. end
  61. else
  62. fen_ge<=fen_ge+1'b1;
  63. end
  64. else
  65. miao_shi<=miao_shi+1'b1;
  66. end
  67.  
  68. else
  69. miao_ge<=miao_ge+1'b1;
  70. end
  71.  
  72. always @(posedge clk)//数码管扫描时钟产生进程
  73. begin
  74. if(count2==10000)
  75. begin
  76. count2<=0;
  77. clk_scan<=~clk_scan;
  78. end
  79. else
  80. count2<=count2+1;
  81. end
  82.  
  83. always @(posedge clk_scan)
  84. begin
  85. if(select==3'b110)
  86. select<=3'b000;
  87. else
  88. select<=select+1'b1;
  89.  
  90. end
  91.  
  92. always @(miao_ge or miao_shi or fen_ge or fen_shi or shi_ge or shi_shi or select)//敏感信号列表
  93. begin
  94. if(select==3'b001)
  95. begin
  96. wei<=6'b111110;//秒个位数显示
  97. case(miao_ge)
  98. 4'b0000:begin duan<=8'b1100_0000;end
  99. 4'b0001:begin duan<=8'b1111_1001;end
  100. 4'b0010:begin duan<=8'b1010_0100;end
  101. 4'b0011:begin duan<=8'b1011_0000;end
  102. 4'b0100:begin duan<=8'b1001_1001;end
  103. 4'b0101:begin duan<=8'b1001_0010;end
  104. 4'b0110:begin duan<=8'b1000_0011;end
  105. 4'b0111:begin duan<=8'b1111_1000;end
  106. 4'b1000:begin duan<=8'b1000_0000;end
  107. 4'b1001:begin duan<=8'b1001_1000;end
  108. default duan<=8'bx;
  109. endcase
  110. end
  111.  
  112. else if(select==3'b010)
  113. begin
  114. wei<=6'b111101;//秒十位数显示
  115. case(miao_shi)
  116. 3'b000:duan<=8'b1100_0000;
  117. 3'b001:duan<=8'b1111_1001;
  118. 3'b010:duan<=8'b1010_0100;
  119. 3'b011:duan<=8'b1011_0000;
  120. 3'b100:duan<=8'b1001_1001;
  121. 3'b101:duan<=8'b1001_0010;
  122. 3'b110:duan<=8'b1000_0011;
  123. default duan<=8'bx;
  124. endcase
  125. end
  126.  
  127. else if(select==3'b011)
  128. begin
  129. wei<=6'b111011;//分钟个位数显示
  130. case(fen_ge)
  131. 4'b0000:begin duan<=8'b1100_0000;end
  132. 4'b0001:begin duan<=8'b1111_1001;end
  133. 4'b0010:begin duan<=8'b1010_0100;end
  134. 4'b0011:begin duan<=8'b1011_0000;end
  135. 4'b0100:begin duan<=8'b1001_1001;end
  136. 4'b0101:begin duan<=8'b1001_0010;end
  137. 4'b0110:begin duan<=8'b1000_0011;end
  138. 4'b0111:begin duan<=8'b1111_1000;end
  139. 4'b1000:begin duan<=8'b1000_0000;end
  140. 4'b1001:begin duan<=8'b1001_1000;end
  141. default duan<=8'bx;
  142. endcase
  143. end
  144.  
  145. else if(select==3'b100)
  146. begin
  147. wei<=6'b110111;//分钟十位数显示
  148. case(fen_shi)
  149. 3'b000:duan<=8'b1100_0000;
  150. 3'b001:duan<=8'b1111_1001;
  151. 3'b010:duan<=8'b1010_0100;
  152. 3'b011:duan<=8'b1011_0000;
  153. 3'b100:duan<=8'b1001_1001;
  154. 3'b101:duan<=8'b1001_0010;
  155. 3'b110:duan<=8'b1000_0011;
  156. default duan<=8'bx;
  157. endcase
  158. end
  159.  
  160. else if(select==3'b101)
  161. begin
  162. wei<=6'b101111;//时钟个位数显示
  163. case(shi_ge)
  164. 4'b0000:begin duan<=8'b1100_0000;end
  165. 4'b0001:begin duan<=8'b1111_1001;end
  166. 4'b0010:begin duan<=8'b1010_0100;end
  167. 4'b0011:begin duan<=8'b1011_0000;end
  168. default duan<=8'bx;
  169. endcase
  170. end
  171.  
  172. else
  173. begin
  174. wei<=6'b011111;//时钟十位数显示
  175. case(shi_shi)
  176. 3'b000:duan<=8'b1100_0000;
  177. 3'b001:duan<=8'b1111_1001;
  178. 3'b010:duan<=8'b1010_0100;
  179. default duan<=8'bx;
  180. endcase
  181. end
  182. end
  183.  
  184. endmodule

数码管一些列功能的verilog实现的更多相关文章

  1. JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案

    前言:最近项目里面需要用到表格的冻结列功能,所谓“冻结列”,就是某些情况下表格的列比较多,需要固定前面的几列,后面的列滚动.遗憾的是,bootstrap table里自带的fixed column功能 ...

  2. sql内置函数pivot强大的行转列功能

    原文:sql内置函数pivot强大的行转列功能 语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...

  3. JS组件系列——自己动手扩展BootstrapTable的 冻结列 功能:彻底解决高度问题

    前言:一年前,博主分享过一篇关于bootstrapTable组件冻结列的解决方案  JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案 ,通过该篇,确实可以实现bo ...

  4. Bootstrap Blazor 组件介绍 Table (一)自动生成列功能介绍

    Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...

  5. mysql实现行转列功能

    实现从图一转行成图二的功能: 图一: 图二: 建表语句: CREATE TABLE `t_user_score` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT '主 ...

  6. Bootstrap Blazor 组件介绍 Table (二)自定义模板列功能介绍

    Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...

  7. sql强大的行转列功能(内置函数pivot及注意事项)

    语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) ) ...

  8. 固定GridView标题栏,冻结列功能实现

    <%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> < ...

  9. VS2010,VS2013 Datagridview控件的编辑列功能,弹窗界面被挤扁了

    搜了很久,没找到解决办法,在一个角落看到说要卸载Framework,实践后可以,发出来记一下. 解决办法: 发现自己电脑上多了Framework4.8,可能安装VS2013的时候自动安装的. 卸载了F ...

随机推荐

  1. JAVA MyBybatis分页

    java: import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; impo ...

  2. 作业调度框架Quartz.NET | 大专栏

    原文:作业调度框架Quartz.NET | 大专栏 作业调度框架Quartz.NET 发表于 2019-09-28 |  分类于 前端 |  没有评论 前言 任务调度系统并不是完美的,它会出现任务执行 ...

  3. 报告题目:HAO智能:HI + AI + OI

     报告题目:HAO智能:HI + AI + OI 报告摘要:大数据面向异构自治的多源海量数据, 旨在挖掘数据间复杂且演化的关联.大数据知识工程(BigKE)从大数据的 HACE定理开始, 从大知识建模 ...

  4. 关于 Nginx的相关学习

    转自:https://www.cnblogs.com/wcwnina/category/1193394.html Nginx能做什么 ——反向代理 ——负载均衡 ——HTTP服务器(动静分离) ——正 ...

  5. OO——JML作业总结

    目录 第三单元博客作业 JML语言理论基础 1.注释结构 2.JML表达式 3.方法规格 4.类型规格 应用工具链 JMLUnitNG使用实例 作业架构设计 第一次作业 第二次作业 第三次作业 BUG ...

  6. 子进程的LD_PRELOAD

    一个指定LD_PRELOAD的进程创建的子进程是否受LD_PRELOAD的影响? 1. fork()后在子进程中执行函数. main.c #include <unistd.h> #incl ...

  7. 【转载】ASP.NET网站选购阿里云服务器的时候,阿里云账号个人认证以及企业认证有何不同

    在采购阿里云产品,如阿里云云服务器.阿里云短信包.阿里云数据库MySql以及Sqlserver.阿里云对象存储OSS等云产品的时候,如果账号未进行实名认证,很多时候会要求实名认证操作,在实名认证时可选 ...

  8. Oracle 创建数据表

    数据库中的每一个表都被一个模式(或用户)所拥有,因此表是一种典型的模式对象.在创建数据表时,Oracle 将在一个指定的表空间中为其分配存储空间.最初创建的表时一个空的逻辑存储结构,其中不包含任何数据 ...

  9. GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?

    一.GC如何判断一个对象为”垃圾”的java堆内存中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”.那么GC具体通过什么手段来 ...

  10. Centos 端口被占用,kill被占用的进程

    1.yum install lsof 2.输入netstat -tln,查看系统当前所有被占用端口 3.根据端口查询进程,输入lsof -i :9555,切记不要忘了添加冒号 4. 既然知道进程号了, ...