❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》

一般来说,我贴上来的代码都是能直接跑的,如果不行可以邮箱交流[email protected]

仅供参考,微机的老师讲的很好,所以请还是要先自己完成咯。
免责声明,本人菜只因一只,内容仅供参考,错了不负责哈

该实验和报告部分参考了基于状态机的交通灯控制(vhdl)_尚@scut的博客-CSDN博客_基于状态机的交通灯控制,但是因为我们华工EDA实验室换成了正点原子新起点V2开发板,因此在数码管输出和前面的输入等部分做了一定的修改与调整。 

实验三  交通灯与智慧交通

          点:

          楼

      房;

实验台号:

实验日期与时间:

    分:

预习检查纪录:

批改教师:

报告内容:

一、实验要求:

1. 知识点掌握

  1. 掌握时序逻辑电路设计的方法;
  2. 掌握状态机设计方法;
  3. 掌握交通灯控制器设计的方法;
  4. 掌握FPGA嵌入式系统开发能力。

2. 能力培养

  1. 利用VHDL语言对硬件电路建模的能力;
  2. 利用Quartus平台进行数字系统设计的能力。
  3. 利用FPGA软核或者硬核进行系统开发的能力

重点

  1. 利用状态机进行时序逻辑电路设计方法;
  2. FPGA嵌入式系统开发方法;
  • 实验内容:

交通灯与智慧交通:

  1. 状态机设计;
  2. 基础内容:交通灯设计;

拓展内容:基于FPGA嵌入式系统的智慧交通系统设计,功能涉及但不限于行人检测、行人定位、车流检测、车牌检测等。

基础实验内容

1) 开发板上三个 led 等分别代表公路上红黄绿三种颜色交通灯,D3 代表红灯, D5 代表黄灯,D7 代表绿灯 。D3,D5,D7 对应开发板的 IO 口为 120,118, 116 。

2) 交通灯状态机初始状态为红灯,交通灯工作过程依次是红 绿 黄 红。

3) 为了方便观察,本次实验要求红灯的显示时间为 9s,绿灯显示时间为 6s , 黄灯显示时间为 3s ,时间需要倒计时,在数码管 Q4 上显示。Q4 的使能端 (低电平有效)对应开发板 IO 口为 168,八段 led 对应 IO 口为 A~H (144,158,162,160,159,156,163,161)。

4) 编程之前要求同学们先画好 ASM 图。

5) 1Hz 分频模块请采用第二次实验中的内容,7 段码显示模块可参考实验二。

6) 顶层模块命名方式,traffic_light_(班级)_(班级序号)

  • 实验设计原理

1、代码实现与思路

本实验共分为4各模块,分别为seg, divider, traffic_light。和实验2非常类似,seg和divider和实验2没有区别。Traffic_light中主要分为两个部分,一是和实验2一样的正向计数部分,二是按照规则亮灯:以上两个部分都用三进程状态机完成。

Seg和divider在实验2报告中有详解,在此不再赘述。Traffic_light解析如下:(报告2链接)

(❀工信工实验参考——《VHDL实验2——数码管及分频器》_程序源_hytz的博客-CSDN博客)

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.all;
ENTITY traffic_light is
PORT(clk:IN std_logic;
rst_n:IN std_logic;
red_light:OUT std_logic;
green_light:OUT std_logic;
yellow_light:OUT std_logic;
holdtime:OUT integer range 0 TO 9);
END ENTITY;
ARCHITECTURE Behav OF traffic_light IS
TYPE state_type IS (reset0,r1,r2,r3,r4,r5,r6,r7,r8,r9,g1,g2,g3,g4,g5,g6,y1,y2,y3);
SIGNAL present_state,next_state:state_type;
BEGIN
seq:PROCESS(clk,rst_n)
BEGIN 
IF(rst_n='0') THEN
present_state<=reset0;
ELSIF(rising_edge(clk)) THEN
present_state<=next_state;
END IF;
END PROCESS;
com:PROCESS(next_state)
BEGIN
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=0;
CASE present_state IS
WHEN reset0=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=0;
next_state<=r1;
WHEN r1=>
red_light<='0';
green_light<='0';
yellow_light<='1';
holdtime<=9;
next_state<=r2;
WHEN r2=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=8;
next_state<=r3;
WHEN r3=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=7;
next_state<=r4;
WHEN r4=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=6;
next_state<=r5;
WHEN r5=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=5;
next_state<=r6;
WHEN r6=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=4;
next_state<=r7;
WHEN r7=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=3;
next_state<=r8;
WHEN r8=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=2;
next_state<=r9;
WHEN r9=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=1;
next_state<=g1;
WHEN g1=>
red_light<='1';
green_light<='0';
yellow_light<='0';
holdtime<=6;
next_state<=g2;
WHEN g2=>
red_light<='0';
green_light<='1';
yellow_light<='0';
holdtime<=5;
next_state<=g3;
WHEN g3=>
red_light<='0';
green_light<='1';
yellow_light<='0';
holdtime<=4;
next_state<=g4;
WHEN g4=>
red_light<='0';
green_light<='1';
yellow_light<='0';
holdtime<=3;
next_state<=g5;
WHEN g5=>
red_light<='0';
green_light<='1';
yellow_light<='0';
holdtime<=2;
next_state<=g6;
WHEN g6=>
red_light<='0';
green_light<='1';
yellow_light<='0';
holdtime<=1;
next_state<=y1;
WHEN y1=>
red_light<='0';
green_light<='1';
yellow_light<='0';
holdtime<=3;
next_state<=y2;
WHEN y2=>
red_light<='0';
green_light<='0';
yellow_light<='1';
holdtime<=2;
next_state<=y3;
WHEN y3=>
holdtime<=1;
red_light<='0';
green_light<='0';
yellow_light<='1';

next_state<=r1;
END CASE;
END PROCESS;
END Behav;

在该实验中我们定义19个状态:

(reset0,r1,r2,r3,r4,r5,r6,r7,r8,r9,g1,g2,g3,g4,g5,g6,y1,y2,y3)分别对应重置,9秒绿灯,6秒红灯,3秒黄灯,具体代码实现中编写一个双进程,其中seq进程判断重置状态,com进程判断下一个状态。在分频器每次输出脉冲的上升沿,计数加1,从初始状态跳入至r1状态,以此类推,并不断循环往复。在每个状态中会对LED进性赋值来分别表征亮红灯/亮黄灯/亮绿灯。

       本报告的写法虽然状态较多,但是省去了条件判断的编程,虽然使用更多硬件资源,但在编程上更简单。

      

2、实例化

将上述代码设为顶层实体,并且create symbol files for current file来创立元件,在新建的bpf文件中可直接使用。下图为三个实例化元件:

❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》_第1张图片

图1 seg数码管接口模块

❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》_第2张图片

图2 分频器

❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》_第3张图片

图3 交通灯模块(亮灯与计数)

并且最后按照对应线路将其连接完整,如图4所示:

❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》_第4张图片

图4 完整接线图

  1. 烧录至开发板

我们将bpf文件设为顶层文件并且编译,编译成功后,按照图5分配引脚后再次编译,并将文件烧录至正点原子新起点V2开发板。

❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》_第5张图片

图5 引脚分配图

、实验结果和分析

❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》_第6张图片

图6  9秒绿灯

❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》_第7张图片

图7  6秒红灯

❀工信工实验参考——《VHDL实验3——交通灯与智慧交通》_第8张图片

图8 3秒黄灯

       从开机开始,交通灯会从9秒绿灯、6秒红灯、3秒黄灯循环亮灯(分别对应LED1,LED3,LED2),我们也可以从数码管上看到该颜色灯已经亮的时间。

你可能感兴趣的:(VHDL实验,fpga开发,学习方法,经验分享)