首页 数字电路与逻辑设计实验

数字电路与逻辑设计实验

举报
开通vip

数字电路与逻辑设计实验数字电路与逻辑设计实验 数字电路与逻辑设计实验 实验报告 姓 名:尚 飞 班 级:07605 学 号:071857(6) 数字电路与逻辑设计实验报告 一.设计课题的任务要求 设计制作一个用于十字路口的交通灯控制器 (1)南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20秒、5秒和25秒; (2)当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行; (3)用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间...

数字电路与逻辑设计实验
数字电路与逻辑设计实验 数字电路与逻辑设计实验 实验报告 姓 名:尚 飞 班 级:07605 学 号:071857(6) 数字电路与逻辑设计实验报告 一.设计课 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 的任务要求 设计制作一个用于十字路口的交通灯控制器 (1)南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20秒、5秒和25秒; (2)当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行; (3)用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间; 选做:增加左、右转弯显示控制功能; 二.系统设计 (1)基本设计思路: 基本思路是采用状态机的设计方法,在增加了左转显示功能后,修改了每个交通灯的持续时间列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 如下: 绿灯 20s 黄灯 5s 左转灯 10s 红灯 40s 最初的状态机是设定了8个状态列表如下:(设两个路口为A和B) A:红 B:绿 A:绿 B:红 A:红 B:黄 A:黄 B:红 A:红 B:左转 A:左转 B:红 A:红 B:黄 A:黄 B:红 MSD图如下: ASM图如下: (2)对原有设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 的创新和新方案的利弊分析: 编写VHDL时发现采用上述的设计方法,对于交通灯的计时模块设计需要完成累计80秒的过程,而实际上前半个40秒和后半个40秒的状态具有对称性,可以看成4种状态:RG,RY,RL ,RY在前半40秒出现在A和B路口的交通灯和倒计时器上,后半个40秒只需将这四个状态的的对应数据做调换再次出现在A和B路口的交通灯和倒计时器上,这样设计的目的是从硬件的角度理解,实际上是在简化了计时模块的电路,在交通灯显示控制模块和倒计时显示模块(两个译码电路)增设了选择信号。 从上学期的数电理论课上学习的知识角度考虑这样的设计相比最初的设计可以简化硬件电路,但是可能在实际电路中,这样的组合电路设计方式不如8个状态的时序电路设计方案效果更好,毕竟理论和实际有一定的差距,短时间内做到理论和实际的平衡对于本科生来讲,在没有经过大量数字电路的设计,积累大量的实践经验的情况下,还是很困难的,往往是两者不能兼顾,所以每一种设计方案都代表这一次创新,实验本身的目的不在于在前人的基础上原地踏步,而在于发挥自己的创造力,在前人的基础上努力拓展自己的思路,从中获得宝贵的实践经验 (3)最终设计框图和模块化设计方案: 最终设计的总体框图: 模块化设计方案: 模块名称 文件名称 完成功能 分频器模块 fen 将1MHZ时钟分频输出1HZ和1000HZ的时钟信号 交通灯控制模块 trafficlight 完成倒计时,输出控制信号等主要功能 连接模块 traffic_a 连接前两个模块的各个端口 三.仿真波形及波形分析: (1)交通灯控制模块仿真波形及分析: a.说明在没有加入分频器的情况下,做如下的仿真设置: 实际输入信号属性 仿真输入信号属性 1Hz时钟信号 T=10us时钟信号 1000HZ数码管扫描信号 T=400ns数码管扫描信号 b.仿真波形如图: (1-1)正常情况(urgency=0)的仿真波形 (1-2)出现两次(urgency=1)的仿真波形 c.仿真波形分析: 从仿真波形(1-1)上可以看出在一个路口禁行的情况下(红灯40s),另外一个路口经历了一系列状态(绿灯20s-黄灯5s-左转10s-黄灯5s),每隔40s两个路口的状态就会调换,从仿真波形上可以看到上下两组波形交替出现同一波形。 从仿真波形(1-2)上可以看到一旦出项urgency=1,red_1和red_2同时置为1,另外当urgency从1变回0后,恢复到到urgency置为1前的状态,在仿真波形上可以看到时间延长了,说明计时器在urgency=0的时间段内停止计时,数码管也相继停止。 d.数码管输入信号分析: 对于b端口的详细分析基本上可以在(1-1)(1-2)两个波形的每个状态转移时刻放大波形观察输出信号,配合数码管扫描信号可以完整地写出每个数码管的显示数字。 (2)分频器的仿真波形 a.仿真条件说明:分频器设计框图: 这样在设计时实际是将同一个过程重复书写,所以仿真时只做了1000分频的仿真 参数设置:End time=5ms f=1 MHz b.仿真波形如图: (2-2)分频器仿真波形 c.仿真波形分析: 从时间轴上可以看到,5ms的时间间隔被分成了5个周期,符合1000分频1us时钟信号的要求。 四.源程序(配注释): (1)分频器模块: library ieee; use ieee.std_logic_1164.all; entity fen is port( clk:in std_logic; --开发板的高频时钟输入信号f=1MHz clk_out1:out std_logic; --分频输出f=1000Hz数码管扫描时钟端口 clk_out2:out std_logic --分频输出f=1Hz时钟端口 ); end fen; architecture fen_arc of fen is signal temp1:std_logic; signal temp2:std_logic; -- MESSAGE信号 begin p1:process (clk) variable count1:integer range 0 to 999; --计数变量 begin if clk'event and clk='1'then --上升沿有效 if count1=999 then temp1<='0'; count1:=0; elsif count1<500 then temp1<='1'; count1:=count1+1; elsif count1<999 then temp1<='0'; count1:=count1+1; --占空比为50%的时钟信号 end if; end if; end process p1; p2:process(temp1) variable count2:integer range 0 to 999; begin if temp1'event and temp1='1'then if count2=999 then temp2<='0'; count2:=0; elsif count2<500 then temp2<='1'; count2:=count2+1; elsif count2<999 then temp2<='0'; count2:=count2+1; --同上进程 end if; end if; end process p2; clk_out1<=temp1; --输出分频后的时钟 clk_out2<=temp2; end fen_arc; (2)交通灯控制模块: library ieee; use ieee.std_logic_1164.all; entity trafficlight is port( clk_out,clk_out1,urgency:in std_logic; --两个时钟信号和一个紧急请求信号 red_1,red_2,yellow_1,yellow_2,green_1,green_2,left_1,left_2:out std_logic; --交通灯输出端口 b:out std_logic_vector(6 downto 0); --7段数码管端口 cat:out std_logic_vector(5 downto 0) --数码管共阴极扫描端口 ); end trafficlight; architecture trafficlight_arc of trafficlight is signal transit:integer range 0 to 19; --通行时间 signal stop:integer range 0 to 39; --禁行时间 signal transith,stoph:integer range 0 to 3; --通行/禁行的高位数字 signal transitl,stopl:integer range 0 to 9; --通行/禁行的低位数字 signal k:integer range 0 to 3; --“定义”了4个状态,以0,1,2,3表示 signal k1,k2:integer range 0 to 1; --“定义”了2个状态,以0,1表示 signal red1,red2,green1,green2,yellow1,yellow2,left1,left2:std_logic; begin p1:process (clk_out,urgency) begin if(urgency='1')then --紧急状态下,状态:k2=1 red_1<='1';red_2<='1'; green_1<='0';green_2<='0'; yellow_1<='0';yellow_2<='0'; left_1<='0';left_2<='0'; k2<=1; --k2保持1不变 else --正常情况下 if(k2=0)then --k2=0说明之前不是紧急情况 if (clk_out'event and clk_out='1')then if stop>20 then --禁行时间倒计时未到20s if k1=0 then --k1=0 red1<='1';green2<='1'; green1<='0';red2<='0'; yellow1<='0';yellow2<='0'; left1<='0';left2<='0'; else --k1=1,用k1的0,1交替变化决定两个路口的状态 green1<='1';red2<='1'; green2<='0';red1<='0'; yellow1<='0';yellow2<='0'; left1<='0';left2<='0'; end if; --1,2两个路口在k1=0和k1=1时的状态正好相反 elsif stop>15 then --禁行时间倒计时超过20s,但未到25s if k1=0 then red1<='1';yellow2<='1'; green1<='0';green2<='0'; red2<='0';yellow1<='0'; left1<='0';left2<='0'; else yellow1<='1';red2<='1'; green2<='0';green1<='0'; red1<='0';yellow2<='0'; left1<='0';left2<='0'; end if; elsif stop>5 then --禁行时间倒计时超过25s,但未到35s if k1=0 then red1<='1';left2<='1'; red2<='0'; left1<='0'; yellow1<='0';yellow2<='0'; green1<='0';green2<='0'; else left1<='1';red2<='1'; left2<='0';red1<='0'; yellow1<='0';yellow2<='0'; green1<='0';green2<='0'; end if; elsif stop>0 then --禁行时间倒计时超过35s,但未到最后1s if k1=0 then red1<='1';yellow2<='1'; red2<='0';yellow1<='0'; green1<='0';green2<='0'; left1<='0';left2<='0'; else yellow1<='1';red2<='1'; yellow2<='0';red1<='0'; green1<='0';green2<='0'; left1<='0';left2<='0'; end if; else --禁行时间倒计时到最后一秒,完成状态的对调 if k1=0 then green1<='1';red2<='1'; green2<='0';red1<='0'; yellow1<='0';yellow2<='0'; left1<='0';left2<='0'; else red1<='1';green2<='1'; red2<='0';green1<='0'; yellow1<='0';yellow2<='0'; left1<='0';left2<='0'; end if; end if; red_1<=red1;red_2<=red2; yellow_1<=yellow1;yellow_2<=yellow2; green_1<=green1;green_2<=green2; left_1<=left1;left_2<=left2; --输出 end if; else --从urgency=1中回到紧急前的状态 red_1<=red1; red_2<=red2; yellow_1<=yellow1; yellow_2<=yellow2; green_1<=green1; green_2<=green2; left_1<=left1; left_2<=left2; k2<=0; --k2重归零 end if; end if; end process p1; p2:process (clk_out) begin if(urgency='1')then transith<=transit/10; transitl<=transit rem 10; stoph<=stop/10; stopl<=stop rem 10; --数码管计数停止 else if(clk_out'event and clk_out='1')then if(stop=0)then --一个40s结束进入下一个倒计时周期 transit<=19; --直行20s stop<=39; --红灯累计40s if k1=1 then --k1的作用是“控制”交通灯亮灭和数码管显示的对调 k1<=0; else k1<=1; end if; --k1取反 elsif(stop=20)then transit<=4; --绿灯20s结束,接下来是5s黄灯 stop<=stop-1; elsif(stop=15)then --黄灯5s结束,接下来是10s左转 transit<=9; stop<=stop-1; elsif(stop=5)then --左转10s结束,接下来是5s黄灯 transit<=4; stop<=stop-1; else --每个时段倒计时即为减1 transit<=transit-1; stop<=stop-1; end if; --对禁行时间倒计时的变化过程在特殊的时刻点强制通行时间为 --特定值,其他情况同时自减1 transith<=transit/10; transitl<=transit rem 10; stoph<=stop/10; stopl<=stop rem 10; --取出禁行/通行时间的十位(/10运算)和个位(rem 10运算) end if; end if; end process p2; p3:process (clk_out1) begin if(clk_out1'event and clk_out1='1')then if(k1=0)then --还是用k1=0或者1区分通行/禁行时间在哪组数码管上显示 if k=0 then --k表示第几个数码管点亮 cat<="011111"; --第一个数码管亮 case transith is --k=0时【通行】时间【十位】显示在第一个数码管 when 0 => b <="1111110"; when 1 => b <="0110000"; when 2 => b <="1101101"; when 3 => b <="1111001"; end case; k<=1; --k置为1,表示接下来1号数码管点亮 elsif k=1 then cat<="101111"; --第二个数码管亮 case transitl is --k=1时【通行】时间【个位】显示在第一个数码管 when 0 => b <="1111110"; when 1 => b <="0110000"; when 2 => b <="1101101"; when 3 => b <="1111001"; when 4 => b <="0110011"; when 5 => b <="1011011"; when 6 => b <="1011111"; when 7 => b <="1110000"; when 8 => b <="1111111"; when 9 => b <="1111011"; end case; k<=2; --k置为2 elsif k=2 then cat<="110111"; --第三个数码管亮 case stoph is --k=2时【禁行】时间【十位】显示在第一个数码管 when 0 => b <="1111110"; when 1 => b <="0110000"; when 2 => b <="1101101"; when 3 => b <="1111001"; end case; k<=3; --k置为3 elsif k=3 then cat<="111011"; --第四个数码管亮 case stopl is --k=3时【禁行】时间【个位】显示在第一个数码管 when 0 => b <="1111110"; when 1 => b <="0110000"; when 2 => b <="1101101"; when 3 => b <="1111001"; when 4 => b <="0110011"; when 5 => b <="1011011"; when 6 => b <="1011111"; when 7 => b <="1110000"; when 8 => b <="1111111"; when 9 => b <="1111011"; end case; k<=0; --k重新置为0,进入下一个扫描周期 end if; else if k=0 then --k1=1,数码管的点亮顺序不是从左向右,而是由第三个开始 --实现了在同一组数码管上显示一个路口的通行和禁行时间 cat<="110111"; case transith is when 0 => b <="1111110"; when 1 => b <="0110000"; when 2 => b <="1101101"; when 3 => b <="1111001"; end case; k<=1; elsif k=1 then cat<="111011"; case transitl is when 0 => b <="1111110"; when 1 => b <="0110000"; when 2 => b <="1101101"; when 3 => b <="1111001"; when 4 => b <="0110011"; when 5 => b <="1011011"; when 6 => b <="1011111"; when 7 => b <="1110000"; when 8 => b <="1111111"; when 9 => b <="1111011"; end case; k<=2; elsif k=2 then cat<="011111"; case stoph is when 0 => b <="1111110"; when 1 => b <="0110000"; when 2 => b <="1101101"; when 3 => b <="1111001"; end case; k<=3; elsif k=3 then cat<="101111"; case stopl is when 0 => b <="1111110"; when 1 => b <="0110000"; when 2 => b <="1101101"; when 3 => b <="1111001"; when 4 => b <="0110011"; when 5 => b <="1011011"; when 6 => b <="1011111"; when 7 => b <="1110000"; when 8 => b <="1111111"; when 9 => b <="1111011"; end case; k<=0; end if; end if; end if; end process p3; end trafficlight_arc; (3)连接模块: library ieee; use ieee.std_logic_1164.all; entity traffic_a is port(clk_in:in std_logic; urgency_in:in std_logic; red_1,red_2,yellow_1,yellow_2,green_1,green_2,left_1,left_2:out std_logic; b:out std_logic_vector(6 downto 0); cat:out std_logic_vector(5 downto 0)); end traffic_a; architecture struct of traffic_a is component fen port(clk:in std_logic; clk_out1:out std_logic; clk_out2:out std_logic); end component; --分频器接口说明 component trafficlight port(clk_out,clk_out1,urgency:in std_logic; red_1,red_2,yellow_1,yellow_2,green_1,green_2,left_1,left_2:out std_logic; b:out std_logic_vector(6 downto 0); cat:out std_logic_vector(5 downto 0)); end component; --交通灯控制器接口说明 signal line1,line2:std_logic; --中间信号声明 begin u1:fen port map(clk_in,line1,line2); --端口对应连接 u2:trafficlight port map(line2,line1,urgency_in, red_1,red_2,yellow_1,yellow_2,green_1,green_2,left_1,left_2,b,cat); end struct; 五.功能说明: 实现了十字路口的交通控制,可以通过倒计时显示的方式给驾驶员提供准确的通信或者禁行时间信息,增加的左转信号灯可以适应复杂的十字路口的交通管理模式。下载到开发板后,使用拨码开关作为紧急情况的控制开关,数码管自左向右依次是两个路口的倒计时牌,8个发光二极管前六个依次是两个路口的红黄绿灯,后两个作为左转灯。 六.元件清单和资源利用情况: 七.故障及问题分析: 设计中大部分问题都在仿真阶段可以检查出来,例如,倒计时显示出现误差,可以对仿真波形的每个状态转换时刻逐一校对,当时分析出现显示误差的原因可能由两个方面产生,其一是倒计时时对禁行时间的判断参数设置有问题,特别是禁行和通行转换的时刻格外容易出错,所以要经过简单的人工演算才能确定准确的参数,不能简单考虑,其二是译码电路的问题,这个可以独立检查每个译码是否存在书写错误,不需要太多的演算。 实验中下载只进行了一次,效果很好便直接验收,基本没有出现硬件故障。 八.总结和结论: 这次实验的收获很多,主要是对用VHDL语言的设计方法设计硬件电路的认识上了一个台阶,从前只是将VHDl语言看成又一门程序语言,现在看来完全脱离了实际电路的设计,虽然VHDL是自顶向下的设计方法,不要求设计者有很丰富的硬件电路设计经验,但是不代表着可以脱离实际电路的设计情况,还是要想清楚用VHDL语言设计反映到实际电路中的情况,这样不仅可以提高VHDL语言设计电路的效率,更重要的是提高其实用性。 上述也正是我在这次实验中做的很不足的一方面,对于老师上课时给出的交通灯状态机设计方法,只是看到了其表面的,也就是顶层的设计思路,忽略了在设计中考虑的硬件条件和实用性,本着创新的想法,自己编写了一套程序,结果虽然在功能上看来没有区别,但是实际的电路结构和设计思路都是基于理论和语法的,没有做到自顶向下,换言之,就是还没能将理论和实际相结合去应用VHDL的强大功能,这样看来不仅要注重VHDL语言语法的学习,更要注重对自顶向下的设计思路的学习和研究。
本文档为【数字电路与逻辑设计实验】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_388348
暂无简介~
格式:doc
大小:202KB
软件:Word
页数:15
分类:工学
上传时间:2014-03-03
浏览量:50