数字逻辑电路和PLD设计.docx
《数字逻辑电路和PLD设计.docx》由会员分享,可在线阅读,更多相关《数字逻辑电路和PLD设计.docx(20页珍藏版)》请在冰豆网上搜索。
数字逻辑电路和PLD设计
数字逻辑电路和PLD设计
姓名:
学号:
座号:
24号
时间:
2010/7/5—2010/7/6
目录
一、设计题目----------------------------------2
二、设计要求-----------------------------------2
三、设计内容-----------------------------------2
四、设计流程图--------------------------------2
五、实验内容-----------------------------------4
六、总的原理图和仿真波形-----------------17
七、学习小结-----------------------------------21
一、设计题目
红绿灯交通管理器
二、设计要求
设计十字路口的交通管理器,该管理器控制甲乙垂直的红黄绿三色灯显示和各自显示时间,指挥车辆和行人安全通行,用VHDL语言描述。
设计工具使用QUARTUSII软件。
三、设计内容
该设计采用分层描述方法,以图形输入和原理输入混合方式建立VHDL描述文件。
交通管理器顶层图形输入文件有控制器和三个各位模26、模30、模5的定时器组成,分别控制两个道口的通行时间和公共停车时间,系统由两组红黄绿指示灯和三组七段显示器作倒计时显示,由BCD码驱动,控制器按照流程图中状态的变化来控制红黄绿灯的变换以及计数器的计时,当某个计数器工作技术信号W1、W2或W3,由“0”转为“1”时,表示计满,控制器转向下一个状态并计时,各定时器连接控制器的C1、C2或C3,当为“1”时,该计数器计时结束,整个系统循环互联。
当计数器计数时,各个减法器同时做倒计时,输出接七段译码显示器做倒计时显示。
各减法器具有置数控制端,当控制端为“1”时,预置30、26、5。
可以将时钟信号和置数信号一同设为进程敏感信号,减法计数器的使能端也对应控制器的C1、C2和C3上升沿开始倒计时。
交通灯具体设计内容:
1)设计三个加法计数器(30s,26s,5s)控制器
2)设计三个减法器(30s,26s,5s)倒计时,用PROCESS(CLK,LD)异步预置
3)设计相应减法器的BCD码七段显示模块
4)设计总体状态转换器,完成各输入文件,并产生各模块后,再用原理图输入方式产生总图。
四、设计流程图
红绿灯交通管理器控制甲、乙两道的红、黄、绿三色灯,指挥车辆和行人安全。
交通管理器示意图如下图
(1)所示。
图
(1)中三个计时器分别确定甲道和乙道通行时间t3、t1以及公共的停车(黄灯燃亮)时间t2。
C1、C2和C3分别是3个定时器工作信号,即当C1、C2或C3为1时,相应的定时器计数。
W1、W2和W3为计数器的指示信号,计数器在计数过程中,相应的指示信号为0,
计数结束时为1。
交通管理器工作流程图如下图:
五、实验内容
1、秒加法计数器设计
1.1设计一个30秒加法计数器
使计数器由“0000~11101”进行加法计数,当计数器工作计数信号(进位输出C)有“0”转为“1”时,表示计满。
设30秒加法计数器的源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycount30is
port(
en:
instd_logic;
clk:
instd_logic;
dout:
outstd_logic_vector(4downto0);
c:
outstd_logic);
endcount30;
architecturebehavioralofcount30is
signalcount:
std_logic_vector(4downto0):
="00000";
begin
dout<=count;
process(clk,en)
begin
ifen='0'then
count<="00000";
c<='0';
elsifen='1'then
ifrising_edge(clk)then
Ifcount="11101"then
count<="00000";
c<='1';
else
count<=count+1;
c<='0';
endif;
endif;
endif;
dout<=count;
endprocess;
endbehavioral;
对该计数器程序生成模块并进行编译
对编译结果进行仿真,仿真波形如下图:
1.2设计一个26秒加法计数器
使计数器由“0000~11001”进行加法计数,当计数器工作计数信号(进位输出C)有“0”转为“1”时,表示计满。
26秒加法计数器的源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycount26is
port(en:
instd_logic;
clk:
instd_logic;
dout:
outstd_logic_vector(4downto0);
c:
outstd_logic);
endcount26;
architecturebehavioralofcount26is
signalcount:
std_logic_vector(4downto0):
="00000";
begin
dout<=count;
process(clk,en)
begin
ifen='0'then
count<="00000";
c<='0';
elsifen='1'then
ifrising_edge(clk)then
ifcount="11001"then
count<="00000";
c<='1';
else
count<=count+1;
c<='0';
endif;
endif;
endif;
dout<=count;
endprocess;
endbehavioral;
对该计数器程序生成模块并进行编译:
对编译结果进行仿真,仿真波形如下图:
1.3设计一个5秒加法计数器
使计数器由“000~100”进行加法计数,当计数器工作计数信号(进位输出C)有“0”转为“1”时,表示计满。
5秒加法计数器的源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycount05is
port(en:
instd_logic;
clk:
instd_logic;
dout:
outstd_logic_vector(2downto0);
c:
outstd_logic);
endcount05;
architecturebehavioralofcount05is
signalcount:
std_logic_vector(2downto0):
="000";
begin
dout<=count;
process(clk,en)
begin
ifen='0'then
count<="000";
c<='0';
elsifen='1'then
ifrising_edge(clk)then
ifcount="100"then
count<="000";
c<='1';
else
count<=count+1;
c<='0';
endif;
endif;
endif;
dout<=count;
endprocess;
endbehavioral;
对该计数器程序生成模块并进行编译:
对编译结果进行仿真,仿真波形如下图:
2、秒减法计数器设计
2.1设计一个30秒减法计数器
当加法计数器计数时,整个减法器同时做倒计时,状态从“30~1”
30秒减法器的源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityde30is
port(clk,ld,en,reset:
instd_logic;
qh:
outstd_logic_vector(3downto0);
ql:
outstd_logic_vector(3downto0));
endde30;
architecturebehavioralofde30is
signalmh,ml:
std_logic_vector(3downto0);
begin
process(clk,ld)
begin
if(ld='1'orreset='1')then
mh<="0011";
ml<="0000";
elsif(clk'eventandclk='1')then
if(en='1')then
if(ml<="0001"ANDmh<="0000")
thenml<="0000";
mh<="0011";
elsif(ml=0)then
ml<="1001";
if(mh=0)then
mh<="0011";
elsemh<=mh-1;
endif;
elseml<=ml-1;
endif;
endif;
endif;
qh<=mh;
ql<=ml;
endprocess;
endbehavioral;
对该减法器程序生成模块并进行编译
对编译结果进行仿真,仿真波形如下图:
2.2设计一个26秒减法计数器
当加法计数器计数时,整个减法器同时做倒计时,状态从“26~1”
26秒减法器的源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityde26is
port(clk,ld,en,reset:
instd_logic;
qh:
outstd_logic_vector(3downto0);
ql:
outstd_logic_vector(3downto0));
endde26;
architecturebehavioralofde26is
signalmh,ml:
std_logic_vector(3downto0);
begin
process(clk,reset)
begin
if(ld='1'orreset='1')then
mh<="0010";
ml<="0110";
elsif(clk'eventandclk='1')then
if(en='1')then
if(ml<="0001"andmh<="0000")
thenml<="0110";
mh<="0010";
elseif(ml=0)then
ml<="1001";
mh<=mh-1;
elseml<=ml-1;
endif;
endif;
endif;
endif;
qh<=mh;
ql<=ml;
endprocess;
endbehavioral;
对该减法器程序生成模块并进行编译
对编译结果进行仿真,仿真波形如下图:
2.3设计一个5秒减法计数器
当加法计数器计数时,整个减法器同时做倒计时,状态从“5~1”
5秒减法器的源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityde5is
port(clk,ld,en,reset:
instd_logic;
q:
outstd_logic_vector(3downto0));
endde5;
architecturebehavioralofde5is
signalm:
std_logic_vector(3downto0);
begin
process(clk,ld)
begin
if(ld='1'orreset='1')then
m<="0101";
elsif(clk'eventandclk='1')then
if(en='1')then
if(m="0001")
thenm<="0101";
elsem<=m-1;
endif;
endif;
endif;
q<=m;
endprocess;
endbehavioral;
对该减法器程序生成模块并进行编译
对编译结果进行仿真,仿真波形如下图:
3、交通控制器设计
W1、W2、W3分别为30秒(红灯),5秒(黄灯)和26秒(绿灯)计数进位信号,RESET为控制清零的信号。
时钟信号以1秒为一周期。
g2,y2,r2分别为甲方向的红、黄、绿灯始能信号,g1,y1,r1分别为乙方向各信号灯的始能信号。
交通控制器的源程序:
libraryieee;
useieee.std_logic_1164.all;
entitytrafficcontrolis
port(
clk:
instd_logic;
c1,c2,c3:
outstd_logic;
w1,w2,w3:
instd_logic;
r1,r2:
outstd_logic;
y1,y2:
outstd_logic;
g1,g2:
outstd_logic;
reset:
instd_logic);
endtrafficcontrol;
architectureaoftrafficcontrolis
typestate_spaceis(s0,s1,s2,s3);
signalstate:
state_space;
begin
process(clk)
begin
ifreset='1'then
state<=s0;
elsif(clk'eventandclk='1')then
casestateis
whens0=>
ifw1='1'then
state<=s1;
endif;
whens1=>
ifw2='1'then
state<=s2;
endif;
whens2=>
ifw3='1'then
state<=s3;
endif;
whens3=>
ifw2='1'then
state<=s0;
endif;
endcase;
endif;
endprocess;
c1<='1'whenstate=s0else'0';
c2<='1'whenstate=s1orstate=s3else'0';
c3<='1'whenstate=s2else'0';
r1<='1'whenstate=s1orstate=s0else'0';
y1<='1'whenstate=s3else'0';
g1<='1'whenstate=s2else'0';
r2<='1'whenstate=s2orstate=s3else'0';
y2<='1'whenstate=s1else'0';
g2<='1'whenstate=s0else'0';
enda;
对该交通控制器程序生成模块并编译
对编译结果进行仿真,仿真波形如下图:
4、设计BCD2LED七段显示器
七段显示器在这里主要是用于各减法计数器的倒计时显示,输入信号各为减法计数器的BCD码输入。
通过显示器内部转换最后以数字形式显示。
BCD2LED七段显示器源程序:
libraryieee;
useieee.std_logic_1164.all;
entitybcd2ledis
port(a3,a2,a1,a0:
instd_logic;
a,b,c,d,e,f,g:
outstd_logic);
endbcd2led;
architecturestructuralofbcd2ledis
signalbcd:
std_logic_vector(3downto0);
signalled:
std_logic_vector(6downto0);
begin
bcd<=a3&a2&a1&a0;
process(bcd)
begin
casebcdis
when"0000"=>led<="1111110";
when"0001"=>led<="1100000";
when"0010"=>led<="1011011";
when"0011"=>led<="1110011";
when"0100"=>led<="1100101";
when"0101"=>led<="0110111";
when"0110"=>led<="0111111";
when"0111"=>led<="1100010";
when"1000"=>led<="1111111";
when"1001"=>led<="1110111";
whenothers=>led<="0000000";
endcase;
endprocess;
a<=led(6);
b<=led(5);
c<=led(4);
d<=led(3);
e<=led
(2);
f<=led
(1);
g<=led(0);
endstructural;
将个该程序生成模块并编译
对编译结果进行仿真,仿真波形如下图:
六、总的原理图和仿真波形
交通灯总体设计
将各个模块连接起来,构成完整的红绿灯管理器。
原理图中的de05,de26,de30分别为5秒,26秒,30秒减法计数器,count05,count26和count30分别为加法计数器。
Trafficcontrol为交通灯控制器。
图中的clk为总的时钟输入信号,reset分别作为各减法计数器的初始置数信号和控制器的清零信号。
减法计数器qh输出信号表示高位输出信号,ql表示低位输出信号。
总体输入信号为clk和reset,输出信号为各减法计数器的BCD码输出信号。
设计总原理图:
交通灯管理器总体仿真:
七、学习小结
两天数字逻辑电路和PLD设计学习生活很快就结束了,但是就是这短暂的两天却让我学到了很多。
在学习此课程之前,听说还是运用QuartusⅡ软件,鉴于我学习过CPLD实验,所以我是自信满满的,但是在听完老师的要求之后,我就明白其实这次任务还是很艰巨的,因为此次完全要我们自己独立设计出一个交通红绿灯控制器。
经过努力,我终于自己设计完成了一个十字路交通管理器,更加熟练使用了QuartusⅡ可编程逻辑器件开发软件,并且巩固了上学期在课堂上学到的关于VHDL语言的编程语言的课程。
虽然上个学期学过VHDL语言描述数字电路,但是当时仅仅只是自己编程,并没有给我们这样一个实验平台,让我们看到自己编的程序,可以生成自己想要的效果。
QuartusⅡ软件界面易懂,输入方式灵活多样,是一个十分常用的软件,而这次课程设计锻炼了我对这个软件的熟练程度,也已经为今后进行更复杂的设计打下了扎实的基础。
这次的学习中,我遇到了很多小问题,但是通过同学们的帮助与自身的努力,我开始慢慢的找到了编程思路以及编程中要注意的一些小细节,增强了我的自信心、丰富了我的知识。
两天的课程设计,我学会了怎么将自己所学的知识整合的到实际运用当中,加深了我对相关知识的理解和掌握。
对数电所学知识的实际运用有了进一步的了解,特别是深入的学习了VHDL语言。
这次的实践课程虽然已经结束,但对这个软件的学习以及对VHDL语言的学习并没有结束,我会在以后的学习中抓住机会加深对它们的理解,做到真正掌握这些技术。
总之,每一次的实践课实习学习都是在给我们将来积累经验,锻炼了自主学习,独立思考,综合运用所学知识的能力,我们应该学会如何整理自己所学的知识为现实生活服务,同时开发了我们锻炼思维创新能力克服困难的决心。
2010-7-6