cnt:
=cnt+1;
else
cnt:
=0;
endif;
ifcnt=t2then
c2<='1';-------工作在S1或S3状态
else
c2<='0';
endif;
endif;
endprocess;
enda;
4.3.3黄灯计数器
libraryieee;
useieee.std_logic_1164.all;
entitycounter3is
port(clk:
instd_logic;
enable:
instd_logic;
c3:
outstd_logic;
m3:
outintegerrange0to5);
endcounter3;
architectureaofcounter3is
begin
process(clk)
variablecnt:
integerrange0to5;-------变量cnt定义为常数,取值范围为0
到5
begin
if(clk'eventandclk='1')then-----时钟上升沿到来
ifenable='1'andcnt<5then-----使能信号为1,并且cnt小于5时
cnt:
=cnt+1;------加计数
else
cnt:
=0;
endif;
ifcnt=5then
c3<='1';---------工作在S2状态
else
c3<='0';
endif;
endif;
m3<=cnt;
endprocess;
enda;
4.4分位译码电路设计--1
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFenwei1IS
PORT
(Numin:
INintegerRANGE0TO45;
NumA,NumB:
OUTIntegerRANGE0to9-------绿灯亮的时间,十位和个位数字
);
END;
ARCHITECTUREbehaviorOFFenwei1IS
BEGIN
process(Numin)
BEGIN
IFNumin>=40THEN-------输入计时数据大于40
NumA<=4;-------把十位数字送给A
NumB<=Numin-40;-------把个位数字送给B
ELSIFNumin>=30THEN
NumA<=3;
NumB<=Numin-30;
ELSIFNumin>=20THEN
NumA<=2;
NumB<=Numin-20;
ELSIFNumin>=10THEN
NumA<=1;
NumB<=Numin-10;
ELSE
NumA<=0;
NumB<=Numin;
ENDIF;
ENDPROCESS;
END;
4.5分位译码电路的设计—2
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFenwei2IS
PORT
(Numin:
INintegerRANGE0TO45;
NumC,NumD:
OUTIntegerRANGE0to9-----红灯亮的时间,十位和个位
);
END;
ARCHITECTUREbehaviorOFFenwei2IS
BEGIN
process(Numin)
BEGIN
IFNumin>=40THEN
NumC<=4;
NumD<=Numin-40;
ELSIFNumin>=30THEN
NumC<=3;
NumD<=Numin-30;
ELSIFNumin>=20THEN
NumC<=2;
NumD<=Numin-20;
ELSIFNumin>=10THEN
NumC<=1;
NumD<=Numin-10;
ELSE
NumC<=0;
NumD<=Numin;
ENDIF;
ENDPROCESS;
END;
4.6数码管驱动的设计
4.6.1红绿灯驱动
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYqudongIS
PORT
(clk:
inSTD_LOGIC;
enable:
instd_logic;
data:
INintegerRANGE0TO9;------输入数字
segout:
outSTD_LOGIC_VECTOR(6downto0));-------七段显示器输出
END;
ARCHITECTUREbehaviorOFqudongIS
BEGIN
process(Clk,data)
BEGIN
IFfalling_edge(Clk)andenable='1'then------下降沿到来和使能信号为1时
casedatais
when0=>segout<="1111110";
when1=>segout<="0110000";
when2=>segout<="1101101";
when3=>segout<="1111001";
when4=>segout<="0110011";
when5=>segout<="1011011";
when6=>segout<="0011111";
when7=>segout<="1110000";
when8=>segout<="1111111";
when9=>segout<="1110011";
whenothers=>null;
ENDCASE;
ENDIF;
ENDPROCESS;
END;
4.6.2黄灯驱动
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYHDqudongIS---------黄灯驱动
PORT
(clk:
inSTD_LOGIC;
enable:
instd_logic;
data:
INintegerRANGE0TO5;------黄灯变化范围
segout:
outSTD_LOGIC_VECTOR(6downto0));
END;
ARCHITECTUREbehaviorOFHDqudongIS
BEGIN
process(Clk,data)
BEGIN
IFfalling_edge(Clk)andenable='1'then
casedatais
when0=>segout<="1111110";
when1=>segout<="0110000";
when2=>segout<="1101101";
when3=>segout<="1111001";
when4=>segout<="0110011";
when5=>segout<="1011011";
whenothers=>null;
ENDCASE;
ENDIF;
ENDPROCESS;
END;
5﹑硬件测试
把顶层文件连接图进行编译仿真后就可以进行硬件测试了,我们所用的仿真实验箱是GW48系列SOPC/EDA实验开发系统(杭州康芯电子有限公司现代DSP实验开发系统)。
在实验箱中因为有1HZ的频率并且自带译码器,所以在下载时用的顶层文件连接图就把分频器和译码器驱动电路给去掉了,如图(20),在实验过程中由于数码管不够,图中5个数码管显示的是一个车道的绿、红、黄灯时间。
图20
6、引脚锁定
在下载之前,要进行引脚的锁定,我们用的是模式5,各个端口的引脚锁定如图21。
图21
在确定引脚锁定正确后再编译一次,然后下载到实验箱中。
首先对绿灯时间t1进行置数,可在0到40任意置数,不妨设为7秒,然后系统开始工作,绿灯从0开始正计时到7再跳到黄灯从0开始正计时到5然后再跳到红灯从0开始正计时到12。
相应的另一车道的红、绿、黄灯会变化只是没有显示相应的时间。
7、心得体会
EDA课程设计,使我对EDA的认识有提高了一个层次,现在能够熟练的使用QuartsII,能够用VHDL语言编写简单的、实用的小程序,这次EDA课程设计重点学习了交通灯部分程序的编写、调试、还有硬件下载、操作等过程。
在整个课程设计的过程中,我查阅了大量的关于EDA的资料,特别是在网上和图书馆我找到了大量的关于硬件编程的资料。
另外,图(21)-22-在课程设计的过程中我认为调试程序是很重要的,要有耐心。
我在第一次编译时有三十几个错误,其中有输入错误、语法错误,如:
工程名和实体名不一致,少了分号或者少了ENDIF等错误。
发现错误之后就要一遍一遍的仔细查错,直到没有错误,然后可以进行波型仿真了。
8﹑参考文献
(1)潘松,黄继业.EDA技术实用教程.科学出版社.2006.9
(2)李辉.PLD与数字系统设计.西安电子科技大学出版社.2005
(3)蒋璇.臧蠢华.数字系统设计与PLD应用(第二版).电子工业出
版社.2005
(4)刘笃仁、杨万海编著.在系统可编程技术及其器件原理与应用.
西安:
电子科技大学出版社.2001
(5)张原编著.可编程逻辑器件设计及应用.北京:
机械工业出版
社.2001