微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > FPGA Verilog HDL 设计实例系列连载------交通灯的控制

FPGA Verilog HDL 设计实例系列连载------交通灯的控制

时间:10-02 整理:3721RD 点击:

原理与要求:

   在十字路口,每条道路各有一组红、黄、绿灯和倒计时显示器,用以指挥车辆和行人有序的通行。其中。红灯亮表示该道路禁止通行;黄灯亮表示停车;绿灯亮表示可以通行;倒计时显示器是用来显示允许通行或禁止通行的时间。交通灯控制器就是用于自动控制十字路口的交通灯和计时器,指挥各种车辆和行人安全通过。


下面我们就设计一个这样的:
1)、在十字路口设置一组红、黄、绿等,显示顺序为:红,绿,黄,红……
2)、设置一组数码管,以倒计时的方式显示允许通过或禁止通过的时间,其中绿灯、黄灯、红灯的持续时间为20s,5s,25s。

Verilog HDL实现

设计文件输入Verilog HDL代码。

  系统分为两个模块,一个是顶层traffic,一个是分频模块clkgen。

  分频模块clkgen的实现如下:

  1. //-------------------------------------------------------------------------------------------------
  2. //
  3. // File        : clkgen.v
  4. // Generated   : 2011-07-24
  5. // Author      : wangliang
  6. //
  7. //-------------------------------------------------------------------------------------------------
  8. `timescale 1 ns / 1 ps

  9. module clkgen ( rst ,clkout ,clk );

  10. input rst ;
  11. wire rst ;
  12. input clk ;
  13. wire clk ;

  14. output clkout ;
  15. reg clkout ;
  16.   
  17. reg     [31:0]    count1;

  18.   always @ ( posedge clk or negedge rst)
  19.      
  20.    begin
  21.      if ( rst== 1'b0 ) begin
  22.         clkout = 32'd25000000) begin
  23.           clkout 1'b1 )
  24.                          if ( num [3:0] == 0 ) begin
  25.                              num [ 3:0 ] <= 4'b1001;
  26.                              num [7:4] <= num [7:4] -1 ;
  27.                          end
  28.                          else num [3:0] <= num [3:0] -1 ;
  29.                          if ( num == 2 )
  30.                              temp <= 0 ;
  31.                      end      
  32.                  end
  33.              else begin
  34.                  lamp <= 3'b100 ;
  35.                  state <= red ;
  36.                  temp  <= 0 ;
  37.              end
  38.          end   
  39.    end
  40.   
  41.    
  42.   /************************ 数码管译码**************************************/
  43. reg        [7:0]    Y_r_1;               
  44. reg        [7:0]    Y_r_2;

  45. assign seven_seg[7:0] ={1'b1,(~Y_r_1[6:0])};
  46. assign seven_seg[15:8] = {1'b1,(~Y_r_2[6:0])};

  47. always @(num[3:0] )
  48.      begin
  49.          Y_r_1 = 7'b1111111;
  50.          case (num[3:0] )
  51.                  4'b0000: Y_r_1 = 7'b0111111; // 0
  52.                  4'b0001: Y_r_1 = 7'b0000110; // 1
  53.                  4'b0010: Y_r_1 = 7'b1011011; // 2
  54.                  4'b0011: Y_r_1 = 7'b1001111; // 3
  55.                  4'b0100: Y_r_1 = 7'b1100110; // 4
  56.                  4'b0101: Y_r_1 = 7'b1101101; // 5
  57.                  4'b0110: Y_r_1 = 7'b1111101; // 6
  58.                  4'b0111: Y_r_1 = 7'b0000111; // 7
  59.                  4'b1000: Y_r_1 = 7'b1111111; // 8
  60.                  4'b1001: Y_r_1 = 7'b1101111; // 9
  61.                  4'b1010: Y_r_1 = 7'b1110111; // A
  62.                  4'b1011: Y_r_1 = 7'b1111100; // b
  63.                  4'b1100: Y_r_1 = 7'b0111001; // c
  64.                  4'b1101: Y_r_1 = 7'b1011110; // d
  65.                  4'b1110: Y_r_1 = 7'b1111001; // E
  66.                  4'b1111: Y_r_1 = 7'b1110001; // F
  67.                  default: Y_r_1 = 7'b0000000;
  68.              endcase
  69.      end

  70.      always @( num[7:4] )
  71.      begin
  72.          Y_r_2 = 7'b1111111;
  73.          case ( num[7:4] )
  74.                  4'b0000: Y_r_2 = 7'b0111111; // 0
  75.                  4'b0001: Y_r_2 = 7'b0000110; // 1
  76.                  4'b0010: Y_r_2 = 7'b1011011; // 2
  77.                  4'b0011: Y_r_2 = 7'b1001111; // 3
  78.                  4'b0100: Y_r_2 = 7'b1100110; // 4
  79.                  4'b0101: Y_r_2 = 7'b1101101; // 5
  80.                  4'b0110: Y_r_2 = 7'b1111101; // 6
  81.                  4'b0111: Y_r_2 = 7'b0000111; // 7
  82.                  4'b1000: Y_r_2 = 7'b1111111; // 8
  83.                  4'b1001: Y_r_2 = 7'b1101111; // 9
  84.                  4'b1010: Y_r_2 = 7'b1110111; // A
  85.                  4'b1011: Y_r_2 = 7'b1111100; // b
  86.                  4'b1100: Y_r_2 = 7'b0111001; // c
  87.                  4'b1101: Y_r_2 = 7'b1011110; // d
  88.                  4'b1110: Y_r_2 = 7'b1111001; // E
  89.                  4'b1111: Y_r_2 = 7'b1110001; // F
  90.                  default: Y_r_2 = 7'b0000000;
  91.              endcase
  92.      end
  93. endmodule

复制代码

注:第36行~第39行:实例化分频模块;第42行~第94行:红绿灯的控制以及时间的递减;第97行~第150行:数码管对时间的显示。引脚分配:



图1.1 分频模块



 


 图1.2 顶层模块


  图1.2实例化图1.1,所以只需要对图1.2上的引脚进行分配。其中,clk接50MHZ系统时钟,rst接复位信号,en接按键,控制开始与结束,lamp[2..0]接红黄绿灯,seven_seg[15..0]接2个数码管。实验结果:




  红灯倒计时25S,转绿灯20S,转黄灯5S,转红灯25S。PS:有想法的可以再尝试着做个十字路的那种红绿灯哦。

学习了。谢谢

路过,看看

不错哦

功能有点简单啊,可以再升华一下。

学习下,谢谢小编了

多谢分享。

谢谢小编分享

谢谢小编

好东西,真是各种大牛啊

学习

收益匪浅啊,谢谢

实例很好,很感谢小编

小编好人

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top