您当前的位置: 首页 >  fpga开发

正点原子

暂无认证

  • 1浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子FPGA连载】第十六章交通灯实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

正点原子 发布时间:2021-10-27 15:29:06 ,浏览量:1

1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 4)关注正点原子公众号,获取最新资料更新 在这里插入图片描述

第十六章交通灯实验

交通信号灯是一种生活中非常常见的公共设施,它在马路上的路口、斑马线等位置起着疏导交通的作用,本章我们将使用交通信号灯模块来再现它的功能。 本章包括以下几个部分: 1616.1简介 16.2实验任务 16.3硬件设计 16.4程序设计 16.5下载验证 16.1简介 交通信号灯往往由红、绿、黄三种颜色的灯组成。红灯亮的时候,禁止通行;绿灯亮的时候,可以通行;黄灯亮的时候,提示通行时间已经结束,马上要转换为红灯。 本次实验要再现的交通信号灯为十字路口处的信号灯,它由两对信号灯组成。信号灯实物如图 16.1.1所示: 在这里插入图片描述

图 16.1.1 交通信号灯 图 16.1.2为十字路口交通信号灯简化示意图: 在这里插入图片描述

图 16.1.2 十字路口信号灯示意图 单独一个方向上的信号灯点亮顺序是:红灯熄灭后绿灯亮,绿灯熄灭后黄灯亮,黄灯熄灭后红灯亮,这样一直循环下去。另外,同一方向上的一对信号灯亮的颜色一致,且显示的时间是一样的。 为了模拟交通信号灯的功能,制作了表 16.1.1信号灯状态转换表: 在这里插入图片描述

表 16.1.1 交通信号灯状态转换表

表 16.1.1中,设定一个周期内,红灯发光30s,绿灯发光27s,黄灯发光3s。以东西方向信号灯状态为例,红灯发光的时间等于黄灯与绿灯发光的时间和。所以一个完整的状态转换周期是红灯发光的时间的两倍,也就是60s。 在东西方向红色信号灯发光的30s内,南北方向由绿灯切换到了黄灯;在南北方向红色信号灯发光的30s内,东西方向也由绿灯切换到了黄灯。因此我们将东西和南北方向信号灯同时保持在固定状态的时间段,划为一个状态。由此产生了循环往复的4个状态: 1、东西方向红灯亮27s,南北方向绿灯亮27s,然后切换到状态2; 2、东西方向红灯亮3s,南北方向黄灯亮3s,然后切换到状态3; 3、东西方向绿灯亮27s,南北方向红灯亮27s,然后切换到状态4; 4、东西方向黄灯亮3s,南北方向红灯亮3s,然后切换到状态1。 如图 16.1.3为交通信号灯的状态转换图: 在这里插入图片描述

图 16.1.3 交通信号灯状态转换图 另外,以东西方向为例:一个周期内,红灯发光30s,绿灯发光27s,黄灯发光3s。那么在红灯发光期间,数码管上显示的数字要从29递减到0;同理,绿灯发光期间,数码管上显示的数字要从26递减到0;黄灯发光的时候,数码管上显示的数字要从2递减到0。 16.2实验任务 本节实验任务是通过新起点开发板和外接的交通信号灯扩展模块,再现交通信号灯的功能。 16.3硬件设计 我们的新起点FPGA开发板上左边的P6扩展口可以用来外接交通信号灯扩展模块,交通信号灯扩展模块的原理图如图 16.3.1所示。 在这里插入图片描述

图 16.3.1 交通信号灯原理图 由上图可知,交通信号灯扩展模块四个方向共12个LED灯,而我们使用6个LED控制信号来驱动12个LED灯,这是因为东西方向或者南北方向LED灯的亮灭状态总是一致的,所以我们将东西方向或者南北方向颜色相同的LED灯并联在一起,这样设计的好处是减少了交通信号灯扩展模块LED控制信号的引脚。 上图中四个共阳型数码管分别对应四个路口,每个路口用两位数码管显示当前状态的剩余时间。我们知道,在十字路口中,东西方向或者南北方向数码管显示的时间总是一样的。以东西方向为例,正因为这两个方向显示的时间一致,所以这两个方向的数码管,它们的十位可以用同一个位选信号来控制,个位用另一个位选信号来控制,这样的话,就可以实现两个位选信号控制东西方向共4位数码管的亮灭,南北方向的数码管同理。这样设计的好处是减少了交通信号灯扩展模块位选信号的引脚。 需要注意的是,数码管由PNP型三极管驱动,当三极管的基极为低电平时,数码管相应的位被选通,所以交通信号灯扩展模块的位选信号是低电平有效的。 交通信号灯实物图如图 16.3.2所示,我们本章实验设定交通信号灯的方向为上北下南,左西右东。 在这里插入图片描述

图 16.3.2 交通信号灯实物图 本实验中,交通信号灯管脚分配如下表所示。 表 16.3.1 交通信号灯实验管脚分配 在这里插入图片描述

对应的TCL约束文件如下所示: set_location_assignment PIN_M2 -to sys_clk set_location_assignment PIN_M1 -to sys_rst_n set_location_assignment PIN_R12 -to sel[0] set_location_assignment PIN_T13 -to sel[1] set_location_assignment PIN_R11 -to sel[2] set_location_assignment PIN_G2 -to sel[3] set_location_assignment PIN_N8 -to seg_led[0] set_location_assignment PIN_P8 -to seg_led[1] set_location_assignment PIN_P6 -to seg_led[2] set_location_assignment PIN_M8 -to seg_led[3] set_location_assignment PIN_R14 -to seg_led[4] set_location_assignment PIN_N6 -to seg_led[5] set_location_assignment PIN_R13 -to seg_led[6] set_location_assignment PIN_T14 -to seg_led[7] set_location_assignment PIN_L9 -to led[0] set_location_assignment PIN_M9 -to led[1] set_location_assignment PIN_P9 -to led[2] set_location_assignment PIN_K9 -to led[3] set_location_assignment PIN_L10 -to led[4] set_location_assignment PIN_N9 -to led[5] 16.4程序设计 根据实验任务,我们可以大致规划出系统的控制流程:交通灯控制模块将需要显示的时间数据连接到数码管显示模块,同时将状态信号连接到led灯控制模块,然后数码管显示模块和led灯控制模块驱动交通信号灯外设工作。系统框图如图 16.4.1所示, 在这里插入图片描述

图 16.4.1 交通灯实验系统框图 各模块端口及信号连接如下图所示: 在这里插入图片描述

图 16.4.2 交通信号灯顶层模块原理图 由上图可知,FPGA部分包括四个模块,顶层模块(top_traffic)、交通灯控制模块(traffic_light)、数码管显示模块(seg_led)、led灯控制模块(led)。在顶层模块中完成对其它三个模块的例化,并实现各模块之间的数据传递。 顶层模块(top_traffic):顶层模块完成了对其它三个子模块的例化、实现了子模块间的信号连接、并将led灯和数码管的驱动信号输出给外接设备(交通信号灯外设)。 交通灯控制模块(traffic_light):交通灯控制模块是本次实验的核心代码,这个模块控制信号灯的状态转换,将实时的状态信号state[1:0]输出给led灯控制模块(led),同时将东西和南北方向的实时时间数据ew_time[5:0]和sn_time[5:0]输出给数码管显示模块(seg_led)。 数码管显示模块(seg_led):接收交通灯控制模块传递过来的东西和南北方向的实时时间数据ew_time[5:0]和sn_time[5:0],并以此驱动对应的数码管,将数据显示出来。 led灯控制模块(led):根据接收到的实时状态信号state[1:0],驱动东西和南北方向的led发光。 顶层模块的代码如下:

1   module top_traffic( 
2       input                  sys_clk   ,    //系统时钟信号
3       input                  sys_rst_n ,    //系统复位信号
4       
5       output       [3:0]     sel       ,    //数码管位选信号
6       output       [7:0]     seg_led   ,    //数码管段选信号
7       output       [5:0]     led            //LED使能信号
8   );
9   
10  //wire define    
11  wire   [5:0]  ew_time;                    //东西方向状态剩余时间数据
12  wire   [5:0]  sn_time;                    //南北方向状态剩余时间数据 
13  wire   [1:0]  state  ;                    //交通灯的状态,用于控制LED灯的点亮
14  
15  //*****************************************************
16  //**                    main code                      
17  //*****************************************************
18  //交通灯控制模块    
19  traffic_light u0_traffic_light(
20      .sys_clk                (sys_clk),   
21      .sys_rst_n              (sys_rst_n),      
22      .ew_time                (ew_time),
23      .sn_time                (sn_time),
24      .state                  (state)
25  );
26  
27  //数码管显示模块 
28  seg_led    u1_seg_led(
29      .sys_clk                (sys_clk)  ,
30      .sys_rst_n              (sys_rst_n),
31      .ew_time                (ew_time),
32      .sn_time                (sn_time), 
33      .en                     (1'b1),   
34      .sel                    (sel), 
35      .seg_led                (seg_led)
36  );
37  
38  //led灯控制模块
39  led   u2_led(
40      .sys_clk                (sys_clk  ),
41      .sys_rst_n              (sys_rst_n),
42      .state                  (state    ),
43      .led                    (led      )
44  ); 
45  
46  endmodule        

在代码第22行和第23行,将交通灯控制模块输出的ew_time和sn_time实时时间数据信号连接到数码管显示模块;在代码的第24行,将交通灯控制模块输出的state状态连接到led灯控制模块。 交通灯控制模块的代码如下:

1   module  traffic_light(
2       //input
3       input               sys_clk   ,        //系统时钟
4       input               sys_rst_n ,        //系统复位
5   
6       output  reg  [1:0]  state     ,        //交通灯的状态,用于控制LED灯的点亮
7       output  reg  [5:0]  ew_time   ,        //交通灯东西向数码管要显示的时间数据
8       output  reg  [5:0]  sn_time            //交通灯南北向数码管要显示的时间数据
9       );
10  
11  //parameter define
12  parameter  TIME_LED_Y    = 3;              //黄灯发光的时间
13  parameter  TIME_LED_R    = 30;             //红灯发光的时间
14  parameter  TIME_LED_G    = 27;             //绿灯发光的时间
15  parameter  WIDTH         = 25_000_000;     //产生频率为1hz的时钟
16  
17  //reg define
18  reg    [5:0]     time_cnt;                 //产生数码管显示时间的计数器    
19  reg    [24:0]    clk_cnt;                  //用于产生clk_1hz的计数器
20  reg              clk_1hz;                  //1hz时钟
21  
22  //*****************************************************
23  //**                    main code                      
24  //*****************************************************
25  //计数周期为0.5s的计数器  
26  always @ (posedge sys_clk or negedge sys_rst_n)begin
27      if(!sys_rst_n)
28          clk_cnt             
关注
打赏
1665308814
查看更多评论
0.0403s