VHDL实验报告论文.docx
《VHDL实验报告论文.docx》由会员分享,可在线阅读,更多相关《VHDL实验报告论文.docx(20页珍藏版)》请在冰豆网上搜索。
VHDL实验报告论文
硬件描述语言期末实验报告
题目:
硬件描述语言实现秒表功能
姓名xxxx
学号xxxxxxxxxx
年级专业xxxxxxxxxxxxx
指导教师xxxx
2012年6月20日
河北大学本科生VHDL硬件实验论文(设计)
硬件描述语言实现秒表功能
摘要
应用VHDL语言设计数字系统,很多设计工作可以在计算机上完成,从而缩短了数字系统的开发时间。
我们尝试利用VHDL为开发工具设计数字秒表。
秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、数据选择器、和显示译码器等组成。
在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外整个秒表还需有一个启动信号,暂停信号和一个清零信号,以便秒表能随意停止及启动。
关键词:
VHDL语言数字秒表时序仿真图
目录
1、实验目的…………………………………………………………1
二、硬件要求…………………………………………………………1
三、引脚说明…………………………………………………………1
四、模块介绍…………………………………………………………2
4.1.计数器(六、十进制)…………………………………………2
4.2.蜂鸣器……………………………………………………………2
4.3.译码器……………………………………………………………3
4.4.控制器……………………………………………………………4
五、整体连接图………………………………………………………5
六、实验结果…………………………………………………………6
七、实验总结…………………………………………………………6
八、谢辞………………………………………………………………7
九、附录………………………………………………………………7
一实验目的
学习使用VHDL语言,以及EDA芯片的下载仿真。
二硬件要求
(1)主芯片EPF10K10LC84-4。
(2)蜂鸣器。
(3)8位八段扫描共阴极数码显示管。
(4)二个按键(暂停,开关)。
三引脚说明
3.1引脚设置
端口类型
端口名
数据类型
说明
in
clk,pause_clk,
std_logic
时钟信号
stop
开始,清零按钮
out
a,b,c,d,e,f,g,dp
std_logic
各个显示灯的连接
sr_out
蜂鸣器
d1,d2,d3,d4,d5,d6
控制数码管的信号
3.2信号说明
signalq:
std_logic_vector(3downto0);
--q是用于分频的信号。
signalstate:
std_logic_vector(3downto0);
--state为状态信号,state为1时为暂停记录状态,为0时为正常显示计数状态。
signalled:
std_logic_vector(3downto0);
--led为数码管扫描信号,通过对d1~d6的选择使数码管发光。
signaldata,data1,data2,data3,data4,data5,data6,data7,data8:
std_logic_vector(3downto0);
--data1~data8这些信号为计数器所记录的数值,data为传入译码器的变化值。
signalpause1,pause2,pause3,pause4,pause5,pause6:
std_logic_vector(3downto0);
--这些信号为实现暂停功能寄存信号。
signaloutput:
std_logic_vector(6downto0);
--output为译码输出的信号总线。
signalsound:
std_logic_vector(3downto0)
--sound为蜂鸣器的输入分频器。
signalsound_sout:
std_logic_vector(15downto0);
--data1~data4的总线。
signalsound_star:
std_logic;
--为蜂鸣器输入频率的开关。
四模块介绍
时钟的设计共化分为5个模块:
六进制计数电路,报时电路,扫描电路,译码电路。
下面具体分析各个模块的原理、内容和功能。
4.1计数器
if(count=X)then--‘X’为进制数,为5即为6进制,为9就是10进制。
count<="0000";
next_count_clk<='1';--为下一个计数器的时钟信号输入。
else
count<=count+'1';--实现计数功能。
next_count_clk<='0';
endif;
4.2蜂鸣器
process(data6,data5,data4,data3,data2,data1)
begin
sound_sout<=data4&data3&data2&data1;--实现整点报时的标识。
if(sound_sout=0)then
if(data5>=1)then
sound_star<='1';--开始报时的信号
elsif(data6>=1)then
sound_star<='1';
endif;
endif;
if(sound_star='1')then
if(sound=1)then
sr_out<='1';
else
sr_out<='0';
endif;
endif;
if(data3=5)then
sound_star<='0';--结束报时的信号
endif;
endprocess;
4.3译码器
process(data)
begin
case(data)is--低电平有效
when"0000"=>output<="0000001";--显示0
when"0001"=>output<="1001111";--显示1
when"0010"=>output<="0010010";--显示2
when"0011"=>output<="0000110";--显示3
when"0100"=>output<="1001100";--显示4
when"0101"=>output<="0100100";--显示5
when"0110"=>output<="0100000";--显示6
when"0111"=>output<="0001111";--显示7
when"1000"=>output<="0000000";--显示8
when"1001"=>output<="0000100";--显示9
whenothers=>output<="0000110";
endcase;
endprocess;
a<=output(6);
b<=output(5);
c<=output(4);
d<=output(3);
e<=output
(2);
f<=output
(1);
g<=output(0);
4.4控制器
--输出控制器
case(led)is
when"0000"=>data<=data1;--将百分秒位赋值于data。
d1<='0';d2<='1';d3<='1';d4<='1';d5<='1';d6<='1';dp<='1';--(从右到左)选择第一个数码管。
pause1<=data1;--寄存现在的数值。
when"0001"=>data<=data2;--十分秒位
d1<='1';d2<='0';d3<='1';d4<='1';d5<='1';d6<='1';dp<='1';--第二个数码管
pause2<=data2;--寄存
when"0010"=>data<=data3;--秒低位
d1<='1';d2<='1';d3<='0';d4<='1';d5<='1';d6<='1';dp<='0';--第三个数码管
pause3<=data3;--寄存
when"0011"=>data<=data4;--秒高位
d1<='1';d2<='1';d3<='1';d4<='0';d5<='1';d6<='1';dp<='1';--第四个数码管
pause4<=data4;--寄存
when"0100"=>data<=data5;--分低位
d1<='1';d2<='1';d3<='1';d4<='1';d5<='0';d6<='1';dp<='0';--第五个数码管
pause5<=data5;--寄存
when"0101"=>data<=data6;--分高位
d1<='1';d2<='1';d3<='1';d4<='1';d5<='1';d6<='0';dp<='1';--第六个数码管
pause6<=data6;--寄存
whenothers=>data<="1000";
endcase;
process(pause_clk,stop)--状态控制器
begin
if(pause_clk'eventandpause_clk='1')then
if(state="0001")then
state<="0000";--计时显示状态
else
state<=state+1;--暂停状态
endif;
endif;
endprocess;
五整体连接图
六实验结果
器件上六个数码管上各自显示这一个数值,当左侧第一个开关为1时便清零停止,为0时便开始计数,从00.00.00开始,记录到59.59.99时会变为01.00.00,此时记录为时位、分位和秒位,直到23.59.59时才会自动清零,又从头开始计数。
另外该器件上还有另一个按钮,为暂停记录按钮,该按钮的作用是对正在计数显示的秒表进行数值显示上的暂停功能,再暂停之后再按这个按钮时,则是继续进行显示,其中计数功能并没有终断,只是在输出显示上暂停而已。
另外,当分位为整时本秒表会进行报时蜂鸣。
充分满足了老师的要求。
七实验总结
本次VHDL课程设计历时一个学期,从开始接触到现在结束已经经历了一个学期的日子,因为很多东西都不了解,可以说是苦多于甜,但是后来我学到了很多东西,而且通过实验我还学到了很多在书本上所没有学到过的知识。
这次设计,是对这一学期来所学知识的检验,也是进一步加深对VHDL的了解,我对它有浓厚的兴趣。
但是在编调试程序时,也遇到了不少问题,特别是各元件之间的连接,以及各种语法,总是有错误,在细心的检查下,终于找出了错误,排除困难后,程序编译就通过了。
在硬件实验时,也遇到了一点困难:
想要的结果不能在数码管上得到正确的显示;在设定输入的时钟信号后,数字秒表开始计数,但是始终是乱码等。
后来,经过多次调试之后,才发现是因为输入的时钟信号出了问题。
经过屡次调试,终于找到了比较合适的输入脉冲,时钟周期设置在100hz秒左右比较合适。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
总的来说,这次设计的数字秒表还是比较成功的,虽然在实际的过程中曾经遇到了大量的问题,但是经过自己的努力,都给妥善解决了,这样的积累对于现在大学生来说是十分宝贵的。
希望以后能有更多的动手实践机会,在硬件中发现自己的不足,弥补自己的不足,最终成为一个合格的大学生。
最后,特别感谢老师对我的帮助。
谢辞
本论文的完成,得益于伊开和张芳老师传授的知识,使本人有了完成论文所要求的知识积累,更得益于两位老师从选题的确定、论文资料的收集、论文框架的确定、开题报告准备及论文初稿与定稿中对字句的斟酌倾注的大量心血,在此对两位老师表示感谢!
感谢和我一起生活四年的室友,是你们让我们的寝室充满快乐与温馨,“君子和而不同”,我们正是如此!
愿我们以后的人生都可以充实、多彩与快乐!
感谢我的同学们,谢谢你们给予我的帮助。
回首本人的求学生涯,父母的支持是本人最大的动力。
父母不仅在经济上承受了巨大的负担,在心里上更有思子之情的煎熬与望子成龙的期待。
忆往昔,每次回到家时父母的欣喜之情,每次离家时父母的依依不舍之眼神,电话和信件中的殷殷期待和思念之语,皆使本人刻苦铭心,目前除了学习成绩尚可外无以为报,希望以后的学习、工作和生活能使父母宽慰。
通过这一阶段的努力,我的论文《硬件描述语言实现秒表功能》终于完成了。
在这个阶段,我在学习上和思想上都受益非浅,这除了自身的努力外,与各位老师、同学和朋友的关心、支持和鼓励是分不开的。
时间的仓促及自身专业水平的不足,整篇论文肯定存在尚未发现的缺点和错误。
恳请阅读此篇论文的老师、同学,多予指正,不胜感激!
在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!
最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!
愿把我的幸福和快乐都送给关心和支持过我的人,也愿他们一切如意。
附录
--QuartusIIVHDLTemplate
--BasicShiftRegister
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityminute_clockis
port
(
clk,pause_clk,stop:
instd_logic;
a,b,c,d,e,f,g,dp,sr_out:
outstd_logic;
d1,d2,d3,d4,d5,d6:
outstd_logic
);
endentity;
architecturertlofminute_clockis
signalq:
std_logic_vector(3downto0);
signalstate,led,data:
std_logic_vector(3downto0);
signaldata1,data2,data3,data4,data5,data6,data7,data8:
std_logic_vector(3downto0);
signalpause1,pause2,pause3,pause4,pause5,pause6,sound:
std_logic_vector(3downto0);
signaloutput:
std_logic_vector(6downto0);
signalsound_sout:
std_logic_vector(15downto0);
signalsound_star:
std_logic;
begin
process(pause_clk,stop)
begin
if(sound=1)then
sound<="0000";
else
sound<=sound+'1';
endif;
if(pause_clk'eventandpause_clk='1')then
if(state="0001")then
state<="0000";
else
state<=state+1;
endif;
endif;
endprocess;
process(clk,stop)
begin
if(stop='1')then
data1<="0000";
data2<="0000";
data3<="0000";
data4<="0000";
data5<="0000";
data6<="0000";
data7<="0000";
data8<="0000";
else
if(clk'eventandclk='1')then
if(q=6)then
q<="0000";
if(data1="1001")then
data1<="0000";
if(data2="1001")then
data2<="0000";
if(data3="1001")then
data3<="0000";
if(data4="0101")then
data4<="0000";
if(data5="1001")then
data5<="0000";
if(data6="0101")then
data6<="0000";
if(data7="1001")then
data7<="0000";
if(data8="0010")then
data8<="0000";
else
data8<=data8+'1';
endif;
elsif(data8="0010"anddata7="0011")then
data7<="0000";
data8<="0000";
else
data7<=data7+'1';
endif;
else
data6<=data6+'1';
endif;
else
data5<=data5+'1';
endif;
else
data4<=data4+'1';
endif;
else
data3<=data3+'1';
endif;
else
data2<=data2+'1';
endif;
else
data1<=data1+'1';
endif;
else
q<=q+'1';
endif;
endif;
endif;
endprocess;
process(data6,data5,data4,data3,data2,data1)
begin
sound_sout<=data4&data3&data2&data1;
if(sound_sout=0)then
if(data5>=1)then
sound_star<='1';
elsif(data6>=1)then
sound_star<='1';
endif;
endif;
if(sound_star='1')then
if(sound=1)then
sr_out<='1';
else
sr_out<='0';
endif;
endif;
if(data3=5)then
sound_star<='0';
endif;
endprocess;
process(clk)
begin
if(clk'eventandclk='1')then
if(led="0101")then
led<="0000";
else
led<=led+1;
endif;
endif;
endprocess;
process(led,data7)
begin
if(state="0001")then
case(led)is
when"0000"=>data<=pause1;d1<='0';d2<='1';d3<='1';d4<='1';d5<='1';d6<='1';dp<='1';
when"0001"=>data<=pause2;d1<='1';d2<='0';d3<='1';d4<='1';d5<='1';d6<='1';dp<='1';
when"0010"=>data<=pause3;d1<='1';d2<='1';d3<='0';d4<='1';d5<='1';d6<='1';dp<='0';
when"0011"=>data<=pause4;d1<='1';d2<='1';d3<='1';d4<='0';d5<='1';d6<='1';dp<='1';
when"0100"=>data<=pause5;d1<='1';d2<='1';d3<='1';d4<='1';d5<='0';d6<='1';dp<='0';
when"0101"=>data<=pause6;d1<='1';d2<='1';d3<='1';d4<='1';d5<='1';d6<='0';dp<='1';
whenothers=>data<="1000";
endcase;
else
if(data7="0000"anddata8<="0000")then
case(led)is
when"0000"=>data<=data1;d1<='0';d2<='1';d3<='1';d4<='1';d5<='1';d6<='1';dp<='1';pause1<=data1;
when"0001"=>data<=data2;d1<='1';d2<='0';d3<='1';d4<='1';d5<='1';d6<='1';dp<='1';pause2<=data2;
when"0010"=>data<=data3;d1<='1';d2<='1';d3<='0';d4<='1';d5<='1';