CASE_01 基于FPGA的交通灯控制器

        该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源。

 

目录

1 案例引导

1.1 硬件设计初窥

1.2 逻辑设计初窥

2 模块级逻辑设计

2.1 时钟分频模块

2.2 数码管译码模块

2.3 主逻辑运行模块

3 系统逻辑设计

4 硬件设计

4.1 电源接口电路设计

4.2 电源系统设计

4.3 时钟设计

4.4 JTAG端口和FPGA配置电路设计

4.5  FPGA芯片的电源引脚

4.6 A方向信号灯电路

4.7 B方向信号灯电路

4.8 复位电路

4.9 PCB设计图

 4.10  实物图

5 实物验证

5.1 管脚分配

5.2  实物验证

    资料合集包传送门:


1 案例引导

1.1 硬件设计初窥

CASE_01 基于FPGA的交通灯控制器

       如图所示是实际生活中的一个十字路口,看这个图是作为交通灯硬件设计的输入,说明白一点就是需要哪些元器件。

       图中的设计是为了让每个方向的人和车辆都能看到信号灯,所以红绿黄灯的数量加上人行道上的灯总共是48个灯。那么在实际设计中真的要在板卡上设计那么多灯吗显然是不需要的,通过观察可以发现只要是同一方向上的灯,所显示的状态都是一样的。所以实际设计时按A方向和B方向把灯分为两组即可,同样显示倒计时的数码管也是同样的道理。

       于是可以得出初步的硬件设计框图,如下:

CASE_01 基于FPGA的交通灯控制器

       A方向和B方向上分别由红、绿、黄、左转四个信号灯和两个数码管组成。这里解释一下为什么有左转信号灯,在一般的路口只有红、绿、黄三个信号灯,当该方向上的绿灯亮时车是可以直行和左转的,但是在一些大型路口,车流量大,所以一般将左转单独进行时间控制,做这个功能是为了让交通灯功能更完备,提高设计的通用性。

       到这里初步可以确定硬件设计需要的东西,但是具体硬件设计在这里是得不出结论的,因为在没有进行FPGA/CPLD逻辑设计之前,是很难评估需要多少资源来进行设计的,所以芯片选型这一步还要往后放一放。

1.2 逻辑设计初窥

       虽然硬件设计尚未定稿,但这并不妨碍进行逻辑设计,这就是FPGA/CPLD设计的优点。可以在逻辑设计仿真验证完毕之后,再进行硬件电路的设计,这样可以大大降低先期考虑不充分,导致设计的硬件不能使用或者芯片选型不合理所带来的风险。

       结合需要驱动外围设备,以及系统逻辑。可以大致推断出逻辑设计的框图如下:

CASE_01 基于FPGA的交通灯控制器

       到这里得不出详细的逻辑设计输入,但是可以大致了解到设计分为这几个部分,在接下来的工作里将这几个部分分别实现就能完成设计。

2 模块级逻辑设计

2.1 时钟分频模块

       时钟分频,为什么要进行时钟分频呢为信号灯在进行倒计时是按秒信号倒计时的,而FPGA/CPLD一般采用晶振或者一些频率较高的信号源来提供时钟,所以需要对高频时钟进行分频来得到需要的秒信号。

       时钟分频的原理很简单,而且对于成偶数被时钟关系的分频也十分容易实现。

举个例子:如果的主时钟12hz,如何来生成1hz的秒信号呢简单只需要用计数器每计到5个数时对一个信号进行取反,就刚好能生成的秒信号。

       如下为时钟分频的代码,工程位于Traffic_lightmodule_testCLK_div中。

         仿真结果如下图:

CASE_01 基于FPGA的交通灯控制器

       如果把clk看作是12hz的时钟,那么clk_1s便是秒信号了。可以看出CLK12个周期CLK_1S完成了自己的一个周期。

       如果主时钟的频率更高呢么获得秒信号呢简单只要加大计数的周期就可以了,计数的个数可以通过如下的公式获得:

N = fclk /2 – 1

       N:分频系数 (即程序中div_parameter的值  fclk :主时钟的频率

2.2 数码管译码模块

       这里指的数码管就是最常见的七段显示数码管,如图:

CASE_01 基于FPGA的交通灯控制器

        为什么叫七段,因为可以看出它是由7段小灯组成的,通过点亮小灯的组合不同可以组成不同的文字。管脚图如下:

CASE_01 基于FPGA的交通灯控制器

       每个管脚控制着一段灯管,数码管还分为共阴和共阳的说法,共阴是说每段小灯的负极是连接在一个(一个共地管脚),每段小灯的正级是分开的(对应着每个管脚),共阳数码管的则刚好相反。本文就以共阴的数码管为例来讲解。

       对于交通灯来讲,单个的只需要数码管显示0~9这10个数字,按照管脚状态的组合,可以得到如下的数字管脚组合组合表,就称它为译码表(小数点忽略,该设计不涉及小数点的使用):

       图中用‘1’表示该关键状态为高,点亮该管脚对应的段码;‘0’则相反;

数字   管脚

a

b

c

d

e

f

g

0

1

1

1

1

1

1

0

1

0

1

1

0

0

0

0

2

1

1

0

1

1

0

1

3

1

1

1

1

0

0

1

4

0

1

1

0

0

1

1

5

1

0

1

1

0

1

1

6

1

0

1

1

1

1

1

7

1

1

1

0

0

0

0

8

1

1

1

1

1

1

1

9

1

1

1

1

0

1

1

        到这里就可以进行数码管译码模块的程序编写了,如下便是数码管的译码模块的代码了,该例程位于Traffic_lightmodule_testNixie_tube中。

来源:比特电子工作室

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月1日
下一篇 2022年3月1日

相关推荐