交通灯控制器的设计
一 设计任务有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为南北向,支干道为东西向。为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号灯。要求:(1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行55s,支干道每次放行25s。每次由绿灯变为红灯的过程中,黄灯亮5s作为过渡。(2)能实现正常的倒计时显示功能。(3)能实现总体清零功能:计数器由初始状态开始计数,对应状态的指示灯亮。(4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红灯状态。发挥部分:(1)增加左转允许控制功能(2)选择学校附近一个路口实地观察,按实际数据设计出该路口交通灯控制器。二 题目分析与整体构思1.该交通灯控制器应具备的功能根据设计任务主干道定为绿灯55sec,黄灯5sec,红灯30sec,支干道定为红灯60sec,绿灯25sec,黄灯5sec,同时用数码管指示当前状态(红、黄、绿)剩余时间。另外,设计一个特殊状态,当特殊状态出现时,两个方向都禁止通行,指示红灯,停止计时。特殊状态解除后,恢复计数并指示时间。2实现方案 从题目中计数值与交通灯的亮灭的关系如图所示:3.设计规划根据交通灯控制器的功能与要求,将其总体电路分为分频器、计数器(5s计时,、25s计时、55s计时)、控制器、译码器、数码器显示控制模块。小组进行任务划分,我负责分频器和译码器模块。三 模块的原理及其程序1分频器由于石英晶体振荡器产生的频率很高,要得到秒脉冲,需要用分频电路。例如,振荡器输出4MHz信号,通过D触发器(74LS74)进行4分频变成1MHz,然后送到10分频计数器(74LS90,该计数器可以用8421码制,也可以用5421码制),经过6次10分频而获得1Hz方波信号作为秒脉冲信号。分频器实现的是将高频时钟信号转换成底频的时钟信号,用于触发控制器、计数器和扫描显示电路。设计使用20MHz的晶体振荡器,稳定度高,但需要分频以得到1Hz的秒脉冲,分频器以计数方式实现,当计到10000000个脉冲上升沿输出发生跳变,因此输出端每秒有一个上升沿,即得到1Hz的脉冲。下面是其端口图,CLKin为20MHz的晶体振荡器的时钟输入,CLKout为分频后1Hz的秒脉冲输出:下面是其VHDL代码: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FreDevider ISPORT (CLKin:IN STD_LOGIC; CLKout:OUT STD_LOGIC);END;ARCHITECTURE Devider OF FreDevider ISCONSTANT N:INTEGER:=9999999;SIGNAL counter:INTEGER RANGE 0 to N;SIGNAL CLK: STD_LOGIC;BEGIN PROCESS(CLKin) BEGIN IF rising_edge(CLKin)THEN IF counter=N THEN counter<=0; CLK<=NOT CLK; ELSE counter<=counter+1; END IF; END IF; END PROCESS; CLKout <=CLK;END;分频器的输入CLKin设置成Start time:0 ps,End time:1.0 us,Period:1.0 ns,Offset:0.0 ns,Duty cucle(%):50,模块由VHDL程序实现后,其功能仿真图如下图所示:当CLKin有10000000个脉冲上升沿时,CLKout有一个跳变,但屏幕不能显示,只能得到上图的形式。2.译码器译码为编码的逆过程。它将编码时赋予代码的含义“翻译”过来。实现译码的逻辑电路成为译码器。译码器输出与输入代码有唯一的对应关系。74LS47是输出低电平有效的七段字形译码器,它在这里与数码管配合使用,表2列出了74LS47的真值表,表示出了它与数码管之间的关系。把所使用的每一种二进制代码状态都赋于特定的含义,表示一个特定的信号或对象,叫编码。如用四位二进制数的00001001这十种状太,分别表示09这十个十进制数码,称为8421编码。反过来把代码的特定含义翻译出来,称为译码。计算机在处理各种文字符号或数码时,必须把这些信息进行二进制编码,在编码时所使用的第一种二进制代码状态都赋予了特定的含义,即表示一个确定的信号或者对象,实现这种功能的电路叫编码器,如用于键盘的BCD码,ASCII码编码器等。译码器可以将输入代码的状态翻译成相应的输出信号,以高、低电平的形式在各自的输出端口送出,以表示其意愿。译码器有多个输入端和多个输出端。假如输入的端个数为,每个输出端只能有两个状态,则输出端个数最多有2n个。常用译码器输入、输出端头数来称呼译码器,如3线-8线译码器,4线-10线译码器等。译码器实现的是将二进制数转换成对应的十进制数,并通过显示器件将译码器的状态显示出来。数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字。下面是其端口图,AIN43.0是计数器4位的二进制输出,也是YMQ的输入,DOUT77.0是经译码器译码后的七段数码管的八位输出:下面是其VHDL代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY YMQ ISPORT(AIN4:IN STD_LOGIC_VECTOR(3 DOWNTO 0); -输入为计数器4位的二进制输出DOUT7:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -七段数码管的八位输出END ENTITY YMQ;ARCHITECTURE ART OF YMQ ISBEGINPROCESS(AIN4) ISBEGINCASE AIN4 ISWHEN "0000"=>DOUT7<="11000000" -0WHEN "0001"=>DOUT7<="11111001" -1WHEN "0010"=>DOUT7<="10100100" -2WHEN "0011"=>DOUT7<="10110000" -3WHEN "0100"=>DOUT7<="10011001" -4WHEN "0101"=>DOUT7<="10010010" -5WHEN "0110"=>DOUT7<="10000010" -6WHEN "0111"=>DOUT7<="11111000" -7WHEN "1000"=>DOUT7<="10000000" -8WHEN "1001"=>DOUT7<="10010000" -9WHEN OTHERS=>DOUT7<=NULL; END CASE;END PROCESS;END ARCHITECTURE ART;输入AIN40的设置:Start time:0 ps,End time:1.0 us,Period:5.0 ns,Offset:0.0 ns,Duty cucle(%):50 输入AIN41的设置:Start time:0 ps,End time:1.0 us,Period:4.0 ns,Offset:0.0 ns,Duty cucle(%):50输入AIN42的设置:Start time:0 ps,End time:1.0 us,Period:3.0 ns,Offset:0.0 ns,Duty cucle(%):50 输入AIN43的设置:Start time:0 ps,End time:1.0 us,Period:2.0 ns,Offset:0.0 ns,Duty cucle(%):50译码器模块由VHDL程序实现后,其功能仿真图如图所示:下面是其测试模块的VHDL程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY YMQCS ISPORT(AIN4:IN STD_LOGIC_VECTOR(3 DOWNTO 0);wei:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);bell:OUT STD_LOGIC;DOUT7:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END ENTITY YMQCS;ARCHITECTURE ART OF YMQCS ISBEGINPROCESS(AIN4) ISBEGINCASE AIN4 ISWHEN "0000"=>DOUT7<="11000000" -0WHEN "0001"=>DOUT7<="11111001" -1WHEN "0010"=>DOUT7<="10100100" -2WHEN "0011"=>DOUT7<="10110000" -3WHEN "0100"=>DOUT7<="10011001" -4WHEN "0101"=>DOUT7<="10010010" -5WHEN "0110"=>DOUT7<="10000010" -6WHEN "0111"=>DOUT7<="11111000" -7WHEN "1000"=>DOUT7<="10000000" -8WHEN "1001"=>DOUT7<="10010000" -9WHEN OTHERS=>DOUT7<=NULL; END CASE;END PROCESS;wei<="01"bell<='1'END ARCHITECTURE ART;其端口图为:比起YMQ模块,测试模块多了两个端口:bell和wei1.0,bell接蜂鸣器,wei接数码管。 下面是测试模块由VHDL程序实现后的功能仿真图,其输入设置于YMQ相同:将程序载入芯片,蜂鸣器不响,拨动拨码开关,最右端数码管显示对应数值,测试成功。