CPLD课程学习报告Word下载.docx
《CPLD课程学习报告Word下载.docx》由会员分享,可在线阅读,更多相关《CPLD课程学习报告Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
一、要明确自己的位子即自己再也不是一名小学生,无论做什么事情都应该动脑子而不能只是照搬老师的东西不思考其中的原由。
二、要学会为自己负责任,做事情不可以的总是那么呆板。
在后面听不见自己就要学会解决这点小问题,有什么好怕的。
接触VHD编程语言
通过第一次课的学习——用相关的原理图设计一个138译码器,尽管原理图老师已给出但我们同时也感到受到用其中的复杂性。
而这次课,老师主要给我们介绍了用VHD编程语言如何实现这些功能。
由于有了C语言的基础,学起来还算顺利,但同时也存在一问题。
如有时还是会出现一些基础语法的错误和逻辑错误。
记得在后面写跑马灯的程序时就没把“ELSE”和“ELSIF”的区别弄清楚,也许错了一次才会理解得越深刻吧!
掌握这种语言后,我们类似地设计了各种计数器如CNT100,CNT60,CNT24,数据选择器等;
这是后面数字钟的设计的基础。
现已CNT60和二选一的数据选择器为例来介绍VHD语言的使用:
和原理图设计一样,在最开始都应该是建一个项目名,这一点在整个CPLD设计过程中我们都应牢牢记住!
CNT60的原理文件:
(注意文件后缀一定要保存为·
VHD)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycl46_cnt60is
port(clk,en,clr:
instd_logic;
gw,sw:
outstd_logic_vector(3downto0);
c_out:
outstd_logic);
end;
architectureoneofcl46_cnt60is
signalm,n:
std_logic_vector(3downto0);
begin
process(clk,clr,en)
begin
ifclr=’1’thenm<
=”0000”;
n<
elsifclk’eventandclk=’1’then
ifen=’0’then
ifm=”1001”andn=”0101”then
m<
c_out<
=’1’;
elsifm=”1001”then
=n+1;
=’0’;
else
=m+1;
endif;
endprocess;
gw<
=m;
sw<
=n;
end;
在编写这段程序时主要是注意如何准确无误地把这个设备的功能描述清楚透彻,并注意其中的关键转换条件,应做到不漏。
接下来的一些列过程和上次课的完全相同。
便可得到如下封装后CNT60的图片:
二选一数据选择器源文件:
entitycl46_ymq2x1is
port(a,b:
instd_logic_vector(3downto0);
s:
y:
outstd_logic_vector(3downto0);
k:
outstd_logic);
architectureoneofcl46_ymq2x1is
process(a,b,s)
ifs='
0'
theny<
=a;
else
y<
=b;
process(a,b)
ifa=bthenk<
='
1'
;
k<
按同样的方法,对原理图进行仿真得波形图如下:
二次感受:
如果说课时一是入门,那么这次便是一次质的突变。
上完这次课后,我们基本应该可以设计出数字钟内部所需的相关元件。
这次课我们表现得比上一次要好得多,最起码没想上次那样“浪费时间”,但也还是存在一些问题,如在描述功能时有时不太明确其分界条件。
不过对于这方面问题在学习的过程中老师给了我不少帮助,这极大帮助我。
数字钟的初级设计
记得上第一次课时黄老师就告诉了我们本课程的最终目的是设计一个数字钟及其相关的要求。
从此次课后我们就开始了数字钟的设计,真正开始了理解到了CPLD的神奇。
最开始我们是利用以设计出来的计数器CNT60,CNT24以及输入输出端口,设计一个能正确显示时,分,秒,微秒并可校准时分秒的简单数字钟。
其原理图如下所下:
鉴于要实现显示微秒功能,故需要设计CNT100,但在此存在一个矛盾:
在现有的硬件设备EP1K30中没有100HZ的脉冲。
解决这个问题的办法就是设计一个分频器,从高频中分一个100HZ频率出来;
实际上其设计过程是利用一个CNT100将3MHZ进行100分频。
其程序为:
entitycl46_100jsqis
architectureoneofcl46_100jsqis
ifclr='
thenm<
="
0000"
elsifclk'
eventandclk='
then
ifen='
then
ifm="
1001"
andn="
elsifm="
再加上调分,调时两输入端口及相关的输出端口,数字钟的最基本功能就做好了。
接下来就是按引脚图合理分配引脚,在硬件EP1K30中下载,并在其模式5下验证数字钟的功能能否实。
在这个阶段中我觉得最重要的是弄清原件之间的逻辑关系如怎样实现时分秒间的进位;
其次就是怎样从一个已知频率中得到一个我们所需要的频率,而其核心思想就是利用公式CNT?
=已知频率除以所求频率,求出要用的是多少的计数器;
最后要注意的是空间的合理分配,也就是我在操作的过程中没注意到的一点——注意原件间的间隔,不要太大也不要太小,这样有利于后续的作图。
数字钟的中间设计
这个阶段我们主要是在原来的基础上设计了一个整点报时和一个闹钟功能。
(1)、整点报时的设计:
整点报时就是要让数字钟在从到达整点的前5秒开始发生报时并且在整点时发出一声长鸣。
设计思路是首先利用VHD语言设计一个整点报时原件,其描述如下:
entitycl46_zdbsis
port(mg,ms,fg,fs:
instd_logic_vector(3downto0);
p,k:
architectureoneofcl46_zdbsis
process(mg,ms,fg,fs)
iffs=5andfg=9andms=5andmg>
=5then
elsiffs=0andfg=0andms=0andmg=0then
p<
endprocess;
之后分别将两输出端P,K与两时钟信号相与,再将两结果通过一个或门并将其送到99号输出端口SPK.图形文件如下:
同样完成这些之后,也要进行下载进行验证。
这个阶段是我记忆最为深刻的一部分,由于我犯了一个超低级的错误,从而导致我们在这里浪费了好长时间。
前面的一切进展地很顺利,可在下载时就是什么反应都没有,我们回到原理图花很多时间到处找问题可还是不行,最后老师一来就道出其中的内幕——没有分配引脚!
是啊,没有这个过程肯定是不可看到下载效果的,可我们怎么就忘了这个简单但必要的过程呢,并且还是两个人同时都忘了!
老师狠狠“教训”了我们,不过我甘愿受罚,因为这个错误的确是过于低级。
这次经历也再次让我体会到:
做学问要注重细节,细节决定成败。
不管是在生活还是学习的进程中,其中都有着许许多多的细节,虽然他们很简单朴素,但在生命中却扮演着很重要的角色。
人生需要永不停息地拼搏但不意味着要忽视生活中那些点点滴滴的美丽的童话故事。
(2)、闹钟的设计:
要实现这个功能,必须要用到一个8选4的选择器。
其功能是当我们设计的时分和实际的时分相同时,就让选择器输出设计的时分并使输出端口k为1,否者K为0。
由于在EP1K30中只有8个数码管,故在此必须要实现实际的分时端口与设计的十分端口的复用。
为此,在选择器的输入端增加一个SEL端用以控制时分的显示值。
具体如下:
数据选择器的程序
entitycl46_SJXZis
port(fg,fs,sg,ss,dfg,dfs,dsg,dss:
sel:
xs_fg,xs_fs,xs_sg,xs_ss:
architectureoneofcl46_SJXZis
process(fg,fs,sg,ss,dfg,dfs,dsg,dss,sel)
ifsel='
thenxs_fg<
=fg;
xs_fs<
=fs;
xs_sg<
=sg;
xs_ss<
=ss;
xs_fg<
=dfg;
=dfs;
=dsg;
=dss;
endif;
process(fs,fg,sg,ss,dfg,dfs,dsg,dss,sel)
iffg=dfgandfs=dfsandsg=dsgandss=dssthenk<
end
图形设计
接下来就是将闹钟的输出端口如何加到SPK端口上,同时在此对整点报时端的时钟脉冲做了某些修改,以实现从55到60秒的时间段里蜂鸣器可以间断发生。
注意,图中CLK_L接的是1HZ的频率。
图形如下:
闹钟的设计相比前面的而言难度要大点,它需要我们要非常清楚地知道设计的整个原理,弄清其内的逻辑关系。
同时,也要求我们对前面所学习的一些知识如数据选择器,VHD语言等知识要有较好的理解和掌握。
在这个设计的过程中,我们最容易出现的一个错误是给时钟加的频率不恰当。
如在设计的过程中,就曾把1HZ的信号直接送给SPK,结果就是时钟不能发声。
这让我明白了有很多事情不能只是想当然,一定要结合实际问题。
这一点在以后我们参加工作时尤为重要,在把书本上学习到的知识用于实际时一定要考虑到实际中的一些问题,只有这样才能真正做到理论结合实际,才能取得成功。
数字钟附加功能的设计
在这个阶段在老师的提示和帮助下,我设计了两个附加功能:
一个是跑马灯,一个是分段声音。
以下介绍这两个功能实现的具体过程。
(1)、跑马灯的设计
跑马灯在这主要是实现一个报警的功能,即当闹钟的输出端K为1时,EP1K30中的D0—D7就依次发光。
其设计的思路是:
设计一个8选一的数据器,数据输入端由一个8进制计数器完成(程序如下),控制信号是闹钟输出端口K即当K值为一时跑马灯才开始作用。
8选一数据选择器
entitycl46_pmdis
port(k:
q:
instd_logic_vector(2downto0);
d01,d11,d21,d31,d41,d51,d61,d71:
architectureoneofcl46_pmdis
process(k,q)
ifk='
andq="
000"
d01<
d11<
d21<
d31<
d41<
d51<
d61<
d71<
elsifk='
001"
010"
elsifk='
011"
100"
101"
110"
111"
else
连接图如下:
这虽是一个新增的功能,但实现起来比较简单,只要想得到再加上已掌握的知识就便可很快设计出来。
(2)、分段声音的设计
这个功能是要实现在一分钟内让闹钟的声音由缓慢到急促。
要实现这个效果必须要将不同的频率的脉冲和闹钟的K相与,然后由秒钟的数字来选择一个信号送给端口SPK。
选择器的问题很好解决,这里主要问题的是该如何得到合适的频率即可以驱动硬件发声的频率。
开始时我也尝试了和求得100HZ一样的方法,从3MHZ中分出四个频率,可是得到的频率并不能驱动硬件,原因是占空比太小。
后来,在老师的指导下,我改变了设计思路。
从8HZ中分别分出1HZ,2HZ,4HZ三个频率然后分别和K作用。
图形,程序如下:
分得1HZ:
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
entitycl46_8f4is
port(fin:
fout4:
architectureoneofcl46_8f4is
signalm:
std_logic_vector(2downto0);
process(fin)
iffin'
eventandfin='
ifm="
m<
fout4<
elsem<
entitycl46_8f3is
fout3:
分得2HZ:
architectureoneofcl46_8f3is
fout3<
分得4HZ:
entitycl46_8f2is
fout2:
architectureoneofcl46_8f2is
std_logic_vector(1downto0);
01"
00"
fout2<
四选一的选择器
entitycl46_4xipis
port(fout2:
fout5:
ms:
mg:
f:
architectureoneofcl46_4xipis
process(fout2,fout3,fout4,fout5,ms,mg)
ifms<
"
0011"
or(ms="
andmg="
0"
)then
f<
=fout2;
elsifms="
or(ms="
0100"
andmg<
0101"
=fout3;
=fout4;
=fout5;
图形文件:
做到这里接下来就是将此两个功能结合起来,得图形如下:
到此整个数字钟的设计就结束了。
虽然花了很多精力与时间到最后只实现了两个简单的功能,但我觉得值得。
时间和精力应该是我们在成长过程要取得每一点进步所必须付出的代价吧,沉下了心思考过或多或少总会有些收获的。
最起码我对占空比有了更深的认识,真正体会到“纸上得来终觉浅,得知此事得躬行”的含义。
我没天才的头脑但我愿意花更多的时间去学习,我创新思维不够但我会用心去寻求新知。
就像面对生活一样,或许我的世界里没有太多的钱财权势但我仍然会去寻觅自己的归属,走自己的路,追自己的
大总结
历经八个周的学习,从对CPLD这门课程一无所知到设计出一个属于自己的