北邮数字电路综合实验报告——交通灯控制器的VHDL实现_第1页
北邮数字电路综合实验报告——交通灯控制器的VHDL实现_第2页
北邮数字电路综合实验报告——交通灯控制器的VHDL实现_第3页
北邮数字电路综合实验报告——交通灯控制器的VHDL实现_第4页
北邮数字电路综合实验报告——交通灯控制器的VHDL实现_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数字电路综合实验报告班 级: 姓 名: 班内序号: 学 号: 日 期: 目录一、实验摘要3二、实验任务31.任务要求32.任务解析3三、实验设计思路41.状态转移图42.流程图53.模块确定54.系统框图7四、程序代码7主程序7分频模块9防抖模块10交通灯控制模块11数字译码模块14五、实验结果151.仿真结果152.实物结果17六、所遇问题分析17七、实验总结18北京邮电大学 数字电路综合实验交通灯控制器的vhdl实现一、实验摘要随着交通情况的日益复杂,交通灯在生活中所处的位置也越来越高。本实验就是基于vhdl语言编程实现了十字路口的交通灯控制器。对于交通等控制器的设计是分模块自顶向下的设计

2、思想,软硬件结合来实现本设计。关键字:交通灯、vhdl、控制器二、实验任务1.任务要求1) 南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20秒、5秒和25秒;2) 当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;3) 用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;2.任务解析东西(a车道)和南北(b车道)方向各有一组绿、黄、红灯用于指挥交通(如图1),绿灯、黄灯和红灯的持续时间分别为 20 秒、5 秒和 25 秒。图1 十字路口交通灯模型因此,可以设计如下四个状态,其关

3、系为:状态亮灯情况车辆行驶状况持续时间(秒)下一状态a车道b车道s0红亮红亮紧急状况,a/b车道均禁止通行s1s1绿亮红亮a车道通行,b车道禁止通行20s2s2黄亮红亮a车道缓行,b车道禁止通行5s3s3红亮绿亮a车道禁止通行,b车道通行20s4s4红亮黄亮a车道禁止通行,b车道缓行5s1三、实验设计思路1.状态转移图图2 状态转移图2.流程图图3 流程图3.模块确定分频模块设计原因:由于实验板只能提供50mhz的时钟信号,而电路中只能使用较低频率的时钟:1hz时钟信号:计数器count变化时使用;20hz时钟信号:在防抖电路中使用的时钟信号;1khz时钟信号哦:用于数码管位选信号的改变的时钟

4、信号。功能:用于将实验板上的50mhz的时钟信号经分频后输出:1khz、20hz、1hz。图4 分频模块的输入和输出防抖动模块设计原因:只要有按键或是拨码开关,防抖电路就是不可缺少的一个模块。否则,按键信号中的一些毛刺和抖动往往会引起电路不可预知的错误。功能:将带有抖动的信号进行识别和判断,输出持续时间超过0.1s的高电平信号。图5 防抖动模块的输入和输出交通灯控制模块设计原因:这个模块是本程序设计的灵魂,是重中之重!这个模块用于控制电路的状态改变和按键响应,也就是系统中控制器的作用。功能:根据按键信号和输入时钟,输出符合交通灯状态变化规律的led驱动信号、数码管显示的数据、数码管位选信号。图

5、6 交通灯控制模块的输入和输出数字译码模块设计原因:由于交通灯控制模块输出的为数码管显示的数据,为10进制数,因此必须要一个译码电路,将此十进制数转化为led灯的驱动信号,而这个功能正是由此模块完成。功能:将输入的十进制数转变为相应的8位2二进制数作为数码管的驱动信号。图7 数字译码模块的输入和输出整体模块连接图图8 模块整体连接图4.系统框图图9 系统框图四、程序代码主程序-主程序-library ieee; use ieee.std_logic_1164.all;entity traffic_lights isport(clk:in std_logic; -时钟信号emerg,reset:

6、in std_logic; -复位和紧急情况信号seg:out std_logic_vector(7 downto 0); -7段数码管显示select_led:out std_logic_vector(5 downto 0); -选通输出lights:out std_logic_vector(7 downto 0);-led发光管输出end traffic_lights;architecture a of traffic_lights is -分别调用各个模块signal cp1k,cp20,cp1,resetout,emergout:std_logic;signal number:inte

7、ger range 0 to 9;component freq_divide -分频模块 1k 100hz 1hz port(clk_in:in std_logic; clk_1,clk_20,clk_1k:out std_logic);end component;component noshake -分频模块 1k 100hz 1hz port(clk_20,keyin:in std_logic; keyout:out std_logic);end component;component traffic -交通灯控制模块 port(clk1,clk1k:in std_logic;emerg,

8、reset:in std_logic;num:out integer range 0 to 9;lights:out std_logic_vector(7 downto 0);select_led:out std_logic_vector(5 downto 0);end component;component display -数字译码模块 port(num:in integer range 0 to 9; seg:out std_logic_vector(7 downto 0);end component;begin u1:freq_divide port map(clk,cp1,cp20,

9、cp1k); -分频器产生时钟信号u2:noshake port map(cp20,reset,resetout); -对复位信号防抖处理u3:noshake port map(cp20,emerg,emergout); -对紧急信号防抖处理u4:traffic port map(cp1,cp1k,emergout,resetout,number,lights,select_led); -状态机运转u5:display port map(number,seg); -数码管显示end;分频模块-分频模块-library ieee;use ieee.std_logic_1164.all;use i

10、eee.std_logic_unsigned.all;entity freq_divide isport(clk_in : in std_logic; clk_1,clk_20,clk_1k : out std_logic);end;architecture a of freq_divide issignal count1 : integer range 0 to 24999;signal count2 : integer range 0 to 24;signal count3 : integer range 0 to 9;signal clk_tmp1,clk_tmp2,clk_tmp3:

11、std_logic;begin-50000分频进程-输出:1khz的时钟信号-功能:用于数码管显示时刷新频率p1:process(clk_in)beginif (clk_inevent and clk_in=1) thenif count1=24999 thencount1=0;clk_tmp1= not clk_tmp1;elsecount1=count1+1;end if;end if;end process p1;-50分频进程-输出:20hz的时钟信号-功能:防抖动电路中使用p2:process(clk_tmp1)beginif (clk_tmp1event and clk_tmp1=

12、1) thenif count2=24 thencount2=0;clk_tmp2= not clk_tmp2;elsecount2=count2+1;end if;end if;end process p2;-20分频进程-输出:1hz的时钟信号-用于状态转变的时钟信号p3:process(clk_tmp2)beginif (clk_tmp2event and clk_tmp2=1) thenif count3=9 thencount3=0;clk_tmp3= not clk_tmp3;elsecount3=count3+1;end if;end if;end process p3;clk_

13、1=clk_tmp3;clk_20=clk_tmp2;clk_1k=clk_tmp1;end;防抖模块-防抖动模块-library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity noshake isport(clk_20,keyin: in std_logic; keyout: out std_logic);end;architecture a of noshake issignal cp:std_logic;begin-只有持续时间高于0.1s的高电平才有效-process(clk_20)var

14、iable times:integer range 0 to 2;beginif (clk_20event and clk_20=1) thenif keyin=1 thenif times=2 then times:=times;else times:=times+1;end if;else times:=0;end if;end if;if times=2then cp=1;else cp=0;end if;keyout=cp;end process;end;交通灯控制模块-交通灯控制模块-library ieee;use ieee.std_logic_1164.all;use ieee.

15、std_logic_unsigned.all;entity traffic is port(clk1,clk1k:in std_logic; emerg,reset:in std_logic; num:out integer range 0 to 9; lights:out std_logic_vector(7 downto 0); select_led:out std_logic_vector(5 downto 0); end traffic;architecture control of traffic istype states is(s0,s1,s2,s3,s4);signal sta

16、te:states;signal num1,num2,num3,num4:integer range 0 to 9;signal emerg_status,reset_status:std_logic:=0;signal count:integer range 1 to 50 :=50;begin-紧急信号的处理进程-p1:process(emerg)beginemerg_status=emerg;end process p1;-复位信号处理及计数器count控制进程-p2:process(reset)beginreset_status=reset;end process p2;p3:proc

17、ess(clk1)beginif(reset_status=1) thencount=50;elsif(emerg_status=1) then count=count;else if(clk1event and clk1=1) thenif count=1 thencount=50;else count=count-1;end if;end if;end if;end process;-核心状态机- p4:process(emerg_status,count)-根据计数器来选择交通灯状态begin if(emerg_status=1)then state=31)then state=s1;e

18、lsif(count=26)then state=s2;elsif(count=6)then state=s3;else statelightslightslightslightslights=10001000; -;ra/ybend case; end process;-根据计数器值确定数码管显示数字-p5:process(emerg_status,count)beginif(emerg_status=1) -紧急状态下数码管显示8then num1=8;num2=8;num3=8;num4=8;else -状态s1if(count=50) then num1=2;num2=0;num3=2

19、;num4=45 and count50) then num1=1;num2=count-40;num3=2;num4=40 and count=44) then num1=1;num2=count-40;num3=1;num4=35 and count=39) then num1=0;num2=count-30;num3=1;num4=31 and count=34) then num1=0;num2=count-30;num3=0;num4=26 and count=30) then num1=0;num2=count-25;num3=0;num4=count-25;-状态s3elsif(

20、count=25) then num1=2;num2=5;num3=2;num4=20 and count=24) then num1=2;num2=count-20;num3=1;num4=15 and count=19) then num1=1;num2=count-10;num3=1;num4=14 and count=10) then num1=1;num2=count-10;num3=0;num4=6 and count=9) then num1=1;num2=count;num3=0;num4=count-5;else num1=0;num2=count;num3=0;num4nu

21、m=num1;temp:=1;select_lednum=num2;temp:=2;select_lednum=num3;temp:=3;select_lednum=num4;temp:=0;select_ledsegsegsegsegsegsegsegsegsegsegseglightslightslightslightslightsnum=num1;temp:=1;select_lednum=num2;temp:=2;select_lednum=num3;temp:=3;select_lednum=num4;temp:=0;select_led=000011;即数码管位选信号循环输出03。

22、输入信号:1hz和1khz的时钟信号,仿真时间为110s。仿真波形图正常状况下reset和emerg都为低电平。图10 正常状态下的仿真波形图11 续图10由上两图可见,正常情况下,状态转移完全符合设计要求:,如此循环往复。num信号和select_led信号(局部)图12 正常运行下的的仿真波形数码管显示数字和数码管位选信号也都正常输出。复位信号响应reset信号图13 复位情况下的仿真波形由上面仿真波形中可见,当reset为高电平时,在时钟沿上状态改变为s1,即复位成功。紧急信号响应紧急信号图14 紧急情况下的仿真波形由图14可见,在emerg信号有效时,交通灯状态一直处于s0,一旦eme

23、rg信号失效,状态立马恢复到原来(emerg信号之前的状态)。总之,紧急状况处理成功!2.实物结果总体来说,实验要求的基本功能全部完成,且没有bug。交通灯运行完全符合前面分析的要求。六、所遇问题分析问题1:状态改变的参考量的确定。解决方案:当初设计时,丝毫没有头绪。当参考了以前同学的程序后,心中不由豁然开朗使用计数器count的值来控制状态改变和数码管显示数字。这个想法确实很巧妙,做到了一个count解决所有控制问题。这样的设计,大大减小了程序的复杂度。问题2:reset信号由拨码开关还是由按键来输入。解决方案:这点困扰了我好久。最后考虑到如果使用按键输入时,一来与实际情况不符,二来为程序编写增加了难度。难度引入主要是由

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论