中国石油大学数电课程设计报告

中国石油大学数电课程设计报告

2013—2014学年第二学期 数字电子技术课程设计报告

专业班级 自动化1班

姓 名 张 青 学 号 12051124 开课系室 电工电子学教学中心 设计日期 20xx年7月4/5日~8日

目录

数字电子技术课程设计题目:交通灯控制电路设计 ........................................................... 1

一、设计任务及原理 ............................................................................................................... 1

二、具体要求 ........................................................................................................................... 1

三、输入输出资源说明 ........................................................................................................... 3

四、基础设计方案 ................................................................................................................... 4

五、模块仿真结果 ................................................................................................................... 6

六、总结与讨论 ....................................................................................................................... 8

七.各模块关键代码 ............................................................................................................... 9

数字电子技术课程设计题目:交通灯控制电路设计

一、 设计任务及原理:

交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂。

要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各四个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的燃灭规律为:东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯闪烁,红灯亮(表示左转弯),再延时一段时间后,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯闪烁,红灯亮(表示左转弯),再延时一段时间后,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。

在实验中使用4个七段码管中的任意两个数码管显示时间。东西路和南北路的通车时间均设定为20s(其中,绿灯亮时间为10s,绿灯闪烁时间为5s,黄灯闪烁时间为5s)。数码管的时间总是显示为20、19、18、17??2、1、0、20、19、18??。在显示时间小于等于5秒的时候,通车方向的黄灯闪烁。在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。

二、具体要求:

本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的50MHz时钟,黄灯和绿灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz脉冲,即每1s中递减一次。在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。显示方式:1秒显示一个汉字或者一个数字(汉字和数字均静止不动,即不循环),然后全暗1秒,然后再显示一个汉字或者一个数字,以此类推。

实验箱中用到的数字时钟模块、按键开关、数码管、点阵与FPGA的接口电路,以及数字时钟源、按键开关、数码管、点阵与FPGA的管脚连接在以前的实验中都做了详细说明,这里不再赘述。交通灯模块原理与LED灯模块的电路原理一致,当有高电平输入时LED灯就会被点亮,反之不亮。只是LED发出的光有颜色之分。其与FPGA的管脚连接如下表所示:

中国石油大学数电课程设计报告

2

三、输入输出资源说明:

1、外部输入脉冲信号时钟源CP(50MHz),经适当分频后供计数器使用。

2、输出2组显示译码信号(每组7个输出端),分别接到外部的两个七段数码管M1、M2上,M1和M2分别显示倒计时的十位和个位。

3、输出6个高低电平信号,分别接到外部的6个指示纵向、横向的LED灯。(输出高电平时,对应的LED灯亮)

其具体框图如下:

图1 交通灯控制电路结构框图

同时可以拓展:

1、 利用一个开关将0-20s扩展为0-30s(30-10s之间绿灯亮,其他与基本要求相同); 2、 增加交警控制模块:用一个开关切换自动模式(上述情况属于自动模式)和人工

模式(交警控制模式):用4个开关分别实现东西向通行(东西向绿灯亮,南北向红灯亮,没有时间限制),实现南北向通行(南北向绿灯亮,东西向红灯亮,没有时间限制),实现东西向左转弯(东西向绿灯闪烁,东西向红灯亮,南北向

中国石油大学数电课程设计报告

红灯亮,没有时间限制),实现南北向通行(南北向绿灯闪烁,南北向红灯亮,东西向红灯亮,没有时间限制)。

3

中国石油大学数电课程设计报告

四、基础设计方案:

中国石油大学数电课程设计报告

图2 交通灯控制电路图

中国石油大学数电课程设计报告

中国石油大学数电课程设计报告

图3 交通灯控制模块 图4 点阵显示模块

中国石油大学数电课程设计报告

4

图5 倒计时计数模块

中国石油大学数电课程设计报告

图6 分频器模块 图7 LED显示模块

关键代码见最后

首先对于50MHz 使用,我们要进行分频,把其分成1KHz、2Hz、1Hz,三种频率。1KHz用于点阵显示的扫描频率,1Hz用于计数器计时,2Hz用于交通灯的闪烁情况。

关于交通灯的控制模块,输入clk 为2Hz ,接信号灯实现闪烁,两次上升时间为1秒;输入k2 是控制20秒 和 30秒 的切换;w1~w2 相当于使能端,用于之后控制交警模式信号灯明暗情况并使LED保持在00 的状态。

倒计时计数模块实现简单的倒计时计数的功能。Clk 为计数脉冲;k1 是20和30秒之间的切换,k2 是交警模式保持00的使能端。

点阵模块实现16×16点阵显示,同时使能端使在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。clk 是逐行显示进位端,clk3列扫描端。k2 是实现滚动功能的开关。

5

五、模块仿真结果(基础模块仿真,不带使能端):

1.分频器模块

50MHz不能仿真,用50Hz进行模拟。

1Hz:(50-2)/ 2 = 24 ;

中国石油大学数电课程设计报告

5Hz: ( 10- 2) / 2 = 4 ;

CP1 为50Hz 到 1Hz

CP2 为50Hz 到 5Hz

2.交通灯控制模块

中国石油大学数电课程设计报告

15.125ns 的延时是对num赋值

此后经过20脉冲实现10s (因为clk 频率为2Hz),东西路(灯1)和南北路 (灯2)的通车时间均设定为20s(其中,绿灯亮时间为10s,绿灯闪烁时间为5s,黄灯闪烁时间为5s)。数码管的时间总是显示为20、19、18、17??2、1、0、20、19、18??。在显示时间小于等于5秒的时候,通车方向的黄灯闪烁。

3.倒计时计数模块

6

gw 为个位,sw 为十位。倒计时19.18.17……3.2.1.0 计数。

4.LED灯显示模块

中国石油大学数电课程设计报告

LED 为 共阳极 0 亮,1 不亮。

中国石油大学数电课程设计报告

7

六、总结与讨论

七.各模块关键代码

1.分频器

module divider(clk,CP1_1hz,CP2_2hz,CP3_1khz); input clk;

output CP1_1hz,CP2_2hz,CP3_1khz;

reg CP1_1hz,CP2_2hz,CP3_1khz;

reg [31:0] n1,n2,n3;

initial

begin

CP1_1hz=0;

CP2_2hz=0;

CP3_1khz=0;

n1=0;

n2=0;

n3=0;

end

always@(posedge clk)

begin

if(n1==32'd24999999)

begin

n1=32'd0;

CP1_1hz <= ~CP1_1hz;

end

else n1=n1+1;

if(n2==32'd12499999) begin

n2=32'd0;

CP2_2hz <= ~CP2_2hz;

end

else n2=n2+1;

if(n3==32'd24999) begin

n3=32'd0;

CP3_1khz <= ~CP3_1khz; end

else n3=n3+1;

end

endmodule

2.信号灯控制

10

module

control(clk,red1,yellow1,green1,red2,yellow2,green2,k,k2,w1,w2,w3,w4);

input clk,k2,w1,w2,w3,w4;

output red1,yellow1,green1,red2,yellow2,green2;

reg red1,yellow1,green1,red2,yellow2,green2,nb;

output reg [5:0]k;

reg [6:0]num;

initial

num=0;

always @(posedge clk)

begin

if((w1+w2+w3+w4)>1) begin red1=1;red2=1;green1=0;green2=0; end //判断交警模式操作间隔,w1~w4 同时连接或门给LED信号.有延时 else begin

begin

if(k2==0) //此处条件为20,30切换

begin

if(w1==1) num<=10;

else if(w2==1) num<=50;

11

else num<=(num==(7'd79))?1'd0:(num+1'd1);

if(num>0&&num<(20))

begin

k=6'd0;

red1=0;yellow1=0;green1=1;red2=1;yellow2=0;green2=0;k=6'd0; end

else if((num>(19))&&num<(30)) // no.1 green flash

begin

k=6'd1;

red1=1;

if(num%2==0)

green1=1;

else

green1=0;

end

else if(num>(29)&&num<(40)) // no.1 yellow flash

begin

k=6'd2;

red1=0;

if(num%2==0)

yellow1=1;

else

yellow1=0;

12

end

else if(num>(39)&&num<(60))

begin

k=6'd3;

red1=1;yellow1=0;green1=0;

red2=0;yellow2=0;green2=1;

end

else if(num>(59)&&num<(70)) // no.2 green flash begin

k=6'd4;

red2=1;

if(num%2==0)

green2=1;

else

green2=0;

end

else if(num>(69)&&num<(80)) // no.2 yellow flash begin

k=6'd5;

red2=0;

if(num%2==0)

yellow2=1;

else

13

yellow2=0;

end

if(w3==1) begin red1=1;yellow1=0;yellow2=0;if(green1==0) green1=1; else green1=0; end//

if(w4==1) begin red2=1;yellow1=0;yellow2=0;if(green2==0) green2=1; else green2=0; end//

end

else

begin //k2!=0 此处切换为30s

if(w1==1) num<=20;

else if(w2==1) num<=70;

else num<=(num==(7'd119))?1'd0:(num+1'd1);

if(num>0&&num<40)

begin

k=6'd0;

red1=0;yellow1=0;green1=1;red2=1;yellow2=0;green2=0;k=6'd0;

end

else if((num>39)&&num<50) // no.1 green flash

begin

k=6'd1;

red1=1;

14

if(num%2==0)

green1=1;

else

green1=0;

end

else if(num>49&&num<60) // no.1 yellow flash begin

k=6'd2;

red1=0;

if(num%2==0)

yellow1=1;

else

yellow1=0;

end

else if(num>59&&num<100)

begin

k=6'd3;

red1=1;yellow1=0;green1=0;

red2=0;yellow2=0;green2=1;

end

else if(num>99&&num<110) // no.2 green flash begin

k=6'd4;

15

red2=1;

if(num%2==0)

green2=1;

else

green2=0;

end

else if(num>109&&num<120) // no.2 yellow flash

begin

k=6'd5;

red2=0;

if(num%2==0)

yellow2=1;

else

yellow2=0;

end

else if(w3==1) begin red1=1;yellow1=0;yellow2=0;if(green1==0) green1=1; else green1=0; end//

else if(w4==1) begin red2=1;yellow2=0;yellow1=0;if(green2==0) green2=1; else green2=0; end//

end end end end

endmodule

3.倒计时计数器

module nback(clk,gw,sw,k1,k2);

16

input clk,k1,k2;

output [3:0]gw,sw;

reg [3:0]gw,sw;

reg flag;

always@(posedge clk) begin

if(k2==1) begin

gw=4'b0000;

sw=4'b0000; end

else begin

if(gw==4'b0000&&sw==4'b0000) begin

gw=4'b1001;

if(k1==1)

sw=4'b0010;

else sw=4'b0001;

end

else if(gw==4'b0000)

begin

gw=4'b1001;

sw=sw-4'b0001;

17

end

else

begin

gw=gw-4'b0001;

end

end

end

endmodule

4.LED灯模块

module led7(input [3:0] cnt,output reg[6:0]led); 18

always@(cnt)

begin

case(cnt)

4'd0:led=7'b1000000; 4'd1:led=7'b1111001; 4'd2:led=7'b0100100; 4'd3:led=7'b0110000; 4'd4:led=7'b0011001; 4'd5:led=7'b0010010; 4'd6:led=7'b0000010; 4'd7:led=7'b1111000; 4'd8:led=7'b0000000; 4'd9:led=7'b0010000; default:led=7'b1000000; endcase

end

endmodule

19

5.点阵模块

module point (clk,clk3,row,con,en,k2);

20

input[5:0] en;

input clk,clk3,k2;

output[15:0] row;

output[15:0] con;

reg[15:0] row;

reg[15:0] con;

integer cnt,b,n;

reg[15:0] r[96:0];

initial

begin

//b=0 全黑状态

r[0] <=16'b 11xxxxxxxxxxxx1; r[1] <=16'b 11xxxxxxxxxxxx1; r[2] <=16'b 11xxxxxxxxxxxx1; r[3] <=16'b 11xxxxxxxxxxxx1; r[4] <=16'b 11xxxxxxxxxxxx1; r[5] <=16'b 11xxxxxxxxxxxx1; r[6] <=16'b 11xxxxxxxxxxxx1; r[7] <=16'b 11xxxxxxxxxxxx1; r[8] <=16'b 11xxxxxxxxxxxx1; r[9] <=16'b 11xxxxxxxxxxxx1; r[10] <=16'b 11xxxxxxxxxxxx1; r[11] <=16'b 11xxxxxxxxxxxx1;

21

r[12] <=16'b 11xxxxxxxxxxxx1; r[13] <=16'b 11xxxxxxxxxxxx1; r[14] <=16'b 11xxxxxxxxxxxx1; r[15] <=16'b 11xxxxxxxxxxxx1; //=1 显示学号个位 4

r[16] <=16'b 11xxxxxxxxxxxx1; r[17] <=16'b 1111110000001111; r[18] <=16'b 111xxxxxxxxxxxx; r[19] <=16'b 111xxxxxxxxxxxx; r[20] <=16'b 111xxxxxxxxxxxx; r[21] <=16'b 110xxxxxxxxxxxx; r[22] <=16'b 1001111111001111; r[23] <=16'b 0011111111001111; r[24] <=16'b 0000000000000000; r[25] <=16'b 0000000000000000; r[26] <=16'b 111xxxxxxxxxxxx; r[27] <=16'b 111xxxxxxxxxxxx; r[28] <=16'b 111xxxxxxxxxxxx; r[29] <=16'b 111xxxxxxxxxxxx; r[30] <=16'b 11xxxxxxxxxxxx1; r[31] <=16'b 11xxxxxxxxxxxx1; //b=2 显示学号十位 2

r[32] <=16'b 111xxxxxxxxxxxx;

22

r[33] <=16'b 1100000000000111; r[34] <=16'b 0011111111110011; r[35] <=16'b 0011111111111001; r[36] <=16'b 11xxxxxxxxxxxx1; r[37] <=16'b 11xxxxxxxxxxxx1; r[38] <=16'b 1111111111000001; r[39] <=16'b 111xxxxxxxxxxxx; r[40] <=16'b 11xxxxxxxxxxxx1; r[41] <=16'b 11xxxxxxxxxxxx1; r[42] <=16'b 10xxxxxxxxxxxx1; r[43] <=16'b 0011111111110111; r[44] <=16'b 0001111111100011; r[45] <=16'b 0000000000000000; r[46] <=16'b 11xxxxxxxxxxxx1; r[47] <=16'b 11xxxxxxxxxxxx1; //b=3 名字 青

r[48] <=16'b 11xxxxxxxxxxxx1; r[49] <=16'b 11xxxxxxxxxxxx1; r[50] <=16'b 1000000000000011; r[51] <=16'b 11xxxxxxxxxxxx1; r[52] <=16'b 1100000000000111; r[53] <=16'b 11xxxxxxxxxxxx1; r[54] <=16'b 0000000000000001;

23

r[55] <=16'b 11xxxxxxxxxxxx1; r[56] <=16'b 1110000000001111; r[57] <=16'b 11xxxxxxxxxxxx1; r[58] <=16'b 1110000000001111; r[59] <=16'b 11xxxxxxxxxxxx1; r[60] <=16'b 1110000000001111; r[61] <=16'b 11xxxxxxxxxxxx1; r[62] <=16'b 11xxxxxxxxxxxx1; r[63] <=16'b 111xxxxxxxxxxxx; //b=4 名字 张

r[64] <=16'b 11xxxxxxxxxxxx1; r[65] <=16'b 0000001011110111; r[66] <=16'b 11xxxxxxxxxxxx1; r[67] <=16'b 11xxxxxxxxxxxx1; r[68] <=16'b 11xxxxxxxxxxxx1; r[69] <=16'b 10xxxxxxxxxxxx1; r[70] <=16'b 10xxxxxxxxxxxx1; r[71] <=16'b 1011100000000001; r[72] <=16'b 10xxxxxxxxxxxx1; r[73] <=16'b 10xxxxxxxxxxxx1; r[74] <=16'b 11xxxxxxxxxxxx1; r[75] <=16'b 11xxxxxxxxxxxx1; r[76] <=16'b 11xxxxxxxxxxxx1;

24

r[77] <=16'b 11xxxxxxxxxxxx1; r[78] <=16'b 10xxxxxxxxxxxx1; r[79] <=16'b 11xxxxxxxxxxxx1;

//b=5 全黑

r[80] <=16'b 11xxxxxxxxxxxx1; r[81] <=16'b 11xxxxxxxxxxxx1; r[82] <=16'b 11xxxxxxxxxxxx1; r[83] <=16'b 11xxxxxxxxxxxx1; r[84] <=16'b 11xxxxxxxxxxxx1; r[85] <=16'b 11xxxxxxxxxxxx1; r[86] <=16'b 11xxxxxxxxxxxx1; r[87] <=16'b 11xxxxxxxxxxxx1; r[88] <=16'b 11xxxxxxxxxxxx1; r[89] <=16'b 11xxxxxxxxxxxx1; r[90] <=16'b 11xxxxxxxxxxxx1; r[91] <=16'b 11xxxxxxxxxxxx1; r[92] <=16'b 11xxxxxxxxxxxx1; r[93] <=16'b 11xxxxxxxxxxxx1; r[94] <=16'b 11xxxxxxxxxxxx1; r[95] <=16'b 11xxxxxxxxxxxx1;

25

n=96;

end

always@(posedge clk)

begin

if(n==0)n=96;

//b控制显示哪个字符,通过使能端控制在南北通显示名,东西通学号//黄灯闪烁不显示

else n=n-3;

case(en)

4'd0:begin

if(b<=3) b=5;

else b=b-1;

end

4'd1:begin

if(b<=3) b=5;

else b=b-1;

end

4'd2:b=0;//y

4'd3:begin

if(b==0||b>=3) b=2;

else b=b-1;

end

26

4'd4:begin

if(b==0||b>=3) b=2;

else b=b-1;

end

4'd5:b=0;//y

endcase

end

always@(posedge clk3)

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;

27

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

//en

begin

if(k2==0) //滚动动能的条件判断 case(cnt)

0: row<=r[b*16+0];

1: row<=r[b*16+1];

2: row<=r[b*16+2];

3: row<=r[b*16+3];

4: row<=r[b*16+4];

5: row<=r[b*16+5];

28

6: row<=r[b*16+6]; 7: row<=r[b*16+7]; 8: row<=r[b*16+8]; 9: row<=r[b*16+9]; 10: row<=r[b*16+10]; 11: row<=r[b*16+11]; 12: row<=r[b*16+12]; 13: row<=r[b*16+13]; 14: row<=r[b*16+14]; 15: row<=r[b*16+15]; endcase

else

case(cnt)

0: row<=r[n+0]; 1: row<=r[n+1]; 2: row<=r[n+2]; 3: row<=r[n+3]; 4: row<=r[n+4]; 5: row<=r[n+5]; 6: row<=r[n+6]; 7: row<=r[n+7]; 8: row<=r[n+8]; 9: row<=r[n+9];

29

10: row<=r[n+10]; 11: row<=r[n+11]; 12: row<=r[n+12]; 13: row<=r[n+13]; 14: row<=r[n+14]; 15: row<=r[n+15]; endcase

end

end

endmodule

30

相关推荐