基于VHDL的交通灯数电课程设计报告_第1页
基于VHDL的交通灯数电课程设计报告_第2页
基于VHDL的交通灯数电课程设计报告_第3页
基于VHDL的交通灯数电课程设计报告_第4页
基于VHDL的交通灯数电课程设计报告_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、数电课程设计 by ZY湖南大学电气与信息工程学院本科生课程设计题目:交通信号灯控制器设计 课程:数字电子技术课程设计专业:电气工程及其自动化班级:电自1104学号:姓名:指导老师:苏娟、何洪英、周冰航、曾文海 设计时间:2014.4-5月 目录1 课题概述21.1设计任务及要求21.2设计方案32 系统模块划分和源程序42.1分频模块42.2交通灯控制模块52.3BCD码转换模块72.4接口模块102.5LCD显示模块142.6其他模块153 逻辑原理图及仿真163.1逻辑原理图163.2波形仿真164 实验板下载及运行结果204.1约束文件204.2可下载的原理图204.3运行效果图及说明

2、215 心得体会226 答辩老师提问237 参考文献241.课题概述1.1设计任务及要求1. 运用电子技术基础·数字部分所学内容,使用Altium designer进行设计,使用vhdl编写模块,制作原理图进行仿真,并通过老师提供的接口模块下载到Nanoboard 开发板上运行;2. 由主干道A和支干道的汇合点形成十字交叉路口, 在交叉路口的每个入口处设置有红、绿、黄三色信号灯。红灯亮禁止通行;绿灯亮允许通行,黄灯亮则使行驶到路口的车辆有时间行驶到禁止线之外;3. 用红、绿、黄三色发光二极管作信号灯, 主干道A为东西向,设红、绿、黄三色灯为AR 、 AG 、 AY; 支干道B为南北向

3、,设红、绿、黄三色灯为BR 、 BG 、 BY;4. 主干道车辆较多, 所以亮绿灯的时间设为50秒,支干道亮绿灯的时间设为30秒。当主干道允许通行亮绿灯时则支干道亮红灯;相反,支干道允许通行亮绿灯时则主干道亮红灯。每次由绿灯转变为红灯时,其间要亮5秒的黄灯作为过渡,以便行驶的车辆有时间行驶到禁止线外;5. 交通灯正常运行时,用LCD显示屏显示主干道和支干道的倒计时时间,交通灯状态。即在LCD上按格式显示交通灯的2个2位BCD码,红绿黄灯。输入:EW7.0、SN7.0为东西、南北向的2个2位BCD码,EWRYG2.0、SNRYG2.0东西南北的红绿灯信号,顺序为红黄绿;6. 具有一定的扩展功能,

4、它能实现特殊状态的功能显示,用开关S作为特殊信号传感器,S为1时进入特殊状态并实现下列特殊状态功能:(1)显示器数字部分闪烁,即在全0和当前计时时间中交替显示;(2)计数器停止计数并保持原来的时间数据;(3)东西, 南北方向的三色灯全显红色状态;(4)特殊状态解除后能继续返回正常工作状态。LCD显示屏显示格式如下:1.2设计方案状态图如下:真值表如下,时间在0-90s循环:时间(s)EWSNRYGRYG0-5000110051-5501010056-8510000186-90100010总体方案:所要设计的红绿灯EW、SN方向各有红、黄、绿三种灯,两路口时间不相同,红灯直接切换为绿灯,绿灯则需

5、要先亮5秒黄灯再变为红灯。根据设计要求,除了需要正确的点亮灯以外,还需要将计时的数转换为8421码送入LCD显示屏显示为数字,另外由于需要红绿灯有保持显示和闪烁功能。综上,本人决定把控制器分为以下几个模块:分频器、交通灯控制模块、BCD转换模块。其中闪烁功能本人决定通过控制器的一个特定输出控制一个一分频(即为分频)的分频器的使能端来控制闪烁。2.模块划分和源程序2.1分频模块本次设计输入的脉冲为10MHz,而红绿灯控制器的计数要求一秒变换一次,即需要得到1Hz的脉冲。因此经计算需要分频5000000次。模块如下,其中10MHz脉冲从clkin输入,分频后输出为clkout。源代码如下:libr

6、ary ieee;use ieee.std_logic_1164.all;entity divider1 is port( clkin:in std_logic; -时钟信号输入 clkout:out std_logic); -时钟信号输出end divider1;architecture arcdivider1 of divider1 issignal data:integer range 0 to 5000000;signal Q:std_logic:='0'beginprocess(clkin) begin if rising_edge(clkin) then if(da

7、ta=5000000) then -想要的分频比 data<=0; Q<=not Q; else data<=data+1; end if; end if;clkout<=Q;end process;end arcdivider1;另外由于需要实现闪烁功能,因此通过控制器的一个特定输出控制一个一分频(即为分频)的分频器的使能端来控制闪烁。其中输入为分频后的1Hz脉冲,en为使能信号,由灯控制器的flash输出口输入en(后面会详细说明),若en为1,输出为1Hz脉冲。源代码如下:library ieee;use ieee.std_logic_1164.all;entit

8、y clk1 is port(clkin,en:in std_logic; -时钟信号输入 clkout:out std_logic); -时钟信号输出end clk1;architecture arcclk1 of clk1 issignal Q:std_logic:='0'beginprocess(clkin) begin if rising_edge(clkin) then if en='0' then Q<='0' else Q<=not Q; end if; end if;clkout<=Q;end process;e

9、nd arcclk1;2.2交通灯控制模块本次设计的核心模块,控制器的作用是通过一个变量在0-90间进行循环计数,在clock输入的脉冲作用下,每一个上升沿计数值加1,同时numa7.0,numb7.0分别输出东西、南北向的倒计时值。当计数为不同的区间时,EWRYG2.0,SNRYG2.0输出红绿灯代表的数字。若reset为1,红绿灯重新开始计数,即从东西向为绿灯,南北向为红灯开始。若hold为1,输出numa7.0,numb7.0保持不变,EWRYG2.0,SNRYG2.0输出为4(红灯)flash为1,通过一个分频器的使能让BCD转换模块在0和当前数值之间变化,从而达到闪烁的效果。源代码如

10、下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity controller isport( clock,reset,hold:in std_logic; flash:out std_logic; numa,numb:out STD_LOGIC_VECTOR(7 DOWNTO 0); EWRYG,SNRYG :out STD_LOGIC_VECTOR(2 DOWNTO 0);end controller;architecture arccontroller of controller i

11、ssignal countnum:integer range 0 to 90:=0;beginprocess(clock)beginif reset='1' then countnum<=0;elsif rising_edge(clock) then if hold='1' then flash<='1' else flash<='0' if countnum=89 then countnum<=0; else countnum<=countnum+1; end if; end if;end if;e

12、nd process;process(clock)begin if rising_edge(clock) then if hold='1' then EWRYG<="100" SNRYG<="100" else if countnum<=49 then -49 numa<="00110010"-countnum; EWRYG<="001" elsif countnum<=54 then -54 numa<="00110111"-count

13、num; EWRYG<="010" else numa<="01011010"-countnum; EWRYG<="100" end if; if countnum<=54 then -54 numb<="00110111"-countnum; SNRYG<="100" elsif countnum<=84 then -84 numb<="01010101"-countnum; SNRYG<="001"

14、 else numb<="01011010"-countnum; SNRYG<="010" end if; end if; end if;end process;end arccontroller;2.3 BCD码转换模块需要将控制器输出的numa7.0,numb7.0转换为8421码送入LCD显示屏显示为数字,由于vhdl语言的功能和实验所用板的限制,本人目前未找到用算式可以正确、及时转化BCD码并能成功下载到板子的源程序,只能运用case语句穷举。输入为七位二进制,输出为转换好的BCD码,reset为1时,输出为0。源代码如下:libra

15、ry ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity TOBCD isport(D: in STD_LOGIC_VECTOR(7 DOWNTO 0); reset:in std_logic; SEG: out STD_LOGIC_VECTOR(7 DOWNTO 0);end TOBCD;architecture ARCTOBCD of TOBCD isbeginprocess(reset,D)begin if reset='1' then SEG <= "000000

16、00" else case D is when "00000000" => SEG<="00000000" when "00000001" => SEG<="00000001" when "00000010" => SEG<="00000010" when "00000011" => SEG<="00000011" when "00000100" =>

17、SEG<="00000100" when "00000101" => SEG<="00000101" when "00000110" => SEG<="00000110" when "00000111" => SEG<="00000111" when "00001000" => SEG<="00001000" when "00001001" =

18、> SEG<="00001001" -9 when "00001010" => SEG<="00010000" when "00001011" => SEG<="00010001" when "00001100" => SEG<="00010010" when "00001101" => SEG<="00010011" when "00001110

19、" => SEG<="00010100" when "00001111" => SEG<="00010101" when "00010000" => SEG<="00010110" when "00010001" => SEG<="00010111" when "00010010" => SEG<="00011000" when "000

20、10011" => SEG<="00011001" -19 when "00010100" => SEG<="00100000" when "00010101" => SEG<="00100001" when "00010110" => SEG<="00100010" when "00010111" => SEG<="00100011" when

21、"00011000" => SEG<="00100100" when "00011001" => SEG<="00100101" when "00011010" => SEG<="00100110" when "00011011" => SEG<="00100111" when "00011100" => SEG<="00101000"

22、when "00011101" => SEG<="00101001" -29 when "00011110" => SEG<="00110000" when "00011111" => SEG<="00110001" when "00100000" => SEG<="00110010" when "00100001" => SEG<="001100

23、11" when "00100010" => SEG<="00110100" when "00100011" => SEG<="00110101" when "00100100" => SEG<="00110110" when "00100101" => SEG<="00110111" when "00100110" => SEG<="0

24、0111000" when "00100111" => SEG<="00111001" -39 when "00101000" => SEG<="01000000" when "00101001" => SEG<="01000001" when "00101010" => SEG<="01000010" when "00101011" => SEG<

25、;="01000011" when "00101100" => SEG<="01000100" when "00101101" => SEG<="01000101" when "00101110" => SEG<="01000110" when "00101111" => SEG<="01000111" when "00110000" => S

26、EG<="01001000" when "00110001" => SEG<="01001001" -49 when "00110010" => SEG<="01010000" when "00110011" => SEG<="01010001" when "00110100" => SEG<="01010010" when "00110101"

27、; => SEG<="01010011" when "00110110" => SEG<="01010100" -54 when "00110111" => SEG<="01010101" when others => SEG<="00000000" end case; end if;end process;end ARCTOBCD;2.4接口模块在这里使用周冰航老师编好的交通等接口模块,在这里感谢老师的提供!输入:EW7.0、

28、SN7.0:东西、南北向的2个2位BCD码;EWRYG2.0、SNRYG2.0:东西南北的红绿灯信号,顺序为红黄绿;CPIN:时钟脉冲输入,按10MHz设计;R:复位;BUSY:忙信号。输出:CLK:控制器工作时钟,上升沿有效RST:复位信号,高电平有效DATA7.0:ASCII码数据总线ADDR3.0:字符在LCD屏幕上的地址(共两行,每行16个字符)LINE:LCD屏幕上的行选择信号BUSY:控制器忙信号STROBE:数据输入有效使能源代码如下:-File name JTDLCD- 目的:在LCD上按格式显示交通灯的2个2位BCD码,红绿黄灯-编程 周冰航 2008年11月-输入:EW7.

29、0、SN7.0 东西、南北向的2个2位BCD码-EWRYG2.0、SNRYG2.0东西南北的红绿灯信号,顺序为红黄绿-CPIN 时钟脉冲输入 按10MHz设计 ;复位R-注意:每个总线形式的输入均为LOGIC_VECTOR形式,因此,相应电路的输出要定义为LOGIC-VECTOR 形式,整型形式不能使用。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity JTDLCD is port (CPIN,R,BUSY :IN STD_LOGIC; EW,SN :IN STD_LOGIC_VECT

30、OR(7 DOWNTO 0); EWRYG,SNRYG : IN STD_LOGIC_VECTOR(2 DOWNTO 0); CLK,RST,STROBE,OUTLINE : OUT STD_LOGIC; DATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ADDR : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );end entity ;architecture JGT of JTDLCD is TYPE STATES IS (S0,S1,S2,S3,S4); SIGNAL S: STATES; SIGNAL LCDPT : INTEGE

31、R RANGE 0 TO 10; SIGNAL CPCT : INTEGER RANGE 0 TO 65535; SIGNAL CP: STD_LOGIC; SIGNAL ASCEW,ASCSN : STD_LOGIC_VECTOR(7 DOWNTO 0);beginPROCESS(CPIN,R)BEGINCLK<=CPIN;IF R='1' THEN CPCT<=65535;ELSIF CPIN='1' AND CPIN 'EVENT THEN IF CPCT=0 THEN CPCT<=65535;CP<=NOT CP; ELS

32、E CPCT<=CPCT-1; END IF;END IF;END PROCESS; -分频为500US周期-主进程:拟采用500us时钟,即在500us后完成状态转换,修改LCDPT指针-S0:初始状态,在R=1时,处于S0状态,LCDPT=0- 流程: 输出rst=1, 转S1-S1:输出RST=0;判断BUSY=0? :Y: LCDPT+1;LCDPT到固定最后?:N: ->S2 - :Y: 转S3- ;N; NULL-S2:给出STROBE信号。转S1-S1,S2完成初始化固定显示的功能PROCESS(CP,R)BEGINIF R='1' THEN S<

33、;=S0;LCDPT<=0;RST<='1'ELSIF CP='1' AND CP 'EVENT THEN CASE S IS WHEN S0=> S<=S1;LCDPT<=0;RST<='1' WHEN S1=> RST<='0'STROBE<='0' IF BUSY='0' THEN LCDPT<=LCDPT+1; IF LCDPT=5 THEN S<=S3; ELSE S<=S2; END IF; END IF;

34、WHEN S2=> S<=S1;STROBE<='1' -S3S4完成扫描显示功能-S3:BUSY=0? :Y: LCDPT循环+1 ,转S4-S4:给出STROBE信号,转S3 WHEN S3=> STROBE<='0' IF BUSY='0' THEN IF LCDPT=10 THEN LCDPT<=5; ELSE LCDPT<=LCDPT+1; END IF; S<=S4; END IF; WHEN S4=> STROBE<='1'S<=S3; WHEN OT

35、HERS=> NULL; END CASE;END IF; END PROCESS;-选择输出进程(LCDPT)-LCDPT=0,NULL- =14 显示EW SN E 45H,5 W57H,6 S53H,9 N4EH,10PROCESS(LCDPT)BEGINCASE LCDPT ISWHEN 0 => NULL;WHEN 1=> DATA<="01000101"ADDR<="0101"OUTLINE<='0'WHEN 2=> DATA<="01010111"ADDR&

36、lt;="0110"OUTLINE<='0'WHEN 3=> DATA<="01010011"ADDR<="1001"OUTLINE<='0'WHEN 4=> DATA<="01001110"ADDR<="1010"OUTLINE<='0' -LCDPT=5,6 EWBCD码 EH,5 EL,6-LCDPT=7 EW 红绿灯 R,4-LCDPT=89 SNBCD码 SH,9 SL,10-LCDP

37、T=10 SN 红绿灯。 G,8 R52H;Y59H;G47HWHEN 5=>DATA<="0011"&EW(7 DOWNTO 4);ADDR<="0101"OUTLINE<='1'WHEN 6=>DATA<="0011"&EW(3 DOWNTO 0);ADDR<="0110"OUTLINE<='1'WHEN 7=>DATA<=ASCEW;ADDR<="0100"OUTLINE<

38、;='1'WHEN 8=>DATA<="0011"&SN(7 DOWNTO 4);ADDR<="1001"OUTLINE<='1'WHEN 9=>DATA<="0011"&SN(3 DOWNTO 0);ADDR<="1010"OUTLINE<='1'WHEN 10=>DATA<=ASCSN;ADDR<="1000"OUTLINE<='1'WHEN

39、 OTHERS=> NULL;END CASE;END PROCESS;PROCESS(EWRYG)BEGINCASE EWRYG ISWHEN "100" => ASCEW<="01010010"WHEN "010" => ASCEW<="01011001"WHEN "001" => ASCEW<="01000111"WHEN OTHERS=> NULL;END CASE;END PROCESS;PROCESS(SNRYG)B

40、EGINCASE SNRYG ISWHEN "100" => ASCSN<="01010010"WHEN "010" => ASCSN<="01011001"WHEN "001" => ASCSN<="01000111"WHEN OTHERS=> NULL;END CASE;END PROCESS; end architecture JGT;2.5 LCD显示模块显示模块在FPGA NanoBoard Port-Plugin.IntL

41、ib库中,作用是接受前面用户自己的逻辑单元送来的ASCII码数据和控制信号,然后与外部的LCD显示器通讯,显示相应字符。数据总线使用输入输出分离模式,IP核后面需要增加双向BUF控制单元(U8)。LCD控制器端口说明如下:用户控制逻辑接口:CLK:控制器工作时钟,上升沿有效RST:复位信号,高电平有效DATA7.0:ASCII码数据总线ADDR3.0:字符在LCD屏幕上的地址(共两行,每行16个字符)LINE:LCD屏幕上的行选择信号BUSY:控制器忙信号STROBE:数据输入有效使能LCD显示器接口:LCD_E:LCD显示器使能LCD_RW:LCD读写方向控制LCD_RS:LCD命令,数据选

42、择LCD_DATA_TRI:LCD数据高阻态控制LCD_DATAO:LCD数据输出总线LCD_DATAI:LCD数据输入总线实际上用户只需关心用户控制逻辑接口的控制操作,至于LCD显示器接口,是由该IP核自动控制的,用户不许干涉。控制器工作原理如下:A 控制器复位当RST信号有效时(高电平),控制器进入LCD复位与初始化操作,此时,BUSY信号持续高电平,表示控制器忙,LCD不能进行用户请求的操作。RST信号由高变低后的大约80us之后,LCD控制器初始化完成,可以响应用户的操作请求,此时,BUSY信号变低。LCD处于显示模式。B 字符显示上电后的LCD必须初始化一次,之后LCD控制器停留于“

43、WAIT FOR DATA” 状态。在用户向LCD控制器申请字符显示操作时,ADDR、DATA、LINE信号必须保持稳定,同时使用STROBE信号触发显示操作。具体步骤如下:表示字符显示位置的4bit地址信号加载到ADDR信号线上;表示字符显示行号的1bit选择信号加载到LINE信号线上;字符ASCII编码加载到DATA总线上并保持稳定;用户送入STROBE的有效电平,LCD控制器进入与LCD显示器通讯的过程,显示相应地址和行位置的ASCII码对应字符,同时BUSY信号变为高电平,表示控制器忙。此时,用户需要等待。一定时间后,LCD字符显示稳定,BUSY信号变为低电平,等待用户下一次操作申请。

44、如此循环。2.6 其他模块其他模块包括拨盘开关和脉冲输入。3.逻辑原理图及仿真3.1 逻辑原理图逻辑原理图为了通过仿真验证自己所编模块是否正确,这里未验证reset。3.2 波形仿真1.从原理图创建VHDL程序。电路图画好后保存,选择:DesignNetlist For DoucoumentVHDL File,然后在弹出的对话框中,钩选“Generate mutiple VHDL files” 和“转换参数为属性”两项。产生的VHDL文件保存在系统自动建立的项目中子文件夹“Generated”中。2.创建VHDL测试平台。将上述创建的VHDL文件打开,使其处于当前窗口,选择:DesignCre

45、ate VHDL Testbench。系统自动创建一个VHDTST类型的测试平台文件。3.在vhdtst文件中写入如下(改写process之中的内容,用5ns脉冲):- VHDL Testbench for fpga_project1- 2014 5 13 21 32 53- Created by "EditVHDL"- "Copyright (c) 2002 Altium Limited"-Library IEEE;Use IEEE.std_logic_1164.all;Use IEEE.std_logic_textio.all;Use STD.tex

46、tio.all;-entity Testfpga_project1 isend Testfpga_project1;-architecture stimulus of Testfpga_project1 is file RESULTS: TEXT open WRITE_MODE is "results.txt" procedure WRITE_RESULTS( CLK: std_logic; EWRYG: std_logic_vector(2 downto 0); HOLD: std_logic; SEGA: std_logic_vector(7 downto 0); SE

47、GB: std_logic_vector(7 downto 0); SNRYG: std_logic_vector(2 downto 0) ) is variable l_out : line; begin write(l_out, now, right, 15); write(l_out, CLK, right, 2); write(l_out, EWRYG, right, 4); write(l_out, HOLD, right, 2); write(l_out, SEGA, right, 9); write(l_out, SEGB, right, 9); write(l_out, SNR

48、YG, right, 4); writeline(RESULTS, l_out); end procedure; component fpga_project1 port ( CLK: in std_logic; EWRYG: out std_logic_vector(2 downto 0); HOLD: in std_logic; SEGA: out std_logic_vector(7 downto 0); SEGB: out std_logic_vector(7 downto 0); SNRYG: out std_logic_vector(2 downto 0) ); end compo

49、nent; signal CLK: std_logic; signal EWRYG: std_logic_vector(2 downto 0); signal HOLD: std_logic; signal SEGA: std_logic_vector(7 downto 0); signal SEGB: std_logic_vector(7 downto 0); signal SNRYG: std_logic_vector(2 downto 0);begin DUT:fpga_project1 port map ( CLK => CLK, EWRYG => EWRYG, HOLD

50、=> HOLD, SEGA => SEGA, SEGB => SEGB, SNRYG => SNRYG ); STIMULUS0:process begin - insert stimulus here hold <= '0' wait for 150 ns; hold <= '1' wait for 50 ns; hold <= '0' wait; end process; CLK2:process begin CLK <= '0' wait for 5 ns; CLK <= '1' wait for 5 ns; end process; WRITE_RESULTS( CLK, EWRYG, HOLD, SEGA, SEGB, SNRYG );end architecture;-仿真波形如下,是正确的结果4.实验板下载及运行结果4.1 约束文件在下载时选择NB1_6

温馨提示

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

评论

0/150

提交评论