当前位置:   article > 正文

FPGA智能交通灯控制器系统系统设计_基于fpga的数字交通灯设计

基于fpga的数字交通灯设计

1系统总体设计

把由5OM的有源晶振产生的现场可编程逻辑器件FPGA 的系统时钟输入到分频模块,经分频模块分频产生频率为1Hz的时钟脉冲,作为控制定时模块、控制模块、紧急模块、计数模块的时钟信号,然后再由定时模块来控制紧急模块和控制模块,按照交通管理规则控制交通工作状态的切换,最后,由系统时钟和计数模块以及控制模块来共同控制计数器控制模块,计数器的时钟为lHz,再把计数器控制模块送出的BCD码送给译码器译码后,送给数码管显示各方向直行绿灯的倒计时。

图2.1.1

由系统开发需求,我们可以大致规划出系统的控制流程:交通灯控制模块将需要显示的时间数据连接到数码管显示模块,同时将状态信号连接到数码管控制模块,然后数码管显示模块和数码管控制模块驱动交通信号灯外设工作。系统框图如图2.1.1所示。

在分析如下需求状态后,可以得出:

状态1:主干道方向绿灯29s,支路红灯,

状态2:主干道方向黄灯3s, 支路红灯,

状态3:主干道左转方向绿灯14s,支路红灯,

状态4:主干道方向黄灯3s, 支路红灯,

状态5:支路方向绿灯20s,主干道红灯,

状态6:支路方向黄灯3s, 主干道红灯,

救援车紧急通行状态

状态7:主干道和支路都是红灯10s,之后恢复状态1循环进行。

特殊状态1:道路特殊情况时,主干道和支路都是黄灯,数码管为00,不改变。

特殊状态2:夜间黄灯闪烁。

2. 十字路口红绿灯功能设计

功能说明:该十字路口交通灯控制器用于主干道与支道公路的交叉路口,要求是优先保证主干道的畅通,因此,设计要求如下:

设计一个用于十字路口的交通灯控制器,能显示十字路口东西、南北两个方向的红、黄、绿的指示状态;

1.具有倒计时的功能,用两组数码管作为东西和南北方向的倒计时显示,主干道直行(绿灯)29秒后,左转(绿灯)14秒;支干道直行(绿灯)20秒,在每次绿灯变成红灯的转换过程中,要亮黄灯3秒作为过渡。

2.只考虑直行和左转车辆控制信号灯,右转车辆不受信号灯控制,南北向车辆与东西向车辆交替方向,同方向等待车辆应先方向直行车辆而后放行左转车辆。

3.救援车紧急通行模块是方便救护车和消防车快速通行,所以主干道和支路都为红灯。

3.主控制器模块原理上是一个状态机,依据要求设计,设计出信号灯点亮规律的状态转换表,其中0表示灭,1表示亮,状态表显示了信号灯在运行过程中每个状态应该持续的时间,以及状态之间的转换顺序。依据分频计数器,当分频计数器的时钟达到了对应时间则切换为下一个状态,就可以实现控制信号灯的亮灭。

本次设计较复杂,如果不采用状态机的方式实现起来会非常繁琐,所以在功能中采用状态机的方式实现。

状态1:主干道方向绿灯29s,支路红灯,

状态2:主干道方向黄灯3s, 支路红灯,

状态3:主干道左转方向绿灯14s,支路红灯,

状态4:主干道方向黄灯3s, 支路红灯,

状态5:支路方向绿灯20s,主干道红灯,

状态6:支路方向黄灯3s, 主干道红灯,

然后又重新进行状态1循环进行

救援车紧急通行模块

状态7:主干道和支路都是红灯10s,之后恢复状态1循环进行。

3.分频代码

  1. module clk_div(
  2. input clk,
  3. input clr,
  4. output reg clk_out);
  5. parameter FREQ=1000;
  6. localparam NUM=50000000/(2*FREQ);
  7. reg[29:0] count;
  8. always@(posedge clk,negedge clr)
  9. begin
  10. if(!clr) begin clk_out<=0;count<=0;end
  11. else if(count==NUM-1)
  12. begin count<=0;clk_out<=~clk_out;end
  13. else begin count<=count+1;end
  14. end
  15. endmodule

4.红绿灯

  1. module color_led(
  2. input[3:0] led,
  3. output reg green,red,yellow,zuo);
  4. always @(*)
  5. begin
  6. case(led)
  7. 4'b1000: begin green<=1;yellow<=0;red<=0;zuo<=0;end
  8. 4'b0100: begin green<=0;yellow<=1;red<=0;zuo<=0;end
  9. 4'b0010: begin green<=0;yellow<=0;red<=1;zuo<=0;end
  10. 4'b0011: begin green<=0;yellow<=0;red<=1;zuo<=1;end
  11. default: begin green<=1;yellow<=0;red<=0;zuo<=0;end
  12. endcase
  13. end
  14. endmodule

5.数码管

module seg_led(

input [3:0] code_ge,code_shi,

output reg[6:0] led_ge,led_shi);

parameter D0=7'b1000000,D1=7'b1111001,D2=7'b0100100,D3=7'b0110000,D4=7'b0011001,

D5=7'b0010010,D6=7'b0000010,D7=7'b1111000,D8=7'b0000000,D9=7'b0010000;

always @(*)

begin

case(code_ge)

4'd0: led_ge = D0;

4'd1: led_ge = D1;

4'd2: led_ge = D2;

4'd3: led_ge = D3;

4'd4: led_ge = D4;

4'd5: led_ge = D5;

4'd6: led_ge = D6;

4'd7: led_ge = D7;

4'd8: led_ge = D8;

4'd9: led_ge = D9;

default: led_ge = 7'bx;

endcase

case(code_shi)

4'd0: led_shi = D0;

4'd1: led_shi = D1;

4'd2: led_shi = D2;

4'd3: led_shi = D3;

4'd4: led_shi = D4;

4'd5: led_shi = D5;

4'd6: led_shi = D6;

4'd7: led_shi = D7;

4'd8: led_shi = D8;

4'd9: led_shi = D9;

default: led_shi = 7'bx;

endcase

end

endmodule

6主模块

  1. module top_traffic(
  2. input clk,clr,
  3. output green,yellow,red,zuo,GREEN,YELLOW,RED,ZUO,
  4. output[6:0] led_ge,led_shi,LED_GE,LED_SHI);
  5. wire clk1hz,clk2hz;
  6. clk_div #(25000000) clk1(
  7. .clk(clk),
  8. .clr(clr),
  9. .clk_out(clk1hz)
  10. );
  11. clk_div #(2) clk2(
  12. .clk(clk),
  13. .clr(clr),
  14. .clk_out(clk2hz)
  15. );
  16. traffic_light light1(
  17. .clk1hz(clk1hz),
  18. .clr(clr),
  19. .led_ge(led_ge),
  20. .led_shi(led_shi),
  21. .green(green),
  22. .yellow(yellow),
  23. .red(red),
  24. .LED_GE(LED_GE),
  25. .LED_SHI(LED_SHI),
  26. .GREEN(GREEN),
  27. .YELLOW(YELLOW),
  28. .RED(RED),
  29. .zuo(zuo),
  30. .ZUO(ZUO)
  31. );
  32. endmodule
  33. module traffic_light(
  34. input clk1hz,clr,
  35. output green,yellow,red,GREEN,YELLOW,RED,zuo,ZUO,
  36. output[6:0] led_ge,led_shi,LED_GE,LED_SHI);
  37. reg[2:0] color,COLOR;
  38. reg[3:0] state;
  39. reg[3:0] num_ge,num_shi,NUM_GE,NUM_SHI;
  40. wire[3:0] ge,shi,GE,SHI;
  41. wire[3:0] led,LED;
  42. parameter S0=0,S1=1,S2=2,S3=3,S4=4,S5=5,G1=10;
  43. always @(posedge clk1hz,negedge clr)
  44. begin
  45. if(!clr) begin state<=S0;num_ge<=9;num_shi<=2;NUM_GE<=3;NUM_SHI<=3;end
  46. else begin
  47. case(state)
  48. S0:begin
  49. num_ge<=num_ge-1;NUM_GE<=NUM_GE-1;
  50. if(num_ge==0) begin num_ge<=9;num_shi<=num_shi-1;end
  51. if(num_ge==0 && num_shi==0) begin num_ge<=3;num_shi<=0;state<=S1;end
  52. if(NUM_GE==0) begin NUM_GE<=9;NUM_SHI<=NUM_SHI-1;end
  53. end
  54. S1:begin
  55. num_ge<=num_ge-1;NUM_GE<=NUM_GE-1;
  56. if(num_ge==0 && num_shi==0) begin num_ge<=4;num_shi<=1;end
  57. if(NUM_GE==0 && NUM_SHI==0) begin NUM_GE<=0;NUM_SHI<=1;state<=S2;end
  58. end
  59. S2:begin
  60. num_ge<=num_ge-1;NUM_GE<=NUM_GE-1;
  61. if(num_ge==0) begin num_ge<=9;num_shi<=num_shi-1;end
  62. if(NUM_GE==0) begin NUM_GE<=9;NUM_SHI<=NUM_SHI-1;end
  63. if(NUM_GE==0 && NUM_SHI==0) begin NUM_GE<=3;NUM_SHI<=0;state<=S3;end
  64. end
  65. S3:begin
  66. num_ge<=num_ge-1;NUM_GE<=NUM_GE-1;
  67. if(num_ge==0 && num_shi==0) begin num_ge<=4;num_shi<=2;end
  68. if(NUM_GE==0 && NUM_SHI==0) begin NUM_GE<=0;NUM_SHI<=2;state<=S4;end
  69. end
  70. S4:begin
  71. num_ge<=num_ge-1;NUM_GE<=NUM_GE-1;
  72. if(num_ge==0) begin num_ge<=9;num_shi<=num_shi-1;end
  73. if(NUM_GE==0) begin NUM_GE<=9;NUM_SHI<=NUM_SHI-1;end
  74. if(NUM_GE==0 && NUM_SHI==0) begin NUM_GE<=3;NUM_SHI<=0;state<=S5;end
  75. end
  76. S5:begin
  77. num_ge<=num_ge-1;NUM_GE<=NUM_GE-1;
  78. if(num_ge==0 && num_shi==0) begin num_ge<=9;num_shi<=2;end
  79. if(NUM_GE==0 && NUM_SHI==0) begin NUM_GE<=3;NUM_SHI<=3;state<=S0;end
  80. end
  81. G1:begin
  82. num_ge<=num_ge;num_shi<=num_shi;NUM_GE<=NUM_GE-1;NUM_GE<=NUM_SHI;
  83. end
  84. default:begin state<=S0;num_ge<=9;num_shi<=2;NUM_GE<=3;NUM_SHI<=3;end
  85. endcase end
  86. end
  87. always @(state)
  88. begin
  89. case(state)
  90. S0: begin color<=4'b1000;COLOR<=4'b0010;end
  91. S1: begin color<=4'b0100;COLOR<=4'b0010;end
  92. S2: begin color<=4'b0011;COLOR<=4'b0010;end
  93. S3: begin color<=4'b0100;COLOR<=4'b0010;end
  94. S4: begin color<=4'b0010;COLOR<=4'b1000;end
  95. S5: begin color<=4'b0010;COLOR<=4'b0100;end
  96. default: begin color<=4'b1000;COLOR<=4'b0010;end
  97. endcase
  98. end
  99. assign led=color;
  100. assign LED=COLOR;
  101. assign ge=num_ge;
  102. assign shi=num_shi;
  103. assign GE=NUM_GE;
  104. assign SHI=NUM_SHI;
  105. color_led color_led1(
  106. .led(led),
  107. .green(green),
  108. .yellow(yellow),
  109. .red(red),
  110. .zuo(zuo)
  111. );
  112. seg_led seg_led1(
  113. .code_ge(ge),
  114. .code_shi(shi),
  115. .led_ge(led_ge),
  116. .led_shi(led_shi)
  117. );
  118. color_led color_led2(
  119. .led(LED),
  120. .green(GREEN),
  121. .yellow(YELLOW),
  122. .red(RED),
  123. .zuo(ZUO)
  124. );
  125. seg_led seg_led2(
  126. .code_ge(GE),
  127. .code_shi(SHI),
  128. .led_ge(LED_GE),
  129. .led_shi(LED_SHI)
  130. );
  131. endmodule

说明:该部分为实现红绿灯,左转功能的变化,主要利用了减法器原理,初始主干道方向绿灯29s,支路红灯,然后黄灯闪烁,当数码管为00时状态跳到S1,主干道左转绿灯赋值14s,然后是支路赋值20Ss依次循环,

救援车紧急通行模块

always @(posedge clk1hz,negedge rst_n,negedge M,negedge N,negedge shan)

begin

if(!M)begin state<=S6;dig_zhulu_m1<=9;dig_zhulu_m2<=0;Dig_zhilu_n1<=9;Dig_zhilu_n2<=0;end

S6:begin dig_zhulu_m1<=dig_zhulu_m1-1;Dig_zhilu_n1<=Dig_zhilu_n1-1;

if(dig_zhulu_m1==0 && dig_zhulu_m2==0) begin dig_zhulu_m1<=9;dig_zhulu_m2<=2;end

if(Dig_zhilu_n1==0 && Dig_zhilu_n2==0) begin Dig_zhilu_n1<=3;Dig_zhilu_n2<=3;state<=S0;end end

S6: begin light_zhulu<=4'b0010;

Light_zhilu<=4'b0010;end

说明:代码段为M判断按钮状态,当按下M按钮时执行代码段状态机S6,主干道和支路都变为红灯,倒计时10s后恢复为状态1.

3 十字路口红绿灯,左转,救援车紧急通行模块

1、功能测试设计的测试与分析

我主要是测试红绿黄灯,左转能否正常亮和跳转下一个状态,所以我先给clk和复位信号初值为0,然后经过#10单位时间后复位为1,交通灯开始工作,#10000时间按下按键M后进入救援车紧急通行模块。

clk=0;

rst_n=0;

#10 rst_n=1;

#10 M=1;

#10 N=1;

#10 shan=1;

//#10 M=0;

#10000 M=0;

#10010 M=1;

#10520 rst_n=0;

#10530 rst_n=1;

#11000 N=0;

#11010 N=1;

#11050 shan=0;

#11060 shan=1;

// --> end

$display("Running testbench");

end

always #10 clk=~clk;

2、modelsim仿真和分析

仿真结果和分析

分析:开始主干道直行(绿灯)29秒后,亮红灯,之后左转(绿灯)14秒变为3s黄灯;支干道直行(绿灯)20秒,在每次绿灯变成红灯的转换过程中,要亮黄灯3秒作为过渡。仿真结果正确

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/648769
推荐阅读
相关标签
  

闽ICP备14008679号