7色彩灯控制器设计
一、设计题目
7色彩灯控制器
二、设计原理
1.Quartus Ⅱ简介
QuartusⅡ可编程逻辑开发软件是Altera公司为其FPGA/CPLD芯片设计的集成化专用开发工具,是Altera最新一代功能更强的集成EDA开发软件。使用QuartusII可完成从设计输入,综合适配,仿真到下载的整个设计过程。 Max+plusⅡ是Altera公司早期的开发工具,曾经是最优秀的PLD开发平台之一,现在正在逐步被QuartusⅡ代替。并且Max+plus Ⅱ已经不再支持Altera公司的新器件,同时,QuartusH也放弃了对少数较老器件的支持。QuattusII界面友好,具有MAX+PLUSⅡ界面选项,这样MAX的老用户就无须学习新的用户界面就能够充分享用QuartusⅡ软件的优异性能。所以,无论是初学者,还是Max+plusⅡ的老用户,都能较快的上手。
QuartusⅡ根据设计者需求提供了一个完整的多平台开发环境,它包含蕞个FPGA和CPLD设计阶段的解决方案。QuarmsⅡ软件提供的完整,操作简易的图形用户界面可以完成整个设计流程中的各个阶段。QuartusⅡ集成环境包括以下内容:系统级设计,嵌入式软件开发,可编程逻辑器件(PLD)设计,综合,布局和布线,验证和仿真。
QuartusⅡ也可以直接调用Synplify Pro,LeonardoS~ctmm以及ModelSim等第三方EDA 工具来完成设计任务的综合与仿真。QualtusⅡ与MATLAB和DSPBuilder结合可以进行基于FPGA的DSP系统开发,方便且快捷,还可以与SOPCBuilder结合,实现SOPC系统的开发。
2.EDA简介
EDA技术(即Electronic Design Automation技术)就是依赖强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description Language)为系统逻辑描述手段完成的设计文件,自动的完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。他在硬件实现方面融合了大规模集成电路制造技术、IC版图设计、ASIC测试和封装、FPGA(Field Programme Gate Array)CPLD(Complex Programme Logic Device)编程下载和自动测试等技术:在计算机辅助工程方面融合了计算机辅助设计(CAD),计算机辅助制造(CAM),计算机辅助测试(CAT),计算机辅助工程(CAE)技术以及多种计算机语言的设计概念;而在现代电子学方面则容纳了更多的内容,如电子线路设计理论、数字信号处理技术、数字系统建模和优化技术及长线技术理论等。
硬件描述语言HDL是EDA技术的重要组成部分,常见的HDL主要有VHDL、Verilog HDL、ABEL、AHDL、System Verilog和System C。其中VHDL、Verilog HDL和现在的EDA设计中使用最多,并且我们学习的是Verilog的编程方法及实用技术。
三、设计背景
在经济和商业高度发达的今天,彩灯已经成为人民日常生活不可或缺的一部分,已经逐渐为越来越多的人们所关注,在家庭中的普及率不断提高,大大的丰富和点缀了人民的生活,使人们的生活增添了不少色彩。彩灯由不同的颜色的LED灯组成,通过控制不同颜色的灯的
亮与灭,呈现给人们不同的花塑和图案,极大的点缀了单调的都市夜景,让城市成为了多姿多彩的不夜城。
当今社会是数字化的社会,也是数字集成电路广泛应用的社会,数字本身在不断的进行更新换代。它由早起的电子管、晶体管、小中规模集成电路发展到超大规模集成电路以及许多具有特定功能的专用集成电路。而EDA技术就是以微电子技术为物理层面,现代电子设计为灵魂,计算机软件技术为手段,最终形成集成电子系统或专用集成电路ASIC为目的的一门新兴技术。
Verilog HDL是一种应用较为广泛的HDL语言,能对范围广泛的各种复杂的网络在不同的抽象级加以描述,而且在整个设计过程中可使用同一种语言。采用Verilog HDL作为HDL 综合设计的优点有:标准语言,即设计者可在不同环境下进行设计;仿真和综合均可采用同一种语言进行;Verilog HDL中提供的大量的资源模块,简化了设计者的开发工作;由Verilog HDL描述的源文件既是程序文件又可作为设计的文档。
四、设计思路
有7只不同颜色的LED,现通过按钮来控制彩灯的显示方式,并且在数码管显示运行状态。LED亮灭方式(以下简称“花式”)如下:
四、注意事项
要注意是高电平/低电平亮
五、设计工具
计算机、Quartus II软件
六、框架分析
整个控制器的实现流程如下:
经分析,彩灯控制器设计可以分为四部分:时钟分频,数码管显示模块,彩灯显示电路。其中时钟分频又包括八选一数据选择和分频和状态选择两部分。
彩灯控制模块的系统结构图如下:
系统结构图如下:
彩灯控制器系统框图
各部分电路模块框图功能:
● 按键消抖模块
按键开关是各种电子设备不可或缺的人机接口。在实际应用中,很大一部分的按键是机械按键。在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。我们通过Verilog HDL 设计描述语言实现按键消抖。
在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。所以,对于按键消抖的处理,必须按最差的情况来考虑。
● 状态控制模块
● 数码管显示模块
通过Verilog HDL 设计描述语言实现对数码管的显示控制。
● 蜂鸣器
作为按键的反馈。用于告知用户是否操作完成。
七、 主要模块的状态机描述
稳定的按键脉冲
接数码管
数据接口
八、程序设计和相关源代码
主要由以下文件组成:
ORDER_LIGHT.V
BCDTO7SEG.V
Block.bdf
ORDER_LIGHTS.V源代码:
//From red to purple color LED
module ORDER_LIGHTS(CLK,OE,nRST,B,Q);
input CLK,OE,nRST; //Input:Clock,OE,Reset(should be zero.)
input [2:0] B; //3 inputs for animation style
output [6:0] Q; //6 LED Lights
reg [6:0] s;
reg [2:0] prevTemp;
reg is1;
integer i,timer;
parameter ANIM1=3'h0, //1st:From left to right,on and off one by one ANIM2=3'h1, //2nd:From left to right,on one by one,and off
ANIM3=3'h2, //3rd:Spread from the center light,then collapse
ANIM4=3'h3, //4th:Odd & even lights on and off
ANIM5=3'h4, //5th:
ANIM6=3'h5, //6th:
ANIM_BY_ORDER=3'h6, //7th:
ANIM_RND=3'h7; //8th:Circulate the animations above randomly parameter CUSTOM_INTERVAL=50; //You can edit this integer afterwards.
//in<=3'h0;
always@(posedge CLK/*,negedge nRST*/)begin if(!nRST)begin
s<=7'b1111111;
end
else
if(OE)begin
//prevTemp
case(B)
ANIM1:
playAnimation(B);
ANIM2:
playAnimation(B);
ANIM3:
playAnimation(B);
ANIM4:
playAnimation(B);
ANIM5:
playAnimation(B);
ANIM6:
playAnimation(B);
ANIM_BY_ORDER:begin
if(timer==CUSTOM_INTERVAL)begin
playAnimation(timer/5+1'b1);
timer=0;
end
playAnimation(timer/5);
timer=timer+1;
end
ANIM_RND:begin
timer=timer+1;
end
/*default:begin
if(B< playAnimation(B); end*/ endcase //i=i+1; end end task playAnimation; input [2:0] index; begin case(B) ANIM1:begin case(i%7) 0:s<=7'b0111111; default:begin s<=((s>>1)+7'b1000000); if(i%14==0) i=0; end endcase end ANIM2:begin case(i%14) 0:s<=7'b0111111; 1:s<=7'b0011111; 2:s<=7'b0001111; 3:s<=7'b0000111; 4:s<=7'b0000011; 5:s<=7'b0000001; 6:s<=7'b0000000; default:begin s=((s>>1)+7'b1000000); if(i%14==0) i=0; end endcase end ANIM3:begin case(i%8) 0:s<=7'b1111111; 1:s<=7'b1110111; 2:s<=7'b1100011; 3:s<=7'b1000001; 4:s<=7'b0000000; 5:s<=7'b1000001; 6:s<=7'b1100011; 7:s<=7'b1110111; default:begin s<=7'b1111111; if(i%14==0) i=0; end endcase end ANIM4:begin if(is1) s<=7'b1010101; else s<=7'b0101010; is1=!is1; end ANIM5:begin case(i%8) 0:s<=7'b1111111; 1:s<=7'b1110111; 2:s<=7'b1101011; 3:s<=7'b1011101; 4:s<=7'b0111110; 5:s<=7'b1011101; 6:s<=7'b1101011; 7:s<=7'b1110111; default:begin s<=7'b1111111; if(i%14==0) i=0; end endcase end ANIM6:begin case(i%50) 0://begin s<=7'b0111111; //Previous state:1111110 //This is because the last light is on //So a first LED goes: //prevTemp=s; //end 7:s<=7'b0111110; 8:s<=7'b1011110; 9:s<=7'b1101110; 10:s<=7'b1110110; 11:s<=7'b1111010; 12:s<=7'b1111100; 13:s<=7'b0111100; 14:s<=7'b1011100; 15:s<=7'b1101100; 16:s<=7'b1110100; 17:s<=7'b1111000; 18:s<=7'b0111000; 19:s<=7'b1011000; 20:s<=7'b1101000; 21:s<=7'b1110000; 22:s<=7'b0110000; 23:s<=7'b1010000; 24:s<=7'b1100000; 25:s<=7'b0100000; 26:s<=7'b1000000; 27:s<=7'b0000000;//All LED are on 28:s<=7'b0000001; 29:s<=7'b0000010; 30:s<=7'b0000011; 31:s<=7'b0000101; 32:s<=7'b0000110; 33:s<=7'b0000111; 34:s<=7'b0001011; 35:s<=7'b0001101; 36:s<=7'b0001110; 37:s<=7'b0001111; 38:s<=7'b0010111; 39:s<=7'b0011011; 40:s<=7'b0011101; 41:s<=7'b0011110; 42:s<=7'b0101111; 43:s<=7'b0110111; 44:s<=7'b0111011; 45:s<=7'b0111101; 46:s<=7'b0111110; 47:s<=7'b0111111; default:begin if(i%54==0) i=0; else if(i<<7 || i>>47) s<=((s>>1)+7'b10000000); end endcase end endcase i=i+1; end endtask assign Q=s; endmodule CONTROLLER.V源代码: module CONTROLLER(CLK,LR,DIN,D,BCD,BEEP); input CLK, //Clock input(4 Hz would be better) DIN, //Button press LR; //Light resistance voltage(only low voltage available) output [2:0] D; //Main data lines output [4:0] BCD; //gfedcba output BEEP; //Speaker output reg [4:0] seg; reg [2:0] data; reg isDightsOn,shouldBeep,isChanged; integer state; //Animation state from 1 to 8 always@(posedge CLK)begin if(LR)begin seg<=5'b11010; shouldBeep=1; end else begin isChanged=0; shouldBeep=1; if(!DIN)begin if(state==7) state=0; state=state+1; shouldBeep=0; isChanged=1; end case(state) 0:begin seg<=5'b10001; if(isChanged) data<=3'h0; end 1:begin seg<=5'b10010; if(isChanged) data<=3'h1; end 2:begin seg<=5'b10011; if(isChanged) data<=3'h2; end 3:begin seg<=5'b10100; if(isChanged) data<=3'h3; end 4:begin seg<=5'b10101; if(isChanged) data<=3'h4; end 5:begin seg<=5'b10110; if(isChanged) data<=3'h5; end 6:begin if(isDightsOn) seg<=5'b00000; else seg<=5'b10000; isDightsOn=!isDightsOn; if(isChanged) data<=3'h6; end 7:begin if(isDightsOn) seg<=5'b01011; else seg<=5'b11011; isDightsOn=!isDightsOn; if(isChanged) data<=3'h7; end endcase end end assign BEEP=shouldBeep; //if(isChanged) assign D=data; //isChanged=0; assign BCD=seg; endmodule BCDTO7SEG.V源代码: module BCDto7SEG(DI,B3,B2,B1,B0,a,b,c,d,e,f,g,dights); input DI,B3,B2,B1,B0; output a,b,c,d,e,f,g,dights; reg [3:0] BCD; reg a,b,c,d,e,f,g,dights; always@(B3,B2,B1,B0)begin BCD={B3,B2,B1,B0}; case(BCD) 4'b0000:{g,f,e,d,c,b,a,dights}=7'b10000001; 4'b0001:{g,f,e,d,c,b,a,dights}=7'b11110011; 4'b0010:{g,f,e,d,c,b,a,dights}=7'b01001001; 4'b0011:{g,f,e,d,c,b,a,dights}=7'b01100001; 4'b0100:{g,f,e,d,c,b,a,dights}=7'b00110011; 4'b0101:{g,f,e,d,c,b,a,dights}=7'b00100101; 4'b0110:{g,f,e,d,c,b,a,dights}=7'b00000101; 4'b0111:{g,f,e,d,c,b,a,dights}=7'b11110001; 4'b1000:{g,f,e,d,c,b,a,dights}=7'b00000001; 4'b1001:{g,f,e,d,c,b,a,dights}=7'b00100001; //Reserved cases 4'b1010:{g,f,e,d,c,b,a,dights}=7'b01000011;//small letter "d" 4'b1011:{g,f,e,d,c,b,a,dights}=7'b01011111;//small letter "r" default:{g,f,e,d,c,b,a,dights}=7'b11111111; endcase if(DI) {g,f,e,d,c,b,a,dights}={g,f,e,d,c,b,a,dights}-1'b1; end endmodule 波形仿真图: 一、花式1({B2,B1,B0}=000) 二、花式2({B2,B1,B0}=001) 三、花式3({B2,B1,B0}=010) 四、花式4({B2,B1,B0}=011) 五、花式5({B2,B1,B0}=100) 六、花式6({B2,B1,B0}=101) 七、原理图及仿真图 状态1:白天(LIGHTR为高电平) 状态2:夜间(LIGHTR为低电平)