2635|2

300

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【国产FPGA高云GW1N-4系列开发板测评】动态数码管显示之秒表 [复制链接]

 

本次就进行数码管动态显示练习

一、目标

利用三个拨码开关和四个数码管进行秒表计时。即一个拨码开关开始计时,一个拨码开关暂停计时,一个拨码开关复位。

二、原理

1、动态数码管的原理:上一次练习进行了静态数码管显示。但是同时让多个数码管显示数字呢?其实很简单,就是利用人的视觉暂留现象(人眼在观察外物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉影像并不立即消失)和数码管的余晖现象(当停止向发光二极管供电时发光二极管亮度仍能维持一段时间),即可以让一只数码管亮,再让另一个数码管亮,如果中间切换的时间很短就会让人眼觉得同时显示两个数码管,这种显示方式为动态扫描。

2、秒表原理:即让分频时钟产生1Hz的时钟信号,并每隔一秒加1,同时呢进行数码管动态扫描。秒表是由3个拨码开关进行控制的。

三、硬件

由开发板的原理图可知,四个拨码开关向上拨都是高电平,向下拨都是低电平。可以进行扫描拨码开关的输入电平,进而实现秒表的控制。

四、软件部分

代码如下:

时钟分频部分

  • `define UD #1 //在引用已定义的宏名时,必须在宏名的前面加上符号“`”,表示该名字是一个经过宏定义的名字.
  • //宏定义不是Verilog HDL语句,不必在行末加分号。如果加了分号会连分号一起进行置换
  • //宏名和宏内容必须在同一行中进行声明。如果在宏内容中包含有注释行,注释行不会作为被置换的内容
  • module div_clk(
  • input sys_clk,//系统时钟 50Mhz
  • output clk_1hz,//1Hz时钟
  • output clk_1ms //1ms时钟
  • );
  • reg [25:0] time_cnt = 0;//用于保存分频计数值
  • reg [15:0] ms_cnt = 0; //用于保存分频计数值
  • reg flag = 0;//用于产生正负信号标志
  • reg ms_flag = 0;//用于产生正负信号标志
  • always @(posedge sys_clk)
  • begin
  • if(time_cnt == 26'h2faf080-1'b1)
  • time_cnt <= `UD 26'd0;
  • else
  • time_cnt <= `UD time_cnt + 1'b1;
  • end
  • always @(posedge sys_clk)
  • begin
  • if(ms_cnt == 16'hc350-1'b1)
  • ms_cnt <= `UD 16'd0;
  • else
  • ms_cnt <= `UD ms_cnt + 1'b1;
  • end
  • //分频,产生1Hz时钟
  • always @(posedge sys_clk)
  • begin
  • if(time_cnt == 26'h2faf080/2-1'b1)
  • flag <= `UD 1'b1;
  • else if(time_cnt == 26'h2faf080-1'b1)
  • flag <= `UD 1'b0;
  • end
  • //分频,产生1000Hz时钟
  • always @(posedge sys_clk)
  • begin
  • if(ms_cnt == 16'hc350/2-1'b1)
  • ms_flag <= `UD 1'b1;
  • else if(ms_cnt == 16'hc350-1'b1)
  • ms_flag <= `UD 1'b0;
  • end
  • assign clk_1ms = ms_flag;
  • assign clk_1hz = flag;
  • endmodule

 

秒表控制和动态扫描部分

  • /*
  • 数码管显示实验,进行每秒显示不同的数字
  • 4个数码管
  • */
  • `define UD #1 //延时1个时间单位
  • module stopwatch(
  • input sys_clk,//系统时钟
  • input sys_rst_n,
  • input [3:0]key,
  • output [3:0]dig,//位选
  • output reg[7:0]smg//数码管段码
  • );
  • wire clk_1hz; //变量
  • wire clk_1ms;
  • div_clk u_div_clk
  • (
  • .sys_clk(sys_clk),
  • .clk_1hz(clk_1hz),
  • .clk_1ms(clk_1ms)
  • );
  • reg stop_flag = 0;
  • reg start_flag = 0;
  • reg continue_flag = 0;
  • reg reset_flag = 0;
  • always @(posedge sys_clk)
  • begin
  • if(key[0] == 1)
  • start_flag = 1;//开始计时
  • else
  • start_flag = 0;//停止计时,并归0
  • if(key[1] == 1)
  • stop_flag = 1;//暂停计时
  • else
  • stop_flag = 0;//继续计时
  • if(key[2] == 1)
  • reset_flag = 1;//复位
  • else
  • reset_flag = 0;
  • end
  • reg [4:0]second_counter_ge = 0;//秒个位计时
  • reg [4:0]second_counter_shi = 0;//秒十位计时
  • reg [4:0]minute_counter = 0;//分计时
  • reg [4:0]num = 0;//要显示的数字
  • always @(posedge clk_1hz)
  • begin
  • if(second_counter_ge == 4'd9) //秒个位加到9进位(使用除法,比较耗费资源)
  • begin
  • second_counter_ge <= `UD 4'd0;
  • second_counter_shi <= `UD second_counter_shi + 1'b1;
  • if(second_counter_shi == 4'd5) //秒十位加到5,并且个位到9,分钟加1
  • begin
  • second_counter_shi <= `UD 4'd0;
  • minute_counter <= `UD minute_counter + 1'b1;
  • if(minute_counter == 4'd9)
  • begin
  • second_counter_shi <= 0;
  • minute_counter <= 0;
  • second_counter_ge <= 0;
  • end
  • end
  • end
  • else
  • begin
  • if(start_flag && (!stop_flag) && (!reset_flag))//正常计时,暂停不增加秒
  • second_counter_ge <= `UD second_counter_ge + 1'b1;
  • else if(start_flag == 0 || reset_flag == 0)
  • begin
  • second_counter_ge <= 0;
  • minute_counter <= 0;
  • end
  • end
  • end
  • parameter smg_one = 4'b1110;
  • parameter smg_two = 4'b1101;
  • parameter smg_three = 4'b1011;
  • parameter smg_four = 4'b0111;
  • reg [3:0]sel ;
  • reg [3:0]disp_sel;
  • //使用状态机进行数码管扫描
  • always @(posedge clk_1ms or negedge sys_rst_n)
  • begin
  • if(!sys_rst_n)
  • begin
  • sel <= smg_one;
  • disp_sel = 4'b1110;
  • end
  • else
  • begin
  • case(sel)
  • smg_one:
  • begin
  • disp_sel <= 4'b1110;sel <= smg_two;num <= second_counter_ge;
  • end
  • smg_two:
  • begin
  • disp_sel <= 4'b1101;sel <= smg_three;num <= second_counter_shi;
  • end
  • smg_three:
  • begin
  • disp_sel <= 4'b1011;sel <= smg_four;num <= 4'd10;
  • end
  • smg_four:
  • begin
  • disp_sel <= 4'b0111;sel <= smg_one;num <= minute_counter;
  • end
  • default :sel <= smg_one;
  • endcase
  • end
  • end
  • //共阳极
  • assign dig = disp_sel; //显示一位
  • //0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80,0x90
  • //显示部分 共阳极,为0有效
  • always @(*)
  • begin
  • case(num)
  • 4'd0:smg = 8'hc0;//数字0
  • 4'd1:smg = 8'hf9;//数字1
  • 4'd2:smg = 8'ha4;//数字2
  • 4'd3:smg = 8'hb0;//数字3
  • 4'd4:smg = 8'h99;//数字4
  • 4'd5:smg = 8'h92;//数字5
  • 4'd6:smg = 8'h82;//数字6
  • 4'd7:smg = 8'hf8;//数字7
  • 4'd8:smg = 8'h80;//数字8
  • 4'd9:smg = 8'h90;//数字9
  • 4'd10:smg = 8'hBF;//符号-
  • default:smg = 8'hc0;//数字0
  • endcase
  • end
  • endmodule

 

五、实验现象

开始计时.mp4 (6.36 MB, 下载次数: 5)

 

暂停.mp4 (1.22 MB, 下载次数: 2)

 

最新回复

评测很详细,继续加油  详情 回复 发表于 2021-12-16 15:55
点赞 关注
个人签名

阅读改变人生

 
 

回复
举报

1397

帖子

3

TA的资源

版主

沙发
 
评测很详细,继续加油

点评

FPGA小白一枚,多谢鼓励  详情 回复 发表于 2021-12-16 16:54
 
 
 

回复

300

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
annysky2012 发表于 2021-12-16 15:55 评测很详细,继续加油

FPGA小白一枚,多谢鼓励

个人签名

阅读改变人生

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
Windows下常见Oracle服务介绍

注:SID - 数据库标识 HOME_NAME - Oracle Home名称,如OraHome92、OraHome81 (1)OracleServiceSID 数据库服务, ...

西门子S7-300 150个问题解答之一(转载)

1:使用CPU 315F和ET 200S时应如何避免出现“通讯故障”消息? 使用CPU S7 315F, ET 200S以及故障安全DI/DO模块,那么您将调用 ...

硬件设计经验之鸡毛蒜皮小事

鸡毛蒜皮之一:成本节约 现象一:这些拉高/拉低的电阻用多大的阻值关系不大,就选个整数5K吧点评:市场上不存在5K的阻值, ...

TI 工业机器人解决方案

对工业机器人的定义分类,系统考虑,模块分析等进行详细介绍,细数工业机器人设计所面临的挑战,提供TI在工业机器人中核心板,通 ...

51单片机除了8位的还有其他规格的吗,比如16位32位的规格?

51单片机除了8位的还有其他规格的吗,比如16位32位的规格?是不是它的指令系统就决定了它只能是低端的8位机?

从波特图上测量零极点

本帖最后由 Jack315 于 2021-1-25 00:52 编辑 单个零点的传递函数: 522846 零点的波特图如下图所示: 522847 ...

如何预防工资补助诈骗?网曝搜狐全体员工遭遇工资补助诈骗

网曝搜狐全体员工遭遇工资补助诈骗,损失惨重! 近日,一条来自网络的微信群聊记录显示,搜狐全体员工在5月18日早晨收到 ...

嵌入式Qt-简易网络监控摄像头

本编利用Qt实现一个网络摄像头功能,包含一个服务端和一个客户端,服务端用于将USB摄像头转换为一个IP摄像头,当有客户端 ...

请教下,双向可控硅手册的IDRM是不是指关断时的漏电流?

请教下,双向可控硅手册的IDRM是不是指关断时的漏电流?,IRRM是不是指温度为125℃时的漏电流?,谢谢 827950

白皮书分享:三相集成 GaN 技术如何更大限度地 提高电机驱动器的性能

三相集成 GaN 技术如何更大限度地提高电机驱动器的性能 834061 834062 834063

关闭
站长推荐上一条 2/9 下一条
ADI 有奖直播报名中~
直播时间:3月27日(周四) 上午10:00-11:30
直播主题:易于驱动SAR型ADC的原理、优点及应用介绍
好礼等你拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 2

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表