EDA彩灯控制器课程设计报告书.docx
《EDA彩灯控制器课程设计报告书.docx》由会员分享,可在线阅读,更多相关《EDA彩灯控制器课程设计报告书.docx(16页珍藏版)》请在冰豆网上搜索。
EDA彩灯控制器课程设计报告书
第一章绪论
1.1系统背景
20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。
在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
现在对EDA的概念或范畴用得很宽。
包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。
目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。
例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。
1.2课程设计的主要内容和任务以及要达到的目标
(1)主要内容和任务
完成彩灯控制系统的设计与制作,在计算机上用MAX+plusⅡ仿真后要能在实验箱上实现,熟悉可编程逻辑器件的使用,学会自己烧程序并应用于实践。
(2)目标
设计一个彩灯控制器,具有3种花样的变化,最后一次是将前三种的循环。
并且具有四种频率的变化。
整个系统有三个输入信号,分别为音频输入脉冲信号clk2,复位清零信号CLR,彩灯输入控制脉冲clk1。
最后按照FPGA的开发流程和VHDL语言建模、仿真、综合、下载、适配,用EDA6000实验箱上的FPGA系统实现了相应的功能。
第二章系统电路设计
2.1系统总体设计框架结构
图2-1系统框图
2.1系统硬件
该系统使用的是ACEX1K-EP1K30TC144-3芯片。
其具体的电路如下:
图2-2系统的硬件图
第三章系统软件设计
3.1方案原理
彩灯设计总体采用分模块的方法来完成,包括分频器、4选1选择器、48进制计数器、彩灯控制器四大部分。
其中彩灯控制器是用来控制16个LED,使其呈现出不同的花型,而彩灯控制器的输出则是由48进制计数器来控制。
通过一个集成分频器来将输入的频率分成几种不同的频率,然后通过一个四选一选择器择性不同频率,从而实现彩灯不同的速率。
通过一个显示模块来显示不同的花样,该模块的使能端实现四种状态的切换显示。
3.2模块设计
(1)集成分频器模块
设计分频器来用不同的频率控制不同的彩灯速率输出。
模块说明:
通过分频器可以实现不同频率的转换,clk为输入信号,clk_out_1hz,clk_out_2hz,clk_out_4hz为输出信号,还有一个信号为系统时钟
(2)4选1选择器模块
通过一个使能端来控制不同的状态,状态用A,B,C,D表示。
(3)48进制计数器模块
48进制模块用来控制彩灯输出模块来控制彩灯的显示模块,即当计数到49时自动转到到第一种状态,实现循环控制,不然到49将停止。
RST:
系统清零信号,低电平有效
Clk:
输入信号用来给模块提供工作频率
CQ【5..0】:
48进制计数器的输出
(4)彩灯显示模块
灯控制模块用来直接控制彩灯的输出,使彩灯表现出不同的花样。
通过使能端来实现不同状态的转换。
X[5..0]:
不同的输入使彩灯控制模块有不同的输出即彩灯显示出不同的花样。
K[1..0]:
即使能端,来控制不同状态的切换。
Y[15..0]:
输出信号直接与彩灯相连来控制彩灯。
3.3总体模块设计
整个系统就是各个分模块组成来实现最后的彩灯控制功能,用一个时钟为分频器的输入来进行分频处理,通过四选一来切换不同频率,再通过显示模块显示
第四章实验结果和分析
4.1实验仿真结果
(1)分频
说明:
该程序是将时钟进行二分频,将分频的信号再分频,就变成四分频了,将四分频的信号再二分频就可以变八分频了
(2)四选一
(3)48进制计数器
(4)显示模块
说明:
使能端控制的是四种状态的转换,第四种状态是前三种状态的循环。
结束语
彩灯控制器EDA设计实验刚开始,拿着选定的题目不知如何入手。
不过通过指导老师冯杰老师的说明与提示,心中才有了谱。
将整个系统根据不同的功能化分成模块,再分别进行设计,逐个攻破,最后再将其整合即可。
通过这次课程设计,使我受益颇多。
既巩固了课堂上学到的理论知识,又掌握了常用集成电路芯片的使用。
在此基础上学习了数字系统设计的基本思想和方法,学会了科学地分析实际问题,通过查资料、分析资料及请教老师和同学等多种途径,独立解决问题。
同时,也培养了我认真严谨的工作作风。
只有这样才能有实质的进步,还有要和同学共同讨论,解决各种困难,在困难中你能了解更多的非课本的知识,还能再找错误的同时锻炼你的观察力,所以我知道了很多器件的作用,并了解到什么样的现象是哪块的电路出现了错误,小小的成功给了我很大的动力,也感受到探索的乐趣。
附录
(1)分频程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfenpingIS
PORT(clk:
INSTD_LOGIC;
clk_out_1hz,clk_out_2hz,clk_out_4hz:
OUTSTD_LOGIC);
ENDfenping;
ARCHITECTUREaOFfenpingIS
signalfull1,full2,full3:
STD_LOGIC;
begin
p_a:
process(clk)
begin
ifclk'eventandclk='1'then
full3<=notfull3;
endif;
clk_out_4hz<=full3;
endprocess;
p_b:
process(full3)
begin
iffull3'eventandfull3='1'then
full2<=notfull2;
endif;
clk_out_2hz<=full2;
endprocess;
p_c:
process(full2)
begin
iffull2'eventandfull2='1'then
full1<=notfull1;
endif;
clk_out_1hz<=full1;
endprocess;
enda;
(2)四选一
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitymux41is
port(a,b,c,d:
instd_logic;
s:
instd_logic_vector(1downto0);
y:
outstd_logic);
endmux41;
architecturebehavofmux41is
begin
process(a,b,c,d,s)
begin
ifs="00"theny<=a;
elsifs="01"theny<=b;
elsifs="10"theny<=c;
elsey<=d;
endif;
endprocess;
endbehav;
(3)48进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt48IS
PORT(CLK,RST:
INSTD_LOGIC;
CQ:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDcnt48;
ARCHITECTUREbehavOFcnt48IS
signalDQ:
STD_LOGIC_VECTOR(5DOWNTO0);
BEGIN
PROCESS(CLK,RST)
BEGIN
IFRST='1'THENDQ<="000000";
ELSIFCLK'EVENTANDCLK='1'THEN
IFDQ="110000"THENDQ<="000000";COUT<='1';
ELSEDQ<=DQ+'1';COUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
CQ<=DQ;
ENDbehav;
(4)显示模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_unsigned.ALL;
ENTITYxianshiis
PORT(x:
INSTD_LOGIC_VECTOR(5DOWNTO0);
k:
INSTD_LOGIC_VECTOR(1DOWNTO0);
y:
OUTSTD_LOGIC_vector(15downto0));
END;
ARCHITECTUREoneOFxianshiIS
BEGIN
PROCESS(x)
BEGIN
ifk="00"then
CASEx(3downto0)IS
when"0000"=>y<="0000000000000001";
when"0001"=>y<="0000000000000010";
when"0010"=>y<="0000000000000100";
when"0011"=>y<="0000000000001000";
when"0100"=>y<="0000000000010000";
when"0101"=>y<="0000000000100000";
when"0110"=>y<="0000000001000000";
when"0111"=>y<="0000000010000000";
when"1000"=>y<="0000000100000000";
when"1001"=>y<="0000001000000000";
when"1010"=>y<="0000010000000000";
when"1011"=>y<="0000100000000000";
when"1100"=>y<="0001000000000000";
when"1101"=>y<="0010000000000000";
when"1110"=>y<="0100000000000000";
when"1111"=>y<="1000000000000000";
whenothers=>y<="1111111111111111";
ENDCASE;
elsifk="01"then
CASEx(5downto0)IS
when"010000"=>y<="1000000000000000";
when"010001"=>y<="0100000000000000";
when"010010"=>y<="0010000000000000";
when"010011"=>y<="0001000000000000";
when"010100"=>y<="0000100000000000";
when"010101"=>y<="0000010000000000";
when"010110"=>y<="0000001000000000";
when"010111"=>y<="0000000100000000";
when"011000"=>y<="0000000010000000";
when"011001"=>y<="0000000001000000";
when"011010"=>y<="0000000000100000";
when"011011"=>y<="0000000000010000";
when"011100"=>y<="0000000000001000";
when"011101"=>y<="0000000000000100";
when"011110"=>y<="0000000000000010";
when"011111"=>y<="0000000000000001";
whenothers=>y<="1111111111111111";
ENDCASE;
elsifk="10"then
CASEx(5downto0)IS
when"100000"=>y<="1000000000000001";
when"100001"=>y<="0100000000000010";
when"100010"=>y<="0010000000000100";
when"100011"=>y<="0001000000001000";
when"100100"=>y<="0000100000010000";
when"100101"=>y<="0000010000100000";
when"100110"=>y<="0000001001000000";
when"100111"=>y<="0000000110000000";
when"101000"=>y<="0000001001000000";
when"101001"=>y<="0000100000100000";
when"101010"=>y<="0001000000010000";
when"101011"=>y<="0010000000001000";
when"101100"=>y<="0100000000000100";
when"101101"=>y<="1000000000000001";
when"101110"=>y<="1100000000000011";
when"101111"=>y<="1110000000000111";
whenothers=>y<="1111111111111111";
ENDCASE;
elsifk="11"then
CASEx(5downto0)IS
when"000000"=>y<="0000000000000001";
when"000001"=>y<="0000000000000010";
when"000010"=>y<="0000000000000100";
when"000011"=>y<="0000000000001000";
when"000100"=>y<="0000000000010000";
when"000101"=>y<="0000000000100000";
when"000110"=>y<="0000000001000000";
when"000111"=>y<="0000000010000000";
when"001000"=>y<="0000000100000000";
when"001001"=>y<="0000001000000000";
when"001010"=>y<="0000010000000000";
when"001011"=>y<="0000100000000000";
when"001100"=>y<="0001000000000000";
when"001101"=>y<="0010000000000000";
when"001110"=>y<="0100000000000000";
when"001111"=>y<="1000000000000000";
when"010000"=>y<="1000000000000000";
when"010001"=>y<="0100000000000000";
when"010010"=>y<="0010000000000000";
when"010011"=>y<="0001000000000000";
when"010100"=>y<="0000100000000000";
when"010101"=>y<="0000010000000000";
when"010110"=>y<="0000001000000000";
when"010111"=>y<="0000000100000000";
when"011000"=>y<="0000000010000000";
when"011001"=>y<="0000000001000000";
when"011010"=>y<="0000000000100000";
when"011011"=>y<="0000000000010000";
when"011100"=>y<="0000000000001000";
when"011101"=>y<="0000000000000100";
when"011110"=>y<="0000000000000010";
when"011111"=>y<="0000000000000001";
when"100000"=>y<="1000000000000001";
when"100001"=>y<="0100000000000010";
when"100010"=>y<="0010000000000100";
when"100011"=>y<="0001000000001000";
when"100100"=>y<="0000100000010000";
when"100101"=>y<="0000010000100000";
when"100110"=>y<="0000001001000000";
when"100111"=>y<="0000000110000000";
when"101000"=>y<="0000001001000000";
when"101001"=>y<="0000100000100000";
when"101010"=>y<="0001000000010000";
when"101011"=>y<="0010000000001000";
when"101100"=>y<="0100000000000100";
when"101101"=>y<="1000000000000001";
when"101110"=>y<="1100000000000011";
when"101111"=>y<="1110000000000111";
whenothers=>y<="1111111111111111";
ENDCASE;
endif;
endprocess;
END;