您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 彩灯控制电路设计与实现(VHDL编程)
实验名称:彩灯控制电路设计与实现实验任务要求:用VHDL语言设计并实现一个彩灯控制电路,仿真并下载验证其功能。彩灯有两种工作模式,可通过拨码开关或按键进行切换。(1)单点移动模式:一个点在8个发光二极管上来回的亮(2)幕布式:从中间两个点,同时向两边依次点亮直至全亮,然后再向中间点灭,依次往复设计思路和过程:可以将两种模式分开设计,再用一个控制钮进行切换。两种模式本质一样,都是循环点亮灯。可以用状态机设计。首先明确设计对象的外部特征,输入信号只有时钟信号cp和切换按钮此处取a;输出为检测的八个彩灯亮暗。根据设计对象的操作控制步来确定有限状态机的状态。取初始状态为s0,第一种模式共有14种状态循环,因而可取状态s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13;第二种模式有八种状态,可共用第一种模式中的前八种状态,即为s0,s1,s2,s3,s4,s5,s6,s7。根据题目要求的循环可以写出各个状态的下一状态,写完整个循环为止。切换按钮可以用一个If来总领。单点移动模式:S0S5S13S7S8S9S10S11S1S2S3S4S12S6幕布式:流程图:彩灯电路设计语言:libraryieee;useieee.std_logic_1164.all;entitypmdisport(a,cp:instd_logic;%输入信号deng:outstd_logic_vector(7downto0)%输出灯信号);endpmd;architecturearchofpmdistypeall_stateis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13);%枚举状态机状态signalstate:all_state;%状态转换符号begin%开始程序process(cp)S0S7S6S1S5S4S2S3beginif(cp'eventandcp='1')then%时钟信号开始计数if(a='1')then%单点循环模式casestateiswhens0=state=s1;deng=00000001;%状态循环whens1=state=s2;deng=00000010;whens2=state=s3;deng=00000100;whens3=state=s4;deng=00001000;whens4=state=s5;deng=00010000;whens5=state=s6;deng=00100000;whens6=state=s7;deng=01000000;whens7=state=s8;deng=10000000;whens8=state=s9;deng=01000000;whens9=state=s10;deng=00100000;whens10=state=s11;deng=00010000;whens11=state=s12;deng=00001000;whens12=state=s13;deng=00000100;whens13=state=s0;deng=00000010;whenothers=state=s0;deng=00000000;endcase;Else%切换为幕布式casestateiswhens0=state=s1;deng=00011000;whens1=state=s2;deng=00111100;whens2=state=s3;deng=01111110;whens3=state=s4;deng=11111111;whens4=state=s5;deng=01111110;whens5=state=s6;deng=00111100;whens6=state=s7;deng=00011000;whens7=state=s0;deng=00000000;whenothers=state=s0;deng=00000000;endcase;endif;endif;endprocess;endarch;输入波形:添加五十分频后的仿真程序:libraryieee;useieee.std_logic_1164.all;entitycdisport(a,clk:instd_logic;q:outstd_logic_vector(7downto0));endcd;architectureaofcdistypeall_stateis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13);signalstate:all_state;signalcnt:integerrange0to24999999;%50分频状态signalclk_tmp:std_logic;beginprocess(clk)Begin%开始运行分频信号if(clk'eventandclk='1')thenifcnt=24999999thencnt=0;clk_tmp=notclk_tmp;elsecnt=cnt+1;endif;endif;if(clk_tmp'eventandclk_tmp='1')then%分频后运行彩灯程序if(a='1')thencasestateiswhens0=state=s1;q=00000001;whens1=state=s2;q=00000010;whens2=state=s3;q=00000100;whens3=state=s4;q=00001000;whens4=state=s5;q=00010000;whens5=state=s6;q=00100000;whens6=state=s7;q=01000000;whens7=state=s8;q=10000000;whens8=state=s9;q=01000000;whens9=state=s10;q=00100000;whens10=state=s11;q=00010000;whens11=state=s12;q=00001000;whens12=state=s13;q=00000100;whens13=state=s0;q=00000010;whenothers=state=s0;q=00000000;endcase;elsecasestateiswhens0=state=s1;q=00011000;whens1=state=s2;q=00111100;whens2=state=s3;q=01111110;whens3=state=s4;q=11111111;whens4=state=s5;q=01111110;whens5=state=s6;q=00111100;whens6=state=s7;q=00011000;whens7=state=s0;q=00000000;whenothers=state=s0;q=00000000;endcase;endif;endif;endprocess;enda;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitycdisport(a,clk:instd_logic;q:outstd_logic_vector(7downto0));endcd;architectureaofcdistypeall_stateis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13);signalstate:all_state;beginprocess(clk)beginif(clk'eventandclk='1')thenif(a='1')thencasestateiswhens0=state=s1;q=00000001;whens1=state=s2;q=00000010;whens2=state=s3;q=00000100;whens3=state=s4;q=00001000;whens4=state=s5;q=00010000;whens5=state=s6;q=00100000;whens6=state=s7;q=01000000;whens7=state=s8;q=10000000;whens8=state=s9;q=01000000;whens9=state=s10;q=00100000;whens10=state=s11;q=00010000;whens11=state=s12;q=00001000;whens12=state=s13;q=00000100;whens13=state=s0;q=00000010;whenothers=state=s0;q=00000000;endcase;elsecasestateiswhens0=state=s1;q=00011000;whens1=state=s2;q=00111100;whens2=state=s3;q=01111110;whens3=state=s4;q=11111111;whens4=state=s5;q=01111110;whens5=state=s6;q=00111100;whens6=state=s7;q=00011000;whens7=state=s0;q=00000000;whenothers=state=s0;q=00000000;endcase;endif;endif;endprocess;enda;故障及问题分析:1.编写这个程序时,很自然地想到用一个输入信号控制两种模式的切换,但把这个输入放在哪里,如何放,开始出现了几种想法。先是用when来引出a=0&a=1两种模式,结果出现了错误,后改用if……if来总领,感觉太罗嗦,但可行,最后定为if……else……,这样比较清晰的表达了分组的目的,取得了较好的效果。2.在确定有限状态机的状态个数时,一开始只是用了8个状态,第一种工作模式循环出现了混乱(虽然第一种模式只有8种状态),古尔改采用14个状态表示,第二种模式共用第一种模式的前八种状态,虽然看上去比较罗嗦,但这样使得整个程序运行比较顺畅,看起来也相对比较明了。3.在验收虽然本程序得到了通过,但是state描述两个或多个状态时可能会发生锁存器错误,产生记忆效应,因而可以将state改命名为state_1和state_2,这样看起来就不会混乱了。总结和结论:《数字电路与逻辑设计实验》这门课总共虽然只有四次课堂实验,但是我还是学到了很多东西。第一次和第二次实验都是实验板的接线。第一次是集成门电路电压参数的测量,让我熟悉了TTL电路和COMS电路的使用规则,掌握了集成门电路的电路外特性参数的测量方法及其物理意义,并熟悉了实验板的结构和使用方法,为下面的实验打好了基础。第二次是组合逻辑电路冒险的研究和消除,在第一次实验的经验基础上可以较顺利地完成此次实验,这次试验将课本中学关于冒险的理论充分应用到实际中的,让我们清楚地看到了冒险并尝试找到了一些解决冒险的方法,为理论到实践搭建了桥梁。第三、四次试验都是基于一款在电路中应用十分广泛也是十分重要的软件quartusII的实验。通过第三次试验熟悉了用quartusII原理图输入法进行电路设计和仿真,熟悉了电路板是使用。第四次实验是用quartusII文本输入法进行电路设计和仿真,用到了VHDL语言设计组合逻辑电路,让我学习了一种新的设计语言,为以后从事电路设计方面的工
本文标题:彩灯控制电路设计与实现(VHDL编程)
链接地址:https://www.777doc.com/doc-2467969 .html