FPGA实验四:交通灯控制器设计

目录

一、实验目的

二、设计要求

三、实验代码

1.design source文件代码

2.仿真文件代码

3.代码原理分析

四、实验结果及分析

1、引脚锁定

2、仿真波形及分析

3、下载测试结果及分析

五、实验心得

1.解决实验中遇见的问题及解决

2.实验完成的心得


一、实验目的

(1)熟悉交通灯控制器的工作原理;

(2)掌握状态机的设计;

(3)掌握用Verilog语言实现较复杂时序电路的设计过程。

二、设计要求

实现一个由一条主干道和一条乡间公路形成的十字路口的交通灯控制器功能:

(1)有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;

(2)交通灯由绿转红前有4秒亮黄灯的间隔时间,由红转绿没有间隔时间;

(3)乡间公路右侧各埋有一个串连传感器,当有车辆准备通过乡间公路时,发出请求信号S=1,其余时间S=0;

(4)平时系统停留在主干道通行(MGCR)状态,一旦S信号有效,经主道黄灯4秒(MYCR)状态后转入乡间公路通行(MRCG)状态,但要保证主干60s后才能转换;

(5)一旦S信号消失,系统脱离MRCG状态,即经乡道黄灯4秒(MRCY)状态进入MGCR状态,即使S信号一直有效,MRCG状态也不得长于20秒钟。

三、实验代码

1.design source文件代码

  1. `timescale 1ns / 1ps
    module traffic(clk,Traffic_Light,s,sout,rst,count_display);//,cnt,state,clk1
    input clk,s,rst;//clk时钟信号输入,s来车信号(开关),rst复位信号输入(按钮)
    output[10:0] count_display;//数码管输出
    output[5:0] Traffic_Light;//5-3主  2-0乡 (led*6)
    output sout;//sout来车信号显示(led)
    //定义交通灯的各种状态
    parameter[5:0] MGCR=6'b001100,MYCR=6'b010100,MRCG=6'b100001,MRCY=6'b100010;
    reg[5:0] state;
    reg[15:0] cnt;
    reg[5:0] Traffic_Light;
    reg clk1,sout;
    //进行状态初始化
    initial 
     begin
     cnt<=59;  //60s倒计时
     state<=MGCR;
     Traffic_Light<=MGCR;
     
     end
     
    //分频:
    reg[26:0] clk_cnt;
    reg  [2:0]  sel=3'b0;
    
    always @(posedge clk)
        begin 
            clk_cnt=clk_cnt+1;
            if(clk_cnt==100000000)
                begin
                clk_cnt=0;
                clk1=1'b1;
                end
            else
                clk1=1'b0;
            
            if(clk_cnt%100000==0) 
                begin
                sel=sel+1;
                if(sel==3) 
                    sel=0;
                end
        end
    
    display SG_display(
        .clk (clk),
        .rst (rst),
        .counter (cnt),
        .count_display (count_display),
        .sel(sel)
    );
    
    always @(s)
     begin
     if(s==1) sout=1;
     else sout=0;
     end
    
    //状态转移
    always @(posedge clk1 or negedge rst)
     if(!rst)begin state<=MGCR;cnt<=16'd59;end
     else begin
      case (state)
      MGCR:if (cnt==0) 
        begin 
         if(s==1)begin Traffic_Light<=MYCR; cnt<=3;
       state<=MYCR; end
    //如果s信号为0,则回到初始状态,开始60s倒计时
         else cnt<=59;
        end  
    //开始60s倒计时
         else cnt<=cnt-1;
    //主红乡黄状态后,仍然s=1,则开始20s倒计时状态
      MYCR:if (cnt==0)begin Traffic_Light<=MRCG; cnt<=19;state<=MRCG;end
         else cnt<=cnt-1;
    //经过乡道黄灯4s后,进入MGCR状态
       MRCG:if (cnt==0||s==0) begin Traffic_Light<=MRCY; cnt<=3;state<=MRCY;end  
           else cnt<=cnt-1;
    //4s倒计时结束后,进入主绿乡红状态,数码管60s倒计时
      MRCY:if (cnt==0) begin Traffic_Light<=MGCR; cnt<=59;state<=MGCR;end 
           else cnt<=cnt-1;
      default: state<=MGCR;
      endcase
     end
     
    endmodule

2.仿真文件代码

  1. `timescale 1ns / 1ps
    module traffic_tb();
        reg clk,rst,s;
        wire sout;
        wire[5:0]  Traffic_Light;
        wire[5:0] state;
        wire[15:0] cnt;
        //开始仿真
        traffic sim_traffic(
            .clk(clk);
            .rst(rst),
            .s(s),
            .sout(sout),
            .Traffic_Light(Traffic_Light[5:0]),
            .state(state[5:0]),
            .cnt(cnt[15:0])
        );
    //初始化
        initial begin
            clk = 0;
            rst = 1;
            s = 0;
            #3250
            s = 1;
         #1000
       s = 1;
        end
        always #10  clk = ~clk;
    endmodule

3.代码原理分析

在本实验中,最最重要的就是对状态机的设计,在此设计了 4 个状态。当在 s0 即 MGCR 时,执行语句如下:如果计时器为 0,则开始判断信号 S,如果信号有效,即乡间公路有车,则跳转到 s1,即 MYCR 状态,进行四秒黄灯倒计时,如果信号无效,则仍处于 MGCR 状态,重新从 60 秒开始倒计时。 

当在 s1 即 MYCR 时,执行语句如下:如果计时器为 0,则进入 s2,即 MRCG状态,计时器从 20 秒开始倒计时。当在 s2 即 MRCG 时,执行语句如下:如果乡间公路信号 S 持续为 1,且 20 

秒倒计时结束,计时器为 0 时,状态转换为 s3,即 MRCY 状态,进行四秒黄灯倒计时,但一旦 S 信号为 0,则立即跳出状态 s2,进入 s3 MRCY 状态。当在 s3 即 MRCY 时,执行语句如下:四秒黄灯倒计时结束后,重新回到状态 MGCR,开始 60 秒倒计时,并等待下一个状态转换。

四、实验结果及分析

1、引脚锁定

如约束文件所示

set_property -dict { PACKAGE_PIN W5   IOSTANDARD LVCMOS33 } [get_ports clk]

create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]

## Switches

set_property -dict { PACKAGE_PIN V17   IOSTANDARD LVCMOS33 } [get_ports {s}]

set_property -dict { PACKAGE_PIN V16   IOSTANDARD LVCMOS33 } [get_ports {rst}]

## LEDs

set_property -dict { PACKAGE_PIN U16   IOSTANDARD LVCMOS33 } [get_ports {Traffic_Light[0]}]

set_property -dict { PACKAGE_PIN E19   IOSTANDARD LVCMOS33 } [get_ports {Traffic_Light[1]}]

set_property -dict { PACKAGE_PIN U19   IOSTANDARD LVCMOS33 } [get_ports {Traffic_Light[2]}]

set_property -dict { PACKAGE_PIN V19   IOSTANDARD LVCMOS33 } [get_ports {Traffic_Light[3]}]

set_property -dict { PACKAGE_PIN W18   IOSTANDARD LVCMOS33 } [get_ports {Traffic_Light[4]}]

set_property -dict { PACKAGE_PIN U15   IOSTANDARD LVCMOS33 } [get_ports {Traffic_Light[5]}]

set_property -dict { PACKAGE_PIN L1    IOSTANDARD LVCMOS33 } [get_ports {sout}]

##7 Segment Display

set_property -dict { PACKAGE_PIN W7   IOSTANDARD LVCMOS33 } [get_ports {count_display[6]}]

set_property -dict { PACKAGE_PIN W6   IOSTANDARD LVCMOS33 } [get_ports {count_display[5]}]

set_property -dict { PACKAGE_PIN U8   IOSTANDARD LVCMOS33 } [get_ports {count_display[4]}]

set_property -dict { PACKAGE_PIN V8   IOSTANDARD LVCMOS33 } [get_ports {count_display[3]}]

set_property -dict { PACKAGE_PIN U5   IOSTANDARD LVCMOS33 } [get_ports {count_display[2]}]

set_property -dict { PACKAGE_PIN V5   IOSTANDARD LVCMOS33 } [get_ports {count_display[1]}]

set_property -dict { PACKAGE_PIN U7   IOSTANDARD LVCMOS33 } [get_ports {count_display[0]}]

2、仿真波形及分析

首先画出状态分析图如下所示

交通灯设计对应波形及分析

首先对一些关键信号的含义

clk:时钟信号

rst:使能端

sout:即要求中的s信号

cnt:显示倒计时计数

Traffic_light:交通灯的状态

(1)在使能端有效时,从起始状态主绿乡红开始,进行60s倒计时

(2)当60s减1计数完成后,如果s信号为1(代表乡干道有车要求通过)时,变为主黄乡绿状态,数码管4s倒计时;4s倒计时后,进入主红乡绿状态,如果s信号一直为1,则数码管开始20s倒计时

 

观察波形很明显可以观察到60s倒计时的结束到4s倒计时的转变,在4s倒计时结束后,由于s信号依旧为1,于是进入20s倒计时状态。

(3)当20s倒计时完成后也会入主红乡黄状态。主红乡黄,数码管开始4s倒计时,计数完成后进入主绿乡红状态

(4)计数完成后进入主绿乡红状态,数码管60s倒计时,重复上述状态。

3、下载测试结果及分析

在实验室用bassy3开发板下载测试。

(1)复位时,起始状态是主绿乡红,数码管从60开始倒计时。如图1所示

 

(2)要求:当60s减1计数完成后,如果s信号为1(代表乡干道有车要求通过)时,变为主黄乡绿状态,数码管4s倒计时;如果s信号为0(代表乡干道没有车要求通过)时, 则回到起始状态,主绿乡红重新60s倒计时。

此时开发板s信号为1,数码管处于4s倒计时阶段,如图2所示 

 

               图3                                     图4                   

(3)分析:4s倒计时后,进入主红乡绿状态,如果此时s信号为0,则立即转入主红乡黄状态;如果s信号一直为1,则数码管开始20s倒计时,计数期间一旦出现s信号为0,则立即转入主红乡黄状态,即使s信号一直为1,当20s倒计时完成后也会入主红乡黄状态。由于此时s信号依旧为1,数码管进入20s倒计时,如图3所示

(4)分析:主红乡黄,数码管开始4s倒计时,计数完成后进入主绿乡红状态,数码管60s倒计时,重复上述状态。而此时s信号为1,重新进行60s倒计时状态,如图5所示。

五、实验心得

1.解决实验中遇见的问题及解决

实验中发现对各盏交通灯状态的判断是单独的,程序过于繁冗。

解决方法:可以将各盏交通灯的状态判断与状态机的状态联系起来,这里也参考了网上的方法,给状态机的每个状态设定一个六位参数,一个位数对应一盏交通灯的状态,1亮0灭。这样,只需要针对状态机的状态就可以判断出所有交通灯的明灭情况。 

2.实验完成的心得

交通灯的设计实验是一项非常有意义的实践项目,通过这个实验可以更好地理解状态机的应用,并且在实际场景中体现出状态机的作用。

在这个实验中,我深刻地认识到了状态机对于交通灯控制的重要性,同时也学习到了如何使用Verilog HDL编程语言来设计状态机。

在完成这个实验的过程中,我遇到了一些问题和挑战,但最终还是成功地完成了整个实验。以下是我在实验过程中所得到的心得和体会:

本次实验是在实验三的基础上,进一步对状态机进行运用理解,完成更复杂的实验设计要求。初看到本实验要求时,觉得很繁多麻烦,但其实细细思考,运用状态机还是很容易实现的,状态机的存在确实给很多设计带来了极大的便利。当然,在程序的设计中还是遇到了许多问题,比如刚开始没有用足位的 BCD码进行倒计时的设计,导致数码管程序出现了问题,还有就是在每个状态后面都单独对交通灯的状态进行了判断,显得冗杂多余等等。只是完成一项功能的实现不难,重要的还是如何用更简洁灵活的语言去实现它,所以对实验方案程序的优化设计是十分必要的,事实上在很多领域中,如何进行更好的优化都是困扰技术人员的一大难题。在本实验中要实现的功能与前几次相比稍多,但完成后的成就感也更大,每完成一个实验,都能感受到自己在逐步进步,逐渐熟练。 

2023-04-20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/38526.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux使用HTTP隧道代理代码示例模版

下面是一个在Linux上使用HTTP隧道代理的代码示例模板&#xff0c;可以根据自己的实际情况进行修改和配置&#xff1a; #!/bin/bash# 配置代理服务器信息 proxy_server"代理服务器IP或域名" proxy_port"代理服务器端口号" proxy_username"代理服务器用…

《动手学深度学习》——线性神经网络

参考资料&#xff1a; 《动手学深度学习》 3.1 线性回归 3.1.1 线性回归的基本元素 样本&#xff1a; n n n 表示样本数&#xff0c; x ( i ) [ x 1 ( i ) , x 2 ( i ) , ⋯ , x d ( i ) ] x^{(i)}[x^{(i)}_1,x^{(i)}_2,\cdots,x^{(i)}_d] x(i)[x1(i)​,x2(i)​,⋯,xd(i)​…

《实战AI低代码》:普元智能化低代码开发平台发布,结合专有模型大幅提升软件生产力

在7月6日举办的“低代码+AI”产品战略发布会上,普元智能化低代码开发平台正式发布。该平台融合了普元自主研发的专有模型,同时也接入了多款AI大模型的功能。它提供了一系列低代码产品,包括中间件、业务分析、应用开发、数据中台和业务流程自动化等,旨在简化企业的复杂软件生…

Nginx学习

文章目录 Nginx什么是NginxLinux安装与配置Nginx编译安装Nginxnignx使用nginx默认首页配置案例 localtion的匹配规则Nginx虚拟主机基于多IP的虚拟主机基于多端口的虚拟主机基于域名的虚拟机主机 反向代理案例①案例② 负载均衡案例①案例②分配策略 动静分离案例 配置Nginx网关…

文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;58&#xff09;-- 算法导论6.4 2题 二、试分析在使用下列循环不变量时&#xff0c;HEAPSORT 的正确性&#xff1a;在算法的第 2~5行 for 循环每次迭代开始时&#xff0c;子数组 A[1…i]是一个包含了数组A[1…n]中第i小元素的最大…

【Distributed】zookeeper+kafka的应用及部署

文章目录 一、zookeeper1. zookeeper的概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.6 Zookeeper 选举机制第一次启动选举机制非第一次启动选举机制选举Leader规则 2. 部署 Zookeeper 集群2.1 安装前准备2.2…

day52

思维导图 比较指令结果的条件码 练习 汇编实现1-100的累加 .text .global _strat _start: mov r0,#0mov r1,#0 add_fun:add r0,r0,#1cmp r0,#100addls r1,r1,r0bls add_fun .end

机器学习技术(三)——机器学习实践案例总体流程

机器学习实践案例总体流程 文章目录 机器学习实践案例总体流程一、引言二、案例1、决策树对鸢尾花分类1.数据来源2.数据导入及描述3.数据划分与特征处理4.建模预测 2、各类回归波士顿房价预测1.案例数据2.导入所需的包和数据集3.载入数据集&#xff0c;查看数据属性&#xff0c…

JVM重点整理

一、虚拟机架构图 二、类加载过程 类加载器的作用&#xff1a;负责把class文件加载到内存中 类加载过程&#xff1a; 加载&#xff1a; 通过类的全限定名获取此类的二进制字节流文件的编码结构---->运行时的内存结构内存中生成一个class对象 链接&#xff1a; 验证&#x…

【网络】socket——预备知识 | 套接字 | UDP网络通信

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 在前面本喵对网络的整体轮廓做了一个大概的介绍&#xff0c;比如分层&#xff0c;协议等等内容&#x…

【QT】元对象系统学习笔记(一)

QT元对象系统 01、元对象系统1.1、 元对象运行原则1.2、 Q_OBJECT宏1.3、 Qt Creator启动元对象系统1.4、 命令行启动元对象&#xff08;不常用&#xff09; 02、反射机制2.1、 Qt实现反射机制2.2、 反射机制获取类中成员函数的信息2.1.1、 QMetaMethon类2.1.2、QMetaObject类 …

【UE4 塔防游戏系列】07-子弹对敌人造成伤害

目录 效果 步骤 一、让子弹拥有不同伤害 二、敌人拥有不同血量 三、修改“BP_TowerBase”逻辑 四、发射的子弹对敌人造成伤害 效果 步骤 一、让子弹拥有不同伤害 为了让每一种子弹拥有不同的伤害值&#xff0c;打开“TotalBulletsCategory”&#xff08;所有子弹的父类…

架构训练营:3-3设计备选方案与架构细化

3架构中期 什么是备选架构&#xff1f; 备选架构定义了系统可行的架构模式和技术选型 备选方案筛选过程 头脑风暴 &#xff1a;对可选技术进行排列组合&#xff0c;得到可能的方案 红线筛选&#xff1a;根据系统明确的约束和限定&#xff0c;一票否决某些方案&#xff08;主要…

为 GitHub 设置 SSH 密钥

1. 起因 给自己的 github 改个名&#xff0c;顺便就给原来 Hexo 对应的仓库也改了个名。然后发现 ubhexo clean && hexo generate && hexo deploy 失败了&#xff0c;报错如下&#xff1a; INFO Deploying: git INFO Clearing .deploy_git folder... INFO …

Hive自定义函数

本文章主要分享单行函数UDF&#xff08;一进一出&#xff09; 现在前面大体总结&#xff0c;后边文章详细介绍 自定义函数分为临时函数与永久函数 需要创建Java项目&#xff0c;导入hive依赖 创建类继承 GenericUDF&#xff08;自定义函数的抽象类&#xff09;&#xff08;实现…

仓库管理软件有哪些功能?2023仓库管理软件该如何选?

对于现代企业或批发零售商&#xff0c;高效的仓库管理是确保供应链运作顺畅、库存控制精准的关键要素。在数字化时代&#xff0c;越来越多的企业和商户意识到采用仓库管理软件的重要性。 无论您是中小型企业还是中小商户&#xff0c;仓库管理都是不可忽视的一环。 一、选择仓库…

边缘计算在智慧校园应用,实现校园智能化管理

随着科技的发展和互联网技术进步&#xff0c;校园管理正逐步实现数字化、智能化转型。边缘计算作为一种新兴技术&#xff0c;通过在离数据源较近的地方进行数据处理&#xff0c;实现了实时性分析与响应&#xff0c;为校园带来了更智能、安全的管理方式。 学生学习状态监控 AI动…

AI Chat 设计模式:8. 门面(外观)模式

本文是该系列的第八篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 请介绍一下门面模式A.1Q.2 该模式由哪些角色组成呢A.2Q.3 举一个门面模式的例子A.3Q.4…

串口wifi6+蓝牙二合一系列模块选型参考和外围电路参考设计-WG236/WG237

针对物联网数据传输&#xff0c;智能控制等应用场景研发推出的高集成小尺寸串口WiFi串口蓝牙的二合一组合模块。WiFi符合802.11a/b/g/n无线标准&#xff0c;蓝牙支持低功耗蓝牙V4.2/V5.0 BLE/V2.1和EDR&#xff0c;WiFi部分的接口是UART&#xff0c;蓝牙部分是UART/PCM 接口。模…

深入解析浏览器Cookie(图文码教学)

深入解析浏览器Cookie 前言一、什么是 Cookie?二、Cookie的特点二、如何创建 Cookie&#xff1f;三、服务器如何获取 Cookie四、Cookie 值的修改4.1 方案一4.2 方案二 五、浏览器查看 Cookie六、Cookie 生命控制七、Cookie 有效路径 Path 的设置八、案例&#xff1a;Cookie 练…