实验十 彩灯控制器设计与实现.docx
实验十彩灯控制器设计与实现报告一、实验目的1、进一步掌握VHDL语言的基本结构及设计的输入方法。2、掌握VHDL语言中状态机的设计与实现。3、掌握层次化设计混合编程方法和元件例化语句的使用方法。二、实验原理及内容1、设计并实现一彩灯控制器,要有多种花型变化(至少设计4 种);多种花型可以自动变换,循环往复;彩灯变换的快慢节拍可以 选择;彩灯控制器具有清零开关。2、根据系统设计要求,现设计一个具有6种花型循环变化的彩 灯控制器。系统设计采用自顶向下的设计方法,系统的整体组装设计 原理图如图所示,它由时序控制模块和显示控制模块两部分组成。整 个系统有3个输入信号:系统时钟信号CLK,系统清零信号CLR和 控制彩灯节奏快慢的选择开关SPEEDo 9个输出信号LED8.0,分 别用于模拟彩灯。系统整体设计原理图如下图所示,请编写SX、XS程序代码,分 析彩灯控制器实现过程,结合现已设计底层文件实现顶层元器件(采 用混合编程或VHDL文本编辑输入法)系统的设计,使之组成一个 完整系统。泌)'而'"CLR5FEEDxso"NNT"CLK CLK1CLRCLHl LE皿.D罗上匚叫叫CLR图2.1系统整体组装设计原理图3. 模块设计1)集成分频器模块设计要求显示不同的彩灯的时候要伴随不同的音乐,所以设计分 频器来用不同的频率控制不同的音乐输出。模块说明:Rst:输入信号复位信号用来复位集成分频器的输出使输出为“0”, 及没有音乐输出。此输入信号模块的功能即为分频输入的频率信号。Clk_4、clk_6、clk_8、clk_10:输出信号 即为分频模块对输入信号 clk的分频,分别为1/4分频输出、1/6分频输出、1/8分频输出、1/10 分频输出。2)32进制计数器模块32进制模块用来控制彩灯输出模块,即确定彩灯控制器的不同的 输出。Rst:输入信号复位信号用来复位32进制使其输出为“00000”。Clk:输入信号用来给模块提供工作频率。Count_out4.0:输出信号 即为32进制计数器的输出。COLINTEFg 3£;GI_K GOUNT_OUTEfl. . O 8:RET A图2.3进制计数器3)彩灯控制模块彩灯控制模块用来直接控制彩灯的输出,使彩灯表现出不同的花 样。Rst:输入信号使彩灯控制模块的输出为“00000000”,即让彩灯无 输出。Input4.0:输入信号 不同的输入使彩灯控制模块有不同的输出即彩 灯显示出不同的花样。Output7.0:输出信号直接与彩灯相连来控制彩灯。CAIDENGI NPUT A. 0 OUTPUT 7 . fi5TM 6 . . O1图2.4彩灯控制模块4) 4选1选择器模块Rst:输入信号 复位信号 使选择器的输出为“0”。In1、in2、in3、诅4:输入信号 接分频器的输出。Inp1.0:输入信号 接4进制计数器的输出用来控制选择器的选择不 同的输入选择不同的输出。Output:输出信号 直接接扬声器即输出的是不同的频率来控制扬声 器播放音乐。XZQ4-1RSTI HP _ OI HIQUTPUTIN2I NmI H勺16图2.5选1选择器5)4进制计数器模块4进制计数器作为选择器的输入来控制选择器选择不同的频率作为输出控制扬声器工作。Clk:输入信号来为计数器提供工作频率。Rst:输入信号复位信号使计数器的输出为“00”。 1 1 1 I 1 1 I I 1 1 I 1COUNTER_4ci K COUNVOIJVCX. . Q',RST图2.6进制计数器三、程序代码:LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY fenpinqi ISPORT(clk,rst : IN std_logic;clk_10,clk_4,clk_6,clk_8 : OUT std_logic );END fenpinqi;ARCHITECTURE cd OF fenpinqi ISbeginp1:process(clk,rst)variable a:integer range 0 to 20;beginif rst='1' thenclk_4<='0'elseif clk'event and clk='1'thenif a>=3 thena:=0;clk_4<='1'elsea:=a+1;clk_4<='0'end if;end if;end if;end process pl;p2:process(clk,rst)variable b:integer range 0 to 20;beginif rst='1' thenclk_6<='0'elseif clk'event and clk='1'thenif b>=5 thenb:=0;clk_6<='1'elseb:=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;beginif rst=T thenclk_8<='0'elseif clk'event and clk='1'thenif c>=7 thenc:=0;clk_8<=T;elsec:=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;beginif rst='1' thenclk_10<='0'elseif clk'event and clk='1'thenif d>=9 thend:=0;clk_10<='1'elsed:=d+1;clk_10<='0'end if;end if;end if;end process p4;end cd;LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY xzq4_1 ISPORT(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 ISBEGINPROCESS (rst,inp)BEGINelsecase inp iswhen 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 ISPORT(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 ISBEGINPROCESS (input)BEGINif rst='1' then output<="00000000"sm<="0000000"elsecase input iswhen 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 1 l=>output<="01111000"sm<="0011011 when 12=>output<="01 111 100"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<=" 1100000 l"sm<=" 1001111" when 18=>output<=" 11000011" ;sm<=" 1001 111" when 19=>output<=" 11100011 "sm<="0011011 when 20=>output<=" 111001H"sm<=" 1001111" when 21=>output<=" 111101H"sm<=" 1001111" when 22=>output<=" 11111111" ;sm<=" 1001111" when 23=>output<="00001000"sm<=" 1001 111" 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;LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY counter_32 ISPORT(clk,rst : IN std_logic;count_out : OUT integer range 0 to 31 );END counter_32;ARCHITECTURE a OF counter_32 ISBEGINPROCESS (rst,clk)variable temp:integer range 0 to 32;BEGINIF rst='1' THENtemp:=0;ELSIF (clk'event and clk='1') THENtemp:=temp+1;if(temp=32) thentemp:=0;end if;END IF;count_out<=temp;END PROCESS;END a;LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY counter_4 ISPORT(clk,rst : IN std_logic;count_out : OUT integer range 0 to 3);END counter_4;ARCHITECTURE a OF counter_4 ISBEGINPROCESS (rst,clk)variable temp:integer range 0 to 32;BEGINIF rst='1' THENtemp:=0;ELSIF (clk'event and clk='1') THENtemp:=temp+1;if(temp=4) thentemp:=0;end if;END IF;count_out<=temp;END PROCESS;END a;四、实验结果:多种花型可以自动变换,循环往复;彩灯变换的快慢节拍可以选 择;彩灯控制器具有清零开关。4种花色(4种花样可分别为:彩灯从右到左,然后从左到右逐 次闪烁。彩灯从右到左点亮,然后从左到右逐次依次熄灭,全亮全 灭。彩灯两边同时亮1个逐次向中间移动再散开。彩灯两边同时 亮2个,2亮2灭)的彩灯控制系统。gim 对心心 -出略EM rn y:ri bw» - II «flq >-XAM,.号-n4*<>Ivdc AS lUBivuKW图4.14.2分频器的信号图岫0 qi初 0帼所】 i祥卜m u祖网】图4.3counter_4:3ltemp.Q 端口输出图4.4counter_32:1ltemp.Q图4.5Caideng0-7 端口输出图4.6xs6.0 端口输出图4.7四、实验心得本次实验是彩灯控制器的设计,实验通过分频器,32位计数器,4选1选择器,4位计数器,彩灯控制器来实现四种花色,在扬声器 中以不同频率发出不同的声响。实验模块比较多,各部分分开实现比 较简单。在最后的总的系统原理图连接上,须认真仔细,以达到实验 的目的。