1.试验任务

  • 完成6位数码管以动态方式从0开始计数,没100ms计数值增加1,当计数值从0增加到999999后重新从0开始计数。

2.硬件原理图

3.程序框图

  • 程序设计思想:

FPGA顶层(top_seg_led)例化了以下两个模块:计数模块(count)以及数码管动态显示模块(seg_led)。实现各模块之间数据的交互。计数模块将计数值通过data端口传递给数码管动态显示模块, 使能信号en使能数码管显示数据, 小数点显示信号point控制小数点的显示,符号信号sign可以让数码管显示负号。

计数模块(count):显示的数字每100ms加“1”。

数码管动态显示模块 (seg_led) : 数码管动态显示模块在数码管上以动态方式显示数值。

module top_seg_led(input    sys_clk,input    sys_rst_n,output [5:0] seg_wei,output [7:0] seg_duan
);wire [19:0] seg_num;time_count u_time_count(.sys_clk   (sys_clk),.sys_rst_n (sys_rst_n),.seg_num  (seg_num)
);seg_led u_seg_led(.sys_clk    (sys_clk),.sys_rst_n  (sys_rst_n),.seg_num    (seg_num),.seg_wei    (seg_wei),.seg_duan   (seg_duan)
);
endmodule
module time_count(input    sys_clk,input    sys_rst_n,output reg [19:0] seg_num);reg [22:0] time_num;
reg time_flag;always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)begintime_num<=23'd0;time_flag<=1'b0;endelse beginif(time_num<23'd5_000_000)begintime_num<=time_num+1'b1;time_flag<=1'b0;endelse begintime_num <=23'd1; time_flag<=1'b1;  endend
endalways @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginseg_num<=20'd0;  endelse beginif(time_flag&&seg_num<20'd1_000_000)seg_num<=seg_num+1'b1;else if(seg_num==20'd1_000_000)seg_num<=20'd0;else seg_num<=seg_num;end
end
endmodule
module seg_led(input  sys_clk,input  sys_rst_n,input      [19:0] seg_num,output reg [5:0] seg_wei,output reg [7:0] seg_duan
);wire [23:0] data_num;   //每位数码管需要显示的数assign data_num[3:0]  =seg_num%10;
assign data_num[7:4]  =seg_num/4'd10%10;
assign data_num[11:8] =seg_num/7'd100%10;
assign data_num[15:12]=seg_num/10'd1000%10;
assign data_num[19:16]=seg_num/14'd10000%10;
assign data_num[23:20]=seg_num/17'd100000;/
reg [22:0] time_num;
reg time_flag;always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)begintime_num<=23'd0;time_flag<=1'b0;endelse beginif(time_num<23'd100_000)begintime_num<=time_num+1'b1;time_flag<=1'b0;endelse begintime_num <=23'd1; time_flag<=1'b1;  endend
end
/
reg  [3:0] seg_static;always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)seg_static<=4'd0;else beginif(seg_static<4'd6&&time_flag)seg_static<=seg_static+1'b1;else  if(seg_static==4'd6)seg_static<=4'd0;elseseg_static<=seg_static;    end
endalways @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginseg_wei  <=6'b000000;seg_duan<=8'b1111111;endelse begincase(seg_static)4'd0:   begin      seg_wei  <=6'b111110;case (data_num[3:0]) 4'd0 : seg_duan   <= 8'b1100_0000; //显示数字 0 4'd1 : seg_duan   <= 8'b1111_1001; //显示数字 1 4'd2 : seg_duan   <= 8'b1010_0100; //显示数字 2 4'd3 : seg_duan   <= 8'b1011_0000; //显示数字 3 4'd4 : seg_duan   <= 8'b1001_1001; //显示数字 4 4'd5 : seg_duan   <= 8'b1001_0010; //显示数字 5 4'd6 : seg_duan   <= 8'b1000_0010; //显示数字 6 4'd7 : seg_duan   <= 8'b1111_1000; //显示数字 7 4'd8 : seg_duan   <= 8'b1000_0000; //显示数字 84'd9 : seg_duan   <=  8'b1001_0000;endcaseend4'd1:begin      seg_wei  <=6'b111101;case (data_num[7:4]) 4'd0 : seg_duan   <= 8'b1100_0000; //显示数字 0 4'd1 : seg_duan   <= 8'b1111_1001; //显示数字 1 4'd2 : seg_duan   <= 8'b1010_0100; //显示数字 2 4'd3 : seg_duan   <= 8'b1011_0000; //显示数字 3 4'd4 : seg_duan   <= 8'b1001_1001; //显示数字 4 4'd5 : seg_duan   <= 8'b1001_0010; //显示数字 5 4'd6 : seg_duan   <= 8'b1000_0010; //显示数字 6 4'd7 : seg_duan   <= 8'b1111_1000; //显示数字 7 4'd8 : seg_duan   <= 8'b1000_0000; //显示数字 84'd9 : seg_duan   <=  8'b1001_0000;endcaseend4'd2:begin      seg_wei  <=6'b111011;case (data_num[11:8]) 4'd0 : seg_duan   <= 8'b1100_0000; //显示数字 0 4'd1 : seg_duan   <= 8'b1111_1001; //显示数字 1 4'd2 : seg_duan   <= 8'b1010_0100; //显示数字 2 4'd3 : seg_duan   <= 8'b1011_0000; //显示数字 3 4'd4 : seg_duan   <= 8'b1001_1001; //显示数字 4 4'd5 : seg_duan   <= 8'b1001_0010; //显示数字 5 4'd6 : seg_duan   <= 8'b1000_0010; //显示数字 6 4'd7 : seg_duan   <= 8'b1111_1000; //显示数字 7 4'd8 : seg_duan   <= 8'b1000_0000; //显示数字 84'd9 : seg_duan   <=  8'b1001_0000;endcaseend4'd3:begin      seg_wei  <=6'b110111;case (data_num[15:12]) 4'd0 : seg_duan   <= 8'b1100_0000; //显示数字 0 4'd1 : seg_duan   <= 8'b1111_1001; //显示数字 1 4'd2 : seg_duan   <= 8'b1010_0100; //显示数字 2 4'd3 : seg_duan   <= 8'b1011_0000; //显示数字 3 4'd4 : seg_duan   <= 8'b1001_1001; //显示数字 4 4'd5 : seg_duan   <= 8'b1001_0010; //显示数字 5 4'd6 : seg_duan   <= 8'b1000_0010; //显示数字 6 4'd7 : seg_duan   <= 8'b1111_1000; //显示数字 7 4'd8 : seg_duan   <= 8'b1000_0000; //显示数字 84'd9 : seg_duan   <=  8'b1001_0000;endcaseend4'd4:begin      seg_wei  <=6'b101111;case (data_num[19:16]) 4'd0 : seg_duan   <= 8'b1100_0000; //显示数字 0 4'd1 : seg_duan   <= 8'b1111_1001; //显示数字 1 4'd2 : seg_duan   <= 8'b1010_0100; //显示数字 2 4'd3 : seg_duan   <= 8'b1011_0000; //显示数字 3 4'd4 : seg_duan   <= 8'b1001_1001; //显示数字 4 4'd5 : seg_duan   <= 8'b1001_0010; //显示数字 5 4'd6 : seg_duan   <= 8'b1000_0010; //显示数字 6 4'd7 : seg_duan   <= 8'b1111_1000; //显示数字 7 4'd8 : seg_duan   <= 8'b1000_0000; //显示数字 84'd9 : seg_duan   <=  8'b1001_0000;endcaseend4'd5:begin      seg_wei  <=6'b011111;case (data_num[23:20]) 4'd0 : seg_duan   <= 8'b1100_0000; //显示数字 0 4'd1 : seg_duan   <= 8'b1111_1001; //显示数字 1 4'd2 : seg_duan   <= 8'b1010_0100; //显示数字 2 4'd3 : seg_duan   <= 8'b1011_0000; //显示数字 3 4'd4 : seg_duan   <= 8'b1001_1001; //显示数字 4 4'd5 : seg_duan   <= 8'b1001_0010; //显示数字 5 4'd6 : seg_duan   <= 8'b1000_0010; //显示数字 6 4'd7 : seg_duan   <= 8'b1111_1000; //显示数字 7 4'd8 : seg_duan   <= 8'b1000_0000; //显示数字 84'd9 : seg_duan   <=  8'b1001_0000;endcaseendendcaseend
endendmodule

仿真 结果如下:

起初调试的时候只有最低为显示自加1,原因为led_static的 计数写的后问题 ,后进行改进

PS:补一下上周的实验仿真调试

FPGA之动态数码管显示实验相关推荐

  1. FPGA 动态数码管显示实验

    参考:正点原子开拓者 FPGA 开发指南 一.数码管动态显示简介 由于一般的静态驱动操作虽然方便,但占用的I/0口较多,例如要驱动6位8段数码管,以静态驱动方式让数码管各个位显示不同的数值,如&quo ...

  2. 【正点原子FPGA连载】第三十一章RTC实时时钟数码管显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  3. 共阳数码管段码表_正点原子开拓者FPGA开发板资料连载第十一章 静态数码管显示实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  4. c语言实现7段数码管显示,七段数码管显示实验.doc

    七段数码管显示实验 单 片 机 实 验 报 告 实验九 七段数码管显示实验 实验目的 学习七段数码管的工作原理: 学习数码管与8051单片机的接口方法: 掌握动态扫描显示技术. 实验原理 如图4.9- ...

  5. 【51单片机】七段数码管显示实验+详细讲解

    [51单片机]七段数码管显示实验 前言 一.兵马未动,粮草先行--认识七段数码管 1.关于显示器 2.七段数码管 3.七段数码管的结构 4.数码管显示方法 二.数码管显示程序 1.静态显示 效果 2. ...

  6. 实验7-1_八段 LED 数码管显示实验

    一.实验要求 用89C51单片机控制并行接口芯片8255实现6 位八段码 LED 动态方式循环显示一组数据. 二.8255接口芯片的简介 (1)8255芯片是什么 8255A是一种可编程并行I/O口的 ...

  7. 51单片机动态数码管显示自己学号

    实验题目:使用51单片机实现动态数码管显示自己8位学号,例如20220018 在此原理图又分两种连接方式: 第一种是8位数码管接38译码器来减少端口使用. 第二种是,没有端口要求接好就可以那就是,把位 ...

  8. 单片机入门——动态数码管显示

    前言 在实际应用中通常都需要显示多位数值,如果采用静态数码管显示就不够好,因此就需要采用另外一种显示方式,即数码管动态显示.开发板上板载2 个四位一体的共阴数码管,接下来我们就来介绍下如何使用51 单 ...

  9. 51单片机入门——动态数码管显示详解

    51单片机:动态数码管显示 - 模块图 - 显示原理 – 消抖 静态数码管技术 + 人眼视觉停留 显示原理类似于以前的 胶片机放影视,也就是只要我切换的速度足够快你就看不出来其实我是一次次显示的(滑稽 ...

最新文章

  1. iOS-ARC_Xcode检测循环引用
  2. Redis的7000字笔记总结,超详细!
  3. 面试官问我:spring、springboot、springcloud的区别,我笑了
  4. springboot MVC视图解析流程源码分析
  5. [分享]我国食品行业ERP现状及分析解决方案
  6. dram sram利用 利用_使用量子力学技术的新型超低功耗存储器或将取代DRAM和Flash...
  7. [转]游戏UI与flash 组件开发
  8. Eclipse-JAVA版本
  9. 7 - Struts.xml各属性说明(待补充)
  10. asp.net 缓存Cache的使用总结
  11. 持续更新免费的 API,做一个 API 的搬运工
  12. 点聚AIP电子签章在Chrome、Edge新内核、360系列、FireFox、IE、Opera等浏览器中实现网页内嵌效果案例(一)
  13. 一次做数据报表的踩坑经历,让我领略了数据同步增量和全量的区别
  14. ARCH模型和GARCH模型
  15. java登录注册功能怎么实现_使用Java代码实现登录注册功能
  16. 一个实际电路的原理图是怎样设计出来的?
  17. PADS VX.2.7 + OrCAD 16.5 + AutoCAD 2020 使用教程
  18. 伪随机生成器具体实现——杂乱的方法
  19. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(5):Cortex-M3处理器能量管理
  20. 时间复杂度(超详解+例题)

热门文章

  1. 【拨号】iPhone拨号功能隐藏代码,值得收藏。
  2. vue 中哪些操作自动触发更新视图
  3. HttpClient的释放资源到底在释放什么?如何正确的释放资源?
  4. 仿qq跨三端app uni-app+springboot+mybatis+websocket(springboot+mybatis)
  5. 申请百度地图密钥Android SDK
  6. mysql的NULL和空值
  7. SQL 难点解决:集合及行号
  8. html5导航栏点击之后变色,vue实现导航栏点击当前标题变色
  9. Chrome浏览器禁用TextBox的自动填充
  10. [整合]2012-2021全球生态遥感监测报告与数据