摘要:本文基于分频器和有限状态机设计了可选择节拍、具有六种循环变换花
型功能的多路彩灯控制器,并通过VHDL将其实现。通过Modelsim得到了仿真波形,达到了预期的要求和功能。
目录
一、背景介绍 ............................................. 2 二、设计要求 ............................................. 2 三、设计方案 ............................................. 2 四、方案程序设计 ......................................... 2
4.1 时序控制模块(SXKZ)程序 ........................................................................................... 3
4.1.1 T触发器单元程序 ................................................................................................ 3 4.1.2 多路选择器单元程序 ........................................................................................... 3 4.1.3 总的设计程序 ....................................................................................................... 4 4.2 显示控制模块(XSKZ)程序 ........................................................................................... 5 4.3 多路彩灯控制器的顶层模块程序 ................................................................................... 6 4.4 测试平台(TESTBENCH)程序 ......................................................................................... 7
五、仿真结果及分析 .......................................... 8
5.1 多路彩灯控制器的RTL级 ............................................................................................... 8 5.2 多路彩灯控制器TECHNOLOGY图 ..................................................................................... 9 5.3 Modelsim仿真波形图 .................................................................................................... 10
六、设计的亮点 .......................................... 10
一、背景介绍
在现代生活中,彩灯作为一种装饰,既可以增强人们的感观,起到广告宣传的作用,又可以增添节日气氛,为人们的生活增添亮丽,用在舞台上增强晚会灯光效果。随着电子技术的发展,应用系统向着小型化、快速化、大容量、重量轻的方向发展,EDA(Electronic Design Automatic)技术的应用引起电子产品及系统开发的革命性变革。
VHDL语言作为可编程逻辑器件的标准语言描述能力强,覆盖面广,抽象能力强,在实际应用中越来越广泛。在这个阶段,人们开始追求贯彻整个系统设计的自动化,可以从繁重设计工作中彻底解脱出来,把精力集中在创造性的方案与概念构思上,从而可以提高设计效率,缩短产品的研制周期。整个过程通过EDA工具自动完成,大大减轻了设计人员的工作强度,提高了设计质量,减少了出错的机会。
因而我们对此十分感兴趣,希望借助我们学过的VHDL语言并通过学习相关知识能够进行简单的循环彩灯设计。
二、设计要求
设计一个16路彩灯控制器,六种花样循环变化,有清零开关(即复位功能),并且可以选择快慢两种节拍。
三、设计方案
对设计要求进行分析可知,整个系统共需三个输入信号,即控制彩灯节奏的基准时钟信号CLK_IN,系统清零信号CLR,彩灯节奏快慢选择开关CHOOSE_KEY;应共有16个输出信号,分别用来控制16路彩灯。
我们这里将整个彩灯控制器分为两大部分:时序控制电路SXKZ,用于产生节奏控制信号,选择产生基准频率的1/4和1/8的时钟信号来改变节奏;显示控制电路XSKZ生成变化的花样信号。
四、方案程序设计
基于前面叙述的设计方案,VHDL程序也分为两个主要的模块:时序控制模块SXKZ和显示控制模块XSKZ。
4.1 时序控制模块(SXKZ)程序
时序控制模块主要包括分频(得到1/4标准主频和1/8标准主频)和频率选择两部分,而分频的基本单元为T触发器,选频为二选一多路选择器,因而该模块的程序包括T触发器单元、多路选择器单元、SXKZ总的设计单元三个单元。 4.1.1 T触发器单元程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity T_FF is
Port ( clk : in STD_LOGIC; rst : in STD_LOGIC;
dout : buffer STD_LOGIC); end T_FF;
architecture Behavioral of T_FF is begin
process(clk,rst) is begin
if (rst = '1') then dout <= '0'; else
if (rising_edge(clk)) then if dout='1' then dout <= '0'; elsif dout = '0' then dout <= '1'; end if; end if; end if;
end process; end Behavioral;
4.1.2 多路选择器单元程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; entity MUX_TWO_ONE is
Port ( CHOOSE_KEY : in STD_LOGIC; DAT1 : in STD_LOGIC; DAT2 : in STD_LOGIC;
DOUT : out STD_LOGIC); end MUX_TWO_ONE;
ARCHITECTURE behave OF MUX_TWO_ONE IS BEGIN
PROCESS(DAT1,DAT2,CHOOSE_KEY) BEGIN
CASE CHOOSE_KEY IS
WHEN '0' => DOUT <= DAT1; WHEN '1' => DOUT <= DAT2;
WHEN OTHERS => DOUT <= '0'; END CASE; END PROCESS; END behave; 4.1.3 总的设计程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; entity SXKZ is
Port ( CHOOSE_KEY : in STD_LOGIC; CLK_IN : in STD_LOGIC; CLR : in STD_LOGIC; clk : out STD_LOGIC); end SXKZ;
architecture Behavioral of SXKZ is signal t1,t2,t3 : std_logic; component T_FF
Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; dout : out STD_LOGIC); end component;
component MUX_TWO_ONE
Port ( CHOOSE_KEY : in STD_LOGIC; DAT1 : in STD_LOGIC; DAT2 : in STD_LOGIC; DOUT : out STD_LOGIC); end component; begin u0 : T_FF
PORT MAP(CLK_IN,CLR,t1); u1 : T_FF
PORT MAP(t1,CLR,t2); u2 : T_FF
PORT MAP(t2,CLR,t3); u3 : MUX_TWO_ONE
PORT MAP(CHOOSE_KEY,t2,t3,clk);--devide-by-4 when CHOOSE_KEY is 0,devide-by-8 when CHOOSE_KEY is 1 end Behavioral;
4.2 显示控制模块(XSKZ)程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL ; ENTITY XSKZ IS
PORT( CLK : IN STD_LOGIC; CLR : IN STD_LOGIC;
LED : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)); END ENTITY XSKZ;
ARCHITECTURE ART OF XSKZ IS TYPE STATE IS (S0,S1,S2,S3,S4,S5,S6); SIGNAL CURRENT_STATE: STATE;
SIGNAL FLOWER : STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN
PROCESS(CLR,CLK) IS CONSTANT F1 : STD_LOGIC_VECTOR(15 DOWNTO \CONSTANT F2 : STD_LOGIC_VECTOR(15 DOWNTO \CONSTANT F3 : STD_LOGIC_VECTOR(15 DOWNTO \CONSTANT F4 : STD_LOGIC_VECTOR(15 DOWNTO \CONSTANT F5 : STD_LOGIC_VECTOR(15 DOWNTO \CONSTANT F6 : STD_LOGIC_VECTOR(15 DOWNTO \
--DEFINATION OF SIX FLOWERS BEGIN
IF CLR = '1' THEN
CURRENT_STATE <= S0; ELSE
IF RISING_EDGE(CLK) THEN CASE CURRENT_STATE IS WHEN S0 =>
FLOWER <= \
0) := 0) := 0) := 0) := 0) := 0)
:=