EDA 技术及应用 实验报告.docx
《EDA 技术及应用 实验报告.docx》由会员分享,可在线阅读,更多相关《EDA 技术及应用 实验报告.docx(16页珍藏版)》请在冰点文库上搜索。
EDA技术及应用实验报告
一、任务:
基于CPLD实现数字钟的实验
要求:
(一)接通5V电源可实现数字钟的基本功能
(二)可通过按键调整分钟和时钟位的数值
二、设计框图(框图说明)
整个数字时钟的大体分为CPLD模块、数码管模块、时钟模块、按键电源模块等四个模块。
CPLD在时钟信号、电源、按键的作用下控制数码管的输出显示。
三、CPLD内部原理图
CPLD内部原理图由控制秒钟的CNT10、CNT6,控制分钟的CNT10M、CNT6,控制时钟的CNT10H,译码器DEC6G,D触发器,1000分频的F1000等模块组成。
其中ENA端为清零重置端,D1、D2端通过D触发器控制分别控制分钟位和时钟位的增加调整。
1M为时钟的输入。
Sel[7..0]控制数码管的功能端,led7s[7..0]控制数码管的码段显示。
四、CPLD内部原理图各模块相应的程序代码
--F1000的逻辑描述
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYf1000IS
PORT(CLK:
INSTD_LOGIC;
q1000:
OUTSTD_LOGIC);
ENDf1000;
ARCHITECTUREoneOFf1000IS
SIGNALX:
STD_LOGIC;
BEGIN
PROCESS(CLK)
variableCNT:
INTEGERRANGE0TO499;
BEGIN
IFCLK'EVENTANDCLK='1'then
IFCNT<499THEN
CNT:
=CNT+1;
ELSE
CNT:
=0;
X<=NOTX;
ENDIF;
ENDIF;
q1000<=X;
ENDPROCESS;
ENDONE;
--秒钟的十进制的逻辑描述
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10is
port(clk:
instd_logic;
ena:
instd_logic;
cq:
outstd_logic_vector(3downto0);
carry_out:
outstd_logic);
endentitycnt10;
architectureoneofcnt10is
signalcqi:
std_logic_vector(3downto0);
begin
process(clk,ena)is
begin
ifena='1'thencqi<="0000";
elsifclk'eventandclk='1'then
ifcqi="1001"thencqi<="0000";
elsecqi<=cqi+'1';endif;
endif;
endprocess;
process(cqi)is
begin
ifcqi="0000"thencarry_out<='1';
elsecarry_out<='0';
endif;
endprocess;
cq<=cqi;
endarchitectureone;
--秒钟、分钟的六进制的逻辑描述
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt6is
port(clk:
instd_logic;
ena:
instd_logic;
cq:
outstd_logic_vector(3downto0);
carry_out:
outstd_logic);
endentitycnt6;
architectureoneofcnt6is
signalcqi:
std_logic_vector(3downto0);
begin
process(clk,ena)is
begin
ifena='1'thencqi<="0000";
elsifclk'eventandclk='1'then
ifcqi="0101"thencqi<="0000";
elsecqi<=cqi+'1';endif;
endif;
endprocess;
process(cqi)is
begin
ifcqi="0000"thencarry_out<='1';
elsecarry_out<='0';
endif;
endprocess;
cq<=cqi;
endarchitectureone;
--分钟的十进制逻辑描述
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10Mis
port(clk:
instd_logic;
clr:
instd_logic;
add:
instd_logic;
cq:
outstd_logic_vector(3downto0);
carry_out:
outstd_logic);
endentitycnt10M;
architectureoneofcnt10Mis
signalcqi:
std_logic_vector(3downto0);
signalgclk:
std_logic;
begin
gclk<=clkoradd;
process(gclk,clr)is
begin
ifclr='1'thencqi<="0000";
elsifgclk'eventandgclk='1'then
ifcqi="1001"thencqi<="0000";
elsecqi<=cqi+'1';endif;
endif;
endprocess;
process(cqi)is
begin
ifcqi="0000"thencarry_out<='1';
elsecarry_out<='0';
endif;
endprocess;
cq<=cqi;
endarchitectureone;
--小时的逻辑描述
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10his
port(clk:
instd_logic;
clr:
instd_logic;
add:
instd_logic;
cq3:
outstd_logic_vector(3downto0);
cq4:
outstd_logic_vector(3downto0));
endentitycnt10h;
architectureoneofcnt10his
signalsum:
integerrange0to11;
signalgclk:
std_logic;
signalcq1:
std_logic_vector(3downto0);
signalcq2:
std_logic_vector(3downto0);
begin
gclk<=clkoradd;
process(gclk,clr)is
begin
ifclr='1'thencq1<="0000";sum<=0;
elsifgclk'eventandgclk='1'then
ifsum=11thensum<=0;
elsesum<=sum+1;endif;
endif;
casesumis
when0=>cq1<="0000";cq2<="0000";
when1=>cq1<="0001";cq2<="0000";
when2=>cq1<="0010";cq2<="0000";
when3=>cq1<="0011";cq2<="0000";
when4=>cq1<="0100";cq2<="0000";
when5=>cq1<="0101";cq2<="0000";
when6=>cq1<="0110";cq2<="0000";
when7=>cq1<="0111";cq2<="0000";
when8=>cq1<="1000";cq2<="0000";
when9=>cq1<="1001";cq2<="0000";
when10=>cq1<="0000";cq2<="0001";
when11=>cq1<="0001";cq2<="0001";
endcase;
endprocess;
cq3<=cq1;cq4<=cq2;
endarchitectureone;
--DEC6G的逻辑描述
libraryieee;
useieee.std_logic_1164.all;
entitydec6gis
port(a:
inbit_vector(3downto0);
b:
inbit_vector(3downto0);
c:
inbit_vector(3downto0);
d:
inbit_vector(3downto0);
e:
inbit_vector(3downto0);
f:
inbit_vector(3downto0);
clk:
instd_logic;
sel:
outbit_vector(7downto0);
led7s:
outbit_vector(7downto0));
endentitydec6g;
architectureoneofdec6gis
signalsum:
integerrange0to7;
signalm:
bit_vector(3downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
ifsum>=7thensum<=0;
elsesum<=sum+1;
endif;
endif;
casesumis
when0=>sel<="11111110";m<=a;
when1=>sel<="11111101";m<=b;
when2=>sel<="11111011";m<="1111";
when3=>sel<="11110111";m<=c;
when4=>sel<="11101111";m<=d;
when5=>sel<="11011111";m<="1111";
when6=>sel<="10111111";m<=e;
when7=>sel<="01111111";m<=f;
endcase;
endprocess;
process(m)
begin
casem(3downto0)is
when"0000"=>led7s<="00111111";
when"0001"=>led7s<="00000110";
when"0010"=>led7s<="01011011";
when"0011"=>led7s<="01001111";
when"0100"=>led7s<="01100110";
when"0101"=>led7s<="01101101";
when"0110"=>led7s<="01111101";
when"0111"=>led7s<="00000111";
when"1000"=>led7s<="01111111";
when"1001"=>led7s<="01101111";
when"1111"=>led7s<="01000000";
whenothers=>NULL;
endcase;
endprocess;
endone;
--D触发器的逻辑描述
libraryieee;
useieee.std_logic_1164.all;
entitydffis
port(d:
instd_logic;
clk:
instd_logic;
q:
outstd_logic);
endentitydff;
----------------------------------
architectureddofdffis
begin
tt:
process(clk)is
begin
if(clk'eventandclk='1')
thenq<=d;
endif;
endprocesstt;
endarchitecturedd;
五、CPLD内部结构各模块图与各自仿真图
1、为DEC6G模块图与之仿真图
Maxplus中设置:
ENDTIME=480ns,Gridsize=15ns;时钟周期为30ns;在时钟信号的控制下,a[3..0]、b[3..0]、c[3..0]、d[3..0]、e[3..0]、f[3..0]端使输入,相应SEL[7..0]控制相应的数码管,LED[7..0]在相应的数码管上产生相应的断码。
实现译码器的功能。
2、为小时模块与之仿真图
Maxplus设置:
ENDTIME=480ns;Gridsize=10ns;clk周期为20ns;clr低电平有效,在时钟信号的作用下,cq[33…30]产生脉冲,当cq[33…30]达到9时,cq[43…40]产生一个脉冲,add按键在按下时也达到了加速的目的,仿真图可见可以实现其功能。
3、为分钟十进制模块与之仿真图
Maxplus设置:
ENDTIME=480ns;Gridsize=15ns;clk周期为30ns;仿真图可知当clr=0时有效;add上升沿有效;当clk=0时,cq[3..0]有输出,carry_out=0,当cq[3..0]产生十个脉冲时,carry_out产生一个脉冲,add按键按下时时间延长,达到了设计的功能要求。
4、为秒位、分位六进制模块图与之仿真图
Maxplus设置:
ENDTIME=480ns,Gridsize=15ns,周期T=30ns,
仿真实现CNT6功能:
当ena=0,clk上升沿时cq[3..0]实现六进制cq[3..0]到6时carry_out产生一个脉冲;
5、为秒位十进制模块图与之仿真图
Maxpius设置:
ENDTIME=480ns,Gridsize=15ns,周期T=30ns,
仿真实现功能:
当ena=0andclk上升沿时cq[3..0]输出十进制当cq[3..0]到达9时carry_out产生一个脉冲;
6、为1000分频模块图与之仿真图
1000分频在maxplus中波形仿真中设置ENDTIME=20us,Gridsize=10ns;可见在CLK499个脉冲的时候,q1000产生一个脉冲,占空比=50%。
7、为D触发器模块图与之仿真图
Maxplus设置:
ENDTIME=480ns,Gridsize=10ns,clk周期T=20ns,d的周期Td=60ns,
仿真图实现功能当clk上升沿到来时q<=d;
六、实验设计结果
合理运用CPLD个端口的功能,下面图表为CPLD上各相应得端口连接
此程序所用芯片如下图所示为EPM7128SLC84-18
实验焊接成功正常工作正面图
实验焊接成功正常工作反面图
七、总结
在这整个数字钟的设计过程,不仅可以体现个人的细心度,而且还有对整个电路的了解,因为整个数字钟电路的设计不是说照着老师的直接焊接就行了,还得考虑电路是如何工作的,在理解的基础上,再去焊接就会达到事半功倍的效果,这也充分展示了个人的思维能力。
整个数字钟大体可以分为数码管模块、CPLD模块、晶振模块、电源模块等四个大的模块,数码管要理解它的工作原理,在理解的情况下再去焊接。
经过这次数字钟的设计,深刻体会到一个数字钟的实现不能光看CPLD里程序的设计,还得认真的理清思路,将模块先在草稿纸上规划一下,板子的焊接不光看它的实用性,还得考虑它的规划。
第一次设计时钟电路难免会出错。
板子如果焊的很有条理性,这对电路的排错检查是很有帮助的。
我花了一天的时间将板子完完全全的焊完,但是不能只追求时间的进度,这样难免出错,我没有检查一遍就直接去调试,结果很明了--失败,后来经过自己的排错、检查,居然检查出三个模块的错误,分别是晶振模块、下载端口模块、数码管模块,由于自己的疏忽之前没有检查出来,导致第一次下载调试不成功,然后自己只能逐一排查,首先是数码管的功能端没有核对好,这就会导致数码管的显示顺序出现问题,还好只需对CPLD中程序sel[7..0]的锁脚顺序改变一下就可以很好的解决这个问题了。
其次是晶振的接地端没有连对,这直接导致整个时钟电路没有时钟的支持,即使其他电路模块正确,电路也不会正常工作的,解决的方法很简单,这只需要将晶振的接地端认真核对再重新焊接,这样就把电路的两大问题解决了,装上芯片可以显示数字,当然用别人的芯片,芯片里面是别人的代码,由于锁脚不同,数码管显示乱码。
连接下载线,准备下载程序,结果没法下载,借用别人的板子下载我自己的程序,然后将芯片装入我的板子,时钟电路板子正常工作了,很显然我的板子还存在一个很大的问题在下载端口处,仔细检查了一遍我的下载端口的焊接,发现一个致命的错误—下载端口焊反了,这直接导致下载端口和下载线上的端口不对应,从而无法正常下载程序,没办法,只好重新焊接。
经过将下载端口的重新焊接,最后终于可以程序下载入芯片,这样就将整个时钟电路设计完毕。
时钟电路可以正常的工作了。
这次时钟电路的最终设计成功,让我深深的了解了时钟电路的工作原理,更学会了MAXPLUS软件的基本应用。
在成功的完成之后,也让我学到了很多,学会了自己动手设计,遇到问题自己排查,这充分的锻炼了我。
八、参考书(文章)
[1]谭会生张昌凡.EDA技术及应用[M].西安:
电子科技大学出版社,2004