分享好友 天南地北首页 网站导航

EDA课程设计:彩灯控制器

网友发布 2023-07-29 01:58 · 头闻号仪器机械

以前做的设计,粘贴时图形没出来,参考一下,记得给分啊

一.设计目的

1、学习EDA开发软件和MAX+plus Ⅱ的使用方法,熟悉可编程逻辑器件的使用,通过制作来了解彩灯控制系统。

2、进一步掌握数字电路课程所学的知识。

3、了解数字电路设计的一般思路,进一步解决和分析问题。

4、培养自己的编程和谨慎的学习态度

二、.设计题目内容和要求

(1)课题内容:

用EDA技术设计一个彩灯控制器,使彩灯(LED管)能连续发出三种以上不同的花型(自拟);

随着彩灯显示图案的变化,发出不同的音响声。

要求使用7段数码管显示当前显示的花型,如第一种花型显示A1,第二种花型显示b2,第三种花型显示C3

(2)主要任务:完成该系统的硬件和软件的设计,并利用实验箱制作出实物演示,调试好后并能实际运用(指导教师提供制作所需的器件),最后就课程设计本身提交一篇课程设计报告。

三、总体方案设计与选择

1 总体方案的设计

方案一:电路分为三个部分:彩灯花型模块、声音模块,时钟模块。用时钟控制声音和花型,整体使用相同的变量与信号,主体框图如下;

图三—1-1方案一的的流程图

方案二:电路分为五个模块:分频器模块、16进制计数器、4进制计数器,4选1选择器、彩灯控制器。其中彩灯控制器是用来输出不同的花样,彩灯控制器的输出则是用一个16进制的计数器来控制,扬声器的输出时用不同的频率来控制,所以用了一个集成分频器来使输入的频率被分为几种不同的频率,不同频率的选择性的输出则是用一个4选一的选择器来控制。整体框图如下:

图三—1-2方案二的流程图

2、方案的选择

方案一是将融合在一起,原理思路简单,元件种类使用少,但是在编程时要使用同一变量和信号,这样就会给编程带来很大的困难,另外中间单元连线较多,不容易检查,门电路使用较多,电路的抗干扰能力会下降。

方案二将彩灯花型控制与声音控制分开,各单元电路只实现一种功能,电路设计模块化,且编程时将工作量分开,出现错误时较容易检查,连线较少且容易组装和调试。

结合两个方案的优缺点,我选择容易编程、组装和调试的方案二。

四、模块电路的设计

1、分频器模块

设计要求显示不同的彩灯的时候要伴随不同的音乐,所以设计分频器来用不同的频率控制不同的音乐输出。

模块说明:

Rst:输入信号 复位信号 用来复位分频器的输出使输出为“0”,及没有音乐输出。

Clk:输入信号 模块的功能即为分频输入的频率信号。

Clk_4、clk8、clk_12、clk_16:输出信号 即为分频模块对输入信号clk的分频,分别为1/4分频输出、1/8分频输出、1/12分频输出、1/16分频输出。不同的频率会发出不同的声音。如图

图四-1分频器电路图

2、16进制计数器

16进制模块用来控制彩灯输出模块,即确定彩灯控制器的不同的输出。

Rst:输入信号 复位信号 用来复位16进制使其输出为“00000”,即彩灯不亮。

Clk1:输入信号 用来给模块提供工作频率。

Count_out[3..0]:输出信号 即为16进制计数器的输出,此输出信号作为彩灯的输入信号。

如图四-2

图四-2 16进制计数器电路图

3、4进制计数器模块

4进制计数器作为选择器的输入来控制选择器选择不同的频率作为输出控制扬声器工作。

Clk2:输入信号 来为计数器提供工作频率。

Rst:输入信号 复位信号 使计数器的输出为“00”。

如图四-3

图四-3 4进制计数器电路图

4、4选1选择器模块

Rst:输入信号复位信号使选择器的输出为“0”。

In1、in2、in3、in4:输入信号接分频器的输出。

Inp[1..0]:输入信号接4进制计数器的输出用来控制选择器的选择不同的输入选择不同的输出。

Output2:输出信号直接接扬声器即输出的是不同的频率来控制扬声器播放声音

如图四—4

图四—4 4选1选择器电路图

5、彩灯控制模块

彩灯控制采用的模式6来进行显示。

图四—5—1模式6结构图

彩灯控制模块用来直接控制彩灯的输出,使彩灯表现出不同的花样。

Rst:输入信号 使彩灯控制模块的输出为“00000000”,即让彩灯无输出。

Input[4..0]:输入信号 不同的输入使彩灯控制模块有不同的输出即彩灯显示出不同的花样。

Output3[7..0]:输出信号 直接与数码管相连来控制数码管。

如图四—5—2

图四-5-2 彩灯控制电路图

五、EDA设计与仿真

1、源程序:

----------------------------------------------分频器模块-----------------------------------------

LIBRARYieee;

USEieee.std_logic_1164.all;

ENTITYfenpinqi IS

PORT

(

clk2,rst :IN std_logic;

clk_12,clk_4,clk_16,clk_8 : OUT std_logic

);

ENDfenpinqi;

ARCHITECTUREcd OF fenpinqi IS

begin

p1:process(clk2,rst)

variable a:integer range 0 to 20;

begin

if rst='1' then

clk_4<='0'; ----- 复位信号控制部分

else

if clk2'event and clk2='1'then

if a>=3 then

a:=0;

clk_4<='1';

else

a:=a+1;

clk_4<='0';

end if;

end if;

end if;

endprocess p1;

p2:process(clk2,rst)

variable b:integer range 0 to 20;

begin

if rst='1' then

clk_16<='0'; ----- 复位信号控制部分

else

if clk2'event and clk2='1'then

if b>=15 then

b:=0;

clk_16<='1';

else

b:=b+1;

clk_16<='0';

end if;

end if;

end if;

endprocess p2;

p3:process(clk2,rst)

variable c:integer range 0 to 20;

begin

if rst='1' then

clk_8<='0'; ----- 复位信号控制部分

else

if clk2'event and clk2='1'then

if c>=7 then

c:=0;

clk_8<='1';

else

c:=c+1;

clk_8<='0';

end if;

end if;

end if;

endprocess p3;

p4:process(clk2,rst)

variable d:integer range 0 to 40;

begin

if rst='1' then

clk_12<='0'; ----- 复位信号控制部分

else

if clk2'event and clk2='1'then

if d>=11 then

d:=0;

clk_12<='1';

else

d:=d+1;

clk_12<='0';

end if;

end if;

end if;

endprocess p4;

endcd;

----------------------------------------------4选1选择器---------------------------------------

LIBRARYieee;

USEieee.std_logic_1164.all;

ENTITYxzq4_1 IS

PORT

(

rst:in std_logic;

inp:in integer range 0 to 3;

in1,in2,in3,in4 : In std_logic;

output2 :OUT std_logic

);

ENDxzq4_1;

ARCHITECTUREa OF xzq4_1 IS

BEGIN

PROCESS (rst,inp)

BEGIN

if(rst='1') then output2<='0';

else

case inp is

when 0=>output2<=in1;

when 1=>output2<=in2;

when 2=>output2<=in3;

when 3=>output2<=in4;

when others=>null;

end case;

end if;

END PROCESS;

ENDa;

-------------------------------------------彩灯控制模块----------------------------------------

LIBRARYieee;

USEieee.std_logic_1164.all;

ENTITYcaideng IS

PORT

(

input :

IN INTEGER RANGE

0 TO 15;

rst:in std_logic;

output3 :OUT std_logic_vector(7 downto 0);

sm :out std_logic_vector(6 downto 0)

);

ENDcaideng;

ARCHITECTUREa OF caideng IS

BEGIN

PROCESS (input)

BEGIN

if rst='1' thenoutput3<="00000000";sm<="0000000";

else

case input is

when 0=>output3<="00111000";sm<="0000110";

when1=>output3<="00001111";sm<="0000110";

when2=>output3<="00111110";sm<="0000110";

when3=>output3<="01111111";sm<="0000110";

when4=>output3<="01011011";sm<="1011011";

when5=>output3<="01110110";sm<="1011011";

when6=>output3<="00001111";sm<="1011011";

when7=>output3<="01111111";sm<="1011011";

when8=>output3<="01101101";sm<="1001111";

when9=>output3<="00000111";sm<="1001111";

when10=>output3<="01110111";sm<="1001111";

when11=>output3<="01111011";sm<="1001111";

when12=>output3<="00111000";sm<="1100110";

when13=>output3<="00111111";sm<="1100110";

when14=>output3<="00111110";sm<="1100110";

when 15=>output3<="01111001";sm<="1100110";

when others=>null;

end case;

end if;

end process;

end a;

--------------------------------------------16进制计数器模块-----------------------------------

LIBRARYieee;

USEieee.std_logic_1164.all;

ENTITYcounter_16 IS

PORT

(

clk,rst :IN std_logic;

count_out :

OUT INTEGER RANGE

0 TO 15);

ENDcounter_16;

ARCHITECTUREa OF counter_16 IS

BEGIN

PROCESS (rst,clk)

variable temp:integer range 0 to 16;

BEGIN

IF rst='1' THEN

temp:=0;

ELSIF (clk'event and clk='1') THEN

temp:=temp+1;

if(temp=15) then

temp:=0;

end if;

END IF;

count_out<=temp;

END PROCESS;

ENDa;

-------------------------------4进制计数器模块----------------------------------

LIBRARYieee;

USEieee.std_logic_1164.all;

ENTITYcounter_4 IS

PORT

(

clk,rst :IN std_logic;

count_out :OUT integer range 0 to 3 );

ENDcounter_4;

ARCHITECTUREa OF counter_4 IS

BEGIN

PROCESS (rst,clk)

variable temp:integer range 0 to 16;

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;

ENDa;

-------------------------------------------主程序----------------------------------

LIBRARYieee;

USEieee.std_logic_1164.all;

ENTITYproject IS

PORT (clk1,rst,clk2: IN std_logic;

Out1: OUT std_logic_vector(7 downto 0);

Out2 :out std_logic_vector(6 downto0);

Out3: OUT std_logic);

ENDproject;

ARCHITECTUREstruct OF project IS

COMPonENT counter_16 IS

PORT(clk,rst : IN std_logic;

count_out : OUT integer range 0 to 15 );

ENDCOMPONENT;

COMPonENT fenpinqi IS

PORT(clk2,rst : IN std_logic;

clk_12,clk_4,clk_16,clk_8 : OUT std_logic);

END COMPonENT ;

COMPonENT counter_4 IS

PORT(clk,rst :IN std_logic;

count_out :OUT integer range 0 to 3 );

ENDCOMPONENT;

COMPonENT xzq4_1 IS

PORT

(

rst:in std_logic;

inp:in integer range 0 to 3;

in1,in2,in3,in4 : In std_logic;

output2 :OUT std_logic

);

ENDCOMPONENT;

COMPonENT caideng IS

PORT

(

input: IN INTEGER RANGE 0 TO 15;

rst:in std_logic;

output3 :OUT std_logic_vector(7 downto 0);

sm :out std_logic_vector(6 downto 0)

);

ENDCOMPONENT;

SIGNALu: integer range 0 to 15;

SIGNALw: integer range 0 to 3;

SIGNALv1,v2,v3,v4: std_logic;

BEGIN

U1:counter_16PORT MAP(clk1,rst,u);

U2:fenpinqiPORT MAP(clk2,rst, v1,v2,v3,v4);

U3:counter_4PORT MAP(v3,rst,w);

U4:xzq4_1 PORT MAP(rst,w, v1,v2,v3,v4,out3);

U5:caidengPORT MAP(u,rst,out1,out2);

ENDstruct;

2、彩灯控制器仿真结果及数据分析

分析:如上图,clk1控制的是彩灯模块,clk2控制的是声音模块,当rst为高电平是输出全为0,ck1每出现四个高电平,花型发生一次变化,out2分别显示1、2、3、4,out1显示不同的花型,out3发出声音,如图脉冲数不同表示发出的声音不同,但是声音与花型相比有一定的延迟。

六、硬件实现

1、引脚锁定图

2、硬件仿真图

显示第一组花型之一

显示第二组花型之一

显示第三组花型之一

显示的第四组花型之一

七、总体电路

整个系统就是各个分模块组成来实现最后的彩灯控制功能,系统又两个时钟来控制一个是控制16进制计数器即控制彩灯控制模块来实现彩灯的不同输出,另一个时钟为分频器的输入来进行分频处理,最后用来控制扬声器发出不同的音乐,为了使效果明显尽量达到要求分频处理的时钟的频率比实现彩灯控制的时钟频率要高。

将各个模块连在一起采用在课程中学到的元件例化,将各个模块的引脚连在一起,使之成为一个整体。元件例化是VHDL设计实体构自上而下层次化设计的重要途径。整体电路如图五—1

图七—1 整体电路图

八、心得体会

1、在设计时遇到一些主要问题如下:怎么将各个模块连在一起、开始硬件仿真时总是出现错误,设计方案的选择。最后我选择了元件例化将各个模块连在一起,仿真时是因为短路帽接错了,当时没有注意,在方案的选择时我们选了实现比较简单的分模块方案

2、这次的EDA课程设计我学到得东西很多明白了理论与实践之间的差距,而且对DEA课程有了更深入的理解,尤其是知道了怎么去应用所学的知识,怎么去利用网络实现自己的要求,具体体会如下:

(1)要想完成编程就要对DEA知识很熟悉,这样才能加快编程的速度,另外在编程时一定要小心,稍微有一点粗心都会有很多的错误出现,在出现错误后要学会寻找错误原因如名称前后不一、数据类型不同、符号写错等等

(2)拿道题目后要注意分析,要学会总体把握,然后再一一一细化、学会将复杂的问题简单化,分析时一定要有一个明确的目标。

(3)要学会理论联系实际,在程序导入到实验箱后,居然不显示结果,认真的检查看看操作是否有错误、试验箱中该短路的是否已用短路帽短路、又重新检查了一下程序,结果发现是短路帽接错了,所以看似很简单的操作自己操作起来可能会有很大的漏洞,所以亲自动手是很重要的。

(4)当自己的只是有限时,要注意运用网络等一切资源,要学会知识的灵活运用在查阅的过程中学到了很多在书本所没有学到的知识,通过查阅相关资料进一步加深了对EDA的了解

总的来说,通过这次课程设计不仅锻炼了我们的动手和动脑能力,也使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,要把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。还有最重要的一点就是要有一丝不苟的精神和端正认真的态度,遇到困难后要学会积极的面对。

3、在此设计中声音会有一定的延迟,可以考虑用花型输出信号作为4选1的控制信号

九、参考书目:

赵伟军,《Protel99se教程》,北京,人民邮电出版社,1996年

金西,《VHDL与复杂数字系统设计》,西安,西安电子科技大学出版社,2003

汉泽西,《EDA技术及其应用》,北京,北京航空航天大学出版社,2004

[4] 黄任,《VHDL入门.解惑.经典实例.经验总结》,北京,北京航空航天大学出版社,2005

[5] 李洋,《EDA技术 使用教程》,北京,机械工业出版社,2009

[6] 网络资源:EDA课程设计、EDA课程设计—彩灯控制器等

正确。立创EDA不仅是一个绘制电路图和PCB图的工具,还是一个电路仿真工具。立创EDA所使用的仿真程序是免费且强大的LTSpice,在此基础上简化了许多操作。立创eda仿真图像正确,在使用仿真功能前需要在编辑器首页将“标准”改为”仿真“,进入仿真模式。

免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报

举报
反对 0
打赏 0
更多相关文章

收藏

点赞