EDA课程设计 彩灯控制器.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子设计自动化大作业
题目彩灯控制器的设计
学院**学院
班级电气**
学号**********
姓名********
二O一二年十月三十一日
彩灯控制器的设计
一、彩灯控制器的设计要求
设计能让一排彩灯(8只)自动改变显示花样的控制系统,发光二极管可作为彩灯用。
控制器应有两种控制方式:
(1)规则变化。
变化节拍有0.5秒和0.x秒两种,交替出现,每种节拍可有4种花样,各执行一或二个周期后轮换。
(2)随机变化。
无规律任意变化。
二、彩灯控制器的设计原理
本次彩灯控制器的设计包含几个主要模块,一是彩灯显示和扬声器的时序控制部分,二是发光二极管的动态显示和数码管的动态显示,本次设计中,二者的显示同步变化;三是扬声器的控制部分。
流程图如下所示:
图 1 彩灯控制器的设计流程图
彩灯控制器的设计核心主要是分频器的使用,显示部分的设计较
简易。
分频的方法有很多种,本次设计之采用了其中较简易的一种,通过计数器的分频,将控制器外接的频率分为几个我们预先设定的值。
当计数器达到预先设定的值,即产生一个上升沿,从而实现分频。
扬声器通过不同的频率控制发出不同的声音。
同样发光二极管和数码管的显示速度也由其中分出来的一种频率控制(控制显示频率在1~4 之间为宜)。
通过使能端的控制可以控制不同的数码管显示预先设定的图案,数码管依次显示的图案为 AA、BB、CC,并随着发光二极管同步动态显示。
AA 为自左向右显示,BB 为自右向左显示,CC 从二边向中间再由中间向二边发散显示。
与此同时,显示不同的花型时扬声器发出不同的声音,代表不同的花型。
本次设计还带有复位功能,通过复位可以使彩灯控制器恢复到最初的状态。
三、程序设计和分析
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
建立设计库和标准程序包
实体部分: entity pan is
port(clk:in std_logic;
clr:in std_logic;
speak:out std_logic;
led7s1:out std_logic_vector(6 downto 0);
led7s2:out std_logic_vector(7 downto 0);
led_selout:out std_logic_vector(7 downto 0);
end entity;
实体名为 pan,定义端口,输入端口为 clk 和 clr ,其中 clk 接脉冲信号,clr 接复位端;输出端口 speak 接扬声器,led7s1 接数码管的七段显示部分,led7s 接八个发光二极管,led_selout 接八个数码管的使能端,控制数码管的循环显示。
结构体部分: architecture one of pan is
signal s: std_logic_vector(4 downto 0);
signal clk1:std_logic; signal clk2:std_logic;
signal clk3:std_logic;
定义 4 个信号,cq,cllk1,clk2,clk3.
process(clk)
variable a:std_logic_vector(5 downto 0);
begin
if clr='1' then
clk1<='0';
else
if clk'event and clk='1'then
if a="110010"then
a:="000000";
else a:=a+1;
clk1<='0';
end if;
end if;
end if;
end process;
以上程序为第一次分频,为 50 分频,当 clk 发生变化,使 a 从 000000 变化到 110010 时产生一个上升沿 clk1。
如果 a 没有变化到 110010 则 a 继续自加,直到 110010 为止产生下一个上升沿。
process(clk)
variable b:std_logic_vector(4 downto 0);
begin
if clr='1' then
clk2<='0'; -----复位信号
else
if clk'event and clk='1'then
if b="11001"then
b:="00000"; clk2<='1';
else
b:=b+1;
nd if;
end if;
end if;
end process;
以上程序为对 clk 进行 25 分频,原理同上,产生信号clk2。
process(clk)
variable c:std_logic_vector(2 downto 0);
begin
if clr='1' then
clk3<='0'; ----复位信号
else
if clk'event and clk='1'then
if c="111"then
c:="000";
clk3<='1';
else c:=c+1;
clk3<='0';
end if;
end if;
end if;
end process;
以上程序为对 clk 进行 8 分频,产生一个新的时钟脉冲信号clk3。
数码管及二极管循环显示时序控制程序:
process(clk2)
variable z:integer range 0 to 20;
begin
if clr='1' then
s<="00000"; -------复位信号
else
if clk'event and clk='1'then
z:=z+1;
if z=20then s<=s+1;s:=0;
if s="10111" then s<="00000";
else s<=s+1;
end if;
end if;
end if;
end if;
end process;
该段程序的目的是对 clk2 再进行一次分频,当 clk2 发生变
化,并且变化为上升沿时,z 就加 1,直到加到为 20 时,s 就发生变化,加 1,每当 s 发生变化,加到 30 时,s 就加 1。
当 s 从00000 变化到 10111 时,就对 s 清零,从而实现数码显示管和发光二极管的循环显示,以达到显示速度的要求。
发光二极管及数码管显示程序:
process(s)
begin
case s is
when"00000"=>led7s1<="0001000";led7s2<="01111111";speak<=cl k1;led_selout<="11000000"; when
"00001"=>led7s1<="0001000";led7s2<="10111111";speak<=clk1;l ed_selout<="01100000"; when
"00010"=>led7s1<="0001000";led7s2<="11011111";speak<=clk1;l ed_selout<="00110000"; when
"00011"=>led7s1<="0001000";led7s2<="11101111";speak<=clk1;l ed_selout<="00011000"; when
"00100"=>led7s1<="0001000";led7s2<="11110111";speak<=clk1;l ed_selout<="00001100"; when
"00101"=>led7s1<="0001000";led7s2<="11111011";speak<=clk1;l ed_selout<="00000110"; when
"00110"=>led7s1<="0001000";led7s2<="11111101";speak<=clk1;l ed_selout<="00000011"; when
"00111"=>led7s1<="0001000";led7s2<="11111110";speak<=clk1;l ed_selout<="10000001"; 此段程序就是当敏感信号 s 发生变化,对数码管进行置位和置型,0001000 也就是对相应的数码管使之显示花型为 A,通过对数码管使能端的置位,控制显示的数码管显示为 AA ,并且发光二极管最右边显示为亮。
当 S 每变化一次,数码管向左移动一格,发光二极管也同步向左移动,每次只亮一个灯。
当 s 变化到 00111 之后执行下一段程序,同时扬声器发出声音。
when
"01000"=>led7s1<="0000011";led7s2<="11111110";speak<=clk2;l ed_selout<="00000011"; when
"01001"=>led7s1<="0000011";led7s2<="11111101";speak<=clk2;l ed_selout<="00000110"; when
"01010"=>led7s1<="0000011";led7s2<="11111011";speak<=clk2;l ed_selout<="00001100"; when
"01011"=>led7s1<="0000011";led7s2<="11110111";speak<=clk2;l ed_selout<="00011000"; when
"01100"=>led7s1<="0000011";led7s2<="11101111";speak<=clk2;l ed_selout<="00110000"; when
"01101"=>led7s1<="0000011";led7s2<="11011111";speak<=clk2;l ed_selout<="01100000"; when
"01110"=>led7s1<="0000011";led7s2<="10111111";speak<=clk2;l
ed_selout<="11000000"; when
"01111"=>led7s1<="0000011";led7s2<="01111111";speak<=clk2;l ed_selout<="10000001"; 此段程序就是当敏感信号 s 发生变化至01000 时,对数码管进行置位和置型, 0000011 也就是对相应的数码管使之显示花型为 B,通过对数码管使能端的置位,控制显示的数码管显示为 BB ,并且发光二极管最左边显示为亮。
当 S 每变化一次,数码管向右移动一格,发光二极管也同步向右移动,每次只亮一个灯。
当 s 变化到 01111 之后执行下一段程序,同时扬声器发出声音。
when
"10000"=>led7s1<="1000110";led7s2<="01111110";speak<=clk3;l ed_selout<="10000001";
when"10001"=>led7s1<="1000110";led7s2<="10111101";speak<=cl k3;led_selout<="01000010";
when"10010"=>led7s1<="1000110";led7s2<="11011011";speak<=cl k3;led_selout<="00100100"; when
"10011"=>led7s1<="1000110";led7s2<="11100111";speak<=clk3;l ed_selout<="00011000";
when"10100"=>led7s1<="1000110";led7s2<="11100111";speak<=cl k3;led_selout<="00011000";
when"10101"=>led7s1<="1000110";led7s2<="11011011";speak<=cl k3;led_selout<="00100100";
when"10110"=>led7s1<="1000110";led7s2<="10111101";speak<=cl k3;led_selout<="01000010"; when
"10111"=>led7s1<="1000110";led7s2<="01111110";speak<=clk3;l ed_selout<="10000001"; when others=>null;
end case;
end process;
end;
此段程序就是当敏感信号 s 发生变化至 10000 时,对数码管进行置位和置型,1000110 也就是对相应的数码管使之显示花型为C,通过对数码管使能端的置位,控制显示的数码管显示为 CC ,并且发光二极管最左边第一个和最右边第一个显示为亮。
当 S 每变化一次,数码管向中间移动一格,发光二极管也同步中间移动,可以看到由二边向中间移动再发散到二边的变化过程。
当 s 变化到10111 之后执行再循环显示 A 花型,同时扬声器发出声音。
四、波形仿真分析
程序经过编译之后即可进行波形的仿真,为了方便观察显示结果,这里调节仿真时间为 3us ,脉冲频率 clk 的周期为 5ns,复位信号暂且不进行仿真.。
执行 Quartus 软件中的 processing--> start simulation 选项,即可观察到波形仿真图像。
如下图所示为显示花型 AA 的仿真结果。
图 2 花型 A 波形仿真图
由图 2 可知,当 clk 发生变化,来上升沿时,led7s1 为0001000 即数码管首先显示为花型 A 二极管按规定的显示,首先led7s2 位 01111111 即最右边的二极管亮灯,led_selout 为11000000 即最右边的 2 个数码管显示 2 个 A 的花型。
当 clk 变化到规定次数时二极管的显示开始按左移动,数码显示管也向左移动。
Led7s2 依次变化 01111111~11111110,实现二极管的向左移动;led_selout 也依次变化 11000000~00000011 实现数码显示管的向
左移动。
同时当 clk 信号变化 50 次时产生一个上升沿 clk1,控
制扬声器发出声音。
图 3 花型 BB 的波形仿真图
由图 3 可知,当 clk 发生变化,来上升沿时,led7s1 为0000011 即数码管首先显示为花型 B 二极管按规定的显示,首先led7s2 位 11111110 即最右边的二极管亮灯,led_selout 为00000011 即最右边的 2 个数码管显示 2 个 B 的花型。
当 clk 变化到规定次数时二极管的显示开始向右移动,数码显示管也向右移动。
Led7s2 依次变化 11111110~01111111,实现二极管的向右移动;led_selout 也依次变化 00000011~11000000 实现数码显示管的向
右移动。
同时当 clk 信号变化 25 次时产生一个上升沿 clk2,控制扬声器发出声音。
图 4 花型 C 的波形仿真图
由图 4 可知当 clk 发生变化,来上升沿时, led7s1 为1000110 即数码管首先显示为花型 C 二极管按规定的显示,首先led7s2 位 01111110 即最右边和最右边的二极管亮灯, led_selout 为 10000001 即最右边和最左边的 2 个数码管显示 2 个 C 的花型。
clk 变化到规当定次数时二极管的显示开始向中间移动,数码显示管中的花型也向中间移动,然后再由中间向俩边移动。
Led7s2 依次变化 01111110~11100111~01111110,实现二极管的向中间移动再向俩边移动; led_selout 也依次变化
10000001~00011000~10000001 实现数码显示管的向中间再向俩边移动。
同时当 clk 信号变化 8 次时产生一个上升沿 clk3,控制扬声器发出声音。
波形仿真完成之后即可进行引脚的分配,并进行编程下载至硬件进行测试。
在 Quartus 中选择 Assignments->Assignments Editor,在 Assignments Editor 窗口中选择 pin 标签页,即可分配引脚,引脚的分配情况如图 5 所示。
图 5 引脚分配图
如上图所示,在实验过程中 clk 的引脚选择 J16 即可外接频率源,实验过程中选择的频率为 1KHZ。
其余数码管和二极管以及 8 个数码管的使能端引脚分配见上图,复位键引脚 T10 对应的按键。
选
择 process->start compilation,重新编译,完成后形成可配置到FPGA 的 pan.sof 文件和配置到外部的 pan.pof 文件。
编程下载,在 quartus 软件中,选择 tools/programmer,在Mode 中选择 JTAG,点击”add file”按钮添加需要配置的 pan.sof 文件,选中 program /configure,点击 start 按钮对芯片进行配置,等待一段时间后即可观察到实验结果。
在实验箱上,我们观察到实验结果按我们所设计的那样显示,即可显示我们预先设定的三种花型 AA、BB、CC 并且能够按要求循环移动,发光二极管也可按设计要求循环闪烁,并与数码显示管的花型变化同步。
同时当显示不同的花型时扬声器发出了不同的声音。
当按下复位键时我们可以看到数码显示管重新开始再最右边显示花型AA,并且扬声器停止发声。
这些实验结果验证所设计程序的正确性,实现了设计内容和要求,并且有了一定的扩展功能。
五、设计体会
本次EDA课程设计实验,我选择了彩灯控制器的设计实验,我将理论与实践充分地结合到一起。
实践中验证理论,实践中发现新的问题,用所学到的理论知识去解决遇到的问题,在实验的过程中通过思考,摸索以及向老师、同学请教,我学到了不少知识,掌握了相关软件的操作,而这些是在书本中根本无法学到的,只有通过自己亲自实践,才会有所启发,才会有所收获。
原来所学的书本知识在学习的时候感到枯燥无味,因此只是理解了个皮毛。
但是,现在通过这次设计实验,使得我对书本知识有了一个更深入的理解,从根本上对有些问
题有了一个全新的看法,希望以后还有更多这样的实验机会。
由于实验的复杂性,所以在仿真的过程中也遇到了困难。
仿真的过程不能急躁,要一步一步来,看波形之前要先检查其静态工作点,如果静态工作点都不满足要求如何能有波形,所以要先调静态,后再调动态。
而且静态工作点的位置不好的话,也会导致波形的失真。
这次设计实验是我通过自身去解决,去分析,去探索的,我从中受益匪浅,也更深入地理解理论。
本次设计的课题是彩灯控制器的设计,这个课题的关键是计数器和分频器的使用,分频的方法有很多种,对于同一种功能的实现,用VHDL可以采用多种方式进行描述,每种方式之间各有优劣,本次设计只采用了其中较简单的一种,应尽量用最简洁的语言写出所需功能的程序。
通过这次课程设计对EDA技术有了更进一步的熟悉,VHDL 语言和C语言等其他语言还是有很大的区别。
VHDL 是 EDA 技术的重要组成部分,其具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、结构化设计方面,表现了强大的生命力和应用潜力。
其主要的也是最大的优点就在于设计者可以专心致力于其功能的实现,而不需要对不影响功能的与工艺有关的因素花费过多的时间和精力。
在实际操作中发现设计和课本上的知识有很大联系,但又高于课本,一个简单的原理要把它应用以及和其他功能综合起来就有些困难。
通过设计也巩固了我们的书本知识以及通过借阅书籍和上网
查找资料,也丰富了自己对EDA的了解。
不过本次设计也存在一些不足,暴露了自己对EDA的掌握还有所欠缺。
在设计过程中,分频分的太大,频率太小的话,扬声器的声音体现不出显示不同花型时的区别;频率太大的话,数码管显示速度太快,尝试分频时使用不同的脉冲信号,但没有成功。
在反复调试中,最后还是成功了,但原理还不是很清楚。
同时,在课程设计过程中通过与老师、同学的交流,也了解了他们对于这门技术的看法和今后这门技术的发展方向,也感谢老师对我设计的指导和同学对我的帮助。