数电课程设计报告交通灯控制电路设计任务书.docx
20142015学年第一学期数字电子技术课程设计任务书(适用专业:勘查12级、地物12级) 专业班级 地物一班 姓 名 张瑞 学 号 12013103 开课系室 电工电子学教学中心 设计日期 2014年12月22日30日 目录一、 设计题目二、 设计任务及要求1, 具体要求2, 输入输出资源说明三、 设计与仿真1, 基本要求的设计1.1时钟分频模块1.2闪烁模块1.3计数器模块1.4译码器模块1.5交通灯控制模块1.6点阵显示模块2,扩展模块的设计2.1自动切换手动模块的设计2.2交警控制模块的设计3,顶层模块的设计四、 总结与讨论一、 设计题目数字电子技术课程设计题目:交通灯控制电路设计。交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂。要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各四个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的燃灭规律为:东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯闪烁,红灯亮(表示左转弯),再延时一段时间后,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯闪烁,红灯亮(表示左转弯),再延时一段时间后,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。在实验中使用4个七段码管中的任意两个数码管显示时间。东西路和南北路的通车时间均设定为20s(其中,绿灯亮时间为10s,绿灯闪烁时间为5s,黄灯闪烁时间为5s)。数码管的时间总是显示为20、19、18、172、1、0、20、19、18。在显示时间小于等于5秒的时候,通车方向的黄灯闪烁。在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。二、 设计任务及要求1. 具体要求本课程设计要完成的任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的50MHz时钟,黄灯和绿灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz脉冲,即每1s中递减一次。在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。显示方式:1秒显示一个汉字或者一个数字(汉字和数字均静止不动,即不循环),然后全暗1秒,然后再显示一个汉字或者一个数字,以此类推。实验箱中用到的数字时钟模块、按键开关、数码管、点阵与FPGA的接口电路,以及数字时钟源、按键开关、数码管、点阵与FPGA的管脚连接在以前的实验中都做了详细说明,这里不再赘述。交通灯模块原理与LED灯模块的电路原理一致,当有高电平输入时LED灯就会被点亮,反之不亮。只是LED发出的光有颜色之分。2. 输入输出资源说明1、外部输入脉冲信号时钟源CP(50MHz),经适当分频后供计数器使用。2、输出2组显示译码信号(每组7个输出端),分别接到外部的两个七段数码管M1、M2上,M1和M2分别显示倒计时的十位和个位。3、输出6个高低电平信号,分别接到外部的6个指示纵向、横向的LED灯。(输出高电平时,对应的LED灯亮)其具体框图如下:1Hz纵向指示灯LED1控制器计数器(倒计时;通车时间倒计时)七段LED数码管显示(2个)50MHz纵向指示灯LED3横停指示灯LED6纵向指示灯LED2横向指示灯LED5横向指示灯LED4CLK显示姓名或者学号图1 交通灯控制电路结构框图根据如上说明,本设计的主要任务和设计要求是:1、按照现代数字系统的Top-Down模块化设计方法,提出交通灯控制电路设计系统的整体设计方案,并进行正确的功能划分,分别提出并实现控制器、计数器、输出译码、点阵显示等模块化子系统的设计方案。2、在Quartus的EDA设计环境中,完成系统的顶层设计、各子系统的模块化设计。分别完成各个基于Verilog语言实现的子模块(包括控制器电路、计数器电路、输出译码电路、点阵显示电路)的逻辑功能仿真。最后对顶层设计进行功能仿真。 3、在2步的基础上,用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。观察实验结果是否与自己的编程思想一致。三、 设计与仿真1.基本要求的设计1.1时钟分频模块通过设计分频器产生1khz、2hz、1hz时钟频率,为后面模块提供时钟脉冲。Verilog程序如下:module clk_div(clk_50MHz,clk_1KHz,clk_2Hz,clk_1Hz);input clk_50MHz;output clk_1KHz,clk_2Hz,clk_1Hz;reg 31:0 count1;reg 31:0 count2;reg 31:0 count3;reg clk_1KHz,clk_2Hz,clk_1Hz;always (posedge clk_50MHz)begincount1<=(count1=32'd49999)?1'd0:(count1+1'd1);clk_1KHz<=(count1>=32'd25000)?1'd1:1'd0;count2<=(count2=32'd24999999)?1'd0:(count2+1'd1);clk_2Hz<=(count2>=32'd12500000)?1'd1:1'd0;count3<=(count3=32'd49999999)?1'd0:(count3+1'd1);clk_1Hz<=(count3>=32'd25000000)?1'd1:1'd0;endendmodule生成的模块为:仿真测试结果:1.2闪烁模块考虑到灯有闪烁功能,加了一个闪烁模块控制灯的闪烁功能。Verilog程序如下:module flash(clk_2Hz,start,flash);input clk_2Hz;input start;output flash;reg flash;always (clk_2Hz or start)beginif(clk_2Hz=1&&start=1) flash=1;else flash=0;endendmodule生成的模块为:仿真测试结果:1.3计数器模块用计数器实现倒计时,引入了一个变量reg4:0cnt来是实现计数器模值得改变。Verilog程序如下:module cnt20or30(clk_1Hz,k0,q,ew_sn);input clk_1Hz,k0;output 4:0 q;output ew_sn;reg 4:0 q;reg 4:0 cnt;reg ew_sn;initial beginq=5'd20;cnt=5'd20;ew_sn=1;endalways (k0)beginif(k0=1)begincnt=5'd30;endelse begincnt=5'd20;endendalways (posedge clk_1Hz)beginif(q=5'd0)beginq=cnt;if(ew_sn=1) ew_sn=0;else ew_sn=1;endelse q=q-5'd1;endendmodule生成的模块为:仿真测试结果:1.4译码器模块实现将计数器的值显示到7段数码管上。Verilog程序如下:module yimaqi(clk_1KHz,q,Led1,Led2);input clk_1KHz;input 4:0 q;output 6:0 Led1;output 6:0 Led2;reg 6:0 Led1; reg 6:0 Led2; reg 3:0 A,B;always (posedge clk_1KHz)beginA=q/10;B=q%10;case (A)4'b0000: Led1 <= 7'b1000_000;4'b0001: Led1 <= 7'b1111_001;4'b0010: Led1 <= 7'b0100_100;4'b0011: Led1 <= 7'b0110_000;4'b0100: Led1 <= 7'b0011_001;4'b0101: Led1 <= 7'b0010_010;4'b0110: Led1 <= 7'b0000_010;4'b0111: Led1 <= 7'b1111_000;4'b1000: Led1 <= 7'b0000_000;4'b1001: Led1 <= 7'b0010_000;default : Led1 <= 7'b1111_111;endcasecase (B)4'b0000: Led2 <= 7'b1000_000;4'b0001: Led2 <= 7'b1111_001;4'b0010: Led2 <= 7'b0100_100;4'b0011: Led2 <= 7'b0110_000;4'b0100: Led2 <= 7'b0011_001;4'b0101: Led2 <= 7'b0010_010;4'b0110: Led2 <= 7'b0000_010;4'b0111: Led2 <= 7'b1111_000;4'b1000: Led2 <= 7'b0000_000;4'b1001: Led2 <= 7'b0010_000;default : Led2 <= 7'b1111_111;endcaseendendmodule生成的模块为:仿真测试结果:1.5交通灯控制模块通过if else判断语句来实现交通灯的控制。Verilog程序如下:module ledcontrol(k,q,ew_sn,g11,g12,y1,r1,g21,g22,y2,r2);input 4:0 q;input k,ew_sn;output g11,g12,y1,r1,g21,g22,y2,r2;reg g11,g12,y1,r1,g21,g22,y2,r2;always (ew_sn or q or k)beginif(ew_sn=1&&q>5'd10)beging11=1;g12=0;y1=0;r1=0;g21=0;g22=0;y2=0;r2=1;endif(ew_sn=1&&q>5'd5&&q<=10)beging11=0;g12=1;y1=0;r1=0;g21=0;g22=0;y2=0;r2=1;endif(ew_sn=1&&q<=5'd5)beging11=0;g12=0;y1=1;r1=0;g21=0;g22=0;y2=0;r2=1;endif(ew_sn=0&&q>5'd10)beging11=0;g12=0;y1=0;r1=1;g21=1;g22=0;y2=0;r2=0;endif(ew_sn=0&&q>5'd5&&q<=10)beging11=0;g12=0;y1=0;r1=1;g21=0;g22=1;y2=0;r2=0;endif(ew_sn=0&&q<=5'd5)beging11=0;g12=0;y1=0;r1=1;g21=0;g22=0;y2=1;r2=0;endif(k=1)beging11=0;g12=0;y1=0;r1=0;g21=0;g22=0;y2=0;r2=0;endendendmodule生成的模块为:仿真测试结果为:1.6点阵显示模块点阵是一行一行显示的,由于变化频率太高,肉眼分辨不出来,最后显示出想要的图案。Verilog程序如下:module dianzhendisplay(clk_1KHz,clk_1Hz,g11,g21,row,con); input clk_1KHz,clk_1Hz,g11,g21; output15:0 row; output15:0 con; reg15:0 row; reg15:0 con; integer cnt,a=0,b=4; reg15:0 r159:0; initial begin /张 r0 <= 16'b 0000001011111101; r1 <= 16'b 1111101011111011; r2 <= 16'b 1111101011110111; r3 <= 16'b 1111101011101111; r4 <= 16'b 0000001011011111; r5 <= 16'b 0111111010111111; r6 <= 16'b 0100000000000000;r7 <= 16'b 0111111001111111; r8 <= 16'b 0000001010111111; r9 <= 16'b 1111101011011111; r10 <=16'b 1111101011101111; r11 <=16'b 1111101011110111; r12 <=16'b 1111101011111011; r13 <=16'b 1101101011011101; r14 <=16'b 1110101010111110; r15 <=16'b 1111001001111111; /全暗r16 <=16'b 1111111111111111; r17 <=16'b 1111111111111111; r18 <=16'b 1111111111111111; r19 <=16'b 1111111111111111; r20 <=16'b 1111111111111111; r21 <=16'b 1111111111111111; r22 <=16'b 1111111111111111; r23 <=16'b 1111111111111111; r24 <=16'b 1111111111111111; r25 <=16'b 1111111111111111; r26 <=16'b 1111111111111111; r27 <=16'b 1111111111111111; r28 <=16'b 1111111111111111; r29 <=16'b 1111111111111111; r30 <=16'b 1111111111111111; r31 <=16'b 1111111111111111; /瑞 r32 <=16'b 0000000101101101; r33 <=16'b 1110111101101101; r34 <=16'b 1110111101101101;r35 <=16'b 1110111101101101; r36 <=16'b 1110111100000001; r37 <=16'b 1110111111111111; r38 <=16'b 1110111000000000; r39 <=16'b 0000000111101111; r40 <=16'b 1110111111011111; r41 <=16'b 1110111111111111; r42 <=16'b 1110111100000000; r43 <=16'b 1110111101011010; r44 <=16'b 1110111101011010; r45 <=16'b 1110111101011010; r46 <=16'b 1110111101011000; r47 <=16'b 0000000101111110; /全暗r48 <=16'b 1111111111111111; r49 <=16'b 1111111111111111; r50 <=16'b 1111111111111111; r51 <=16'b 1111111111111111; r52 <=16'b 1111111111111111; r53 <=16'b 1111111111111111; r54 <=16'b 1111111111111111; r55 <=16'b 1111111111111111; r56 <=16'b 1111111111111111; r57 <=16'b 1111111111111111; r58 <=16'b 1111111111111111; r59 <=16'b 1111111111111111; r60 <=16'b 1111111111111111; r61 <=16'b 1111111111111111;r62 <=16'b 1111111111111111; r63 <=16'b 1111111111111111; /1r64 <=16'b 1111110011111111; r65 <=16'b 1111110011111111; r66 <=16'b 1111110011111111; r67 <=16'b 1111110011111111; r68 <=16'b 1111110011111111; r69 <=16'b 1111110011111111; r70 <=16'b 1111110011111111; r71 <=16'b 1111110011111111; r72 <=16'b 1111110011111111; r73 <=16'b 1111110011111111; r74 <=16'b 1111110011111111; r75 <=16'b 1111110011111111; r76 <=16'b 1111110011111111; r77 <=16'b 1111110011111111; r78 <=16'b 1111110011111111; r79 <=16'b 1111110011111111; /全暗r80 <=16'b 1111111111111111; r81 <=16'b 1111111111111111; r82 <=16'b 1111111111111111; r83 <=16'b 1111111111111111; r84 <=16'b 1111111111111111; r85 <=16'b 1111111111111111; r86 <=16'b 1111111111111111; r87 <=16'b 1111111111111111; r88 <=16'b 1111111111111111; r89 <=16'b 1111111111111111; r90 <=16'b 1111111111111111; r91 <=16'b 1111111111111111; r92 <=16'b 1111111111111111; r93 <=16'b 1111111111111111; r94 <=16'b 1111111111111111; r95 <=16'b 1111111111111111; /0r96 <=16'b 0000000000000000; r97 <=16'b 0000000000000000; r98 <=16'b 0011111111111100; r99 <=16'b 0011111111111100; r100 <=16'b 0011111111111100; r101 <=16'b 0011111111111100; r102 <=16'b 0011111111111100; r103 <=16'b 0011111111111100; r104 <=16'b 0011111111111100; r105 <=16'b 0011111111111100; r106 <=16'b 0011111111111100; r107 <=16'b 0011111111111100; r108 <=16'b 0011111111111100; r109 <=16'b 0011111111111100; r110 <=16'b 0000000000000000; r111 <=16'b 0000000000000000; /全暗r112 <=16'b 1111111111111111; r113 <=16'b 1111111111111111; r114 <=16'b 1111111111111111; r115 <=16'b 1111111111111111; r116 <=16'b 1111111111111111; r117 <=16'b 1111111111111111; r118 <=16'b 1111111111111111; r119 <=16'b 1111111111111111; r120 <=16'b 1111111111111111; r121 <=16'b 1111111111111111; r122 <=16'b 1111111111111111; r123 <=16'b 1111111111111111; r124 <=16'b 1111111111111111; r125 <=16'b 1111111111111111;r126 <=16'b 1111111111111111; r127 <=16'b 1111111111111111; /3r128 <=16'b 0000000000000000; r129 <=16'b 0000000000000000; r130 <=16'b 1111111111111100; r131 <=16'b 1111111111111100; r132 <=16'b 1111111111111100; r133 <=16'b 1111111111111100; r134 <=16'b 1111111111111100; r135 <=16'b 0000000000000000; r136 <=16'b 0000000000000000; r137 <=16'b 1111111111111100; r138 <=16'b 1111111111111100; r139 <=16'b 1111111111111100; r140 <=16'b 1111111111111100; r141 <=16'b 1111111111111100; r142 <=16'b 0000000000000000;r143 <=16'b 0000000000000000; /全暗r144 <=16'b 1111111111111111; r145 <=16'b 1111111111111111; r146 <=16'b 1111111111111111; r147 <=16'b 1111111111111111; r148 <=16'b 1111111111111111; r149 <=16'b 1111111111111111; r150 <=16'b 1111111111111111; r151 <=16'b 1111111111111111; r152 <=16'b 1111111111111111; r153 <=16'b 1111111111111111; r154 <=16'b 1111111111111111; r155 <=16'b 1111111111111111; r156 <=16'b 1111111111111111; r157 <=16'b 1111111111111111;r158 <=16'b 1111111111111111; r159 <=16'b 1111111111111111;end always(posedge clk_1Hz) begin if(a=3) a<=0; else a<=a+1; end always(posedge clk_1Hz) begin if(b=9) b<=4; else b<=b+1; end always(posedge clk_1KHz) begin if(cnt=15) begin cnt<=0; end else cnt<=cnt+1; case(cnt) 0: con<=16'b0000_0000_0000_0001; 1: con<=16'b0000_0000_0000_0010; 2: con<=16'b0000_0000_0000_0100; 3: con<=16'b0000_0000_0000_1000; 4: con<=16'b0000_0000_0001_0000; 5: con<=16'b0000_0000_0010_0000; 6: con<=16'b0000_0000_0100_0000;7: con<=16'b0000_0000_1000_0000; 8: con<=16'b0000_0001_0000_0000; 9: con<=16'b0000_0010_0000_0000; 10: con<=16'b0000_0100_0000_0000; 11: con<=16'b0000_1000_0000_0000; 12: con<=16'b0001_0000_0000_0000; 13: con<=16'b0010_0000_0000_0000; 14: con<=16'b0100_0000_0000_0000; 15: con<=16'b1000_0000_0000_0000; endcase if(g11=1) begin case(cnt) 0: row<=ra*16+0; 1: row<=ra*16+1; 2: row<=ra*16+2; 3: row<=ra*16+3; 4: row<=ra*16+4; 5: row<=ra*16+5; 6: row<=ra*16+6; 7: row<=ra*16+7; 8: row<=ra*16+8; 9: row<=ra*16+9; 10: row<=ra*16+10; 11: row<=ra*16+11; 12: row<=ra*16+12; 13: row<=ra*16+13; 14: row<=ra*16+14; 15: row<=ra*16+15;endcase endif(g21=1)begin case(cnt) 0: row<=rb*16+0; 1: row<=rb*16+1; 2: row<=rb*16+2; 3: row<=rb*16+3; 4: row<=rb*16+4; 5: row<=rb*16+5; 6: row<=rb*16+6; 7: row<=rb*16+7; 8: row<=rb*16+8; 9: row<=rb*16+9; 10: row<=rb*16+10; 11: row<=rb*16+11; 12: row<=rb*16+12; 13: row<=rb*16+13; 14: row<=rb*16+14; 15: row<=rb*16+15;endcase end end endmodule生成的模块为:仿真测试结果:2.扩展模块的设计2.1自动切换手动模块的设计我是通过一个开关控制时钟信号的有无来控制自动模式的切换为手动模式的。Verilog程序如下:module changemodule(clk_50MHz,k,clk);input clk_50MHz,k;output clk;reg clk;always (k)beginif(k=1) clk=0;else clk=clk_50MHz;endendmodule生成的模块为:仿真测试结果为:2.2交警控制模块的设计module policecontrol(k,k1,k2,k3,k4,g11,g12,r1,g21,g22,r2);input k,k1,k2,k3,k4;output g11,g12,r1,g21,g22,r2;reg g11,g12,r1,g21,g22,r2;always (k or k1 or k2 or k3 or k4)beginif(k1=1&&k=1)beging11=1;g12=0;r1=0;g21=0;g22=0;r2=1;endif(k2=1&&k=1)beging11=0;g12=0;r1=1;g21=1;g22=0;r2=0;endif(k3=1&&k=1)beging11=0;g12=1;r1=1;g21=0;g22=0;r2=1;endif(k4=1&&k=1)beging11=0;g12=0;r1=1;g21=0;g22=1;r2=1;endif(k=0)beging11=0;g12=0;r1=0;g21=0;g22=0;r2=0;endendendmodule生成的模块为:仿真测试结果为:3. 顶层模块的设计3.1顶层设计方案:(1)时钟分频的到1KHz,2Hz,1Hz给后面的模块提供脉冲;(2(计数器实现倒计时及译码器实现显示;(3)交通灯的控制及点阵显示;(4)控制开关的运用。3.2顶层结构图:3.3总设计图:顶层仿真测试结果为:自动模式顶层仿真图20秒:自动顶层仿真图30秒交警控制仿真图:四、 总结与讨论四、 总结与讨论