FOUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLKIN='1')THEN
CLK_COUNT<=CLK_COUNT+1;
ENDIF;
CLKIN<=CLK_COUNT(12);
ENDPROCESS;
PROCESS(CLKIN)--频率及占空比的改变1
BEGIN
IF(CLK'EVENTANDCLKIN='0')THEN
IF(RST='0')THEN
M_BUFFER<="01000000000";
N_BUFFER<="10000000000";
ELSIF(NU='0')THEN
N_BUFFER<=N_BUFFER+1;
ELSIF(ND='0')THEN
N_BUFFER<=N_BUFFER-1;
ELSIF(MU='0')THEN
M_BUFFER<=M_BUFFER+1;
ELSIF(MD='0')THEN
M_BUFFER<=M_BUFFER-1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDBEHAVE;
2.管脚分配:
3.时序仿真图:
4.硬件电路图:
5.现象:
五、心得体会
通过这次EDA课程设计,我对课堂上所学到的理论知识的理解加深了许多,自己动脑、动手设计的能力也得到了较大提高。
在这次课程设计的过程中,我对VHDL语言有了更深的认识。
通过查阅相关资料和动手设计我发现我以前对VHDL语言的认识太过肤浅,认为VHDL语言只能用于设计小型的电路系统。
但有了更深刻的认识之后我发现学好VHDL语言可以设计出大规模的、功能复杂的电路系统。
以前之所以会有错误的认识是因为自己对VHDL语言的了解和掌握还不够。
现在仔细想想,这次课程设计使得我对VHDL语言的理解与应用能力得到了较大的提升,也让我认识到只要升入学习,提升的空间永远的存在的。
另一方面我也发现了动手实践的重要性。
动手实践是理论知识得以灵活运用的必要前提,也是今后今后走上工作岗位之后能够很好的完成设计工作的技术保证。
只有遇到实际问题并根据自己对课堂上获得的专业知识的理解来解决它才能真正的提高自己的能力。
这也提醒我在平时的学习生活中不能一味埋头于课本知识,当今社会竞争越来越激烈,社会对人才的要求越来越全面,只有理论知识是远远不够的,必须靠动手能力做支撑。
因此在学习之余我们应该积极参加各种与专业知识有关的实践活动和知识竞赛,巩固所学的理论知识,多注重培养实际动手能力和专业技术能力,这样才能在以后的工作岗位上有所作为。
数字秒表设计
一、设计目的
本设计的任务就是设计一个数字钟,要求显示格式为小时-分钟-秒钟。
系统时钟选择时钟模块的50MHz,要得到1Hz时钟信号,必须对系统时钟进行50000000次分频。
用S1按键作为系统时钟复位,复位后全部显示00-00-00。
2、设计原理
数码管的八个段a,b,c,d,e,f,g,h(h是小数点)都分别连接到SEG0~SEG7,8个数码管分别由八个选通信号DIG0~DIG7来选择,被选通的数码管显示数据,其余关闭。
如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG0~DIG7分别被单独选通,并在此同时,在段信号输入口SEG0~SEG7加上该对应数码管上显示的数据,于是随着选通信号的扫描就能实现动态扫描显示的目的。
虽然每次只有1个数码管显示,但只要扫描显示速率足够快,利用人眼的视觉余辉效应,我们仍会感觉所有的数码管都在同时显示。
三、设计主要内容
本设计要求掌握使用QuartusII设计数字系统的设计思路和设计方法。
学习VHDL基本逻辑电路的综合设计应用。
掌握VHDL语言的语法规范,掌握时序电路描述方法。
掌握多个数码管动态扫描显示的原理及设计方法。
设计一个由共阴八位数码管作为显示、按键作为控制系统的数字钟电路,要求利用实验室设备完成系统设计并运行调试。
4、设计流程
1.程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitystopwatchis
port(Clk:
instd_logic;--时钟输入
reset:
instd_logic;--复位输入
start,over:
instd_logic;--秒表控制输入
ledag:
outstd_logic_vector(6downto0);--七段码管显示输出
SEL:
bufferstd_logic_vector(2downto0)--七段码管扫描驱动
);
endstopwatch;
architecturebehaveofstopwatchis
signalDisp_Temp:
integerrange0to15;
signalDisp_Decode:
std_logic_vector(6downto0);
signalmSEC1,mSEC10:
integerrange0to9;
signalSEC1,SEC10:
integerrange0to9;
signalMIN1,MIN10:
integerrange0to9;
signalHOUR1,HOUR10:
integerrange0to9;
signalClk1kHz:
std_logic;
signalClk100Hz:
std_logic;
signalStart_Flag:
std_logic;
signalMusic_Count:
std_logic_vector(2downto0);
begin
PROCESS(clk)--generate100hzclocksignal
variablecnt:
INTEGERRANGE0TO499999;--产生100Hz时钟的分频计数器
BEGIN
IFclk='1'ANDclk'eventTHEN
IFcnt=499999THENcnt:
=0;
ELSE
IFcnt<250000THENclk100hz<='1';
ELSEclk100hz<='0';
ENDIF;
cnt:
=cnt+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clk)--generate1khzclocksignal
variablecnt1:
INTEGERRANGE0TO49999;--产生1kHz时钟的分频计数器
BEGIN
IFclk='1'ANDclk'eventTHEN
IFcnt1=49999THENcnt1:
=0;
ELSE
IFcnt1<25000THENclk1khz<='1';
ELSEclk1khz<='0';
ENDIF;
cnt1:
=cnt1+1;
ENDIF;
ENDIF;
ENDPROCESS;
process(Clk100Hz)
begin
if(reset='0')then--系统复位
mSEC1<=0;
mSEC10<=0;
SEC1<=0;
SEC10<=0;
MIN1<=0;
MIN10<=0;
HOUR1<=0;
HOUR10<=0;
Start_Flag<='0';
elsif(start='0'andStart_Flag='0')then
Start_Flag<='1';
elsif(over='0'andStart_Flag='1')then
Start_Flag<='0';
elsif(Clk100Hz'eventandClk100Hz='1')then--正常运行
if(Start_Flag='1')then
if(mSEC1=9)then
mSEC1<=0;
if(mSEC10=9)then
mSEC10<=0;
if(SEC1=9)then
SEC1<=0;
if(SEC10=5)then
SEC10<=0;
if(MIN1=9)then
MIN1<=0;
if(MIN10=5)then
MIN10<=0;
if(HOUR1=9)then
HOUR1<=0;
if(HOUR10=9)then
HOUR10<=0;
else
HOUR10<=HOUR10+1;
endif;
else
HOUR1<=HOUR1+1;
endif;
else
MIN10<=MIN10+1;
endif;
else
MIN1<=MIN1+1;
endif;
else
SEC10<=SEC10+1;
endif;
else
SEC1<=SEC1+1;
endif;
else
mSEC10<=mSEC10+1;
endif;
else
mSEC1<=mSEC1+1;
endif;
endif;
endif;
endprocess;
process(SEL)
begin
if(HOUR1=0)then
case(SEL+1)is
when"111"=>Disp_Temp<=mSEC1;
when"110"=>Disp_Temp<=mSEC10;
when"101"=>Disp_Temp<=10;
when"100"=>Disp_Temp<=SEC1;
when"011"=>Disp_Temp<=SEC10;
when"010"=>Disp_Temp<=10;
when"001"=>Disp_Temp<=MIN1;
when"000"=>Disp_Temp<=MIN10;
endcase;
else
case(SEL+1)is
when"111"=>Disp_Temp<=SEC1;
when"110"=>Disp_Temp<=SEC10;
when"101"=>Disp_Temp<=10;
when"100"=>Disp_Temp<=MIN1;
when"011"=>Disp_Temp<=MIN10;
when"010"=>Disp_Temp<=10;
when"001"=>Disp_Temp<=HOUR1;
when"000"=>Disp_Temp<=HOUR10;
endcase;
endif;
endprocess;
process(Clk1khz)
begin
if(Clk1khz'eventandClk1khz='1')then--扫描累加
SEL<=SEL+1;
ledag<=Disp_Decode;
endif;
endprocess;
process(Disp_Temp)--显示转换
begin
caseDisp_Tempis
when0=>Disp_Decode<="0111111";--0
when1=>Disp_Decode<="0000110";--1
when2=>Disp_Decode<="1011011";--2
when3=>Disp_Decode<="1001111";--3
when4=>Disp_Decode<="1100110";--4
when5=>Disp_Decode<="1101101";--5
when6=>Disp_Decode<="1111101";--6
when7=>Disp_Decode<="0000111";--7
when8=>Disp_Decode<="1111111";--8
when9=>Disp_Decode<="1101111";--9
when10=>Disp_Decode<="1000000";---
whenothers=>Disp_Decode<="0000000";--全灭
endcase;
endprocess;
endbehave;
2.管脚分配:
2.时序仿真图:
4.硬件电路图:
5.现象:
5、设计总结
通过本次的课程设计,我初步了解了VHDL语言的编程思想,以及利用EDA软件进行电子电路设计的方法,通过对一个课题的分析,将实验的内容进行分块解读,具体到每一个模块的具体作用,然后将各个功能的模块通过连线进行总体的电路实现,也可以通过VHDL语言对各个模块进行组合,然后需要在程序编译成功的基础上,安装硬件,将程序下载到具体的芯片上进行硬件的实现。
通过整个实验的完成,我从老师和同学那里学到了更多关于VHDL编程,仿真以及硬件实现的知识,自己以前模糊不清的地方也通过此次的课程设计了解清楚了,并且通过这次课程设计,我也锻炼了独立思考,独立操作的能力,虽然对于VHDL语言的应用我还很生疏,但是此次的课程设计却让我学到了很多,也对这门语言有了更深的理解,对EDA软件的使用有了更多的体会。