一般来说,我贴上来的代码都是能直接跑的,如果不行可以邮箱交流[email protected]
仅供参考,微机的老师讲的很好,所以请还是要先自己完成咯。
免责声明,本人菜只因一只,内容仅供参考,错了不负责哈
该实验和报告部分参考了基于状态机的交通灯控制(vhdl)_尚@scut的博客-CSDN博客_基于状态机的交通灯控制,但是因为我们华工EDA实验室换成了正点原子新起点V2开发板,因此在数码管输出和前面的输入等部分做了一定的修改与调整。
地 点: |
楼 |
房; |
实验台号: |
|
实验日期与时间: |
评 分: |
|||
预习检查纪录: |
批改教师: |
报告内容:
一、实验要求:
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文件中可直接使用。下图为三个实例化元件:
图1 seg数码管接口模块
图2 分频器
图3 交通灯模块(亮灯与计数)
并且最后按照对应线路将其连接完整,如图4所示:
图4 完整接线图
我们将bpf文件设为顶层文件并且编译,编译成功后,按照图5分配引脚后再次编译,并将文件烧录至正点原子新起点V2开发板。
图5 引脚分配图
四 、实验结果和分析
图6 9秒绿灯
图7 6秒红灯
图8 3秒黄灯
从开机开始,交通灯会从9秒绿灯、6秒红灯、3秒黄灯循环亮灯(分别对应LED1,LED3,LED2),我们也可以从数码管上看到该颜色灯已经亮的时间。