题目:
基于 FPGA 彩灯控制器
学院:电子信息工程学院
院系:
班级:
姓名:
学号:
指导老师:
日期:2010-12-15
引言:
21 世纪,电子技术迅猛发展,高薪技术日新月异。传统的设计方法正逐步退
出历史的舞台,取而代之的是基于 EDA 技术的芯片设计技术,它正在成为电子
系统设计的主流。大规模可编程器件现场可编程门阵列 FPGA 和复杂可编程逻辑
器件 CPLD 是当今应用最广泛的两类可编程专用集成电路。
近年来,EDA 技术高速发展使现代电子产品向着功能多样化,体积最小化,
功耗最低化的方向发展。
它与传统电子产品在设计上的显著优势就是:第一大量使用大规模可编程逻
辑器件,以提高产品性能,缩小产品体积,降低功耗。第二是广泛运用现代化计
算机技术,以提高电子设计自动化程度,缩短开发周期,提高产品的竞争力。
所以掌握这方面的应用极其重要,本题目就是基于 FPGA 这一技术完成实现
的。
众所周知,彩灯、流水灯、装饰灯等在日常生活和商业都有极其广泛的应用。
具有很高的商业价值和研究价值。而对于越来越变化多端要求极高的灯饰行业,
相对传统的单片机来说,FPGA 的性价比越来越高,功能强大,能轻松的完成对
彩灯的控制。
本题目基于 FPGA 技术设计彩灯控制器。初步实现了 FPGA 技术在灯饰行业
的简单应用,为深入提供了一些有价值的参考资料。
摘要:CPLD EDA 彩灯控制器 显示模块 时序模块 时钟信号 清零信号
输出信号 状态机
(一)题目任务:
设计一个十六路彩灯控制器,6 种花型循环变化,有清零开关,并且可以选
择快慢两种节拍。
(二)题目基本实现方案:
根据系统设计要求可知,整个系统共有三个输入信号:控制彩灯节奏快慢的
基 准 时 钟 信 号 CLK_IN , 系 统 清 零 信 号 CLR , 彩 灯 节 奏 快 慢 选 择 开 关
CHOSE_KEY;共有 16 个输出信号 LED[15..0],分别用于控制十六路彩灯。
据此,我们可将整个彩灯控制器 CDKZQ 分为三大部分:时序控制电路 SXKZ
和显示控制电路 XSKZ。
本题目还用原理图来完成顶层文件,对于比较简单的,子模块较少的题目,
建议顶层模块使用原理图,会比较直观。而对于比较复杂的,子模块较多的题目,
使用文本元件例化,会更简洁清晰。如用原理图完成顶层文件连线如图所示。
本题目是采用文本元件例化来完成的。
彩灯控制器的组成原理图
(三)VHDL 源程序
1,时序控制器:SXKZ 部分
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity sxkz is
port(
chose_key:in std_logic;
clk_in:in std_logic;
clr:in std_logic;
clk:out std_logic
);
end entity;
architecture art of sxkz is
signal cllk:std_logic;
begin
--库函数声明
--实体声明
--速度控制按钮
--输入时钟信号
--复位信号
--改变后的时钟信号
--结构体声明
process(clk_in,clr,chose_key)is
variable temp:std_logic_vector(0 to 2);
--进程
--定义一个变量
begin
if clr='1' then cllk<='0';temp:="000";
elsif rising_edge (clk_in) then
if chose_key='1' then
if temp="011" then
temp:="000";
cllk<=not cllk;
else temp:=temp+'1';
end if;
else
--复位初始化
--按键按下,高速时
--输出时钟信号 T 为输入信号的
--8 倍
if temp="111" then
temp:="000";
cllk<=not cllk;
--按键没按下,低速时
--输出时钟信号 T 为输入信号的
--16 倍
else temp:=temp+'1';
end if;
end if;
end if;
end process;
clk<=cllk;
end art;
生成的元器件符号 SYMBOL:
波形仿真:
(输入信号)
(输出波形)
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(0 to 15)
);
end entity;
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(0 to 15):="0001000100010001";
constant f2:std_logic_vector(0 to 15):="1010101010101010";
constant f3:std_logic_vector(0 to 15):="0011001100110011";
constant f4:std_logic_vector(0 to 15):="0100100100100100";
constant f5:std_logic_vector(0 to 15):="1001010010100101";
constant f6:std_logic_vector(0 to 15):="1101101101100110";
--定义一组彩灯的花式。
begin
if clr='1' then current_state<=s0;
elsif rising_edge(clk) then
case current_state is
--判断复位信号,有则复
--位状态为 0,否则等待
--时钟信号的上升沿
when s0=>
flower<="0000000000000000";
current_state<=s1;
--初始状态
--一个时钟上升沿,将当前
--状态指向下一个状态
when s1=>
flower<=f1;
current_state<=s2;
when s2=>
flower<=f2;
current_state<=s3;
when s3=>
flower<=f3;
current_state<=s4;
when s4=>
flower<=f4;
current_state<=s5;
when s5=>
flower<=f5;
current_state<=s6;
when s6=>
flower<=f6;
current_state<=s1;
end case;
end if;
--返回第一个状态,实现循环
--返回第一个状态,实现循环
end process;
led<=flower;
end architecture;
flower<=f3;
current_state<=s4;
when s4=>
flower<=f4;
current_state<=s5;
when s5=>
flower<=f5;
current_state<=s6;
when s6=>
flower<=f6;
current_state<=s1;
end case;
end if;
end process;
led<=flower;
end architecture;
生成元器件符号:SYMBOL
波形仿真:
(输入信号)
(输出波形)
3,彩灯控制器:CDKZ
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cdkz2 is
port(
clkin:in std_logic;
clr:in std_logic;
chose_key:in std_logic;
led:out std_logic_vector(0 to 15)
--实体
--端口定义
);
end entity;
architecture art of cdkz2 is
component sxkz is
port(
chose_key:in std_logic;
clk_in:in std_logic;
clr:in std_logic;
clk:out std_logic
--结构体
--元件例化 sxkz
--元件例化 xskz
clk:in std_logic;
clr:in std_logic;
led:out std_logic_vector(0 to 15)
--定义一个信号
u1:sxkz port map(chose_key,clkin,clr,s0);
u2:xskz port map(s0,clr,led);
);
end component sxkz;
component xskz is
port(
);
end component xskz;
signal s0:std_logic;
begin
end architecture;
彩灯控制器 SYMBOL:
波形仿真: