当前位置:首页 > 基于LCD1602的简易秒表的设计与实现
port
(
carry:in STD_LOGIC; --前级计数部分输出的进位信号 data:in std_logic_vector(3 downto 0);--各个计数模块的输出信号作为输入 dataout:out std_logic_vector(7 downto 0));--译码之后的信号作为输出
end;
architecture behav of yima is
signal dis:std_logic_vector(7 downto 0);
begin
process(data) begin
if(carry='1') then--前级计数部分计到23:59:59.99 dis<=\else
case data is
when \译为\when \译为\ when \译为\when \译为\ when \译为\when \译为\ when \译为\ when \译为\ when \译为\when \译为\when others=>dis<=\其他译为\end case; end if; end process;
dataout<=dis; end;
⑨BTN0启动/停止开关消抖模块xiaodou:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity xiaodou is port (
clk :in std_logic;
key_en:in std_logic;--防抖前开始/停止开关按键使能信号 en_out:out std_logic--防抖后开始/停止开关按键使能信号
);
第 33 页 共 37 页
end xiaodou;
architecture behave of xiaodou is
signal cnt:integer range 0 to 3;--采用计数型防抖
signal en,en_tmp:std_logic;
begin
p0:process(clk)
begin
p1:process(en) begin
if en'event and en='1' then
en_tmp<=not en_tmp; en_out<=en_tmp;
end process p1;
end behave;
if clk'event and clk ='1' then
if key_en ='1' then
if cnt = 3 then en<='1'; else cnt<=cnt+1;en<='0'; end if;
else cnt<=0;en<='0'; end if;
end if;
end process p0;
end if;
⑩BTN1复位开关消抖模块fuweixiaodou:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity fuweixiaodou is
architecture behave of fuweixiaodou is
signal cnt:integer range 0 to 3;--采用计数型防抖
第 34 页 共 37 页
port ( );
end fuweixiaodou; clk :in std_logic; fuwei
:in std_logic;--防抖前复位开关按键使能信号
fuwei_out:out std_logic--防抖后复位开关按键使能信号
signal en:std_logic; begin
process(clk)
begin
if clk'event and clk ='1' then
if fuwei ='1' then
if cnt = 3 then en<='1'; else cnt<=cnt+1;en<='0'; end if;
else cnt<=0;en<='0'; end if;
end process; fuwei_out<=en; end behave;
end if;
五、功能说明及资源利用情况
①已实现功能说明:
用LCD1602液晶屏显示计时;
秒表计时长度为23小时59分59.99秒; 用BTN0作为启动/停止开关;
②资源利用情况:
③Netlist Viewer
第 35 页 共 37 页
六、故障及问题分析
在设计秒表计时部分时,将各个计数器模块的时钟信号都给了系统时钟(50MHZ)经500000分频模块fpq分频后得到的时钟信号(100HZ),结果发现LCD1602液晶屏在显示时出现了完全无序的数字,在仔细分析计数器模块的连接方式之后,把系统时钟经500000分频模块fpq分频后的时钟信号作为秒表百分秒位(十进制计数模块cnt10)的时钟信号,并把该十进制计数模块的进位输出信号carry作为秒表十分秒位(十进制计数模块cnt10)的时钟信号,以后以此类推,最终将7个计数器模块级连在一起。这样以后,LCD1602液晶屏在显示数字时的变化规律就正常了。
在LCD1602液晶屏显示部分,最开始LCD1602显示模块LCD1602的时钟给定的是系统时钟50MHZ经500000分频模块fpq分频后得到的时钟信号(100HZ),结果秒表的前六位(小时部分两位、分钟部分两位、秒钟部分两位)显示正常,但就是百分秒位和十分秒位显示的时候,数据总是不完整,有时百分秒位的数只在0、2、4、6、8中依次变化,有时只在1、3、5、7、9中依次变化;十分秒位的情况也类似,在请教了老师后,把LCD1602显示模块LCD1602的时钟变为系统时钟(50MHZ)经50000分频模块fpq1分频后得到的时钟信号(1KHZ)。这样以后,LCD1602液晶屏在显示时,就能将秒表各个时间位的完整状态依次表示出来。
在设计BTN0启动/停止开关消抖模块xiaodou时,采用的是计数型防抖,最开始将该模块的时钟设置为系统时钟(50MHZ),结果实验时发现不管怎么改计数的长度都无法很好的达到预期的按键防抖效果,有时按一下能停止计数,有时又不能停止计数;即时按一下能停止计数了,再按一下又不能继续计数,总之灵敏度很不好。请教了老师后,老师认为是这一模块的时钟频率设置的不好的原因,于是我把这一模块的时钟信号变为系统时钟(50MHZ)经500000分频模块fpq分频后得到的时钟信号(100HZ),结果按键的效果确实有了很大改观。
在设计BTN1复位开关时,一个是遇到了前面BTN0启动/停止开关消抖模块xiaodou时钟选择的相同问题,另一个就是在设计各个计数器模块的复位功能时,采用了同步复位,而没有选择异步复位,导致将程序下载到实验板后,按下复位开关并不能执行无条件的清零操作。
11月2日在验收时,老师认为我的复位功能出现了问题,老师的理解是按下BTN1清零键后,秒表就要保持在00:00:00.00的状态;而我
第 36 页 共 37 页
的理解是按下BTN1清零键之后秒表又立刻开始计时,出现这部分故障是因为我的理解存在问题。
第 37 页 共 37 页
共分享92篇相关文档