VHDL有限状态机(单进程,双进程)交通灯示例

2024-01-13 08:08

本文主要是介绍VHDL有限状态机(单进程,双进程)交通灯示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Finite State Machine有限状态机

它的逻辑流程图是:

注意!“当前状态”和“下一状态”的位置,我们将在下文的交通灯示例中理解。

设计要求:

--我们要设计一个十字路口的交通灯,就两个按钮,东西方向一个(sensor2),南北方向一个(sensor)。流程就是,东西方向为红灯,南北在走人,
--这时候东西方向的人想过马路,按下sensor2,然后红变绿,东西走,南北停。然后南北的人想过马路,按下sensor,灯就由绿变黄再变红。
--整体上这个逻辑不是很严谨,放在这里只是举个例子。

下图为状态流程图:

我把注释写在代码中了,请参悟下文的代码。本实验用的是ModelSim软件,VHDL语言。他一般有两个文件,一个是硬件配置文件(df.vhd)用来写你设计的硬件的结构的。第二个是硬件测试文件(testbench,也就是tb.vhd),是用来设置仿真参数,用来仿真的。补充:因为本实验只用了状态机,所以就是一个硬件配置文件。但是,在往后的综合实验中,我们会用状态机与寄存器等其他硬件综合使用,所以要单独把状态机拿出来进行配置(df_state.vhd),这个就相当于库函数,然后在主函数(df.vhd)中再多写一行:

USE work.state_machine_package.all

进行调用,所以,它相当于三个文件了。

就是写上文的下行即可。

不多墨迹了,见代码(df.vhd)

--我们要设计一个十字路口的交通灯,就两个按钮,东西方向一个(sensor2),南北方向一个(sensor)。流程就是,东西方向为红灯,南北在走人,
--这时候东西方向的人想过马路,按下sensor2,然后红变绿,东西走,南北停。然后南北的人想过马路,按下sensor,灯就由绿变黄再变红。
--整体上这个逻辑不是很严谨,放在这里只是举个例子。-- single Process FSM 单进程的有限状态机
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;Entity Traffic_light isport(sensor : in std_logic;sensor2: in std_logic;rst	: in std_logic;clk	: in std_logic;red_light: out std_logic;green_light: out std_logic;yellow_light : out std_logic);
end entity;Architecture one_process of  Traffic_light is		--结构设定,one_process是本process的名字,一般情况下,状态机我们用一个process就够了type statetype is (red,green,yellow)           --type 是状态(圆圈),有多少个圆圈,括号里就写多少个名字;它们三个的功能就像HIGH/LOW一样,表示状态signal state : statetype;						--这里只设置了一个叫“state”的信号,它既不是输入也不是输出,表示的只是当前信号的状态begin
-- synchronous resetprocess(clk,rst)beginif rising_edge (clk) then    --CLK 上升沿触发red_light <= '1';green_light <= '0';     --这是初始设置,红灯状态yellow_light <= '0';if rst= '0' thenstate <= red;   	--如果RST复位键没有触发,那么就把红灯状态给当前状态;也可以理解为保存红灯亮elsecase state is			--注意!!!state状态设定这里只能用case,不能用ifwhen red =>			--若为状态红灯red_light <= '1';yellow_light <= '0';green_light <= '0';if sensor = '1' then		--如果按钮sensor被按下(1),那么state <= green;			--将绿灯亮的状态给”当前状态“green_light <= '1';     --绿灯亮,红灯灭red_light <= '0';elsestate <= red;			--否则的话,红灯给“当前状态”,也就是保持的意思end if;						--不要忘了end ifwhen green => 		--若状态为绿灯if sensor2 = '1' then			--如果按钮2,sensor2被按下,那么state <= yellow;			--把黄灯亮的状态给“当前状态”yellow_light <= '1';		--黄灯亮,绿灯灭green_light <= '0';else 							--否则保持绿灯亮state <= green;end if;when yellow =>		--若状态为黄灯state <= red;				--因为黄灯的下一步肯定是变红灯,所以在这就把红灯状态给“当前状态”red_light <= '1';			--红灯亮,黄灯灭yellow_light <= '0';end case;end if;end if;end process;
end one_process;

差不多懂了吧?上文的测试代码我就不写了,有兴趣的同学可以自己测试。

下面是双进程结构代码,还是以上文相同的状态逻辑流程图为例。


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;entity Traffic_light is
end entity;Architecture dual_process_B of  Traffic_light is		type statetype is (red,green,yellow)           signal current_state, next_state : statetype; --请看我画的流程图,在这我定义两个状态(当前状态,下一状态)begindecoding: process(current_state, sensor)beginred_light <= '1'; --开始是红灯亮green_light <= '0';yellow_light <= '0';case current_state is --当前状态设置when red =>					--若为红灯状态,若检测到开关1按下,则把“绿灯亮”给下一状态if sensor = '1' thennext_state <= green;end if;								--若没按开关,那就保持红灯red_light <= '1';	when green =>				--若为绿灯状态,把黄灯给下一状态,并点亮绿灯next_state <= yellow;		--(逻辑不严谨,为了简单的举例才这么写的,具体流程图请见上文的手画的状态逻辑流程图)green_light <= '1';when yellow =>			--若为黄灯状态,下一状态为红灯,且黄灯点亮next_state <= red;yellow_light <= '1';end case;end process;state_register: process(clk,rst)--设置时钟进程beginif rising_edge (clk) then		--上升沿触发if rst = '1' thencurrent_state <= red;		--等复位键置1,就红灯亮(开始仿真)elsecurrent_state <= next_state;	--否则就继续循环等待end if;end if;end process;end dual_process_B;

这是我的课堂笔记,题目是老师随便的,他说逻辑有错的,我改对了。放到这就是加深理解的,学VHDL就应该多悟,多写,抄我代码没有任何意义,随便抄,您开心就好。

这篇关于VHDL有限状态机(单进程,双进程)交通灯示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600765

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.