第一篇:fpga数字钟课程设计报告
课程设计报告
设计题目:基于FPGA的数字钟设计
班级:电子信息工程1301 学号:20133638 姓名:王一丁
指导教师:李世平
设计时间:2016年1月
摘要
EDA(Electronic Design Automation)电子设计自动化,是以大规模可编程器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,通过相关的软件,自动完成软件方式设计得电子系统到硬件系统,最终形成集成电子系统或专用集成芯片。本次课程设计利用Quartus II 为设计软件,VHDL为硬件描述语言,结合所学知识设计一个多功能时钟,具有显示年、月、日、时、分、秒显示,计时,整点报时,设定时间等功能。利用硬件描述语言VHDL 对设计系统的各个子模块进行逻辑描述,采用模块化的思想完成顶层模块的设计,通过软件编译、逻辑化简、逻辑综合优化、逻辑仿真、最终完成本次课程设计的任务。
关键词:EDA VHDL语言 数字钟
目 录
摘要 课程设计目的 课程设计内容及要求 2.1 设计任务
2.2 设计要求 VHDL程序设计
3.1方案论证 3.2 系统结构框图 3.3设计思路与方法 3.3.1 状态控制模块 3.3.2 时分秒模块 3.3.3 年月日模块 3.3.4 显示模块 3.3.5脉冲产生模块 3.3.6 扬声器与闹钟模块
3.4 RTL整体电路 4 系统仿真与分析
课程设计总结,包括.收获、体会和建议 6 参考文献 1 课程设计目的
(1)通过设计数字钟熟练掌握EDA软件(QUARTUS II)的使用方法,熟练进行设计、编译,为以后实际工程问题打下设计基础。
(2)熟悉VHDL 硬件描述语言,提升分析、寻找和排除电子设计中常见故障的能力。
(3)通过课程设计,锻炼书写有理论根据的、实事求是的、文理通顺的课程设计报告。课程设计内容及要求
2.1 设计任务
(1)6个数字显示器显示时分秒,setpin按键产生一个脉冲,显示切换为年月日。
(2)第二个脉冲可预置年份,第三个脉冲可以预置月份,依次第四、五、六、七个脉冲到来时分别可以预置时期、时、分、秒,第八个脉冲到来后预置结束正常从左显示时分秒。
(3)up为高时,upclk有脉冲到达时,预置位加一,否则减一。2.2 设计要求
(1)在基本功能的基础上,闹钟在整点进行报时,产生一定时长的高电平。
(2)实现闹钟功能,可对闹钟时间进行预置,当达到预置时间时进行报时。
VHDL程序设计 3.1方案论证
该数字钟可以实现:计时功能、整点报时、闹钟和预置时间功能,因此时钟系统可分为5个模块:功能选择模块、时分秒计数模块、年月日计数模块、显示模块、扬声器模块、脉冲产生模块。
(1)功能选择模块是有状态机构成的,功能为依次进行、设置时间、设置闹钟时间。
调整工作状态:数字钟的初始状态显示时分秒,在setpin按键产生一个脉冲,显示切换为年月日。
设置时间:第二个脉冲可预置年份,第三个脉冲可以预置月份,依次第四、五、六、七个脉冲到来时分别可以预置时期、时、分、秒。第八个脉冲到来后,预置结束恢复初始状态,正常显示时分秒。
设置闹钟时间:闹钟在setpin1按键产生第一个脉冲时设定闹钟的时,第二个脉冲设定分,第三个脉冲设定秒,第四个脉冲恢复显示时分秒。
(2)时分秒计数模块包括正常计时、闹钟、整点报时三个功能。
正常计时功能通过软件编写,60进制的秒计数器,60进制的分计数器,24进制的时计数器。时分秒的计数器具有清0、置数、进位和计数功能。其中reset为清0信号,当reset为0时,时分秒的计数器清0。当set产生第四个脉冲后,连续产生的set信号使分秒计数器依次进行置数。以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。当set产生第八个脉冲时,数字钟恢复时分秒的显示。
闹钟功能是在正常计数功能上拓展,分为闹钟时间预置和闹钟响应两个部分。闹钟时间预置功能:当set1连续产生脉冲时,依次对闹钟的时分秒位进行预置。以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。当set1产生第四个脉冲时,数字钟恢复时分秒的显示。与此同时在程序中增添变量时计时功能可以持续运行。闹钟响应功能:通过预置后,储存的变量与计时器模块的时、分、秒进行比对,当时、分、秒相同时,模块产生一个一段时间的高电平,传输给闹钟响应模块。
整点报时功能:当计数器中的分位等于59,秒位等于59时,模块产生一段高电平,输出给扬声器模块进行报时。
(3)年月日计数模块分为年月日计数功能,年月日预置数功能。
年月日计数功能:以时位的进位脉冲为计时脉冲,闰年二月份为29天,普通年二月份为28天。一月、三月、五月、七月、八月、十月、十二月为31天,四月、六月、九月、十一月为30天。
年月日预置数功能:当set产生第一个脉冲后,依次进行年月日数器置数。以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。
(4)显示模块:以时分秒,年月日模块的输出、状态标志为输入信号,通过状态控制模块产生的状态标志对显示模块进行控制,显示计时、预置时的不同状态。
(5)扬声器模块:输入信号为分位、秒位和状态信号,当计时时钟到达整点是输出高电平,其他时刻输出低电平。
(6)脉冲产生模块:对输入的信号进行1000分频,产生周期为一秒的时钟信号,用于数字钟的时钟输入。
3.2系统结构框图
3.3设计思路与方法 3.3.1 状态控制模块
状态控制模块实现对各个功能模块的整体设计,包括对时间与日期的显示与调整,闹钟的显示与调整等控制操作。状态机的输入为setpin,setpin1,upclk。状态机的状态有11种状态。g0:闹钟设置时位; g1:闹钟设置分位; g2:闹钟设置秒位;
s0:时钟显示时分秒;s1:时钟显示年月日; s2:钟设置年; s3:时钟设置月; s4:时钟设置日; s5:时钟设置时; s6:时钟设置分; s7:设置秒
在产生如上状态的同时产生Tlock,flag状态标志,此标志用来进行时钟设置、闹钟设置与显示控制。RTL 电路图
实现代码如下: process(upclk)begin if(upclk='1' and upclk'LAST_VALUE='0')then state<=next_state;--实现状态变换
end if;end process;process(state,setpin,setpin1)begin next_state<=state;case(state)is when s0 => Tlock<=“0000”;flag<='1';if(setpin1='1'
and
setpin1'LAST_VALUE='0')then next_state<=g0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')
then next_state<=s1;end if;when s1=> Tlock<=“0001”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s2;end if;when s2=> Tlock<=“0010”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s3;end if;
when s3=> Tlock<=“0011”;flag<='1';if(setpin1='1' and next_state<=g0;end if;
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')if(setpin='1' and next_state<=s4;end if;
when s4=> Tlock<=“0100”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s5;end if;when s5=> Tlock<=“0101”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s6;end if;when s6=> Tlock<=“0110”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')then
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
then
setpin'LAST_VALUE='0')
setpin'LAST_VALUE='0')
setpin'LAST_VALUE='0')next_state<=s7;end if;
when s7=>
Tlock<=“0111”;
flag<='1';if(setpin1='1' and
setpin1'LAST_VALUE='0')then next_state<=g0;end if;if(setpin='1'
and next_state<=s0;end if;when g0=> Tlock<=“1000”;flag<='0';if(setpin1='1' and next_state<=g1;end if;if(setpin='1'
and next_state<=s0;end if;
when g1=> Tlock<=“1001”;flag<='0';if(setpin1='1' and next_state<=g2;end if;if(setpin='1'
and next_state<=s0;end if;then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin'LAST_VALUE='0')
when g2=> Tlock<=“1010”;flag<='0';if(setpin1='1' next_state<=s0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')
then
and
setpin1'LAST_VALUE='0')then next_state<=s0;end if;
when others=> next_state<=s0;end case;end process;3.3.2 时分秒模块
时分秒模块的输入为ce(使能端),clk0(系统输入时钟),clk1(upclk时钟),flag(标志位),lock(状态位),up(预置位增减控制),ov(进位位),op(闹钟与扬声器响应)。
时分秒模块的RTL电路图 时钟选择方式:在初始状态和显示年月日的状态下,时分秒模块的时钟输入为系统时钟输入(clk0),在其他状态下,时分秒模块的时钟输入为(upclk时钟)用来进行置位。
实现代码入下:
process(lock,clk0,clk1)begin if(lock=“0000” or lock=“0001”)then clk<=clk0;--正常计数时选择clk0 else clk<=clk1;--预置的时候clk1 end if;end process;时钟计时功能,在显示年月日,时分秒的状态时,时钟正常计数。当数字钟处于置数状态时,年、月、日、时、分、秒时钟停止计时,各个位显示预置数。在闹钟的预置功能实现的同时,通过增添变量,在设置闹钟的同时保证时钟的正常计数,在闹钟预置结束后,恢复到初始的时钟显示。3.2.3 年月日模块
年月日模块分为日期增加和日期减小两个部分,日期增加:在显示时分秒,显示年月日和设置完秒位的状态下,如果是二月,通过函数判断是否为闰年,其他月份对大小月进行判断,大月为31天,小月为30天,代码如下:
if(clk'event and clk='1')then if(ce='1')then if(lock=“0000”)or(lock=“0001”)or(lock=“0100”and up='1')then
if(mon0=“0010”and mon1=“0000”)then
Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1);
elsif((mon0=“0001”and mon0=“0000”)or(mon0=“0011”)or(mon0=“0101”)
or(mon0=“0111”)or(mon0=“1000”)or(mon0=“0000”and mon1=“0001”)or(mon0=“0010”and mon1=“0001”))then
oddmonth_add_day(Td0,Td1,date0,date1);
else evenmonth_add_day(Td0,Td1,date0,date1);
end if;
end if;日期减少同理,代码如下: if(lock=“0100”and up='0')then if(mon0=“0010”and mon1=“0000”)then Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1);elsif((mon0=“0001”and mon1=“0000”)or(mon0=“0011”)or(mon0=“0101”)or(mon0=“0111”)or(mon0=“1000”)or(mon0=“0000”and mon1=“0001”)
or(mon0=“0010”and mon1=“0001”))then
oddmonth_sub_day(Td0,Td1,date0,date1);
else evenmonth_sub_day(Td0,Td1,date0,date1);
END IF;
end if;
end if;
end if;当以日位的进位为输入,当存在输入脉冲时,通过函数对月份进行加减,代码如下: begin
if(clk'event and clk='1')then
if(ce='1')then
if(lock=“0000”)or(lock=“0001”)or(lock=“0011”and up='1')then
add_month(Tm0,Tm1,mon0,mon1);
end if;
if(lock=“0011”and up='0')then
sub_month(Tm0,Tm1,mon0,mon1);
end if;
if(lock=“0000”)or(lock=“0001”)then
if(mon0=“0010”and mon1=“0001”)then
sub_year(Ty0,Ty1,year0,year1);
end if;
end if;
if(lock=“0010”and up='1')then
add_year(Ty0,Ty1,year0,year1);
end if;
if(lock=“0010”and up='0')then
sub_year(Ty0,Ty1,year0,year1);
end if;
end if;
end if;3.2.4 显示模块
显示模块的输入为年、月、日、时、分、秒、lock(状态标志),通过if语句,状态机一共提供11钟状态。在不同状态下,给显示模块的年月日时分秒不同的输入,从而得到要求的显示。
显示电路的RTL电路 代码如下:
process(lock,sec0,sec1,min1,min0,hour1,hour0,date0,date1,mon0,mon1,year0,year1)begin if(lock=“0000”)then a0<=sec0;a1<=sec1;b0<=min0;b1<=min1;c0<=hour0;c1<=hour1;end if;if(lock=“0001”)then a0<=date0;a1<=date1;b0<=mon0;b1<=mon1;c0<=year0;c1<=year1;end if;if(lock=“0101”)or(lock=“1000”)then a0<=“1111”;a1<=“1111”;b0<=“1111”;b1<=“1111”;c0<=hour0;c1<=hour1;end if;if(lock=“0110”)or(lock=“1001”)then a0<=“1111”;a1<=“1111”;b0<=min0;b1<=min1;c0<=“1111”;c1<=“1111”;end if;if(lock=“0111”)or(lock=“1010”)then a0<=sec0;a1<=sec1;b0<=“1111”;b1<=“1111”;c0<=“1111”;c1<=“1111”;end if;if(lock=“0010”)then a0<=“1111”;a1<=“1111”;b0<=“1111”;b1<=“1111”;c0<=year0;c1<=year1;end if;if(lock=“0011”)then a0<=“1111”;a1<=“1111”;b0<=mon0;b1<=mon1;c0<=“1111”;c1<=“1111”;end if;if(lock=“0100”)then a0<=date0;a1<=date1;b0<=“1111”;b1<=“1111”;c0<=“1111”;c1<=“1111”;end if;end process;end led_disp_arc;3.2.5脉冲发生模块(分频电路)
脉冲发生电路将提供的1000hz频率分频成1hz(供系统时钟)。f1000为1000hz输入,second_wave为分频输出。
分频器的RTL电路 代码如下: process(f1000,cnt)begin if(f1000'event and f1000='1')then if(cnt=“00000011”)then cnt<=“000000000”;second_wave<=not second_wave;else cnt<=cnt+'1';end if;end if;end process;end second_wave_arc;3.2.6 扬声器模块
模块的输入为clk(系统时钟),op(响应信号),vcc(闹钟使能端),ala(高电平输出)。当vcc为高时,且当op有响应信号输入(高),闹钟产生一定时长的高电平。
闹钟的RTL电路 代码如下:
signal temp1:std_logic_vector(3 downto 0);begin process(op,vcc,clk)begin if clk'event and clk='1' then if(vcc='1')then if(temp1=“1111”)then ala<=not ala;
else
temp1<=temp1+'1';
ala<='1';
end if;
end if;
end if;end process;end alarm_arc;
3.3整体RTL电路
系统仿真与分析 4.1对基本要求的仿真
初态设置:setpin1=0;up=0;setpin置连续8个脉冲,f1000为频率为1000hz的方波。
分析:在setpin第一次脉冲到来时,显示年月日,因为数字钟是初始状态所以年月日均为0。Setpin。第二次脉冲到来时对时进行预置数,因为up=0,所以设置时位,时位在不断地减小,在后面各位预置的过程中,每一位的预置过程都是减小。第三次脉冲来到是对分位进行预置,第四次脉冲到来时对秒位进行预置。第四次脉冲到来时对年进行预置,第五次脉冲到来时对月进行预置,第六次脉冲到来时对日进行预置。第七次脉冲到来时,数字钟显示时分秒,从仿真结果可以看出来,此时时钟是从预置的时间开始计时的,第八次脉冲到来时,此时时钟显示的是年月日,此时显示的年月日为预置的年月日。
从上述分析可以看出,经过仿真的程序基本达到数字钟的基本要求,系统可靠。
4.2对闹钟状态转换的仿真
初始设置:初态设置:setpin1设计一个脉冲;up=0;setpin置连续2个脉冲,f1000为频率为1000hz的方波。
当第一个setpin脉冲到来时,显示年月日,第二个setpin脉冲来临时时钟对年进行预置,此后setpin1的第一个脉冲到来,时钟的状态转为对闹钟时间的设置,达到实验要求。
4.3对闹钟功能的仿真
初始设置:初态设置:setpin1设计三个脉冲;up=0;f1000为频率为1000hz的方波。
数字钟的原状态显示时分秒,由于未进行初始化,所以时分秒从0开始计时,当setpin1第一个脉冲到来时,数字钟对闹钟的时刻的时位进行预置,当setpin1第二个脉冲到来时,数字钟对闹钟的时刻的分位进行预置,当setpin1第三个脉冲到来时,数字钟对闹钟的时刻的秒位进行预置,当第四个脉冲到来是恢复显示时分秒,此时的时分秒已经计数到51秒,符合预期,在设置闹钟的同时,时钟依旧计数,达到要求。
同时从初始时刻,闹钟的扬声器产生一定时长高电平可以看出整点报时功能良好,达到设计要求。课程设计总结(收获、体会和建议)本次VHDL设计的数字钟定义了三种类型的端口,分别是in、out、buffer。In和out端口使用简单,buffer端口具有回读功能,因为buffer类型的端口不能连接到其他类型的端口上,因此不利于子模块原件例化,不利于大型设计。
进程(Process)是VHDL中最为重要的部分,在本次设计中。我出现了对于时钟引入,输出多驱动,一个进程中不允许出现两个时钟沿触发的错误,这些错误在未来的设计中都是应该避免的。顺序语句如IF语句、CASE语句、LOOP语句、变量赋值语句等必须出现在进程、函数或子程序内部,而不能单独出现在进程之外。
本次实验让我对VHDL 语言有了更深的认识,对语言的运用更加熟悉,为未来的实际应用打下了良好的基础。因为实验室的条件限制,并没有将程序下载到实际器件中观察现象,只是通过软件对系统进行仿真,希望以后可以机会接触并使用实际器件。6 参考文献
1.吴廷鑫.基于FPGA的多功能数字钟设计[J].科技经济市场, 2015,(5): 1-5 2.徐大诏.基于FPGA实现的数字钟设计[J].信息技术, 2009,(12): 101-104 3.张子刚, 卢戈, 田鹏.基于VHDL的数字时钟的设计[J].气象水文海洋仪器, 2008,(2): 10-14 4.樊永宁, 张晓丽.基于VHDL的多功能数字钟的设计[J].工矿自动化, 2006,(3): 92-94 5.江翠云 基于CPLD和VHDL的数字钟的设计[期刊论文]-硅谷2010(2)
第二篇:基于FPGA的数字钟课程设计
计算机与信息工程系
《脉冲与数字电路》 课程设计报告
专业
通信工程
班级
B090507
学号
B09050722
姓名
张亚威
报告完成日期
2011/06/24
指导教师
秦玉洁
评语:
成绩:
批阅教师签名:
批阅时间:
1.任务和设计要求
设计具有时、分、秒计数显示,以24小时循环计时的时钟电路,带有清零和校准功能;
2.设计原理
采用硬件描述语言Verilog 进行编程,实现20MHZ晶振到1HZ的分频;采用verilog语言实现数字表功能实现的各个模块;通过各个模块的代码生成相应的模块原理图;再将各个模块生成的原理图进行叠加组成一个数字表系统;
3.系统设计
设计的数字表有6个输入,16个输出;
6个输入中,有一个是时钟信号,开发板上的28号引脚输入的50MHZ的时钟信号;一个清零端,当数字表正常显示时,按下清零端可以实现
数字钟整体电路图:
4.各个模块设计
基于EP1C6Q240C8的数字钟设计,有6个模块组成: Fdiv 分频模块
Control 模式选择模块 Tune 校正模块 Zoushi 时间正常运行模块 Saomiao 数码管动态扫描模块; Decoder BCD译码模块;
Fdiv 模块:
功能:实现20MHZ的时钟信号分成10KHZ的信号和1HZ的信号;
输入:clk 为20MHZ的时钟信号; 输出:f10000HZ 为10KH的时钟信号;
F1HZ 为1HZ的时钟信号; Fdiv 模块代码:
module fdiv(clk,f10000Hz,f1Hz);output f10000Hz,f1Hz;input clk;reg f10000Hz,f1Hz;integer CNT1=0,CNT2=0;always@(posedge clk)
begin
if(CNT1<1999)
begin
CNT1=CNT1+1;
f10000Hz<=1'b0;
end
else
begin
CNT1=0;
f10000Hz<=1'b1;
end
end
always@(posedge f10000Hz)
begin
if(CNT2<9999)
begin
CNT2=CNT2+1;
f1Hz<=1'b0;
end
else
begin
CNT2=0;
f1Hz<=1'b1;
end
end endmodule fdiv 模块波形仿真:
由于实际的分频波形仿真中,由于要将20MHZ的分成1HZ的,需要将信号缩小20 000 000倍,因此,此处采用将20HZ的先分成10HZ,然后再将10HZ的分成1HZ的时钟信号;在仿真中这样整,在实际演示中再改下代码,实现真正的20MHZ到1HZ的分频;它们只是一个倍数关系而已;
Control 模块:
功能:实现电子表的正常显示及时间校正模式的转换;
输入:key 模式修改键,每来一个高电平,mode加一次。如果mode 的值为2,则mode被赋值为 1;
Reset 复位键,如果reset 为 1,则mode 被赋值为0; 输出:mode 用于输出到下一级模块,进行模式判断; Control 模块源代码:
module control(mode,key,reset);input key,reset;output[1:0] mode;reg[1:0] mode;always@(posedge key)begin
if(reset)
begin
mode<=2'b00;
end
else
begin
mode<=mode+2'b01;
if(mode==2)
begin
mode<=2'b00;
end
end end endmodule Control 模块波形仿真
Tune 模块
功能:实现秒分时的校正;
输入:Mode 为模式选择,mode为0时是正常显示时间模式;mode 为1时,是秒、分、时加一模式。Mode为2时,是时分秒减一模式;
Ht 为时调节输入;
mt 为分调节输入;
St 为秒调节输入;
输出:Aa 为秒的个位;
Ba 为秒的十位;
Da 为分钟的个位;
Ea 为分钟的十位;
Ga 为小时的个位;
Ha 为小时的十位; Tune 调时模块源代码:
module tune(mode,ht,mt,st,aa,ba,da,ea,ga,ha);input[1:0] mode;input ht;input mt;input st;output[3:0] aa;output[2:0] ba;output[3:0] da;output[2:0] ea;output[3:0] ga;output[1:0] ha;reg[3:0] aa,da,ga;reg[2:0] ba,ea;reg[1:0] ha;
always@(posedge st)begin
if(mode==1)
begin
aa<=aa+1;
if(aa==9)
begin
ba<=ba+1;
aa<=0;
end
if(ba==5&&aa==9)
ba<=0;
end
else if(mode==2)
begin
aa<=aa-1;
if(aa==0)
begin
ba<=ba-1;
aa<=9;
end
if(ba==0&&aa==0)
ba<=5;
end end always@(posedge mt)begin
if(mode==1)
begin
da<=da+1;
if(da==9)
begin
ea<=ea+1;
da<=0;
end
if(ea==5&&da==9)
ea<=0;
end
else if(mode==2)
begin
da<=da-1;
if(da==0)
begin
ea<=ea-1;
da<=9;
end
if(ea==0&&da==0)
ea<=5;
end end always@(posedge ht)begin
if(mode==1)
begin
ga<=ga+1;
if(ga==9)
begin
ha<=ha+1;
ga<=0;
end
if(ha==2&&ga==3)
begin
ha<=0;
ga<=0;
end
end
else if(mode==2)
begin
ga<=ga-1;
if(ga==0)
begin
ha<=ha-1;
ga<=9;
end
if(ga==0&&ha==0)
begin
ga<=3;
ha<=2;
end
end end
endmodule Tune
调时模块仿真波形:
Mode 为0 时,ht,mt,st均不起作用;
Mode 为1时,小时加到23,ht再来一个上升沿,小时变为0;
Mode 为1时,秒、分加到59,st、mt再来一个上升沿,秒、分变成0;
Mode 为2时,小时减到0,ht再来一个上升沿,小时变为23;
Mode 为2时,秒、分减到0,st、mt再来一个上升沿,秒、分变成59;
Zou shi模块:
功能:实现时间的正常显示及校正显示;
正常显示,当秒加到59时,1HZ的脉冲信号CLK1再来一个上升沿,秒变为0,同时分加一;
当正常显示时,复位端来一个上升沿的脉冲,显示变成输入端输入的数据;
Mode 变成模式1时,显示变成输入端输入的数据;
Mode 变成模式2时,显示变成输入端输入的数据;
Sao miao模块:
功能:实现数码管的动态扫描;
输入:clk10K 输入10KHZ的时钟信号作为数码管的动态扫描时钟信号;
a[3..0] 上一级输出的秒的个位;
b[2..0] 上一级输出的秒的十位;
c[3..0] 上一级输出的分秒之间的标志位;
d[3..0] 上一级输出的分的个位;
e[2..0] 上一级输出的分的十位;
f[2..0] 上一级输出的秒的时分之间的标志位; g[3..0] 上一级输出的时的个位;
h[2..0] 上一级输出的时的个位;
输出:zx[3..0]数码管将要显示的4位BCD码;
Zw[7..0]八位数码管动态扫描输出; Sao miao 数码管扫描模块源代码:
module saomiao(a,b,c,d,e,f,g,h,f10000HZ,zx,zw);input f10000HZ;input[3:0] a,d,g,c,f;input[2:0] b,e;input[1:0] h;output[3:0] zx;output[7:0] zw;reg[3:0] zx;
reg[7:0] zw;reg[2:0] slip;always@(posedge f10000HZ)begin
if(slip==100)
slip<=4'b000;
else
slip<=slip+1'b1;end always@(slip)begin
case(slip)
4'd0:begin zw=8'b11111110;zx=a;end
4'd1:begin zw=8'b11111101;zx=b;end
4'd2:begin zw=8'b11111011;zx=c;end
4'd3:begin zw=8'b11110111;zx=d;end
4'd4:begin zw=8'b11101111;zx=e;end
4'd5:begin zw=8'b11011111;zx=f;end
4'd6:begin zw=8'b10111111;zx=g;end
4'd7:begin zw=8'b01111111;zx=h;end
default:zw=8'bx;
endcase end endmodule Sao miao 数码管扫描模块仿真波形:
Zx显示的是上一级输出的4位BCD码,此处是以十进制的形式显示的;
Decoder 模块:
功能:将上一级输出的4为BCD码转换成数码管能正常显示的数据;
输入:zx[3..0]上一级输出的4位BCD码; 输出:seg[6..0]数码管能正常显示的数据;
Decoder 译码模块源代码: module decoder(zx,seg);input[3:0] zx;output[6:0] seg;reg[6:0] seg;always@(zx)begin case(zx)4'b0000: seg<=7'b0111111;4'b0001: seg<=7'b0000110;4'b0010: seg<=7'b1011011;4'b0011: seg<=7'b1001111;4'b0100: seg<=7'b1100110;4'b0101: seg<=7'b1101101;4'b0110: seg<=7'b1111101;4'b0111: seg<=7'b0000111;4'b1000: seg<=7'b1111111;4'b1001: seg<=7'b1101111;4'b1010: seg<=7'b1000000;
default:seg<=7'bx;
endcase end endmodule Decoder 译码模块仿真波形:
输入的4位BCD码从0~10,则数码管显示0~9和一横标志位;
5.系统调试与性能分析
在第一次做好之后,下载到开发板里面,出现了问题,不能下载成功;最初认为是下载器的驱动没有安装好,后来经过认真的分析是因为在选择芯片的时候,选错了芯片;在进行了芯片的正确选择,以及引脚的正确配置后,成功的加生成的.sof文件下载到了开发板中;
6.设计过程中遇到的问题及解决方法。
程序完全调时成功后,下载到开发板中,显示全部为0,可能是时钟分频的问题;解决方法是修改源代码,进行正确的时钟信号分频;
第三篇:FPGA课程设计多功能数字钟讲解
多功能数字钟
开课学期:2014—2015 学年第二学期 课程名称: FPGA课程设计
学 院: 信息科学与工程学院
专 业: 集成电路设计与集成系统
班 级: 学 号: 姓 名:
任课教师:
2015 年 7 月 21 日
说 明
一、论文书写要求与说明
1.严格按照模板进行书写。自己可以自行修改标题的题目 2.关于字体:
a)题目:三号黑体加粗。
b)正文:小四号宋体,行距为1.25倍。
3.严禁抄袭和雷同,一经发现,成绩即判定为不及格!!
二、设计提交说明
1.设计需要提交“电子稿”和“打印稿”;
2.“打印稿”包括封面、说明(即本页内容)、设计内容三部分;订书机左边装订。
3.“电子稿”上交:文件名为 “FPGA课程设计报告-班级-学号-姓名.doc”,所有报告发送给班长,由班长统一打包后统一发送到付小倩老师。
4.“打印稿”由班长收齐后交到:12教305办公室; 5.上交截止日期:2015年7月31日17:00之前。
第一章
绪论....................................................................................................................3 关键词:FPGA,数字钟....................................................................................................3 第二章 FPGA的相关介绍...............................................................................................4 2.1 FPGA概述........................................................................................................4 2.2 FPGA特点...........................................................................................................4 2.3 FPGA设计注意...................................................................................................5 第三章 Quartus II与Verilog HDL相关介绍..................................................................7 3.1 Quartus II..............................................................................................................7 3.2 Verilog HDL......................................................................................................7 第四章 设计方案..............................................................................................................8 4.1数字钟的工作原理..............................................................................................8 4.2 按键消抖.............................................................................................................8 4.3时钟复位..............................................................................................................8 4.4时钟校时..............................................................................................................8 4.5数码管显示模块。..............................................................................................8 第五章 方案实现与验证..................................................................................................9 5.1产生秒脉冲..........................................................................................................9 5.2秒个位进位..........................................................................................................9 5.3按键消抖..............................................................................................................9 5.4复位按键设置....................................................................................................10 5.5 数码管显示。...................................................................................................10 5.6 RTL结构总图....................................................................................................11 第六章 实验总结............................................................................................................14 第七章 Verilog HDL源代码附录..................................................................................15
第一章
绪论
现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronic design automatic, EDA)技术。
本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级这三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述,覆盖面广,抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器;而FPGA是特殊的ASIC芯片,与其它的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。
在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所对应的功能。因此,按键信息输入是与软件结构密切相关的过程。根据键盘结构的不同,采用不同的编码方法,但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。[1] 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些都是以钟表数字化为基础的。因此研究数字钟以及扩大其应用有着非常现实的意义。
关键词:FPGA,数字钟
第二章 FPGA的相关介绍
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
2.1 FPGA概述
系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。
FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。这3种可编程电路是:可编程逻辑模块(CLB--Configurable Logic Block)、输入/输出模块(IOB--I/O Block)和互连资源(IR—Interconnect Resource)。可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。
FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(复杂可编程逻辑器件备)。
2.2 FPGA特点
FPGA的基本特点主要有:
1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC电路的中试样片。3)FPGA内部有丰富的触发器和I/O引脚。
4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。
FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。
2.3 FPGA设计注意
不管你是一名逻辑设计师、硬件工程师或系统工程师,甚或拥有所有这些头衔,只要你在任何一种高速和多协议的复杂系统中使用了FPGA,你就很可能需要努力解决好器件配置、电源管理、IP集成、信号完整性和其他的一些关键设计问题。不过,你不必独自面对这些挑战,因为在当前业内领先的FPGA公司里工作的应用工程师每天都会面对这些问题,而且他们已经提出了一些将令你的设计工作变得更轻松的设计指导原则和解决方案。
本次实验所采用的FPGA器件是Altera Cyclone V 5CSEMA5F31C6N
FPGA实物图
FPGA数码管介绍,每节数码管低电平点亮高电平熄灭。LED序号如下图所示:
根据上图所示的顺序,可以得出显示的数组代码。
4'd0: HEX0=7'b1000000;4'd1: HEX0=7'b1111001;4'd2: HEX0=7'b0100100;4'd3: HEX0=7'b0110000;4'd4: HEX0=7'b0011001;4'd5: HEX0=7'b0010010;4'd6: HEX0=7'b0000010;4'd7: HEX0=7'b1111000;4'd8: HEX0=7'b0000000;4'd9: HEX0=7'b0010000;
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9 default: HEX0=7'b1111111;//不符合条件的显示零
第三章 Quartus II与Verilog HDL相关介绍
3.1 Quartus II Quartus II 是Altera公司的综合性PLD/FPGA开发软件,原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
Quartus II 软件拥有友好的界面,使用便捷,功能强大,当中可编程逻辑设计环境采用完成集成化,是先进的EDA工具软件。该软件具备诸多特点(例如:开放性,与结构无联系,多平台设计,完全集成化,设计库丰富、工具模块化等),支持原理图、VHDL、VerilogHDL以及AHDL等多种设计输入形式。Quartus II能够在多系统上使用,为用户的设计方式提供了完善的图形界面。具有运行速度快,界面统一,功能集中,学用简单等特点。
图形或HDL编辑Analysis & Synthesis(分析与综合)Filter(适配器)Assembler(编程文件汇编)编辑器Timing Analyzer(时序分析器)设计输入综合或编译适配器件下载仿真
3.2 Verilog HDL
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
第四章 设计方案
4.1数字钟的工作原理
振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻0”规律计数。计数满后各计数器清零,重新计数。计数器的输出分别经译码器送数码管显示。计时出现误差时,可以用校时电路校时、校分。控制信号由三个独立按键输入。输入信号选择FPGA器件上的50MHZ时钟信号。
4.2 按键消抖
因为按键的物理结构并非理想式开关,在按键按下后会在一个很短的时间内出现电平抖动的情况,因此需要对按键进行消抖处理。这里的按键消抖与单片机中的按键消抖问题有所不同,不能采用延时的方法进行按键消抖,这里我选用对时钟脉冲计数的方式来判断按键是否按下。采用50MHZ时钟信号,实测160ms的消抖时长较为合适,即8000000个时钟上升沿。
4.3时钟复位
按下复位按键后,所有位清零。
4.4时钟校时
时钟计时过程中,可对时钟进行校时。本次设计不考虑对秒位进行校时,分钟的个位和小时的个位加到10时会自动进位,因此只对分钟的个位和小时的个位设置可以加1的校时按钮,即可实现校时功能。整体比较容易实现。
4.5数码管显示模块。
选择需要显示的时钟位数作为敏感词,用上述给出的显示代码对时钟的每一位分别进行显示处理。
第五章 方案实现与验证
5.1产生秒脉冲
always@(posedge clk)。。。
如代码展现,当计数器count记到50000000个时钟上升沿的时候,向秒个位进1.count=count+1;
begin
end count=0;count_s0=count_s0+1;
//秒个位计数
if(count==32'd50000000)
//产生一个一秒的脉冲,//敏感词为50MHZ时钟上升沿
5.2秒个位进位
当秒的个位计数到10的时候,向秒的十位进位。
if(count_s0==4'd10)
begin
end count_s0=0;count_s1=count_s1+1;
//产生秒十位进位
5.3按键消抖
if(!inrst_m0)
count0=count0+1;if(count0==32'd8000000 &&!inrst_m0)
begin count0=0;count_m0=count_m0+1;end
对时钟秒冲进行计数,计数达到8000000时,判断此时的电平是否为0,若还是为0,则判断按键按下,执行分钟个位加1操作。
5.4复位按键设置
begin
if(!reset)
begin
count=0;
count_s0=0;count_s1=0;
count_m0=0;count_m1=0;
count_h0=0;count_h1=0;
end else
复位按键按下后所有位置零。
5.5 数码管显示。
always@(count_s0)
begin
case(count_s0)
4'd0: HEX0=7'b1000000;
4'd1: HEX0=7'b1111001;
4'd2: HEX0=7'b0100100;
4'd3: HEX0=7'b0110000;
4'd4: HEX0=7'b0011001;
4'd5: HEX0=7'b0010010;
4'd6: HEX0=7'b0000010;
4'd7: HEX0=7'b1111000;
4'd8: HEX0=7'b0000000;
4'd9: HEX0=7'b0010000;
default: HEX0=7'b1111111;
endcase end
//按键按下为逻辑0
//复位置零
//秒个位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
5.6 RTL结构总图
显示部分如下图:
判断主体如下图:
部分引脚图展现
最终实验现象:
第六章 实验总结
其实本次的多功能数字钟设计其实应该还有很多其他的方法,比如用到外部中断功能进行时钟的校时,采用按键输入加数码管闪烁的方式进行校时位的选择,但限于时间较短,这部分知识空白,所以本次设计实有所缺陷。
经历了本次FPGA的设计,有很多感受,首先就是看了一点数字钟设计方面的资料,遇到很多不理解的地方,于是就需要再和同学进行研究讨论,在讨论的过程中,能听到其他人的思路,感觉特别有意思,同样的功能,实现的方法有许许多多,努力把自己的想法实现,或是选择一种你喜欢的设计借鉴一下,两者都是很好的选择。
通过这次设计实验,着实培养了我们独立思考、解决问题的能力,从最一开始的一筹莫展,没有一点思路,感觉像平底拔楼一样,从两手空空到产生一个控制电路,从无到有,这是创造的力量。同时,和其他同学讨论的过程也很重要,要说的还有就是最后实验成功的喜悦是无可替代的,就好像你亲手种的果树长出了果实,养的鸡下了鸡蛋,是一种创造的喜悦,整个心就像是一个大箱子里面放着一块糖,隐隐约约总能感觉到一丝甜蜜。
数码管显示的数字钟是常见的技术,这次基于FPGA的多功能数字钟设计具有很高的工程价值和现实意义。让我们将知识服务于生活,将知识用于实践,锻炼了我们发现问题解决问题的能力。
这次FPGA的多功能数字钟设计,加深了我们对FPGA设计的理解,培养了我们的逻辑思维和动手操作能力,使我们将知识与技能链接起来,使我们每个人的都在不断进步,提高了专业技能,提高了动手实践的综合能力。
第七章 Verilog HDL源代码附录
module clock(reset,inrst_m0,inrst_h0,clk,HEX0,HEX1,HEX2,HEX3,HEX4,HEX5);input clk,reset,inrst_m0,inrst_h0;output reg [6:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;reg [31:0] count=0,count0=0,count1=0;reg [3:0] count_s0=0,count_s1=0,count_m0=0,count_m1=0, count_h0=0,count_h1=0;
//实际宽度为25 always@(posedge clk)begin
if(!inrst_m0)
count0=count0+1;if(count0==32'd8000000 &&!inrst_m0)//按键消抖
begin count0=0;count_m0=count_m0+1;end if(!inrst_h0)count1=count1+1;if(count1==32'd8000000 &&!inrst_h0)
begin count1=0;count_h0=count_h0+1;end
//按键按下为逻辑0
//复位置零 if(!reset)begin count=0;count_s0=0;count_s1=0;count_m0=0;count_m1=0;count_h0=0;count_h1=0;end count=count+1;begin else
if(count==32'd50000000)
//产生一个一秒的脉冲,end count=0;count_s0=count_s0+1;
//秒个位计数
else if(count_s0==4'd10)
begin
end count_s0=0;count_s1=count_s1+1;
//产生秒十位进位
else if(count_s1==4'd6)
begin
end
//分个位计数 count_s1=0;count_m0=count_m0+1;else if(count_m0==4'd10)
begin
end
//分十位计数 count_m0=0;count_m1=count_m1+1;else if(count_m1==4'd6)
begin
end
//时个位计数 count_m1=0;count_h0=count_h0+1;else if(count_h0==4'd10)
begin
end
//满24判断 count_h0=0;count_h1=count_h1+1;else if(count_h0==4 && count_h1==2)
begin
count_h0=0;
count_h1=0;end
end
always@(count_s0)
begin
case(count_s0)
4'd0: HEX0=7'b1000000;
4'd1: HEX0=7'b1111001;
4'd2: HEX0=7'b0100100;
4'd3: HEX0=7'b0110000;
4'd4: HEX0=7'b0011001;
4'd5: HEX0=7'b0010010;
4'd6: HEX0=7'b0000010;
4'd7: HEX0=7'b1111000;
4'd8: HEX0=7'b0000000;
4'd9: HEX0=7'b0010000;
default: HEX0=7'b1111111;
endcase end
always@(count_s1)
begin
case(count_s1)
4'd0: HEX1=7'b1000000;
4'd1: HEX1=7'b1111001;
4'd2: HEX1=7'b0100100;
4'd3: HEX1=7'b0110000;
4'd4: HEX1=7'b0011001;
4'd5: HEX1=7'b0010010;
default: HEX1=7'b1111111;endcase
//秒个位显示
//0 低电平点亮高电平熄灭//1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//秒十位显示
//0 低电平点亮高电平熄灭//1 //2 //3 //4 //5
//不符合条件的显示零
end
always@(count_m0)
begin
case(count_m0)
4'd0: HEX2=7'b1000000;
4'd1: HEX2=7'b1111001;
4'd2: HEX2=7'b0100100;
4'd3: HEX2=7'b0110000;
4'd4: HEX2=7'b0011001;
4'd5: HEX2=7'b0010010;
4'd6: HEX2=7'b0000010;
4'd7: HEX2=7'b1111000;
4'd8: HEX2=7'b0000000;
4'd9: HEX2=7'b0010000;
default: HEX2=7'b1111111;
endcase end always@(count_m1)
begin
case(count_m1)
4'd0: HEX3=7'b1000000;
4'd1: HEX3=7'b1111001;
4'd2: HEX3=7'b0100100;
4'd3: HEX3=7'b0110000;
4'd4: HEX3=7'b0011001;
4'd5: HEX3=7'b0010010;
default: HEX3=7'b1111111;
endcase end always@(count_h0)
begin
case(count_h0)
4'd0: HEX4=7'b1000000;4'd1: HEX4=7'b1111001;
//分个位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//分十位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5
//不符合条件的显示零
//时个位显示
//0 低电平点亮高电平熄灭 //1
4'd2: HEX4=7'b0100100;
4'd3: HEX4=7'b0110000;
4'd4: HEX4=7'b0011001;
4'd5: HEX4=7'b0010010;
4'd6: HEX4=7'b0000010;
4'd7: HEX4=7'b1111000;
4'd8: HEX4=7'b0000000;
4'd9: HEX4=7'b0010000;
default: HEX4=7'b1111111;endcase End
always@(count_h1)
begin
case(count_h1)
4'd0: HEX5=7'b1000000;
4'd1: HEX5=7'b1111001;
4'd2: HEX5=7'b0100100;
default: HEX5=7'b1111111;
endcase end
endmodule
//2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//时十位显示
//0 低电平点亮高电平熄灭//1 //2
//不符合条件的显示零
第四篇:数字钟课程设计报告
摘要
数字电子钟是一种用数字显示秒﹑分﹑时的记时装置,与传统的机械时钟相比,它一般具有走时准确﹑显示直观﹑无机械传动装置等优点,因而得到了广泛的应用。数字电子钟的设计方法有许多种,例如,可用中小规模集成电路组成电子钟;也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟;还可以利用单片机来实现电子钟等等。本课程设计采用的是中小规模集成电路法,时钟信号发生器采用32768Hz的CMOS石英谐振器制作,产生1Hz时钟脉冲;用74LS290设计两个六十进制的计数器对“分”、“秒”信号计数,二十四进制计数器对“时”信号计数、再通过“时”、“分”校正电路进行时间的校正,实现数字电子钟的功能。
关键词
数字电子钟;中小规模集成芯片;计数器;数字电子技术
设计的目的
(1)加强对电子制作的认识,充分掌握和理解设计个部分的工作原理、设计过程、选择芯片器件、电路的焊接与调试等多项知识。(2)把理论知识与实践相结合,充分发挥个人与团队协作能力,并在实践中锻炼。(3)提高利用已学知识分析和解决问题的能力。(4)提高实践动手能力
设计用到的仪器和零件
计数器(3片CD4518、CD4081)、显示译码器(6片CD4511)、6片共阴极数码管、二极管、电阻、电容、晶振(32.768kHz)、集成计数器(CD4060、CD4013)、开关、接线座、PCB板等元件。
数字钟的结构及基本工作原理
结构
数字电子时钟实际上是一个对标准频率(1Hz)进行计数的计数电路。由于计数的起始时间不可能与某一个标准时间(如东八时区时间)一致,故需要在电路上加上一个对“时”、“分”进行校正的校时电路,同时为了提高计时的准确性,信号发生器产生的标准的1Hz时间信号必须做到准确稳定,通常使用石英晶体振荡器电路构成数字电子时钟中的信号发生器电路的主元件。
(1)晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。
(2)分频器电路将32768Hz的高频方波信号经3276次分频后得到1Hz的方波信号供秒计数器进行计数。分频器实际上也就是计数器。
(3)时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器。
(4)译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。
(5)数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管。
工作原理
(1)秒脉冲产生电路— CD4060
14位二进制串行计数器 CD4060。CD4060 是由一振荡器和 14 级二进制串行计数位组成。振荡器的结构可以是 RC 或晶振电路。CR 为高电平时,计数器清零且振荡器停止工作。所有的计数器均为主-从触发器,在 CP1(和 CP0)的下降沿,计数器以二进制进行计数。在时钟脉冲线上使用斯密特触发器对时钟的上升和下降时间无限制。利用CD4060组成32.768 kHz振荡器,再经过内部分频器14分频从其第3脚输出2Hz(32.768 kHz /214 = 2 Hz)的脉冲信号。焊接完毕后,通电测试 LED指示灯闪烁,1秒钟闪烁 2次。说明该电路正常工作
(2)分脉冲产生电路— CD4518 CD4518,是一种同步加计数器,在一个封装中含有两个可互换二 / 十进制计数器,其功能引脚分别为1~7和9~15。该计数器是单路系列脉冲输入(1 脚或 2 脚;9 脚或 10脚),4路BCD码信号输出(3脚~6脚;{11}脚~{14}脚)。此外还必须掌握其控制功能,否则无法工作CD4518有两个时钟输入端CP和EN,若用时钟上升沿触发,信号由CP输入,此时EN端应接高电平“1”, 若用时钟下降沿触发,信号由EN端输入,此时CP端应接低电平“0”,不仅如此,清零(又称复位)端CR也应保持低电平“0”,只有满足了这些条件时,电路才会处于计数状态,若不满足则不工作。值得注意,因输出是二/十进制的BCD码,所以输入端的计数脉冲到第十个时,电路自动复位0000状态。另外,CD4518无进位功能的引脚,但电路在第十个脉冲作用下,会自动复位,同时第6脚或第14 脚将输出下降沿的脉冲,利用该脉冲和EN端功能,就可作为计数的电路进位脉冲和进位功能端供多位数显用。(3)小时脉冲产生电路— CD4518 与分脉冲产生电路的结构工作原理相同,只是为24进制。
(4)与门电路— CD4081 CD4081为14脚封装,四2输入与门。在数字钟电路中的作用:将CD4518置为60进制、24进制计数器。
(5)2分频电路— CD4013 CD4013 是双 D 触发器芯片,为14脚封装,在数字电路中常用来进行锁存数据,组成分频电路等。CD4013 在数字钟电路中的作用:将 CD4060 产生的2Hz 脉冲2分频(2进制计数器),输出 1Hz 的秒脉冲。(6)译码显示电路— CD4511 CD4511 是一片 CMOS BCD —锁存 / 7 段译码 / 驱动器,用于驱动共阴极LED数码管显示器的BCD码—七段数码管译码器。具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路,能提供较大的拉电流。共阴 LED 数码管是指 7 段 LED 的阴极是连在一起的,在应用中应接地。限流电阻要根据电源电压来选取,电源电压5V时,可使用300Ω左右的限流电阻。(7)秒、分、时校准电路—开关S3、S2、S1 分、时校准电路:利用开关手动输入脉冲,S2、S1每按下一次,相应的时、分的数字加一。秒校准电路:正常计时工作时,S3闭合;进行秒校准时,S3断开,暂停秒计时,等标准时间一到,立即闭合S3,恢复正常走时。
课程设计电路的组装与调试
组装
(1)核对元器件清单:是否有缺件;
(2)检查印制电路板:是否有断线、短路等;(3)焊接电阻:摆放整齐一致,黄色环在下边;(4)焊接二极管:1N4148,注意极性;(5)焊接跨线:剪下二极管引脚,焊J1~J6;(6)焊接集成电路座:注意缺口位置与图一致;(7)焊接无极性电容、晶振:注意C的字在正面;(8)焊接数码管:注意小数点在右下方;(9)焊接发光二极管:LED,注意极性;(10)焊接开关、电解电容、接线座。(1)判断二极管1N4148,LED的极性;
(2)判断电阻阻值:读色环、用万用表测量;(3)安装集成芯片12片:芯片型号不要装错,缺口位置与图/座一致,缺口左下方为1脚;(4)安装数码管:注意小数点在右下方;
(5)安装电容:正负极性,无极性C的字放在正面(6)最后检查焊接质量:焊点有无虚焊、瑕疵。
调试
(1)安装完成后通电,观察各个模块的工作情况;(2)若数码管不亮,检查地线通否,3脚接地否;(3)若整个电路不工作,分模块检查,各个部分 的接线、安装、功能是否正常;(一般方法)(4)芯片工作是否正常:首先检查电源,„„;(5)秒、分、时校准部分:测试是否功能正常。
总结与心得
通过这次课程设计,加强了我动手、思考和解决问题的能力。在设计中用的芯片可能与平时常见的不一样,但原理一样,同时我还理解到,同样功能可以由不同的芯片实现,需遵行简单,经济的原则,从而最大程度符合目标设计。课程设计是一次难得的锻炼机会,让我们能够充分利用所学过的理论知识还有自己的想象的能力,另外还让我们学习查找资料的方法,以及自己处理分析电路,设计电路的能力。这些对我来说都是一个很好的提高。我趁着做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。另外还学习到了一些仿真软件,比如Proteus等学习软件,给设计提供了很大的便利。
同时,这次课设还让我明白,困难是成功的台阶,只有一级级走上去才能有所收获。工科院校的学生应当这样多参与实践,多去运用自己所学的知识,为将来工作打下基础。
第五篇:数字钟课程设计报告
一、综述
数字电子钟是一种用数字电路实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的应用。数字钟从原理上来讲是一种典型的数字电路,其中即包含了组合逻辑电路,也有时序电路。
因此,我们此次设计与制作数字电子钟就是为了了解其工作原理,从而学会制作数字钟。通过设计和制作数字电子钟,可以加深我们对中小规模集成电路相关知识的理解,并且通过实际运用,提高我们的动手能力、培养我们的探索精神。
二、设计题目与设计要求 1.设计题目
本次的题目为设计一个具有计时、显示“时、分、秒”和校时功能的数字电子钟,具体功能如下:
① 显示时、分、秒;
② 具有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间; ③ 计时过程具有报时功能,当时间到达整点前10秒进行蜂鸣报时; ④ 为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。2.设计要求
本次设计的具体要求如下:
① 画出电路原理图(或仿真电路图); ② 元器件及参数选择; ③ 电路仿真与调试;
三、方案选择
数字电子钟作为实际生活中运用广泛的一个物品。在电路实现方面,完全可以用单片机实现功能。这也是我们小组一开始的思路。但是,由于我们小组的这道题本身就比较简单,如果还从用单片机来做,基本上就只是编个程序的事情了。如此,这个学期在数电课上学到的一些东西并不能得到很好的运用,老师也是基于此考虑,建议我们还是不要使用单片机。
因此,我们采用了老师提供的思路和方案,具体的阐述请见以下几个部分。
四、大体设计思路
1.总体概要设计
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。晶体振荡器电路给数字电子钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。然后分频器将32768Hz的高频方波信号经32768次分频后得到1Hz的方波信号供秒计数器进行计数。分频器实际上也就是计数器。通常使用石英晶体振荡器电路构成数字钟。图1所示为数字钟的一般构成框图。
“时”计时信号 “分”计时信号
校时信号
“秒”计时信号
图 1
数字电子钟原理框图
2.晶体振荡器电路
晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的脉冲,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。
3.分频器电路
分频器电路将32768Hz的高频方波信号经74HC4060和T’触发器(将D端接至输出的非端,使其变成一个T’触发器实现二分频)的分频后得到1Hz的方波信号,可以供秒计数器进行计数。分频器实际上也就是计数器。
4.时间计数器电路
时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,时个位和时十位计数器设计为24进制计数器。
5.译码驱动电路
译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。
6.示数电路
用译码驱动电路提供的电流带动数码管实现数字电子钟最后的示数部分。数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计采用的为LED数码管。
五、元件清单
30pF电容2个 32768Hz晶振1个 15k欧姆电阻4个 74HC4060一片
74LS74双D触发器一个 单刀双掷开关2个 1M电阻1个
74Ls00四二输入7个 74Ls192六片 74Ls48六片 共阴数码管6个 蜂鸣器一个
六、仿真电路图
根据上述思路,我们小组的各个成员分别负责了部分电路,在确认部分功能可以实现 的前提下,将它们有机地组合起来得到了总电路。并在proteus软件中进行了仿真,确定可以实现功能后,再申请了实做。
仿真电路总图见下:
七、各单元模块的具体设计和分析
1.晶体振荡器电路
晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定。
图2所示电路通过CMOS非门构成的输出为方波的数字式晶体振荡电路,这个电路中,CMOS非门U1与晶体、电容和电阻构成晶体振荡器电路,U2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波。输出反馈电阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器。电容C1、C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能。由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。
晶体XTAL的频率选为32768HZ。该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。
从有关手册中,可查得C1、C2 为30pF时,频率准确度和稳定度较高。
由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为20MΩ或10MΩ。较高的反馈电阻有利于提高振荡频率的稳定性。但是,由于实验室只提供了1MΩ的电阻,所以在实际制作的过程中,我们采用的是实验室提供的电阻,最终造成了脉冲输出端的频率并不是严格符合1Hz。
图2 晶体振荡器电路图
2.分频器电路
通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡
器的输出信号进行分频。
通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现。例如,将32767Hz的振荡信号分频为1Hz的分频倍数为32767(2),即实现该分频功能的计数器相当于15级2进制计数器。
本实验中采用HC4060来构成分频电路。HC4060在数字集成电路中可实现的分频次数最高,而且HC4060还包含振荡电路所需的非门,使用更为方便。
HC4060计数为最高为14级2进制计数器,可以将32767Hz的信号分频为2Hz,而经过转换为T’的D触发器则可以通过翻转功能将它分为1HZ的信号。如图3所示,可以直接实现振荡和分频的功能。
5图3 分频电路图
3.时间计数单元
时间计数单元有时计数、分计数和秒计数等几个部分。
时计数单元一般为24进制计数器计数器,其输出为两位8421BCD码形式;分计数和秒计数单元为60进制计数器,其输出也为8421BCD码。
针对每个计数单元,本实验分别采取了用两块74LS192芯片进行级联来产生相应的进制。
74LS192是同步十进制可逆计数器,它具有双时钟输入,并具有清除和置数等功能,其引脚排列及逻辑符号如下所示:
(a)引脚排列(b)逻辑符号
其中:为置数端,为加计数端,为减计数端,为非同步进位输出端,为清除端,Q0、Q1、Q2、为非同步借位输出端,P0、P1、P2、P3为计数器输入端,Q3为数据输出端。
其功能表如下:
表1 74LS192的功能表
对于秒计数单元,由于192内部本身就是10进制,所以只需要将作为十位输出的那一片192的输出端中的Q2和Q1(相与代表作为得到数字6)作为反馈端,相与再连接到两片
192的清零端上即可。如此就可以实现60进制的计数。满足秒计数的要求。实现此功能的部分电路如图四所示:
图4 60进制计数器电路
对于分计数单元,与秒计数单元完全一致,在此不再累述。
对于时计数单元,同理,将作为十位输出的那一片的192的输出端中的Q1(代表数字2)和作为个位输出的那一片192的输出端中的Q2(代表数字4)作为反馈端,相与再连接到两片192的清零端上即可。如此就可以实现24进制的计数。满足时计数的要求。实现此功能的部分电路如图五所示:
图5 24进制计数器电路
4.译码驱动及显示单元
计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,选用74LS48作为显示译码电路,选用共阴LED数码管作为显示单元电路,实现此部分的功能的电路如图6所示。
图6 译码驱动和显示电路
5.校时电路
当重新接通电源或走时出现误差时都需要对时间进行校正。通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可。
根据要求,数字钟应具有分校正和时校正功能,因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中。
图7 校正电路
6.整点报时电路
一般时钟都应具备整点报时电路功能,即在时间出现整点前数秒内,数字钟会自动报时,以示提醒。其作用方式是发出连续的或有节奏的音频声波,较复杂的也可以是实时语音提示。本次采用的是用蜂鸣器实现简单的鸣响。
根据要求,电路应在整点前10秒钟内开始整点报时,即当时间在59分51秒到59分59秒期间时,报时电路报时控制信号。故将秒计数电路部分的作为十位的那一片的192的输出端中的Q2、Q0相与(即表示数字5),作为蜂鸣器的控制端1。再将分计数电路部分的作为十位的那一片192的输出端中的Q2、Q0相与(即表示数字5),再和作为个位的那一片192的输出端中的Q3、Q0相与(即表示数字9)相与,如此作为蜂鸣器的控制端2。最后,再将两个控制端相与,连接至蜂鸣器的一端,再将另一段接地即可。
八、心得体会