彩灯控制器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
彩灯控制器设计
摘要
一、系统设计要求
设计一个控制电路来实现8路彩灯按照一定的次序和时间间隔闪烁。具体要求如下:
1、当控制开关为0时,灯全灭;当控制开关为1时,从第一盏开始,依次点亮,时间间隔为1秒。期间一直保持只有一盏灯亮、其他灯全灭的状态。
2、 8盏灯依次亮完后,从第8盏开始依次灭,期间一直保持只有一盏灯灭、其他灯全亮的状态。
3、当8盏灯依次灭完后,8盏灯同时亮同时灭,其时间间隔为0.5秒,并重复4次。
4、只要控制开关为1,上述亮灯次序不断重复。
5、用层次化设计方法设计该电路,编写各个功能模块的程序。
6、仿真各功能模块,通过观察有关波形确认电路设计是否正确。
7、完成电路设计后,用实验系统下载验证设计的正确性。
二、系统总体结构
系统框图如下所示,
ENA为控制开关,输入信号为2Hz,经过分频器分频之后产生一个1Hz的时钟信号,用两个12位内部信号的左、右移后的中间8位来控制8个灯的亮与灭。计数器1和计数器2的作用:一方面用2Hz和1Hz的时钟信号控制灯亮、灭的时间间隔;另一方面控制八盏灯的依次亮、依次灭和全亮、全灭。
使能信号ENA为无效电平时(低电平),8只LED灯保持全灭的状态;当使能信号ENA为有效电平时(高电平),8只按照既定的花型进行变换,首先2Hz的时钟信号在分频器的左右下改变为1Hz的时钟信号,该1Hz的时钟信号送至计数器2、左移和右移模块,并由计数器2实现左、右移模块的选择。分别实现8只LED灯的自左向右依次点亮,以及自右向左依次熄灭的花型变换;当完成自右向左的花型变换后,计数器2给出一个控制信号给计数器1,执行全亮全灭的花型变换,该模块的时钟信号是未经分频器分频的原始时钟信号2Hz。只要使能信号有效,那么该系统就按照以上的花型变换顺序一直永序的变换下去。
三、各功能模块
1、时钟信号二分频模块:
功能描述:该模块的功能主要是将频率为2Hz的时钟信号分频频率为1Hz的时钟信号,并将频率为1Hz的时钟信号输出给左移、右移模块作为这两个模块时钟触发信号。
代码部分:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY clk_div2 IS
PORT(CLK:IN STD_LOGIC;
OUTPUT:BUFFER STD_LOGIC);
END clk_div2 ;
ARCHITECTURE one OF clk_div2 IS
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
OUTPUT<=NOT OUTPUT;
END IF;
END PROCESS;
END one;
仿真波形:
2、计数器模块:
功能描述:该模块的主要功能是通过计数,实现对左移及右移模块的选通,并在右移和左移模块完成后,跳转到循环取反模块执行指令。
计数器1代码部分:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY count1 IS
PORT(CLK,ENA:IN STD_LOGIC;
OUTPUT:BUFFER STD_LOGIC_VECTOR(1 DOWNTO 0));
ARCHITECTURE one OF count1 IS
SIGNAL CQ:STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
PROCESS(CLK,ENA)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF ENA='1' THEN
IF CQ<"100111" THEN CQ<=CQ+1;
IF CQ="100000" THEN OUTPUT<="10";
ELSIF CQ="100001" THEN OUTPUT<="01"; ELSIF CQ="100010" THEN OUTPUT<="10"; ELSIF CQ="100011" THEN OUTPUT<="01"; ELSIF CQ="100100" THEN OUTPUT<="10"; ELSIF CQ="100101" THEN OUTPUT<="01"; ELSIF CQ="100110" THEN OUTPUT<="10"; ELSIF CQ="100111" THEN OUTPUT<="01"; END IF;
ELSE CQ<="000000";OUTPUT<="00";
END IF;
ELSE CQ<="111111";
END IF;
END IF;
END PROCESS;
END one;
仿真波形:
计数器2代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY count2 IS
PORT(CLK,ENA:IN STD_LOGIC;
OUTPUT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
ARCHITECTURE one OF count2 IS
SIGNAL CQ:STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
PROCESS(CLK,ENA)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF ENA='1' THEN
IF CQ<"010011" THEN CQ<=CQ+1;
ELSE CQ<="000000";
END IF;
ELSE CQ<="111111";
END IF;
END IF;
END PROCESS;
OUTPUT<=CQ;
END one;
仿真波形:
3、循环右移模块:
功能描述:该功能实现8只LED灯的从左向右依次点亮的功能,点亮过程中,每时每刻都保证只有一个LED被点亮,其它LED全灭的状态。时间间隔为1S。
代码部分:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY rightmove IS
PORT(CLK,ENA:IN STD_LOGIC;
COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0);
OUTPUT:OUT STD_LOGIC_VECTOR(11 DOWNTO 0));
END rightmove ;
ARCHITECTURE one OF rightmove IS
BEGIN