科 技 学 院
课程设计报告
( 2015 -- 2016年度第 一 学期)
名 称: EDA课程设计
题 院 系: 科 技 学 院
班 级:
学 号:
学生姓名:
指导教师: 胡老师
设计周数: 2
成 绩:
日期:2015年 12月 10 日
一、课程设计的目的与要求
1.1实验目的
掌握交通灯控制系统的基本原理,及用VHDL状态机实现该系统的方法。
1.2实验内容
设计一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制系统,具体要求如下:
(1) 主、支干道各设有一个绿、黄、红指示灯,两个显示数码管。
(2) 主、支道交替允许通行,主干道每次放行45 s,支干道每次放行25 s,在每次由亮绿灯变成亮红灯的转换过程中,要亮5 s的黄灯作为过渡,并进行减计时显示。
1.3实验要求
1、用8段数码管分别显示两个干道的交通计时。
2、能够正常实现红、黄、绿灯的切换。
二、设计正文
1.1设计思路
主、干支道交替允许通行,主干道每次放行45秒,支干道每次放行25秒,由黄转绿的过程中要亮5秒红灯。分析可以得到,主干道绿灯亮45秒,黄灯亮5秒,红灯亮25秒。而且对应于主干道这一过程,支干道依次亮45秒红灯,25秒绿灯,5秒黄灯。
1.2、分频器的设计
试验箱上提供的最小信源信号频率是2赫兹,而红绿灯系统的设计是秒计时,需要1赫兹的信号,因此需要对试验箱提供的2赫兹信号进行二分频。本设计中利用T触发器对信源信号二分频。具体实现步骤为:设置信号cp,每当信源信号clk的上升沿到来一次,cp取反翻转一次,从而实现二分频。
1.3、红绿灯转换的设计
设置一个计时器,cp信号上升沿每到来一次,计时器加1。 因为红绿黄灯完成一次转换的时间是75秒,所以设计计时器计时达到75秒时自动清零,重新计时。设从计时器开始计时,主干道的状态为绿、黄、红,相应的支干道的状态为红、绿、黄。从计时器开始计时为起点,设置时间轴,根据时间判断亮红灯还是绿灯、黄灯。判断规则是:对于主干道,当时间countnum小于45秒,绿灯亮;当时间大于等于45秒小于50秒,黄灯亮;当时间大于等于50秒,红灯亮。其中,时间等于45秒和50秒处是绿黄灯、黄红灯转换点。同理,对于支干道,当时间countnum小于45秒时,红灯亮;当时间大于等于45秒小于70秒时,绿灯亮;当时间大于等于70秒时,黄灯亮。其中,时间等于5秒和70秒处是红绿灯,绿黄等转换点。主干道和支干道用同一个计时器计时,用两个进程分别判断。
1.4、交通计时的设计
数码管是减计时显示灯亮剩余时间。设置信号numA,numB分别计算主干道和支干道上灯亮剩余时间。因为绿灯亮45秒,黄灯亮5秒,红灯亮25秒,所以在时间轴上,当主干道绿灯亮时,numA等于45减countnum,黄灯亮时,numA等于50减countnum,红灯亮时numA等于75减countnum。当支干道上红灯亮时,numB等于45减countnum,绿灯亮时,numB等于70减countnum,黄灯亮时,numB等于75减countnum。从而实现倒计时的功能。 5、数码管的设计
每条道路上有两个数码管,分别显示倒计时时间的十位和个位。利用10整除倒计时时间得到十位上数字,对时间求余得到个位上数字。结合数码管的管脚信息,利用状态机将十进制数字和驱动数码管显示的七位二进制码一一对应起来。
三、课程设计总结
1.1 在这次课程设计中我学到很多理论之外的东西,EDA这门课程的实用性很强。这次课程设计就是一个列子,平时看到红绿灯没觉得制作是需要很多的知识,这次做了交通灯的设计之后发现需要大量的EDA书本上的知识。这次的课程设计就相当于把平时的一些小实验和知识点全部综合起来得到的结果,经历过这次的课程设计之后我明白了,如果平时不认真学号一些基础知识,到最后是根本做不出来的。同时我也在网上查找了很多资料,从之前的不会到慢慢的学会看代码,改代码和写代码。
1.2设计的时候需要先理解红绿黄这三个灯的跳转,还有数码管的显示,和计算器的倒计时。在进行实验仿真的时候,我第一次做的是直接显示十进制的数字,但是在最后匹配管脚的时候匹配不了,所以我自己重新改了代码,改成二进制输出,此时仿真实验图显示的是十进制转换成二进制的数,我坚信是对的,所以我最后在实验箱里出现了正确的现象。我觉得自己应该相信自己。
五、参考文献
[1]胡正伟,谢志远,范寒柏编著.电子设计自动化 .中国电力出版社
[2]邹彦编著.EDA技术与数字系统设计. 2007年. 北京:电子工业出版社.
[3]潘松,黄继业编著.EDA技术与VHDL(第二版).2007年. 北京:清华大学出版社. [4]王锁萍编著.电子设计自动化教程.2000年.成都:电子科技大学出版社.
附录
1.红绿灯显示示意图
主干道
3.程序
library ieee;
use ieee.std_logic_1164.all;
entity pbd_16 is
port(clk:in std_logic;
redA,greenA,yellowA:out std_logic;
redB,greenB,yellowB:out std_logic;
seg1,seg2,seg3,seg4:out std_logic_vector(6 downto 0));
end entity pbd_16;
architecture rtl of pbd_16 is
signal cp:std_logic;
signal countnum:integer range 0 to 75:=0;
signal numA,numB:integer range 0 to 45;
signal numA1,numB1:integer range 0 to 4;
signal numA2,numB2:integer range 0 to 9;
begin
process(clk)
begin
if clk'event and clk='1' then cp
end if;
end process;
process(cp)
begin
if cp'event and cp='1' then
if countnum=75 then
countnum
else
countnum
end if;
end if;
end process;
process(cp)
begin
if countnum
redA
greenA
yellowA
numA
elsif countnum
redA
greenA
yellowA
numA
else
redA
greenA
yellowA
numA
end if;
end process;
process(cp)
begin
if countnum
redB
greenB
yellowB
numB
elsif countnum
redB
greenB
yellowB
numB
else
redB
greenB
yellowB
numB
end if;
end process;
process(cp)
begin
numB1
numB2
numA1
numA2
end process;
process(numA1)
begin
case numA1 is
when 0=>seg1
when 1=>seg1
when 2=>seg1
when 3=>seg1
when 4=>seg1
end case;
end process;
process(numA2)
begin
case numA2 is
when 0 =>seg2
when 1 =>seg2
when 2 =>seg2
when 3 =>seg2
when 4 =>seg2
when 5 =>seg2
when 6 =>seg2
when 7 =>seg2
when 8 =>seg2
when 9 =>seg2
end case;
end process;
process(numB1)
begin
case numB1 is
when 0=>seg3
when 1=>seg3
when 2=>seg3
when 3=>seg3
when 4=>seg3
end case;
end process;
process(numB2)
begin
case numB2 is
when 0 =>seg4
when 1 =>seg4
when 2 =>seg4
when 3 =>seg4
when 4 =>seg4
when 5 =>seg4
when 6 =>seg4
when 7 =>seg4
when 8 =>seg4
when 9 =>seg4
end case;
end process;
end architecture rtl;
题目二: 数字频率计设计
一、实验目的
学习并掌握数字频率计原理、设计、分析和测试方法。
二、实验内容
用高频率信号检测低频率的信号,通过对高频率脉冲个数的计数得到低频率信号的频率。(高频率信号的频率为已知,低频率信号为所测量值)。或用低频率信号检测高频率信号(低频率信号的频率为已知,高频率信号为所测值)。
三、实验要求
1. 用7段数码管显示频率值。
2. 频率值用十进制表示。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ldz_11 is
port(clk1,rst,setsec,setmin,sethour:in std_logic;
sec1,sec0,min1,min0,hr1,hr0:buffer std_logic_vector(3 downto 0);
speaker:out std_logic;
a1,a2,a3,a4,a5,a6:out std_logic;
b1,b2,b3,b4,b5,b6:out std_logic;
c1,c2,c3,c4,c5,c6:out std_logic;
h1,h2,h3,h4,h5,h6:out std_logic;
e1,e2,e3,e4,e5,e6:out std_logic;
f1,f2,f3,f4,f5,f6:out std_logic;
g1,g2,g3,g4,g5,g6:out std_logic;
dot:out std_logic);
end entity ldz_11;
architecture one of ldz_11 is
component led is
port(data:in std_logic_vector(3 downto 0);
a,b,c,d,e,f,g:out std_logic);
end component led;
signal tmp,clk:std_logic;
begin
p0:process(clk) --分频注释见①
variable count :std_logic_vector(1 downto 0); begin
if(clk1'event and clk1='1') then
if(count="10") then
count:=(others=>'0');
tmp
count:=count+1;
end if;
end if;
end process p0; clk
p1:process(clk,rst,setsec,setmin,sethour)--校时注释见② variable s1,s0,m1,m0,h1,h0:std_logic_vector(3 downto 0); begin
if clk'event and clk='1' then
if rst='1' then
if setsec='1' then
s0:=s0+1;
if s0="1010" then s0:="0000";
s1:=s1+1;
if s1="0110" then
s1:="0000";
end if;
end if;
end if;
if setmin='1'
then m0:=m0+1;
if m0="1010"
then m0:="0000";
m1:=m1+1;
if m1="0110"
then m1:="0000";
end if;
end if;
end if;
if sethour='1' then
h0:=h0+1;
if h0="1010" then
h0:="0000";
h1:=h1+1;
if h0="0100"and h1="0010" then h0:="0000";h1:="0000";
end if;
end if;
end if;
else s0:=s0+1;--秒,分、时的计时注释见③
if s0="1010" then s0:="0000";
s1:=s1+1;
if s1="0110"then s1:="0000";
m0:=m0+1;
if m0="1010" then m0:="0000";
m1:=m1+1;
if m1="0110"
then m1:="0000";
h0:=h0+1;
if h0="1010" then h0:="0000";
h1:=h1+1;
if h0="0100"and h1="0010"
then h1:="0000";
h0:="0000";
end if;
end if;
end if;
end if;
end if;
end if;
end if;
sec0
sec1
min0
min1
hr0
hr1
end if;
if clk1'event and clk1='1' then --报时注释见④
if m1="0101" and m0="1001" and s1="0101" then
if s0="0101" or s0="0110" or s0="0111" or s0="1000" or s0="1001" speaker
else speaker
end if;
end if;
end if;
end process; then
led1:led port map(data=>sec0, a=>a1,
b=>b1,
c=>c1,
d=>h1,
e=>e1,
f=>f1,
g=>g1);
led2:led port map(data=>sec1, a=>a2,
b=>b2,
c=>c2,
d=>h2,
e=>e2,
f=>f2,
g=>g2);
led3:led port map(data=>min0, a=>a3, b=>b3, c=>c3, d=>h3, e=>e3, f=>f3,
g=>g3);
led4:led port map(data=>min1, a=>a4, b=>b4, c=>c4, d=>h4, e=>e4, f=>f4,
g=>g4);
led5:led port map(data=>hr0, a=>a5, b=>b5, c=>c5, d=>h5, e=>e5, f=>f5,
g=>g5);
led6: led port map(data=>hr1, a=>a6,
b=>b6, c=>c6, d=>h6, e=>e6, f=>f6, g=>g6);
end architecture one;
科 技 学 院
课程设计报告
( 2015 -- 2016年度第 一 学期)
名 称: EDA课程设计
题 院 系: 科 技 学 院
班 级:
学 号:
学生姓名:
指导教师: 胡老师
设计周数: 2
成 绩:
日期:2015年 12月 10 日
一、课程设计的目的与要求
1.1实验目的
掌握交通灯控制系统的基本原理,及用VHDL状态机实现该系统的方法。
1.2实验内容
设计一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制系统,具体要求如下:
(1) 主、支干道各设有一个绿、黄、红指示灯,两个显示数码管。
(2) 主、支道交替允许通行,主干道每次放行45 s,支干道每次放行25 s,在每次由亮绿灯变成亮红灯的转换过程中,要亮5 s的黄灯作为过渡,并进行减计时显示。
1.3实验要求
1、用8段数码管分别显示两个干道的交通计时。
2、能够正常实现红、黄、绿灯的切换。
二、设计正文
1.1设计思路
主、干支道交替允许通行,主干道每次放行45秒,支干道每次放行25秒,由黄转绿的过程中要亮5秒红灯。分析可以得到,主干道绿灯亮45秒,黄灯亮5秒,红灯亮25秒。而且对应于主干道这一过程,支干道依次亮45秒红灯,25秒绿灯,5秒黄灯。
1.2、分频器的设计
试验箱上提供的最小信源信号频率是2赫兹,而红绿灯系统的设计是秒计时,需要1赫兹的信号,因此需要对试验箱提供的2赫兹信号进行二分频。本设计中利用T触发器对信源信号二分频。具体实现步骤为:设置信号cp,每当信源信号clk的上升沿到来一次,cp取反翻转一次,从而实现二分频。
1.3、红绿灯转换的设计
设置一个计时器,cp信号上升沿每到来一次,计时器加1。 因为红绿黄灯完成一次转换的时间是75秒,所以设计计时器计时达到75秒时自动清零,重新计时。设从计时器开始计时,主干道的状态为绿、黄、红,相应的支干道的状态为红、绿、黄。从计时器开始计时为起点,设置时间轴,根据时间判断亮红灯还是绿灯、黄灯。判断规则是:对于主干道,当时间countnum小于45秒,绿灯亮;当时间大于等于45秒小于50秒,黄灯亮;当时间大于等于50秒,红灯亮。其中,时间等于45秒和50秒处是绿黄灯、黄红灯转换点。同理,对于支干道,当时间countnum小于45秒时,红灯亮;当时间大于等于45秒小于70秒时,绿灯亮;当时间大于等于70秒时,黄灯亮。其中,时间等于5秒和70秒处是红绿灯,绿黄等转换点。主干道和支干道用同一个计时器计时,用两个进程分别判断。
1.4、交通计时的设计
数码管是减计时显示灯亮剩余时间。设置信号numA,numB分别计算主干道和支干道上灯亮剩余时间。因为绿灯亮45秒,黄灯亮5秒,红灯亮25秒,所以在时间轴上,当主干道绿灯亮时,numA等于45减countnum,黄灯亮时,numA等于50减countnum,红灯亮时numA等于75减countnum。当支干道上红灯亮时,numB等于45减countnum,绿灯亮时,numB等于70减countnum,黄灯亮时,numB等于75减countnum。从而实现倒计时的功能。 5、数码管的设计
每条道路上有两个数码管,分别显示倒计时时间的十位和个位。利用10整除倒计时时间得到十位上数字,对时间求余得到个位上数字。结合数码管的管脚信息,利用状态机将十进制数字和驱动数码管显示的七位二进制码一一对应起来。
三、课程设计总结
1.1 在这次课程设计中我学到很多理论之外的东西,EDA这门课程的实用性很强。这次课程设计就是一个列子,平时看到红绿灯没觉得制作是需要很多的知识,这次做了交通灯的设计之后发现需要大量的EDA书本上的知识。这次的课程设计就相当于把平时的一些小实验和知识点全部综合起来得到的结果,经历过这次的课程设计之后我明白了,如果平时不认真学号一些基础知识,到最后是根本做不出来的。同时我也在网上查找了很多资料,从之前的不会到慢慢的学会看代码,改代码和写代码。
1.2设计的时候需要先理解红绿黄这三个灯的跳转,还有数码管的显示,和计算器的倒计时。在进行实验仿真的时候,我第一次做的是直接显示十进制的数字,但是在最后匹配管脚的时候匹配不了,所以我自己重新改了代码,改成二进制输出,此时仿真实验图显示的是十进制转换成二进制的数,我坚信是对的,所以我最后在实验箱里出现了正确的现象。我觉得自己应该相信自己。
五、参考文献
[1]胡正伟,谢志远,范寒柏编著.电子设计自动化 .中国电力出版社
[2]邹彦编著.EDA技术与数字系统设计. 2007年. 北京:电子工业出版社.
[3]潘松,黄继业编著.EDA技术与VHDL(第二版).2007年. 北京:清华大学出版社. [4]王锁萍编著.电子设计自动化教程.2000年.成都:电子科技大学出版社.
附录
1.红绿灯显示示意图
主干道
3.程序
library ieee;
use ieee.std_logic_1164.all;
entity pbd_16 is
port(clk:in std_logic;
redA,greenA,yellowA:out std_logic;
redB,greenB,yellowB:out std_logic;
seg1,seg2,seg3,seg4:out std_logic_vector(6 downto 0));
end entity pbd_16;
architecture rtl of pbd_16 is
signal cp:std_logic;
signal countnum:integer range 0 to 75:=0;
signal numA,numB:integer range 0 to 45;
signal numA1,numB1:integer range 0 to 4;
signal numA2,numB2:integer range 0 to 9;
begin
process(clk)
begin
if clk'event and clk='1' then cp
end if;
end process;
process(cp)
begin
if cp'event and cp='1' then
if countnum=75 then
countnum
else
countnum
end if;
end if;
end process;
process(cp)
begin
if countnum
redA
greenA
yellowA
numA
elsif countnum
redA
greenA
yellowA
numA
else
redA
greenA
yellowA
numA
end if;
end process;
process(cp)
begin
if countnum
redB
greenB
yellowB
numB
elsif countnum
redB
greenB
yellowB
numB
else
redB
greenB
yellowB
numB
end if;
end process;
process(cp)
begin
numB1
numB2
numA1
numA2
end process;
process(numA1)
begin
case numA1 is
when 0=>seg1
when 1=>seg1
when 2=>seg1
when 3=>seg1
when 4=>seg1
end case;
end process;
process(numA2)
begin
case numA2 is
when 0 =>seg2
when 1 =>seg2
when 2 =>seg2
when 3 =>seg2
when 4 =>seg2
when 5 =>seg2
when 6 =>seg2
when 7 =>seg2
when 8 =>seg2
when 9 =>seg2
end case;
end process;
process(numB1)
begin
case numB1 is
when 0=>seg3
when 1=>seg3
when 2=>seg3
when 3=>seg3
when 4=>seg3
end case;
end process;
process(numB2)
begin
case numB2 is
when 0 =>seg4
when 1 =>seg4
when 2 =>seg4
when 3 =>seg4
when 4 =>seg4
when 5 =>seg4
when 6 =>seg4
when 7 =>seg4
when 8 =>seg4
when 9 =>seg4
end case;
end process;
end architecture rtl;
题目二: 数字频率计设计
一、实验目的
学习并掌握数字频率计原理、设计、分析和测试方法。
二、实验内容
用高频率信号检测低频率的信号,通过对高频率脉冲个数的计数得到低频率信号的频率。(高频率信号的频率为已知,低频率信号为所测量值)。或用低频率信号检测高频率信号(低频率信号的频率为已知,高频率信号为所测值)。
三、实验要求
1. 用7段数码管显示频率值。
2. 频率值用十进制表示。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ldz_11 is
port(clk1,rst,setsec,setmin,sethour:in std_logic;
sec1,sec0,min1,min0,hr1,hr0:buffer std_logic_vector(3 downto 0);
speaker:out std_logic;
a1,a2,a3,a4,a5,a6:out std_logic;
b1,b2,b3,b4,b5,b6:out std_logic;
c1,c2,c3,c4,c5,c6:out std_logic;
h1,h2,h3,h4,h5,h6:out std_logic;
e1,e2,e3,e4,e5,e6:out std_logic;
f1,f2,f3,f4,f5,f6:out std_logic;
g1,g2,g3,g4,g5,g6:out std_logic;
dot:out std_logic);
end entity ldz_11;
architecture one of ldz_11 is
component led is
port(data:in std_logic_vector(3 downto 0);
a,b,c,d,e,f,g:out std_logic);
end component led;
signal tmp,clk:std_logic;
begin
p0:process(clk) --分频注释见①
variable count :std_logic_vector(1 downto 0); begin
if(clk1'event and clk1='1') then
if(count="10") then
count:=(others=>'0');
tmp
count:=count+1;
end if;
end if;
end process p0; clk
p1:process(clk,rst,setsec,setmin,sethour)--校时注释见② variable s1,s0,m1,m0,h1,h0:std_logic_vector(3 downto 0); begin
if clk'event and clk='1' then
if rst='1' then
if setsec='1' then
s0:=s0+1;
if s0="1010" then s0:="0000";
s1:=s1+1;
if s1="0110" then
s1:="0000";
end if;
end if;
end if;
if setmin='1'
then m0:=m0+1;
if m0="1010"
then m0:="0000";
m1:=m1+1;
if m1="0110"
then m1:="0000";
end if;
end if;
end if;
if sethour='1' then
h0:=h0+1;
if h0="1010" then
h0:="0000";
h1:=h1+1;
if h0="0100"and h1="0010" then h0:="0000";h1:="0000";
end if;
end if;
end if;
else s0:=s0+1;--秒,分、时的计时注释见③
if s0="1010" then s0:="0000";
s1:=s1+1;
if s1="0110"then s1:="0000";
m0:=m0+1;
if m0="1010" then m0:="0000";
m1:=m1+1;
if m1="0110"
then m1:="0000";
h0:=h0+1;
if h0="1010" then h0:="0000";
h1:=h1+1;
if h0="0100"and h1="0010"
then h1:="0000";
h0:="0000";
end if;
end if;
end if;
end if;
end if;
end if;
end if;
sec0
sec1
min0
min1
hr0
hr1
end if;
if clk1'event and clk1='1' then --报时注释见④
if m1="0101" and m0="1001" and s1="0101" then
if s0="0101" or s0="0110" or s0="0111" or s0="1000" or s0="1001" speaker
else speaker
end if;
end if;
end if;
end process; then
led1:led port map(data=>sec0, a=>a1,
b=>b1,
c=>c1,
d=>h1,
e=>e1,
f=>f1,
g=>g1);
led2:led port map(data=>sec1, a=>a2,
b=>b2,
c=>c2,
d=>h2,
e=>e2,
f=>f2,
g=>g2);
led3:led port map(data=>min0, a=>a3, b=>b3, c=>c3, d=>h3, e=>e3, f=>f3,
g=>g3);
led4:led port map(data=>min1, a=>a4, b=>b4, c=>c4, d=>h4, e=>e4, f=>f4,
g=>g4);
led5:led port map(data=>hr0, a=>a5, b=>b5, c=>c5, d=>h5, e=>e5, f=>f5,
g=>g5);
led6: led port map(data=>hr1, a=>a6,
b=>b6, c=>c6, d=>h6, e=>e6, f=>f6, g=>g6);
end architecture one;