根据LCD1602的简单秒表的设计与实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字电路与逻辑设计实验报告

学院:电子工程学院

班级:2014211212

姓名:

学号:

班内序号:

一、设计课题的任务要求

简易秒表的设计与实现

设计制作一个计时精度为百分之一秒的计时秒表

基本要求:

1.用LCD1602液晶屏显示计时;

2.秒表计时长度为23小时59分59.99秒;

3.用BTN0作为启动/停止开关;

4.用BTN1作为复位开关,在任何情况下,只要按下复位开关,秒表都要无

条件执行清零操作。

提高要求:

1.增加定时器功能,可根据用户设定的时间进行倒计时,时间到0后蜂鸣器

报警提示;

2.自拟其他功能。

二、系统设计(设计思路、总体框图、分块设计)

1.设计思路:

分别设计6进制计数器、10进制计数器和24进制计数器用于秒表计时部分。具体来说:将两个10进制计数器级联分别作为秒表的十分秒位(最

小单位为0.1秒)和百分秒位(最小单位为0.01秒);将一个10进制计

数器和6进制计数器级联,分别作为秒表秒钟部分的个位(最小单位为1

秒)和十位(最小单位为10秒);再将一个10进制计数器和6进制计数

器级联,分别作为秒表分钟部分的个位(最小单位为1分钟)和十位(最

小单位为10分钟);将24进制计数器作为秒表小时部分,其中低位输出

作为秒表小时部分的个位(最小单位为1小时),高位输出作为秒表小时

部分的十位(最小单位为10小时)。最后把秒表百分秒、十分秒部分、秒

钟部分、分钟部分、小时部分这四部分级联起来便构成了简易数字秒表

的计时部分。

将各个计数器部分的输出信号通过译码模块,变成LCD1602液晶屏能够读取并从而显示相关字符的8位二进制数据。再定义一个存储器ram,存

储各个计数器部分的输出信号经过译码部分之后得到的数据,然后将这

个存储器ram代表的数据在LCD1602液晶屏上显示。

考虑到秒表的最小计时长度为0.01秒(频率为100HZ),如果系统时钟设置为50MHZ,则需要500000分频;实验时发现LCD1602液晶屏的时钟在

1KHZ时,显示效果较好,故需要在系统时钟为50MHZ的基础上进行50000

分频。

考虑到基本要求中需要用BTN0作为启动/停止开关,用BTN1作为复位开关,所以需要设计相应的按键防抖电路,这里我采用的是计数型防抖。

2.总体框图:

图1 系统结构框图

3.分块设计:

系统共通过9个模块实现,分别是:

500000分频模块 fpq

50000分频模块 fpq1

6进制计数器模块 cnt6

10进制计数器模块 cnt10

24进制计数器模块 cnt24

译码模块 yima

LCD1602显示模块 LCD1602

BTN0启动/停止开关消抖模块 xiaodou

BTN1复位开关消抖模块 fuweixiaodou 具体设计如下:

500000分频模块fpq

输入端口:clk : in std_logic;

输出端口:clkout : out std_logic;

生成符号:

设计思路:利用计数法实现分频

主要代码:(完整代码请见源程序)

signal clktmp : std_logic;

signal tmp : integer range 0 to 249999;

begin

process (clk)

begin

if clk'event and clk='1' then

if tmp=249999 then --500000分频

tmp<=0; clktmp<=not clktmp;

else

tmp<=tmp+1;

end if;

end if;

end process;

clkout<=clktmp;

50000分频模块fpq1:

输入端口:clk : in std_logic;

输出端口:clkout : out std_logic;

生成符号:

设计思路:利用计数法实现分频

主要代码:(完整代码请见源程序)

signal clktmp : std_logic;

signal tmp : integer range 0 to 24999;

begin

process (clk)

begin

if clk'event and clk='1' then

if tmp=24999 then --50000分频

tmp<=0; clktmp<=not clktmp;

else

tmp<=tmp+1;

end if;

end if;

end process;

clkout<=clktmp;

6进制计数器模块cnt6:

输入端口:reset,en,clk:IN STD_LOGIC;

输出端口:carry :OUT STD_LOGIC;

q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

生成符号:

设计思路:正常的计数状态是0->1->2->3->4->5->0->1……;

当计数到5时,进位信号变为‘1’;否则状态自增,

进位信号保持在‘0’

主要代码:(完整代码请见源程序)

SIGNAL qs :STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL ca :STD_LOGIC;

BEGIN

PROCESS(clk)

begin

IF(reset='1')THEN qs<="0000";

ELSIF(clk'EVENT AND clk='1')THEN

IF(en='0') THEN

IF(qs="0101") THEN --计数到5

qs<= "0000";

ca<='1';

ELSE

qs<=qs+1;

ca<='0';

END IF;

END IF;

END IF;

END PROCESS;

PROCESS(ca,en)

BEGIN

q<=qs;

carry<=ca;

END PROCESS;

10进制计数器模块cnt10:

输入端口:reset,en,clk:IN STD_LOGIC;

输出端口:carry :OUT STD_LOGIC;

q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

生成符号:

相关文档
最新文档