verilog交通灯设计与实现.doc

上传人:豆**** 文档编号:23970100 上传时间:2022-07-03 格式:DOC 页数:26 大小:12.30MB
返回 下载 相关 举报
verilog交通灯设计与实现.doc_第1页
第1页 / 共26页
verilog交通灯设计与实现.doc_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《verilog交通灯设计与实现.doc》由会员分享,可在线阅读,更多相关《verilog交通灯设计与实现.doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、西北工业大学FPGA技术实验实验报告五(交通灯控制系统)学 院: 软件与微电子学院 学号: 姓 名: 专 业: 微电子学 实验时间: 2011.11.23 实验地点: 毅字楼335 指导教师: 王少熙 西北工业大学 2011年 11月一、实验目的及要求实验目的:通过交通灯的设计与仿真综合,体会复杂时序的实现方法,学会用框图表示程序的设计思想,掌握中小规模集成电路的系统综合设计方法。实验要求:设计一个交通灯信号控制电路。具体要求为:输入为50MHz的时钟和复位信号,输出为红、绿、黄三个信号(高电平为亮)。复位信号(高电平)有效,红、绿、黄灯灭;接着进行如下循环:绿灯亮1分钟,黄灯闪烁10秒,红灯

2、亮1分钟。在此基础上再加两个数码管,对倒计时的数显示。二、实验设备(环境)及要求实验EDA工具为: Synplify Pro 9.6.2和ModelSim SE 6.2b。三、实验内容与步骤1. 设计思路概述总体上分为三个大模块,即:顶层模块、控制模块、译码模块(包括显示模块)。他们各自的作用分别如下:顶层模块:此模块只做例化,即对底层的控制模块和译码模块进行例化,而不做逻辑设计。控制模块:此模块是本程序的主体,主要是控制各个灯颜色(此模块并不控制黄灯的闪烁)的转换,以及倒计时时间输出。首先要对时钟进行分频。由于系统时钟频率比较大,因此首先分频产生时钟,用于下面的电路的控制;然后是各种颜色之间

3、的转换,在此在添加一个使能端enable ,当使能端enable为0的时候,就开始进行状态循环以及倒计时,然后enable就立即变为1;状态用light_status(分别为0、1、2)表示,开始的时候,如果状态light_status为0,表示此时显示的是绿灯,便把绿灯亮的时间(60s)给统计灯亮时间的变量light_long,并且把显示灯亮的变量light_select赋值100(高电平表示亮),最后把状态标志位light_status赋1,但是此时并不能转向下一个状态(黄),因为绿灯亮的时间还没有控制,接下来会转到倒计时处。然后,我们这里用了BCD码表示倒计时时间。灯亮或闪烁时间(绿、黄

4、、红分别为60s、10s、60s)用BCD码表示(分别为60h、10h、60h),倒计时的时候个位和十位分别是BCD码的高四位和低四位,首先是低四位倒数,当倒数到0时,给它重新赋值为9,且高四位减1,如此循环,直到这个数减到0,此时表示某一个灯亮的时间到,接着进行下一个状态,为了能使进入下一个状态,必须在时间减到0的时候,给使能端enable 赋值0;由于用的BCD码,高四位和低四位就分别是我们要在译码模块的要用数码管显示的十位和个位。译码模块:此模块主要有两个作用,控制黄灯闪烁以及对倒计时时间进行译码输出。首先是控制黄灯闪烁。由于控制模块只是控制三个灯的亮与不亮,在此模块中首先是相当于产生一

5、个分频时钟y_flicker(周期1s),然后是控制黄灯的闪烁,控制模块light_select只是控制了三个灯亮与不亮(三位二进制,高电平有效),最后显示灯的亮或者闪还用三位二进制表示(colour),控制时直接把light_select的最高位和最低位直接赋给colour的最高位和最低位(分别控制绿灯和红灯的亮),中间位当分频时钟y_flicker为高且输入light_select为高时,输出colour 才为高(黄灯亮),别的情况colour中间位都为低(黄灯灭),至此可以完美实现黄灯的闪烁了(1s内亮0.5s灭0.5s),也就可以实现要求的各个灯的亮或者闪烁。然后就是七段译码的过程。采

6、用了38译码器的设计原理,将倒计时时间译码,输出到LED晶体管,显示最终倒计时时间。LED中二极管对应的顺序编号如图1所示,并且是低电平有效。写出所有数字对应的字型码,就可以知道数字的控制电平。由于只有两位数字,考虑到成本以及复杂性,可不用扫描,直接用两个译码器就可以了。图1 七段数码管显示字段的示意图2. 总体设计框图及详细说明程序总体设计框图如图2所示。图2 程序总体设计框图 下面将对所做的系统框图进行详尽说明:首先,输入的50MHz的系统时钟和全局控制端reset ,输出为个位数字的七段译码,十位数字七段译码以及各个灯最后状态。然后由于系统时钟频率很大,第一要进行分频,使其成为1Hz的时

7、钟信号,第二利用分频后的时钟信号对电路进行控制,开始先对状态跳转进行控制,正如1问所述,用case 语句控制三灯亮与灭,紧跟着进行倒计时的过程,第三输出个位和十位上的数即可,要显示倒计时是很容易实现的,直接用两个七段译码即可。最后要控制黄灯的闪烁,还是要先产生分频时钟,作为控制端,控制模块各灯亮与灭作为输入,即可产生黄灯闪烁的效果。另外,作为全局控制端,reset 信号是清零用的,在有时钟信号的地方就有reset 。3. 时序说明假设在0时刻,加上系统时钟,首先要进行reset清零,这时在控制模块的计数器会清零,三个灯都是灭的状态,控制状态跳转的使能端enable等于0,等待着清零结束,开始工

8、作;七段译码也不会显示。在reset变低之后,系统开始正常工作。首先是分频时钟开始工作,在计数器达到第一个25000000之前,分频时钟都是低电位,到25000000的时候分频时钟的第一个上升沿来临,此时状态控制开始运转,先工作的是绿灯,它会经过从59到0的倒计时过程,同时译码模块也开始工作,颜色控制colour是100,表征绿灯的点亮,经七段译码,这个倒计时数字也会同步显示出来。经过60s(也就是经过60*50M个系统时钟上升沿之后)绿灯亮的时间到,会自动转到黄灯状态,黄灯是9到0的倒计时过程,译码的显示跟绿灯一样,只是黄灯的亮会加一个1Hz的时钟控制端,1秒内只有半秒,黄灯是亮的,从9秒到

9、8.5秒之间黄灯是亮的,然后8.5到8是灭的,如此继续下去,知道10秒结束。又经过10s(70*50M个系统时钟上升沿),状态转移到红灯,然后显示及七段译码过程与绿灯相似。至此一个周期已经完成,接下来就是循环执行以上步骤的过程,直到有reset清零端打断其正常工作。主要的时序是在三个灯不同状态之间跳转,这也是本程序的关键,他们之间的转换关系如图3所示。图3 时序状态转化图4. 模块设计框图、相关时序本程序分为三个模块,顶层模块、控制模块、译码模块,各模块的设计框图以及相关时序说明如下:顶层模块框图如图4所示。顶层模块控制模块译码模块如图4 顶层模块框图输入:sysclk_50MHz 全局时钟信

10、号,50MHz Reset 全局复位端,高电平有效输出:color 最终各灯状态(包括亮与闪) led_ctrl_1s 个位七段译码 led_ctrl_10s 十位七段译码时序说明:加上时钟信号之后,首先用reset清零,然后控制模块会分频产生分频时钟,根据分频时钟的高与低,会控制各个状态之间的跳转,译码模块会同步通过数码管来显示倒计时数,并且会根据译码模块黄灯闪亮控制端来输出各灯的具体状态。控制模块框图如图5所示。图5 控制模块框图输入:sysclk_50MHz 全局时钟信号,50MHz Reset 全局复位端,高电平有效输出:dout_1s 倒计时个位上数字dout_10s 倒计时十位上数

11、字light_select 各个灯状态light_select(只是控制亮与灭,不管黄灯闪烁)时序说明:首先还是加上系统时钟之后,用reset清零,则计数器清零、所有灯都不亮。但reset为1之后模块开始工作,首先是计数器开始计数,随之分频时钟会根据计数器的变化而周期变化,绿灯会先亮60秒,之后黄灯也会亮(闪烁在译码模块实现)10秒,然后就是红灯亮60秒,以后就是循环以上步骤的过程,同时在循环过程中,倒计数的数会同步输出,各灯亮与灭状态也会同步输出。译码模块框图如图6所示:图6 译码模块框图输入端口: sysclk_50MHz 全局时钟信号,50MHz reset 全局复位端,高电平有效 di

12、n_1s 显示器个位数据,由控制模块输入 din_10s 显示器十位数据,由控制模块输入 light_sel 选择那盏灯亮,由控制模块的输入 输出端口: colour 最终显示哪盏灯亮,可与硬件相连 led_data_1s 显示器个位数据的译码 led_data_10s 显示器十位数据的译码时序说明: 此模块接受(系统时钟)sysclk_50MHz 和(全局复位)reset的控制,均为上升沿触发,当 reset 为高电平时,电路复位,重新开始工作。当reset为低电平时,电路正常工作。时钟上升沿触发,对3:0din_1s(显示器个位数据)进行译码,输出到6:0led_data_1s(显示器个位

13、数据的译码),;对 3:0din_10s (显示器十位数据) 进行译码,输出到 6:0led_data_10s (显示器十位数据的译码) 。这两个译码输出端口最终连接到硬件上去,实现7段LED数码管的显示。时钟上升沿触发,对哪个灯亮进行译码输出,light_sel2将高电平传入到colour2中,红灯开始亮,light_sel0将高电平传入到colour0中,绿灯开始亮。黄灯的闪烁在顶层模块说明。5. 系统结构和模块划分,关键子模块之间的接口实现定义。系统划分为三个模块,顶层模块、控制模块、译码模块,各个模块的相关功能已经在(1)中详细说明,这里详述子模块接口实现,控制模块里有三个输出,即倒计

14、时时间的十位dout_10s,个位dout_1s,控制灯的亮与灭light_select,这三个都是作为译码模块的输入的,十位和个位直接在译码模块里直接使用,用七段译码,用于显示,灯的亮与灭light_select,最高位和最低位(分别控制绿灯和红灯)直接输出,中间位(控制黄灯)要再加上一个时钟信号,使其闪烁。6. 测试平台设计在modelsim里进行仿真,testbench的书写很简单,从顶层模块来看,只有两个输入和三个输出,即输入系统时钟,控制清零端,输出个位的七段译码,十位的七段译码以及灯的颜色和状态。具体实现代码如下:timescale 1ns/1ns /clk周期应该20nsmodu

15、le traffic_tb; reg sysclk_50MHz; reg reset; wire 2:0 color; / 最后控制绿黄红三灯 wire 6:0 led_ctrl_1s; / 个位七段译码wire 6:0 led_ctrl_10s; / 十位七段译码initialbeginreset=1;#1 reset=0;endalwaysbegin#1 sysclk_50MHz=0; / 这里把系统时钟调为2ns#1 sysclk_50MHz=1;endtraffic_light U_traffic( / 实例化.sysclk_50MHz(sysclk_50MHz),.reset(res

16、et),.color(color),.led_ctrl_1s(led_ctrl_1s),.led_ctrl_10s(led_ctrl_10s);endmodule四、实验结果与数据处理1. Modelsim仿真结果,波形图,代码覆盖率图等首先要说明的是,由于系统时钟频率很大,运行起来很慢,并且时钟频率的大小与最后结果的正确与否关系并不是很大,于是我们在仿真的时候,把时钟周期调为了较小的2ns。由于结果很多很长,不可能一一列举,我们在此选择了几个有代表性的的点给予展示。首先来看看图7,正如上前面所说,我们的输入输出一共有5个但是一些中间的输出的显示能让我们更好的理解,为了更好的理解仿真结果,我们

17、将截图的左边一列的信号从上到下的解释说明列在表1中。表1 仿真结果信号解释说明信号解释备注sysclk_50MHz系统时钟, 50MHz为了方便,这里取2nscolor最终三灯状态包括绿红灯亮,黄灯闪烁light_selected控制模块灯亮的标志只控制亮与不亮,不闪led_ctrl_1s倒计时个位七段译码系统时钟led_ctrl_10s倒计时十位七段译码系统输出dout_1s倒计时个位上的数字控制模块的输出dout_10s倒计时十位上的数字控制模块的输出y_flicker黄灯闪烁控制端高电平有效图7展示的是绿灯倒计时的某一瞬间,竖线所在的位置是56s,这时候color和light_selec

18、ted是100,表示此时绿灯亮,而led_ctrl_1s是0010000,对照译码表可以发现它显示的数字6,led_ctrl_10s是0010100,对照译码表可以发现它显示的数字5,十位和个位合起来就是数字56,正好与dout_10s(5)和 dout_1s(6)结果相对应。图7 modelsim仿真结果关键点展示(绿灯) 图8展示的黄灯倒计时的某一瞬间,竖线显示的地方,此时color和light_selected都是010,表示此时是黄灯在亮,倒计时十位(dout_10s)和和个位(dout_1s)合起来是08,而七段译码led_ctrl_10s是0001000,对照译码表可以发现它显示的

19、数字0,led_ctrl_1s是0000000,对照译码表可以发现它显示的数字8,也与输出结果吻合,最后一个y_flicker为1,也表示此时黄灯可以亮。图8 modelsim仿真结果关键点展示(黄灯)图9也是展示的黄灯在倒计时08s时结果,与图8不同的是在color和y_flicker,图9的light_selected也是010,表示此时输入信号时黄灯在亮,然而闪烁控制端y_flicker为0,表示此时输出的黄灯应该是灭的,实际上通过图8和图9对比可以发现,它实现了黄灯闪烁的功能(08s的前半秒黄灯是亮的,后半秒是灭的)。图9 modelsim仿真结果关键点展示(黄灯)图10展示的是红灯倒

20、计时的某一刻,此时color和light_selected是100,表示此时红灯亮,而七段译码结果合起来是37,正好与下面的十位和个位输出结果一致。图10 modelsim仿真结果关键点展示(红灯)以上四幅图虽然少,但却不失代表性,可以证明我们程序的正确性。图11是用modelsim做出来的代码覆盖率图,可见代码覆盖率已经很高了,但是并没有达到100%,可见程序仍有可以改进和提高的地方。图11 modelsim代码覆盖率图程序设计源代码如下:/*/ 顶层模块,只做例化,不做逻辑设计/*module traffic_light( sysclk_50MHz, / 全局时钟,50MHz reset,

21、 / 全局控制端 color, / 控制绿黄红三灯亮或者闪烁 led_ctrl_1s, / 个位七段译码 led_ctrl_10s / 十位七段译码 ); input sysclk_50MHz; input reset; output 2:0 color; output 6:0 led_ctrl_1s; output 6:0 led_ctrl_10s; wire 3:0 dataout_1s; /个位输出,连接控制和译码模块 wire 3:0 dataout_10s; /十位输出,连接控制和译码模块 wire 2:0 light_selccted; /三灯亮否,连接控制和译码模块light_c

22、trl U_light_ctrl( / 控制模块例化.sysclk_50MHz(sysclk_50MHz),.reset(reset),.dout_1s(dataout_1s), / 控制模块输出个位上的数.dout_10s(dataout_10s),/ 控制模块输出个位十的数.light_select(light_selccted); /控制模块输出灯的亮与灭decode U_decode( / 译码模块例化.sysclk_50MHz(sysclk_50MHz),.reset(reset),.din_1s(dataout_1s), / 译码模块个位输出做输入 .din_10s(dataout

23、_10s), /译码模块十位输出做输入.light_sel(light_selccted), / 译码模块灯亮与否做输入.colour(color), / 输出,灯的亮和闪.led_data_1s(led_ctrl_1s), / 个位七段译码.led_data_10s(led_ctrl_10s) /十位七段译码);endmodule/*/ 控制模块,主要是控制灯的时序变化,以及倒计时/*module light_ctrl ( sysclk_50MHz, / 全局时钟 reset, / 全局控制端 dout_1s, / 个位的数字 dout_10s, / 十位的数字 light_select /

24、 只是控制三灯亮与灭 ); inputsysclk_50MHz; inputreset; output3:0 dout_1s; output3:0 dout_10s; output2:0 light_select; reg 2:0 light_select; reg 1:0 light_status; / 状态控制,用于三灯跳转 reg sub_clk_1Hz; / 分频后的1Hz的时钟 reg 24:0 counter; / 计数器,用于产生1Hz时钟 reg enable; / 使能端,控制灯跳转 reg 7:0 light_long; / 灯亮的时间 parameter g_long=8

25、h59; / 绿灯亮时间,BCD码表示 parameter y_long=8h09; / 黄灯闪亮时间,BCD码表示 parameter r_long=8h59; / 红灯亮时间,BCD码表示 / 用于产生分频时钟always(posedge sysclk_50MHz or posedge reset)begin if(reset) begin sub_clk_1Hz=0; counter=5d0; end else if(counter=25d25000000-1) / 0.5s后翻转 begin counter=25d0; sub_clk_1Hz=sub_clk_1Hz; end else

26、 counter=counter+1;end / 控制状态跳转,倒计时always(posedge sub_clk_1Hz or posedge reset)begin if(reset) / 有清零,灯都灭 begin light_select=3b000; light_status=2d0; enable=0; end else if(enable=0) / 使能端为0则执行 begin enable=1; / 使能端变1,下面只执行一次 case(light_status) / 控制状态跳转0: begin light_long=g_long; / 绿灯亮的时间60s light_sel

27、ect=3b100;/ 控制绿灯亮light_status=2d1; / 交给下一个状态end 1: begin light_long=y_long; / 黄灯亮的时间10slight_select=3b010;/ 控制黄灯亮light_status=2d2; / 交给下一个状态end 2: begin light_long=r_long; / 红灯亮的时间60s light_select=3b001;/ 控制红灯亮light_status=2d0; / 交给下一个状态enddefault light_select=3b000; endcase end else if(light_long=0

28、) / 一个灯倒计时完,使能端变0 enable=0; else if(light_long3:0=0) / 如果个位为0 begin light_long3:0=4d9;/ 则个位重新赋值9 light_long7:4=light_long7:4-1; end / 且十位减1 else / 否则个位值减1 light_long3:0=light_long3:0-1;endassign dout_1s=light_long3:0; / 倒计时低四位就是输出个位assign dout_10s=light_long7:4; / 倒计时高四位就是输出十位endmodule/*/ 译码模块,主要是控制

29、黄灯闪烁,绿红灯亮以及倒计时的显示/*module decode ( sysclk_50MHz, / 全局时钟,50MHz reset, / 全局控制端 din_1s, / 个位上输入,是控制模块的输出 din_10s, / 个位上输入,是控制模块的输出 light_sel, / 灯亮的输入,是控制模块的输出 colour, / 最终灯展示出来的效果 led_data_1s, / 个位七段译码 led_data_10s / 十位七段译码 ); input sysclk_50MHz; input reset; input 3:0 din_1s; input 3:0 din_10s; input

30、2:0 light_sel; output 2:0 colour; output 6:0 led_data_1s; output 6:0 led_data_10s; reg 6:0 led_data_1s; reg 6:0 led_data_10s; reg 2:0 colour; reg 24:0 counter_yell; / 计数器,用于控制黄灯闪烁 reg y_flicker; / 相当于一个分频出来的控制时钟 / 分频出控制黄灯闪烁的信号always(posedge sysclk_50MHz or posedge reset)begin if(reset) begin counter

31、_yell=25d0; y_flicker=0; end else if(counter_yell=25d25000000-1) / 周期1s begin counter_yell=25d0; y_flicker=y_flicker; / 0.5s时翻转 end else counter_yell=counter_yell+1;end / 控制黄灯闪烁always(y_flicker or light_sel)begin colour2=light_sel2; / 最高位(绿灯)直接传送 colour0=light_sel0; /最低位(红灯)直接传送 if(y_flicker=1)&(lig

32、ht_sel1=1b1)/ 输入黄灯亮,且控制信号 colour1=1b1; / 为高,黄灯才亮 else / 别的情况,黄灯都灭 colour1=1b0; end / 个位七段译码,低电平有效always(din_1s)begincase(din_1s) 4h0 : led_data_1s = 7b0001000; 4h1 : led_data_1s = 7b1101101; 4h2 : led_data_1s = 7b0100010; 4h3 : led_data_1s = 7b0100100; 4h4 : led_data_1s = 7b1000101; 4h5 : led_data_1

33、s = 7b0010100; 4h6 : led_data_1s = 7b0010000; 4h7 : led_data_1s = 7b0101101; 4h8 : led_data_1s = 7b0000000; 4h9 : led_data_1s = 7b0000100; default : led_data_1s = 7b1111111; endcaseendalways(din_10s) / 十位七段译码,低电平有效begin case(din_10s) 4h0 : led_data_10s = 7b0001000; 4h1 : led_data_10s = 7b1101101; 4h

34、2 : led_data_10s = 7b0100010; 4h3 : led_data_10s = 7b0100100; 4h4 : led_data_10s = 7b1000101; 4h5 : led_data_10s = 7b0010100; 4h6 : led_data_10s = 7b0010000; 4h7 : led_data_10s = 7b0101101; 4h8 : led_data_10s = 7b0000000; 4h9 : led_data_10s = 7b0000100; default : led_data_10s = 7b1111111; endcaseend

35、endmodule2. 综合结果,布局布线结果,关键路径,资源利用率等。 首先对整个模块进行综合,结果如图12所示。图12 整个模块综合结果然后分别对控制模块和译码模块进行综合,综合结果在图13和图14中展示。图13.1 控制模块综合结果图13.2 控制模块综合结果(续)图14 译码模块综合结果五、分析与讨论1. 电路的功能是否正确,仿真是否充分,如何进一步提高代码覆盖率从modelsim模拟仿真结果以及synplify综合结果可以看出,电路功能是基本正确的,实现了我们想要的绿灯亮60秒,黄灯闪10秒和红灯亮60秒。仿真也很充分,从代码覆盖率图我们可以看出,代码覆盖率是有提高的潜力,我们可以从关键路径进行优化等方面来提高。2. 电路的关键路径在哪里,如何对关键路径进行优化。电路关键是在进行时序状态转换,倒计时计数,译码模块控制黄灯闪烁过程,其实经过分析我们会发现,在控制模块和译码模块都用到了一个分频计数器,我们可以进行优化,在一个模块里共用。六、教师评语签名:日期:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁