课程设计论文基于VHDL语言的流水灯设计.doc
滨江学院课程论文(可编程器件原理与应用)题目 基于VHDL语言的流水灯设计 学生姓名 学 号 院 系 滨江学院 专 业 电子与信息工程 指导教师 二零一零年十二月三十日一、 任务:采用ALTERA公司的EPM7128SLC84-10芯片,通过VHDL语言设计一个流水灯电路。流水灯样式必须大于3种,且可以通过按键调节显示样式;可以通过按键调节流水灯变化快慢;当前流水灯样式和变化速度能够通过数码管显示出来;(附加:具有按键声)二、 设计框图(框图说明)速度按键样式按键按键控制模块速度控制样式选择译码和扫描数码显示彩灯显示1000HZ信号100HZ信号蜂鸣器1MHZ周期信号经过2个100分频,得到100HZ,再经过1个10分频得到10HZ信号,传给速度控制模块,得到需要的速度周期信号,然后传给样式选择模块,样式选择模块直接输出彩灯样式;控制模块通过接受两个按键信号,同时控制速度控制模块和样式选择模块;译码扫描模块通过判断控制模块,扫描数码管显示当前彩灯样式和彩灯变化速度;按键信号通过延时模块输出按键发生信号。三、原理图(CPLD内部原理说明)从原理图中可以看到,一共有8种模块,D触发器的作用是对按钮进行消抖,除D触发器之外的7个模块功能及作用如下:f100和f10分别是100和10的分频器,speed模块的作用是对彩灯变化速度进行控制,而style_switch模块的作用是对彩灯样式进行调节。Control模块接收按键信号对样式和速度进行总的控制。Show模块是对速度值和样式值进行译码并进行扫描数码管,将当前样式和速度状态显示出来。Delay模块则是对按键声的延时。四、各个模块设计(波形仿真)1.f100模块功能:100分频波形仿真:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity f100 is -100分频port(clk:in std_logic; sec:out std_logic);end entity f100;architecture getsec of f100 issignal secout : std_logic :='1'beginprocess(clk) isvariable count100: integer range 0 to 50;beginif clk'event and clk='1' thencount100:=count100+1;if count100=50 thensecout<=not secout;count100:=0;end if;end if;end process;sec<=secout;end architecture getsec;2.f10模块功能:10分频波形仿真:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity f10 is -10分频port(clk:in std_logic; sec:out std_logic);end entity f10;architecture getsec of f10 issignal secout : std_logic :='1'beginprocess(clk) isvariable count10: integer range 0 to 5;beginif clk'event and clk='1' thencount10:=count10+1;if count10=5 thensecout<=not secout;count10:=0;end if;end if;end process;sec<=secout;end architecture getsec;3.speed模块功能:根据DATE输入端的数值大小,产生不同频率的周期信号,从而达到控制彩灯变化速率的目的。波形仿真:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity speed is -速度控制port(clk,clr:in std_logic;date:in std_logic_vector(1 downto 0); spd_out:out std_logic);end entity speed;architecture arch of speed issignal spd_num:std_logic_vector(1 downto 0):="00"signal num:std_logic_vector(1 downto 0):="00"signal out_temp : std_logic :='0'beginprocess(clk,clr) isbeginspd_num <= 3-date;if clr='1' thennum <= "00"spd_num <= 3-date;out_temp <='0'elseif clk'event and clk='1' thenif num>=spd_num thennum<="00"out_temp<=not out_temp;elsenum<=num+1;end if;end if;end if;end process;spd_out<=out_temp;end architecture arch;4. style_switch模块功能:根据DATE输入端的数值大小,输出不同的彩灯样式波形仿真:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity style_switch is -样式选择port(clk,clr:in std_logic;date:in std_logic_vector(1 downto 0);style_out:out std_logic_vector(14 downto 0);end entity style_switch;architecture arch of style_switch issignal style_num:std_logic_vector(1 downto 0);signal style_over:std_logic:='0'beginprocess(clk,clr) isvariable temp: integer range 0 to 7;beginif clr='1' thentemp:=0;style_num <= "00"elseif clk'event and clk='1' thenif date="00" thenif style_over='1' thenstyle_num<=style_num+1;end if ;elsestyle_num<=date;end if;case style_num iswhen "00" => case temp iswhen 0 => style_out<="000000000000000"when 1=> style_out <="111111111111111"when 2=> style_out <="000000000000000"when 3=> style_out <="111111111111111"when others => style_out <="111111111111111"end case;temp:=temp+1;if temp>3 thenstyle_over<='1'temp:=0;elsestyle_over<='0'end if;when "01" => case temp iswhen 0 => style_out<="000000000000000"when 1=> style_out <="111110000000000"when 2=> style_out <="111111111100000"when 3=> style_out <="111111111111111"when 4=> style_out <="000001111111111"when 5=> style_out <="000000000011111"when others => style_out <="111111111111111"end case;temp:=temp+1;if temp>5 thenstyle_over<='1'temp:=0;elsestyle_over<='0'end if;when "10"=> case temp iswhen 0 => style_out <="100100100100100"when 1 => style_out <="010010010010010"when 2 => style_out <="001001001001001"when 3 => style_out <="100100100100100"when 4 => style_out <="010010010010010"when 5 => style_out <="001001001001001"when others => style_out <="111111111111111"end case;temp:=temp+1;if temp>5 thenstyle_over<='1'temp:=0;elsestyle_over<='0'end if;when "11"=> case temp iswhen 0 => style_out <="000000000000000"when 1 => style_out <="111000000000111"when 2 => style_out <="111111000111111"when 3 => style_out <="111111111111111"when 4 => style_out <="111111000111111"when 5 => style_out <="111000000000111"when others => style_out <="111111111111111"end case;temp:=temp+1;if temp>5 thenstyle_over<='1'temp:=0;elsestyle_over<='0'end if;when others => style_out <="111111111111111"end case;end if;end if;end process;end architecture arch;5. control模块功能:接收按键信号,调节彩灯样式和变化速度值波形仿真:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity control is 控制模块port(key_speed,key_style:in std_logic;speed_out,style_out:out std_logic_vector(1 downto 0);end entity control;architecture arch of control issignal speed_num:std_logic_vector(1 downto 0);signal style_num:std_logic_vector(1 downto 0);beginprocess(key_speed) isbeginif key_speed'event and key_speed='1' thenspeed_num<=speed_num+1;end if;end process;process(key_style) isbeginif key_style'event and key_style='1' thenstyle_num<=style_num+1;end if ;end process;speed_out<=speed_num;style_out<=style_num;end architecture arch;6.show模块功能:译码和数码管的动态扫描波形仿真:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity show is -译码和数码管显示port(clk:in std_logic;style,speed:in std_logic_vector(1 downto 0);duan:out std_logic_vector(6 downto 0);wei:out std_logic_vector(1 downto 0);end entity show;architecture arch of show isbeginprocess(clk) isvariable temp: integer range 0 to 1;beginif clk'event and clk='1' thenif temp =0 thencase style iswhen "00" => duan<="0111111"when "01" => duan<="0000110"when "10" => duan<="1011011"when "11" => duan<="1001111"when others => duan<="1111111"end case;wei<="10"elsecase speed iswhen "00" => duan<="0111111"when "01" => duan<="0000110"when "10" => duan<="1011011"when "11" => duan<="1001111"when others => duan<="1111111"end case;wei<="01"end if;temp:=temp+1;end if;end process;end architecture arch;7.delay模块功能:按键按下之后,蜂鸣器鸣叫延时波形仿真:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity delay is -蜂鸣器延时port(clk,con:in std_logic; d_out:out std_logic);end entity delay;architecture arch of delay issignal num:std_logic_vector(1 downto 0):="00"beginprocess(clk,con) isbeginif con='1' thennum<="01"d_out<='1'elseif clk'event and clk='1' thenif num/="00" thennum<=num-1;elsed_out<='0'end if;end if;end if;end process;end architecture arch;五、结果为验证所设计程序是否正确,将程序下载进行硬件测试。在MAX+PLUS开发环境中进行管脚锁定,连接好下载线,然后将目标文件下载到器件中。经过测试,流水灯样式一共有4种,第0种样式为样式1、2、3的综合,且可以通过按键调节显示样式;通过按键能够调节流水灯变化快慢,速度0为最慢速度,而速度3为最快速度;当前流水灯样式和变化速度也能够通过数码管显示出来;同时为了突出按键效果,按键被按下时,蜂鸣器能够发出鸣叫声。六、总结(包括体会和制作过程 1000字)经过一周的努力终于完成流水灯的设计,流水灯是由七个部分组成,其中包括分频器、速度控制器、样式选择器、总控制器、显示器、按钮、蜂鸣器组成。由1个四位数码管构成的显示屏可以正常显示当前彩灯样式和变化速度,并且可以通过按钮进行调节彩灯样式和变化速度,经过仿真测试各个功能键工作正常,并且能够发出蜂鸣声,达到了设计要求。在设计过程中,也遇到了许多问题,但通过查阅资料,上网百度,问题都得到了解决。例如:在同一个进程中,如果有两个或两个以上敏感信号,那么只能使用一个EVENT事件;在一个实体中,如果有两个或两个以上的进程,那么在各自的进程中,不能对同一个信号进行赋值;信号和变量的区别在于,信号在进程之外进行定义,而变量只能在某个进程中进行定义,在多进程执行的时候,外部进程不能使用本进程的变量。还有一个最为重要的问题就是,需要考虑资源量,一个芯片中可以下载进去的程序大小是有限的,在程序设计的时候尽量少申请变量和信号,对于信号和变量,位数能少则少,这样生成的模块资源才不会占用很大。通过这次EDA试验设计,我感觉自己设计的流水灯功能虽然很简单,但从中我获得了许多。至少说又学会了一门VHDL语言,学会了MAX-PLUS II的使用,包括模块设计,波形仿真以及原理图的设计同时,我也深深的体会到,EDA和单片机在问题解决上有很多差别,比如:对于按钮消抖,单片机一般通过延时进行消抖,而EDA则是通过一个D触发器来进行消抖。可以说EDA的多进程的并发执行是一大优势,对于单片机来说,只能有一个主进程,通过中断跳转去执行相应的部分。“实践是检验真理的唯一标准”,这句话现在对于我来说真的是深有体会,我越来越相信只有通过自己动手实践,才能发现具体问题,才能够对问题有深刻的认识,最后才能从根本上解决问题。七、参考书(文章)1 谭会生 张昌凡.EDA技术及应用(第二版). 西安电子科技大学出版社,2004.2 余孟尝主编.数字电子技术基础简明教程(第三版). 高等教育出版社,2006.