第一篇:基于FPGA的彩灯控制器设计
《EDA原理及应用》 课程设计报告
课题名称: 基于数码管显示的彩灯控制器 院 系: 机电工程学院
专 业: 电子信息工程
学生姓名: 陈纳爽 学生学号: 201033285123
彩灯及数码管显示控制
摘 要
随着科技的发展 , 在现代生活中, 彩灯作为一种景观应用越来越多。而在电子电路设计领域中,电子设计自动化(EDA)工具已成为主要的设计手段,VHDL语言则是EDA的关键技术之一,它采用自顶向下的设计方法,即从系统总体要求出发,自上至下地将设计任务分解为不同的功能模块,最后将各功能模块连接形成顶层模块,完成系统硬件的整体设计。本文介绍了基于EDA技的多路彩灯控制器的设计与分析。在MAX+PLUSII环境下采用VHDL语言实现,论述了基于VHDL语言和FPGA芯片的数字系统设计思想和实现过程。电子设计自动化技术EDA的发展给电子系统的设计带来了革命性的变化,EDA软件设计工具,硬件描述语言,可编程逻辑器件使得EDA技术的应用走向普及。FPGA是新型的可编程逻辑器件,采用FPGA进行产品开发可以灵活地进行模块配置,大大缩短了产品开发周期,也有利于产品向小型化,集成化的方向发展。
关键词: VHDL 彩灯 仿真
1、概述
1.1、设计目的:
设计一个彩灯控制器,使彩灯(LED管)可以实现彩灯逐渐增多及两种不同频率的闪烁,有复位开关。整个系统有四个输入信号clk,option,fan,clr,三个输出信号控制俩个八路彩灯及数码管显示。option的高低电平控制彩灯闪烁的快慢,fan的高低电平控制彩灯的逐渐增多减少。
1.2、设计要求:
掌握FPGA 的程序设计方法。 掌握硬件描述语言语法。
程序设计完成后要求在软件中实现功能仿真。
2、系统设计
2.1、设计原理:
整个系统共有四个输入信号:基准时钟信号clk,系统清零信号(复位信号)clr,彩灯节奏快慢选择开关option;共有3个输出信号ledout[7..0],shuguan[6..0],doubleled[7..0],分别用于控制彩灯及数码管的显示。据此,我们可将整个彩灯控制器CDKZQ分为四大部分:彩灯花样控制部分、分频部分、定时部分和计数部分。当各个模块均完成上述操作之后,形成最后的彩灯显示系统,并且进行仿真。仿真通过,即可下载到指定的FPGA芯片里面,并进行实际连线,进行最后的硬件测试。把分频部分的不同频率的时钟信号CP输送到计数部分 ,从而控制彩灯闪烁速度的快慢 ,定时部分控制每种速度维持的时间长短。
原理图
模块原理图
管脚图
2.2、设计方案:
在电路中以 1 代表灯亮,以 0 代表灯灭,由 0、1按不同的规律组合代表不同的灯光图案,同时使其选择不同的频率,从而实现多种图案多种频率的花样功能显示。在该电路中只需简单的修改程序就可以灵活地调整彩灯图案和变化方式。下面就以一个彩灯控制系统的实现为例进行简单说明。此彩灯控制系统设定有两种花样变化。彩灯图案状态变换的速度有快、慢两种。
3、程序仿真图
start compilation先编译
generate functional simulation netlist然后生成功能仿真网络表 assignments–setting—simulation setting设置成功能仿真 然后新建一个vector waveform file 通过view—utility windows--node finder 把输入输出管脚添加进波形仿真图里 点击start simulation 得到仿真图WAVEFORM1:
4、实验结果分析
实验表明 ,此设计方法能够满足多种不同花样彩灯的变化要求 ,并且该方法便于扩展不同变化模式的彩灯花样,同时又实现了彩灯的两种不同频率的闪烁。如果不按任何按键时候,灯就按四种花样顺序循环跑,如果按下某个键再松开,比如按下C键然后松开,那么不管之前灯跑到哪个花样,按键后灯就会从C代表的花样处开始跑,然后是D花样,然后是A花样,依次循环。但是A,B,C,D认为是按下会弹起的按键,因为这个程序里,如果一直按着按键不松手,会导致灯只是反复跑一个花样。比如按着B键不松手,那么就会反复跑B花样。还有不能允许同时按下两个键,三个键,4个键,也就是说,同一时刻ABCD只能有一个是高电平,否则会出错,因为这个程序并没有防错机制。
5、心得体会
本次设计的课题是彩灯控制器的设计,当拿到这个课题的时候经过分析就知道关键是计数器和分频器的使用,分频的方法有很多种,对于同一种功能的实现,用VHDL可以采用多种方式进行描述,每种方式之间各有优劣,本次设计只采用了其中较简单的一种,应尽量用最简洁的语言写出所需功能的程序。
通过这次课程设计对EDA技术有了更进一步的熟悉,VHDL 语言和C语言等其他语言还是有很大的区别。VHDL是EDA技术的重要组成部分,其具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、结构化设计方面,表现了强大的生命力和应用潜力。其主要的也是最大的优点就在于设计者可以专心致力于其功能的实现,而不需要对不影响功能的与工艺有关的因素花费过多的时间和精力。在实际操作中发现设计和课本上的知识有很大联系,但又高于课本,一个简单的原理要把它应用以及和其他功能综合起来就有些困难。通过设计也巩固了我们的书本知识以及通过借阅书籍和上网查找资料,也丰富了自己对EDA的了解。
6、致谢
7、参考文献
[1] 周润景.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].电子工业出版社.2007,8
[2] 潘松 黄继业.EDA技术实用教程(第二版).北京:科学出版社,2006.9 [3] 林明权 马维旻 VHDL数字控制系统设计范例.电子工业出版社2003,1 [4] 褚振勇.FPGA设计及应用(第三版)[M].西安电子科技大学出版社.2012,4
8、附录
彩灯显示控制器的源程序
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncomment the following library declaration if instantiating----any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;
entity colorled is
Port(clk : in STD_LOGIC;
clr : in STD_LOGIC;
option : in STD_LOGIC;
fan:in std_logic;
ledout:out STD_LOGIC_VECTOR(7 downto 0);
shuma:out std_logic_vector(6 downto 0);
doubleled:out std_logic_vector(7 downto 0));end colorled;architecture rtl of colorled is component timer is port(clk : in std_logic;
clr : in std_logic;
option : in std_logic;fan:in std_logic;fanout:out std_logic;clkout : out std_logic);end component timer;component shower is port(clk : in std_logic;
clr : in std_logic;
fanin:in std_logic;ledout:out std_logic_vector(7 downto 0);shuma:out std_logic_vector(6 downto 0);
doubleled:out std_logic_vector(7 downto 0));end component shower;signal clk_tmp:std_logic;signal fan_tmp:std_logic;begin U1:timer port map(clk,clr,option,fan,fan_tmp,clk_tmp);U2:shower port map(clk_tmp,clr,fan_tmp,ledout,shuma,doubleled);end rtl;以上为顶层文件代码
以下为分频计数模块及彩灯显示控制模块的代码 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;----Uncomment the following library declaration if instantiating----any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity timer is
Port(clk : in STD_LOGIC;--时钟
clr : in STD_LOGIC;--复位
fan:in std_logic;
fanout:out std_logic;
option : in STD_LOGIC;--快慢分频
clkout : out STD_LOGIC);--输出时钟 end timer;architecture rtl of timer is signal clk_tmp:std_logic;signal fan_tmp:std_logic;--signal counter:std_logic_vector(1 downto 0);--计数器 signal counter:integer range 0 to 16000000;begin process(clk,clr,option)begin
if clr='1' then
clk_tmp<='0';
counter<=0;elsif clk'event and clk='1' then
if option='0' then--四分频
if counter=16000000 then
counter<=0;clk_tmp<=not clk_tmp;else
counter<=counter+1;
end if;
else--八分频
if counter=8000000 then
counter<=0;clk_tmp<=not clk_tmp;else
counter<=counter+1;end if;
end if;end if;end process;--begin--
if clr='1' then--
clk_tmp<='0';--
counter<=“00”;--elsif clk'event and clk='1' then--
if option='0' then--四分频----------
if counter=“01” then
counter<=“00”;clk_tmp<=not clk_tmp;else
counter<=counter+'1';------------------
end if;
else--八分频
if counter=“11” then
counter<=“00”;clk_tmp<=not clk_tmp;else
counter<=counter+'1';end if;
end if;--end if;--end process;clkout<=clk_tmp;--输出分频时钟 fan_tmp<=fan;fanout<=fan_tmp;end rtl;
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;----Uncomment the following library declaration if instantiating----any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;
entity shower is
Port(clk : in STD_LOGIC;
clr : in STD_LOGIC;
fanin:in std_logic;
ledout:out STD_LOGIC_VECTOR(7 downto 0);出
doubleled:out std_logic_vector(7 downto 0));
shuma:out std_logic_vector(6 downto 0);--8位彩灯输end shower;
architecture rtl of shower is type states is
(s0,s1,s2,s3,s4,s5,s6,s7);--Moore状态 signal state:states;begin process(clk,clr,fanin)begin
if clr='1' then
state<=s0;
ledout<=“00000000”;
doubleled<=“00000000”;
shuma<=“0000000”;
elsif clk'event and clk='1' then
case state is
when s0=>
if fanin='1' then
state<=s7;
ledout<=“11111110”;
doubleled<=“11111110”;
shuma<=“1111001”;
else
state<=s1;
ledout<=“00000000”;
doubleled<=“00000000”;
shuma<=“0000000”;end if;when s1=> if fanin='1' then
state<=s0;
ledout<=“00000000”;
doubleled<=“00000000”;
shuma<=“0000000”;else
state<=s2;
ledout<=“10000000”;
doubleled<=“10000000”;
shuma<=“1111000”;
end if;
when s2=> if fanin='1' then
state<=s1;
ledout<=“10000000”;
doubleled<=“10000000”;
shuma<=“1111000”;
else
state<=s3;
ledout<=“11000000”;
doubleled<=“11000000”;
shuma<=“0000010”;
end if;
when s3=>
if fanin='1' then
state<=s2;
ledout<=“11000000”;
doubleled<=“11000000”;
shuma<=“0000010”;
else
state<=s4;
ledout<=“11100000”;
doubleled<=“11100000”;
shuma<=“0010010”;end if;when s4=> if fanin='1' then
state<=s3;
ledout<=“11100000”;
doubleled<=“11100000”;
shuma<=“0010010”;else
state<=s5;
ledout<=“11110000”;
doubleled<=“11110000”;
shuma<=“0011001”;
end if;when s5=> if fanin='1' then
state<=s4;
ledout<=“11110000”;
doubleled<=“11110000”;
shuma<=“0011001”;else
state<=s6;
ledout<=“11111000”;
doubleled<=“11111000”;
shuma<=“0110000”;end if;when s6=> if fanin='1' then
state<=s5;
ledout<=“11111000”;
doubleled<=“11111000”;
shuma<=“0110000”;else
state<=s7;
ledout<=“11111100”;
doubleled<=“11111100”;
shuma<=“0100100”;end if;
when s7=>
if fanin='1' then
state<=s6;
ledout<=“11111100”;
doubleled<=“11111100”;
shuma<=“0100100”;
else
state<=s0;
ledout<=“11111110”;
doubleled<=“11111110”;
shuma<=“1111001”;
end if;
end case;end if;end process;end rtl;
第二篇:基于FPGA的彩灯控制器设计
郑州轻工业学院
可编程数字系统设计
题 目 学生姓名 专业班级 学 号 院(系)指导教师 完成时间
基于FPGA的彩灯控制器的设计 张焕焕 电子信息工程10-2班 电气信息工程学院
基于FPGA的彩灯控制器设计
摘 要
随着科技的发展 , 在现代生活中, 彩灯作为一种景观应用越来越多。而在电子电路设计领域中,电子设计自动化(EDA)工具已成为主要的设计手段,VHDL语言则是EDA的关键技术之一,它采用自顶向下的设计方法,即从系统总体要求出发,自上至下地将设计任务分解为不同的功能模块,最后将各功能模块连接形成顶层模块,完成系统硬件的整体设计。本文介绍了基于EDA技的多路彩灯控制器的设计与分析。在MAX+PLUSII环境下采用VHDL语言实现,论述了基于VHDL语言和FPGA芯片的数字系统设计思想和实现过程。电子设计自动化技术EDA的发展给电子系统的设计带来了革命性的变化,EDA软件设计工具,硬件描述语言,可编程逻辑器件使得EDA技术的应用走向普及。FPGA是新型的可编程逻辑器件,采用FPGA进行产品开发可以灵活地进行模块配置,大大缩短了产品开发周期,也有利于产品向小型化,集成化的方向发展。
关键词: VHDL 彩灯 仿真
1、概述
1.1、设计目的:
设计一个彩灯控制器,使彩灯(LED管)可以实现四种花样循环变化及两种不同频率的闪烁,有复位开关。整个系统有七个输入信号CLK,CLR,A,B,C,D,OPT,六个输出信号控制六个彩灯。OPT的高低电平控制彩灯闪烁的快慢,A,B,C,D控制各种不同花样彩灯的变换。此彩灯控制系统设定有四种花样变化。四种花样分别为:a.彩灯从左到右逐次亮起,再逐次从右到左熄灭;b.彩灯两边同时亮两个,再逐次向中间亮;c.彩灯从左到右两个两个的亮,再从右到左两个两个逐次的亮;d.彩灯中间两个亮,再同时向两边散开。
1.2、设计要求:
掌握FPGA 的程序设计方法。 掌握硬件描述语言语法。
程序设计完成后要求在软件中实现功能仿真。
2、系统设计
2.1、设计原理:
整个系统共有七个输入信号:基准时钟信号CLK,系统清零信号(复位信号)CLR,彩灯节奏快慢选择开关OPT;共有4个输出信号Q[3..0],分别用于控制四路彩灯。据此,我们可将整个彩灯控制器CDKZQ分为四大部分:彩灯花样控制部分、分频部分、定时部分和计数部分。当各个模块均完成上述操作之后,形成最后的四路彩灯显示系统,并且进行仿真。仿真通过,即可下载到指定的FPGA芯片里面,并进行实际连线,进行最后的硬件测试。把分频部分的不同频率的时钟信号CP输送到计数部分 ,从而控制彩灯闪烁速度的快慢 ,定时部分控制每种速度维持的时间长短。
图表 1 2.
2、设计方案:
在电路中以 1 代表灯亮,以 0 代表灯灭,由 0、1按不同的规律组合代表不同的灯光图案,同时使其选择不同的频率,从而实现多种图案多种频率的花样功能显示。在该电路中只需简单的修改程序就可以灵活地调整彩灯图案和变化方式。下面就以一个四路彩灯控制系统的实现为例进行简单说明。此四路彩灯控制系统设定有四种花样变化。彩灯图案状态变换的速度有快、慢两种。
3、程序仿真过程
start compilation先编译
generate functional simulation netlist然后生成功能仿真网络表 assignments–setting—simulation setting设置成功能仿真 然后新建一个vector waveform file 通过view—utility windows--node finder 把输入输出管脚添加进波形仿真图里 点击start simulation 得到仿真图WAVEFORM1:
由图可见:正常情况下 灯按照花样abcd的顺序循环d在80NS---120NS的高电平使得花样变为D花样,D高电平结束,灯顺序进行A花样。
OPT 在80NS---170NS高电平使得灯变换速度提高2倍 但是001100和100000这两种灯的状态任然占用了两个时钟周期,这是因为花样d和花样a状态转换之间没有立即衔接,导致220NS处CLR高电平使得灯全部清0,不再变化DIV2是二分频输出,由图可见是输入时钟CLK的二分频
4、实验结果分析
实验表明 ,此设计方法能够满足多种不同花样彩灯的变化要求 ,并且该方法便于扩展不同变化模式的彩灯花样,同时又实现了彩灯的两种不同频率的闪烁。如果不按任何按键时候,灯就按四种花样顺序循环跑,如果按下某个键再松开,比如按下C键然后松开,那么不管之前灯跑到哪个花样,按键后灯就会从C代表的花样处开始跑,然后是D花样,然后是A花样,依次循环。但是A,B,C,D认为是按下会弹起的按键,因为这个程序里,如果一直按着按键不松手,会导致灯只是反复跑一个花样。比如按着B键不松手,那么就会反复跑B花样。还有不能允许同时按下两个键,三个键,4个键,也就是说,同一时刻ABCD只能有一个是高电平,否则会出错,因为这个程序并没有防错机制。
5、心得体会
本次设计的课题是彩灯控制器的设计,当拿到这个课题的时候经过分析就知道关键是计数器和分频器的使用,分频的方法有很多种,对于同一种功能的实现,用VHDL可以采用多种方式进行描述,每种方式之间各有优劣,本次设计只采用了其中较简单的一种,应尽量用最简洁的语言写出所需功能的程序。
通过这次课程设计对EDA技术有了更进一步的熟悉,VHDL 语言和C语言等其他语言还是有很大的区别。VHDL是EDA技术的重要组成部分,其具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、结构化设计方面,表现了强大的生命力和应用潜力。其主要的也是最大的优点就在于设计者可以专心致力于其功能的实现,而不需要对不影响功能的与工艺有关的因素花费过多的时间和精力。在实际操作中发现设计和课本上的知识有很大联系,但又高于课本,一个简单的原理要把它应用以及和其他功能综合起来就有些困难。通过设计也巩固了我们的书本知识以及通过借阅书籍和上网查找资料,也丰富了自己对EDA的了解。
6、致谢
7、参考文献
[1] 周润景.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].电子工业出版社.2007,8
[2] 潘松 黄继业.EDA技术实用教程(第二版).北京:科学出版社,2006.9 [3] 林明权 马维旻 VHDL数字控制系统设计范例.电子工业出版社2003,1 [4] 褚振勇.FPGA设计及应用(第三版)[M].西安电子科技大学出版社.2012,4
8、附录
彩灯控制器的源程序
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity horseracelamp is port(clk:in std_logic;clr:in std_logic;a:in std_logic;b:in std_logic;c:in std_logic;d:in std_logic;opt:in std_logic;q:out std_logic_vector(5 downto 0);div2:out std_logic);end;architecture one of horseracelamp is
type states is(s0,s1,s2,s3);
signal present:states;
signal q1:std_logic_vector(5 downto 0);
signal count:std_logic_vector(3 downto 0);
signal halfclk:std_logic_vector(1 downto 0);
signal clkin:std_logic_vector(1 downto 0);begin
process(clk)--------------------该进程实现二分频 begin if clk'event and clk='1' then
halfclk<=halfclk+1;end if;end process;
process(opt)---------------------该进程实现OPT高时候用原来的时钟,OPT低的时候用二分频后的时钟,信号CLKIN(0)会传递到下一个进程里
begin
if opt='0' then
clkin(0)<=halfclk(0);
else
clkin(0)<=clk;
end if;
end process;
process(clk,clr,a,b,c,d)
------------S1,S2,S3,S4分别对应
A,B,C,D四种花样,它们之间会自动按顺序循环,也
会因为A,B,C,D中某个置高而改变循环顺序,所以用了大量的IF ELSIF语句
begin if clr='1' then
present<=s0;
q1<=(others=>'0');elsif clkin(0)'event and clkin(0)='1' then
case present is
when s0=>if q1=“000000”then
q1<=“100000”;else
if count=“1100” then
count<=(others=>'0');q1<=“100001”;present<=s1;
elsif b='1'then
count<=(others=>'0');
q1<=“100001”;
present<=s1;
elsif c='1'then
count<=(others=>'0');
q1<=“110000”;
present<=s2;
elsif d='1'then count<=(others=>'0');
q1<=“001100”;
present<=s3;
else
case count is when “0000”=>q1<=“100000”;when “0001”=>q1<=“110000”;when “0010”=>q1<=“111000”;when “0011”=>q1<=“111100”;when “0100”=>q1<=“111110”;when “0101”=>q1<=“111111”;when “0110”=>q1<=“111110”;when “0111”=>q1<=“111100”;when “1000”=>q1<=“111000”;when “1001”=>q1<=“110000”;when “1010”=>q1<=“100000”;when “1011”=>q1<=“000000”;when others=>null;end case;
count<=count+1;present<=s0;
end if;end if;
when s1=>if count=“0011” then
count<=(others=>'0');q1<=“110000”;present<=s2;elsif a='1'then
count<=(others=>'0');
q1<=“100000”;
present<=s0;
elsif c='1'then
count<=(others=>'0');
q1<=“110000”;
present<=s2;
elsif d='1'then count<=(others=>'0');
q1<=“001100”;
present<=s3;
else
case count is when “0000”=>q1<=“100001”;when “0001”=>q1<=“110011”;when “0010”=>q1<=“111111”;when others=>null;end case;
count<=count+1;present<=s1;
end if;
when s2=>if count=“0110” then
count<=(others=>'0');q1<=“001100”;present<=s3;elsif a='1'then
count<=(others=>'0');
q1<=“100000”;
present<=s0;
elsif b='1'then
count<=(others=>'0');
q1<=“100001”;
present<=s1;
elsif d='1'then count<=(others=>'0');
q1<=“001100”;
present<=s3;
else
case count is
when “0000”=>q1<=“110000”;when “0001”=>q1<=“111100”;when “0010”=>q1<=“111111”;when “0011”=>q1<=“000011”;when “0100”=>q1<=“001100”;when “0101”=>q1<=“110000”;when others=>null;end case;
count<=count+1;present<=s2;
end if;
when s3=>if count=“0011” then
count<=(others=>'0');q1<=“100000”;present<=s0;elsif a='1'then
count<=(others=>'0');
q1<=“100000”;
present<=s0;
elsif b='1'then
count<=(others=>'0');
q1<=“100001”;
present<=s1;
elsif c='1'then count<=(others=>'0');
q1<=“110000”;
present<=s2;
else
case count is when “0000”=>q1<=“001100”;when “0001”=>q1<=“010010”;when “0010”=>q1<=“100001”;when others=>null;end case;
count<=count+1;present<=s3;
end if;
end case;
end if;
end process;
div2<=halfclk(0);
q<=q1;
end;
第三篇:基于FPGA的交通灯控制器设计
数字系统课程设计
基于FPGA的交通控制灯设计
姓名:
学号:
班级:
摘要
随着社会的发展,城市规模的不断扩大,城市交通成为制约城市发展的一大因素。人口和汽车日益增长,市区交通也日益拥挤,人们的安全问题当然也日益重要。因此,红绿交通信号灯成为交管部门管理交通的重要工具之一。有了交通灯,人们的安全出行也有了很大的保障。自从交通灯诞生以来,其内部的电路控制系统就不断的被改进,设计方法也开始多种多样,从而使交通灯显得更加智能化。尤其是近几年来,随着电子与计算机技术的飞速发展,电子电路分析和设计方法有了很大的改进,电子设计自动化也已经成为现代电子系统中不可或缺的工具和手段,这些都为交通灯控制系统的设计提供了一定的技术基础。本课程设计运用erilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示,并最后进行了软件实现,达到了系统要求的功能。
设计原理
1.1设计要求
设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数 主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。能实现特殊状态的功能显示,1.2设计思路和原理
本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。循环往复的直行这个过程。其过程如下图所示:
0s主干道方向25s绿灯亮30s红灯亮黄灯亮65s支干道方向0s红灯亮35s绿灯亮黄灯亮60s65s
图1.交通灯点亮时间控制说明
1.3实现方法
本次采用文本编辑法,即利用Verilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
Verilog HDL程序设计
2.1整体设计
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
状状00状状00状状10状状11状状01状状01状状11状状10状状状状状状状状状状001状状状状状010状状状状状100状状状状状010状状状状状状状状状状100状状状状状010状状状状状001状状状状状010
图2.交通灯控制状态转化
说明:该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。进入10状态两路黄灯亮起。结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
holdrst状状状状1Hz状状状状状状状状状状状状状状状状状状状clk1KHz状状状状状状状1Hz状状状状状状状状状状状状状状状状状状状状状 图3.交通灯控制系统结构图
其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
2.2 具体设计
根据整体设计要求,编写各个功能部分Verilog HDL程序,设置各输入输出变量说明如下 clk: 为计数时钟; qclk:为扫描显示时钟;
en: 使能信号,为1 的话,则控制器开始工作; rst: 复位信号,为1的话,控制及技术回到初始状态;
hoid:特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
light1: 控制主干道方向四盏灯的亮灭;其中,light1[0]~light[2],分别控制主干道方向的 绿灯、黄灯和红灯;
light2: 控制支干道方向四盏灯的亮灭;其中,light2[0] ~ light2[2],分别控制支干道方向的 绿灯、黄灯和红灯;
num1: 用于主干道方向灯的时间显示,8 位,可驱动两个数码管; num2: 用于支干道方向灯的时间显示,8 位,可驱动两个数码管; counter:用于数码管的译码输出; st1,st2:数码管扫描信号。输入输出及中间变量设置如下:
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
1.二极管点亮控制
该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。此外,当检测到特殊情况(hold=‘1’)发生时,无条件点亮红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00状态。因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体程序如下: 1)主干道方向 always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin light1<=3'b001;num1<=green1;end else if(hold)begin light1<=3'b100;num1<=green1;end else if(en)
begin //使能有效开始控制计数
if(!tim1)//
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end 2)支干道方向
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
2.倒数计时
该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:
always @(posedge clk)begin else begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end end
3.数码管的译码及扫描显示
该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩余时间。译码的时钟频率要低,为Hz级。扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示: always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule 总体程序见程序清单所示
仿真与硬件调试
3.1 波形仿真
在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。设置仿真时间,时钟周期,输入输出端口,进行波形仿真。具体仿真波形图及说明如下所示: 仿真截止时间:100us; 时钟:clk 1us,qclk 0.1us 1.正常工作时波形仿真图
图4.正常工作时波形仿真图
图形说明
波形仿真主要完成了控制与计数以及数码管显示的波形图。en为低电品时,计数器置初值,高电平时开始正常控制与计数。控制发光二极管首次输出为“light1=001,light2=100”,表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从“00110101”开始递减计数,计数至“00000000”时,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101”开始计数递减,计数至”00000000”时进入下一个状态,light=100,light2=001,表示主干道路红灯亮,支杆道路绿灯亮。Counter根据num1,num2变化随时钟上升沿输出译码后的数据。由于屏幕显示大小有限,未仿真出一个完整周期。
2.特殊情况仿真波形
图5.特殊情况仿真波形
图形说明
当hold输入高电平时,在时钟上升沿的控制下,light 1与light2被强制置位为”100”,表示两路红灯均亮起
3.复位情况仿真波形
图6.复位情况仿真波形
图形说明
当rst输入高电平时,在时钟上升沿控制下,计数与控制都回到00状态,即light1=001,light2=100,计数器num1和num2从“00110101”开始递减计数。3.2 硬件调试
完成时序仿真确认无误后,进行实验箱管脚设置,注意设置完成后一定要再进行一次全局仿真,使程序真正对应于硬件输出输出。具体连接说明如下所示
输入变量:rst、clk、qclk、hold、en 其中en,hold,rst接”0-1”拨码开关,以稳定的输出可变化的电平。计数时钟clk接实验箱上1Hz时钟,扫描显示时钟qclk接125Khz时钟。
输出变量:light1[2:0]、light2[2:0]、counter[6:0]、st1、st2 其中light1[0]、light2[0]分别接绿色的发光二极管;light1[1]、light2[1] 分别接黄色的发光二极管;light1[2]、light2[2]分别接红色的发光二极管。counter[0]~counter[6],分别接七段数码管的a~f,st1、st2分别接试验箱上”4-16”译码器的低两位。
完成接线后将程序烧写到芯片上,开始功能调试。分辨改变使能信号,复位信号以及特殊情况信号,观察数码管以及发光二级管情况。
程序清单
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
always @(en)if(!en)begin //设置计数初值 green1<=8'b00110101;red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;red2<=8'b00110101;yellow2<=8'b00000101;end
always @(posedge clk)begin if(rst)//复位与特殊情况控制
begin
light1<=3'b001;num1<=green1;
end else if(hold)
begin
light1<=3'b100;
num1<=green1;
end
else if(en)
begin //使能有效开始控制计数
if(!tim1)//开始控制
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end
else
begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
else
begin //倒数计时
if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4'b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule
总结
在设计中采用V erilog HDL语言设计交通灯控制系统, 借助其功能强大的语言结构, 简明的代码描述复杂控制逻辑设计, 与工艺无关特性, 在提高工作效率的同时达到求解目的, 并可以通过V erilog HDL 语言的综合工具进行相应硬件电路生成, 具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真出不了正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。实践证明,在编写一个较复杂的程序时,一开始一定要画流程图,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。在编写的时候要尤其要注意语言的规范,如本次设计中编写的V erilog在Quartus8.1中可以正常生成时序图,而在低版本的软件中却无法生成,原因就是语言使用不规范,在解决这个问题时我总结了一些经验,首先程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
完成仿真后进行,进行试验箱上的硬件调试,该步骤主要是要求细心,按照引脚清单,逐一完成连线,本次设计用到两个时钟输入,注意一定要选择合适频率的时钟,以便达到期望的效果。注意观察实物的现象,看是否满足设计要求,不满足时检查是硬件问题还是程序问题,如果是程序问题,在修改完之后必须要重新编译,重新烧入。不断排查错误,直至达到满意的效果。
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对Verilog HDL硬件描述语言的理解,提高了动手能力,并且锻炼了自己的耐心,收获颇丰,我会把在本次课程设计中学到的东西应用到今后的工作学习中。
参考资料
[1] 夏宇闻.复杂数字电路与系统的V erilog HDL设计技术 [M ].北京: 北京航空航天大学出版社, 1998 [2] 郭梯云.移动通信[M ].西安: 西安电子科技大学出版社, 1995 [3] [法]M ichelMouly, M arie Bernadet te Pautet1GSM 数字移动通信系统[M ].骆健霞, 顾龙信, 徐云霄译.北京: 电子工业出版社, 1996 [4] 张毅刚, 乔立岩.虚拟仪器软件开发环境L abW indow söCV I 610 编程指南[M ].北京: 机械工业出版社, 2002 [5] 刘国权.GSM 手机的测试[J ].中国无线电管理, 2003 [6] 俞定玖, 刘湘慧.GSM 数字蜂窝移动交换系统测试[J ].电信科学, 2000 [7] 张明.V erilog HDL 实用教程[M ].成都: 电子科技大学出版社, 1999 [8] Hyde D C.Bucknell Handbook on V erilog HDL 1Computer Science Department, Bucknell U niversity L ew is burg, 1995 [9] 康华光.电子技术基础(数字部分)[M ].北京: 高等教育出版社, 1988
第四篇:EDA课程设计彩灯控制器
沈阳理工大学EDA技术课程设计报告
1设计目的
熟练掌握EDA技术利用计算机方面的课程解决专业课程方面点具体问题,达到解决问题,完成课程设计任务,培养实践的目的。
2设计要求和任务
利用所学的EDA设计方法设计彩灯控制器,熟练使用使用QUARTUSII应用软件,进一步学习使用VHDL语言、原理图等EDA设计方法进行综合题目的方法。
功能要求: 1.要有多种花型变化(至少4种).2.多种花型可以自动变换,循环往复.3.彩灯变换的快慢节拍可以选择.4.具有清零开关.总体设计思路及原理描述
3.1功能描述
在电路中以 1 代表灯亮,以 0 代表灯灭,由 0,1按不同的规律组合代表不同的灯光图案,同时使其选择不同的频率,从而实现多种图案多种频率的花样功能显示。在该电路中只需简单的修改程序就可以灵活地调整彩灯图案和变化方式。下面就以一个十六路彩灯控制系统的实现为例进行简单说明。此十六路彩灯控制系统设定有六种花样变化 ,这六种花样可以进行自动切换 ,并且每种花样可以选择不同的频率。
3.2设计原理
用VHDL进行设计 ,首先应该了解 ,VHDL语言一种全方位硬件描述语言 ,包括系统行为级 ,寄存传输级和逻辑门级多个设计层次。应充分利用DL “自顶向下” 的设计优点以及层次化的设计概层次概念对于设计复杂的数字系统是非常
沈阳理工大学EDA技术课程设计报告
有用它使得人们可以从简单的单元入手 ,逐渐构成庞大而复杂的系统。首先应进行系统模块的划分 ,规定每一模块的功能以及各个模块之间的接口。最终设计方案为:以一个十六路彩灯花样控制器、一个四频率输出分频器 ,一个四选一控制器和一个时间选择器总共四部分来完成设计。四选一控制器从分频器选择不同频率的时钟信号输送到彩灯花样控制器 ,从而达到控制彩灯闪烁速度的快慢 ,时间选择器控制每种速度维持的时间长短。整个十六路彩灯控制系统设计的模块图如图 1所示
图一
4分层次方案设计及代码描述
4.1子模块及其功能
本次设计分为四个子模块 ,即十六路彩灯花样控制器、四频率输出分频器 ,四选一控制器和时间选择器 ,其子模块及其功能如下: 2
沈阳理工大学EDA技术课程设计报告
4.1.1四频率输出分频器
在本次设计中 ,设计了六种花样 ,要求这六种花样以不同的频率显示 ,而只有一个输入的时钟信号 ,所以对所输入的时钟信号进行 2 分频 ,4 分频 ,8分频 ,16分频 ,得到四种频率信号 ,CLKDIV模块用来完成此功能。
4.1.2时间选择器
时间选择器实际上是两个分频器 ,其中一个频率是另一个频率的两倍。本来这两个分频器是可以在上述的四频率输出器中实现的 ,但为了方便地为四选一控制器提供不同的时间选择条件 ,就将这两个分频器独立开来。这两个输出的时钟信号组合起来就可以为四选一控制器提供 00,01,10,11 四个时间选择条件 ,如
下图三所示。
图二
4.1.3四选一控制器
四选一控制器功能是从分频器中选择不同频率的时钟信号送给彩灯控制器 ,实现彩灯闪烁的频率变化。
4.1.4彩灯控制器
彩灯控制电路是整个设计的核心 ,它负责整个设计的输出效果即各种彩灯图案的样式变化。该程序充分地说明了用 VHDL设计电路的 “弹” 性 ,即可通过改变程序中输出变量 Q 的位数来改变彩灯的数目。其中 ,P1进程对灯闪的速度控制有两种方式可改变灯闪的速度:一是改变外部时钟的赋值 ,二是改变信号U 的位数。P2进程能进行彩灯的图案控制 ,改变 s的位数即可改变要控制图案的数目 ,改变输出变量 Q 的组合即可变幻彩灯图案。
最后 ,当各个模块均完成上述操作之后 ,即可利用MAXPLUS2的原理图输
沈阳理工大学EDA技术课程设计报告
入 ,调用各个元器件(底层文件),以原理图的形式形成最后的十六路彩灯显示系统(顶层文件),并且进行仿真。仿真通过 ,即可下载到指定的 CPLD芯片里面 ,并进行实际连线 ,进行最后的硬件测试。当然 ,可以将各个模块所生成的元件符号存放在元件库中 ,用以被其它人或其它的设计所重复调用 ,以简化后面的设计。
4.2 代码描述
4.2.1 时序控制电路部分
程序如下: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity timecontrol is--定义实体 port(clk: in std_logic;--时钟信号 clr: in std_logic;--复位信号 opt: in std_logic;--快慢控制信号 clkout: out std_logic--输出时钟信号);end timecontrol;architecture one of timecontrol is signal clk_tmp: std_logic;signal counter: std_logic_vector(1 downto 0);--定义计数器 begin process(clk,clr,opt)begin 4
沈阳理工大学EDA技术课程设计报告
if clr='0' then--清零 clk_tmp<='0';counter<=“00”;elsif clk'event and clk='1' then if opt='0' then--四分频 if counter=“01” then counter<=“00”;clk_tmp<=not clk_tmp;else counter<=counter+'1';end if;else--八分频 if counter=“11” then counter<=“00”;clk_tmp<=not clk_tmp;else counter<=counter+'1';end if;end if;end if;end process;clkout<=clk_tmp;--输出分频后的信号 end architecture one;
4.2.2显示控制电路部分
程序如下: library ieee;use ieee.std_logic_1164.all;
沈阳理工大学EDA技术课程设计报告
entity showcontrol is port(clk: in std_logic;--输入时钟信号 clr: in std_logic;--复位信号
led: out std_logic_vector(15 downto 0));--彩灯输出
end showcontrol;architecture one1 of showcontrol is type states is--状态机状态列举(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15);signal state: states;begin process(clk,clr)begin
if clr='0'then state<=s0;led<=“***0”;elsif clk'event and clk='1'then case state is when s0=>state<=s1;led<= “***1”;when s1=> state<=s2;led<=“***1”;when s2=> state<=s3;led<=“***0”;when s3=> state<=s4;led<=“***1”;when s4=> state<=s5;6
沈阳理工大学EDA技术课程设计报告
led<=“***0”;when s5=>state<=s6;led<=“***1”;when s6=>state<=s7;led<=“***0”;when s7=>state<=s8;led<=“***1”;when s8=>state<=s9;led<=“***0”;when s9=>state<=s10;led<=“***1”;when s10=>state<=s11;led<=“***0”;when s11=>state<=s12;led<=“***1”;when s12=>state<=s13;led<=“***0”;when s13=>state<=s14;led<=“***1”;when s14=>state<=s15;led<=“***0”;when s15=>state<=s0;led<=“***1”;when others=>null;end case;end if;end process;end architecture one1;
沈阳理工大学EDA技术课程设计报告
4.2.3顶层电路部分
程序如下:
library ieee;use ieee.std_logic_1164.all;entity root is port(clk: in std_logic;clr: in std_logic;opt:in std_logic;led: out std_logic_vector(15 downto 0));--八路彩灯输出 end colorled;architecture one3 of root is component timecontrol is--定义元件:时序控制电路 port(clk: in std_logic;clr: in std_logic;opt:in std_logic;clkout: out std_logic);end component timecontrol;component showcontrol is--定义元件:显示电路
port(clk: in std_logic;clr: in std_logic;led: out std_logic_vector(15 downto 0));end component showcontrol;signal clk_tmp: std_logic;begin u1: timecontrol port map(clk=>clk,clr=>clr,opt=>opt,clkout=>clk_tmp);--例化时序控制模块
沈阳理工大学EDA技术课程设计报告
u2: showcontrol port map(clk=>clk_tmp,clr=>clr,led=>led);--例化显示电路模块 end architecture one3;
5各模块的时序仿真图
5.1时序控制电路timecontrol的仿真图如下:
图三
功能:时序控制电路metronome的功能是,用OPT控制输入信号CKL_IN的快慢节拍。而CLR是控制开关。且从图中可以看出,当复位信号为高电平时,电路时钟输出清零,当快慢信号OPT为低电平时,时序控制电路四分频起作用,当快慢信号OPT为高电平时,时序控制电路八分频起作用,仿真结果符合电路要求。
沈阳理工大学EDA技术课程设计报告
5.2 显示控制电路showcontrol的仿真图如下:
图四
功能:显示控制电路showcontrol的功能是控制花形的。且从图中可以看出,当复位信号有效时彩灯输出为零,否则,显示电路在十六种不同状态间转换。
5.3 顶层电路root系统的仿真图如下:
沈阳理工大学EDA技术课程设计报告
图五
功能:整个电路root系统是把showcontrol与timecontrol综合成一个电路。且从图中可以看出,从图中可以看出当OPT为高电平时彩灯状态转换慢,为低电平时转换要快,当复位信号有效时,所用输出都清零。
6总结
通过这次课程设计使我懂得了理论与实际相结合是很重要的,通过这次的课程设计,发现自己的实践经验还是不足的,以后多应该以理论为基础,然后应用到实践中来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
在这次的课程设计里深入的接触了运用电子集成元器件制作多路彩灯的过程,并和同学一起讨论用软件制作出了这一个多路彩灯控制系统。正所谓“纸上谈兵终觉浅,觉知此事要躬行。”学习任何知识,都要进行实践,只有那样才能达到事半功倍的效果。
沈阳理工大学EDA技术课程设计报告 参考文献
《EDA技术与数字系统设计》
邹彦主编
电子工业出版社
《EDA技术实用教程》,潘松、黄继业,科学出版社 《数字电子技术基础》(第五版),阎石,高等教育出版社
《电子设计自动化(EDA)手册》,王丹、童如松,电子工业出版社 《EDA技术程设计》,刘江海,华中科技大学出版社
第五篇:eda课程设计-彩灯控制器
1.设计目的
学习EDA开发软件和MAX+plus Ⅱ的使用方法,熟悉可编程逻辑器件的使用,通过制作来了解彩灯控制系统。2.设计题目描述和要求
1)设计一个彩灯控制器,使彩灯(LED管)能连续发出四种以上不同的显示形式;
2)随着彩灯显示图案的变化,发出不同的音响声。3)扩充其它功能。3.设计原理 3.1 方案论证
这次的彩灯设计采用的是分模块来完成的,包括分频器、计数器、选择器、彩灯控制器。其中彩灯控制器是用来输出不同的花样,彩灯控制器的输出则是用一个32进制的计数器来控制,扬声器的输出时用不同的频率来控制,所以用了一个集成分频器来使输入的频率被分为几种不同的频率,不同频率的选择性的输出则是用一个4选一的选择器来控制。基于上述的介绍本次的彩灯控制采用的模式6来进行显示。
图3-1-1 模式6结构图
3.2 模块设计
1)集成分频器模块
设计要求显示不同的彩灯的时候要伴随不同的音乐,所以设计分频器来用不同的频率控制不同的音乐输出。模块说明:
Rst:输入信号 复位信号 用来复位集成分频器的输出使输出为“0”,及没有音乐输出。
Clk:输入信号 模块的功能即为分频输入的频率信号。
Clk_
4、clk_
6、clk_
8、clk_10:输出信号 即为分频模块对输入信号clk的分频,分别为1/4分频输出、1/6分频输出、1/8分频输出、1/10分频输出。
图3-2-1 集成分频器
2)32进制计数器模块
32进制模块用来控制彩灯输出模块,即确定彩灯控制器的不同的输出。Rst:输入信号 复位信号 用来复位32进制使其输出为“00000”。Clk:输入信号 用来给模块提供工作频率。
Count_out[4..0]:输出信号 即为32进制计数器的输出。
图3-2-2 32进制计数器
3)彩灯控制模块
彩灯控制模块用来直接控制彩灯的输出,使彩灯表现出不同的花样。Rst:输入信号 使彩灯控制模块的输出为“00000000”,即让彩灯无输出。Input[4..0]:输入信号 不同的输入使彩灯控制模块有不同的输出即彩灯显示出不同的花样。
Output[7..0]:输出信号 直接与彩灯相连来控制彩灯。
图3-2-3 彩灯控制模块 4)4选1选择器模块
Rst:输入信号 复位信号 使选择器的输出为“0”。In1、in2、in3、in4:输入信号 接分频器的输出。
Inp[1..0]:输入信号 接4进制计数器的输出用来控制选择器的选择不同的输入选择不同的输出。
Output:输出信号 直接接扬声器即输出的是不同的频率来控制扬声器播放音乐。
图3-2-4 4选1选择器
5)4进制计数器模块
4进制计数器作为选择器的输入来控制选择器选择不同的频率作为输出控制扬声器工作。
Clk:输入信号 来为计数器提供工作频率。
Rst:输入信号 复位信号 使计数器的输出为“00”。
图3-2-5 4进制计数器
3.3 系统结构
整个系统就是各个分模块组成来实现最后的彩灯控制功能,系统又两个时钟来控制一个是控制32进制计数器即控制彩灯控制模块来实现彩灯的不同输出,另一个时钟为分频器的输入来进行分频处理,最后用来控制扬声器发出不同的音乐,具体分频处理的时钟的频率比实现彩灯控制的时钟频率要高。
图 3-3-1 系统功能模块
4.总结
这次的EDA课程设计有一周的时间,在这一周的时间里我们充分合理的安排了自己的时间来使本次的课程设计能够顺利的完成,当然我们在本次的设计中并不是一帆风顺的,我们遇到了一些的问题,例如我们开始时用的文本的方式用一个总的程序来完成,可以在设计的过程中我们发现程序编到后面变量越到很容易搞混淆同时各个进程间的联系也越来越模糊以至于后面我们自己都不知道程序的整体框图是什么,导致后面不能够继续下去,后面我们再一次对我们这次的设计题目进行了分析和整理,最后我和我的同伴决定采用分模块的方式来完成本次的课题设计,当然最重要的是分析各个模块间的关系。最后我们采用上面分析的结构框图。最后我们的设计很成功,仿真和硬件测试都是正确的,实现了我们的设计要求和目的。
在这次设计中我们收获了很多,首先最直接的收获就是我们巩固了这门课程所学过的知识,把它运用到了实践当中,并且学到了很多在书本撒和那个所没有学到的知识,通过查阅相关资料进一步加深了对EDA的了。总的来说,通过这次课程设计不仅锻炼了我们的动手和动脑能力,也使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,要把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。在我们的共同努力和指导老师的指引下我们圆满的完成了彩灯控制器的设计,实现了设计目的。
6附录一 程序:
---------------分频器模块----------LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY fenpinqi IS
PORT(clk,rst : IN std_logic;
clk_10,clk_4,clk_6,clk_8 : OUT std_logic);
END fenpinqi;
ARCHITECTURE cd OF fenpinqi IS begin p1:process(clk,rst)
variable a:integer range 0 to 20;
begin if rst='1' then
clk_4<='0';
-----
复位信号控制部分 else if clk'event and clk='1'then
if a>=3 then
a:=0;
clk_4<='1';
else
a:=a+1;
clk_4<='0';
end if;
end if;
end if;end process p1;
p2:process(clk,rst)
variable b:integer range 0 to 20;
begin if rst='1' then
clk_6<='0';
-----
复位信号控制部分
else if clk'event and clk='1'then
if b>=5 then
b:=0;
clk_6<='1';
else
b:=b+1;
clk_6<='0';
end if;
end if;
end if;end process p2;
p3:process(clk,rst)
variable c:integer range 0 to 20;
begin if rst='1' then
clk_8<='0';
-----else if clk'event and clk='1'then
if c>=7 then
c:=0;
clk_8<='1';
else
c:=c+1;
clk_8<='0';
end if;
end if;
end if;end process p3;
p4:process(clk,rst)
variable d:integer range 0 to 20;
begin if rst='1' then
clk_10<='0';
-----else if clk'event and clk='1'then
if d>=9 then
d:=0;
clk_10<='1';
else
复位信号控制部分7
复位信号控制部分
d:=d+1;
clk_10<='0';
end if;
end if;
end if;end process p4;end cd;
---------------4选1选择器--------LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY xzq4_1 IS
PORT(rst:in std_logic;
inp:in integer range 0 to 3;
in1,in2,in3,in4 : In std_logic;
output : OUT std_logic);
END xzq4_1;
ARCHITECTURE a OF xzq4_1 IS
BEGIN
PROCESS(rst,inp)BEGIN
if(rst='1')then output<='0';
else
case inp is
when 0=>output<=in1;
when 1=>output<=in2;
when 2=>output<=in3;
when 3=>output<=in4;
when others=>null;
end case;
end if;
END PROCESS;END a;
------------彩灯控制模块---------LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY caideng IS
PORT(input : IN INTEGER RANGE 0 TO 31;
rst:in std_logic;
output : OUT std_logic_vector(7 downto 0);
sm :out std_logic_vector(6 downto 0));
END caideng;
ARCHITECTURE a OF caideng IS
BEGIN
PROCESS(input)BEGIN
if rst='1' then output<=“00000000”;sm<=“0000000”;
else
case input is
when 0=>output<=“10000000”;sm<=“0000110”;
when 1=>output<=“01000000”;sm<=“0000110”;
when 2=>output<=“00100000”;sm<=“0000110”;
when 3=>output<=“00010000”;sm<=“0000110”;
when 4=>output<=“00001000”;sm<=“0000110”;
when 5=>output<=“00000100”;sm<=“0000110”;
when 6=>output<=“00000010”;sm<=“0000110”;
when 7=>output<=“00000001”;sm<=“0000110”;
when 8=>output<=“00010000”;sm<=“0011011”;
when 9=>output<=“00110000”;sm<=“0011011”;
when 10=>output<=“00111000”;sm<=“0011011”;
when 11=>output<=“01111000”;sm<=“0011011”;
when 12=>output<=“01111100”;sm<=“0011011”;
when 13=>output<=“01111110”;sm<=“0011011”;
when 14=>output<=“11111110”;sm<=“0011011”;
when 15=>output<=“11111111”;sm<=“0011011”;
when 16=>output<=“10000001”;sm<=“1001111”;
when 17=>output<=“11000001”;sm<=“1001111”;
when 18=>output<=“11000011”;sm<=“1001111”;
when 19=>output<=“11100011”;sm<=“0011011”;
when 20=>output<=“11100111”;sm<=“1001111”;
when 21=>output<=“11110111”;sm<=“1001111”;
when 22=>output<=“11111111”;sm<=“1001111”;
when 23=>output<=“00001000”;sm<=“1001111”;
when 24=>output<=“00000001”;sm<=“0100110”;
when 25=>output<=“00000010”;sm<=“0100110”;
when 26=>output<=“00000100”;sm<=“0100110”;
when 27=>output<=“00001000”;sm<=“0100110”;
when 28=>output<=“00010000”;sm<=“0100110”;
when 29=>output<=“00100000”;sm<=“0100110”;
when 30=>output<=“01000000”;sm<=“0100110”;
when 31=>output<=“10000000”;sm<=“0100110”;
when others=>null;
end case;
end if;
end process;end a;
-------------32进制计数器模块----
LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY counter_32 IS
PORT(clk,rst : IN std_logic;
count_out : OUT integer range 0 to 31);
END counter_32;
ARCHITECTURE a OF counter_32 IS BEGIN PROCESS(rst,clk)
variable temp:integer range 0 to 32;BEGIN
IF rst='1' THEN
temp:=0;
ELSIF(clk'event and clk='1')THEN
temp:=temp+1;
if(temp=32)then
temp:=0;
end if;
END IF;
count_out<=temp;END PROCESS;
END a;
------------4进制计数器模块---LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY counter_4 IS
PORT(clk,rst : IN std_logic;
count_out : OUT integer range 0 to 3);
END counter_4;
ARCHITECTURE a OF counter_4 IS BEGIN
PROCESS(rst,clk)
variable temp:integer range 0 to 32;BEGIN
IF rst='1' THEN
temp:=0;
ELSIF(clk'event and clk='1')THEN
temp:=temp+1;
if(temp=4)then
temp:=0;
end if;
END IF;
count_out<=temp;END PROCESS;END a;
7附录二 编译
7附录三 时序仿真