VHDL实验:基于有限状态机实现秒表

news2024/9/20 16:51:08

题目要求:
利用有限状态机实现实现一个具有启动、停止、清零功能的秒表,显示格式:分:秒:十分秒。启动、停止、清零由一个按键控制,按键按下时,功能按启动、停止、清零顺序循环。

思路分析:
参考知乎上的这篇文章FPGA | Finite State Machine 有限状态机,对比两种状态机:
1.Mealy型状态机
在这里插入图片描述
2.Moore型状态机:
在这里插入图片描述
从这两张图上看,这两种状态机的唯一区别在于决定输出的是什么,在本实验中,最终的输出是数码管上的显示结果,题目中说“启动、停止、清零由一个按键控制,按键按下时,功能按启动、停止、清零顺序循环”也就是说按键的次数会影响到数码管的显示,因此本实验采用Mealy型状态机。

画出秒表的状态图:
在这里插入图片描述
S1: 0状态,所有数码管显示为0
S2:计时并显示
S3:停止计时,显示不变动
状态之间的“0”代表按键输入,本项目所用的开发板在不按动的情况下产生高电位,按动了就产生低电位,由于开发板的按键使用了施密特触发电路,因此在代码中就不做消抖了。

我在硬件设计代码里使用枚举类型来表示这3个状态,综合器在综合时,会自动对它们四个编码,将状态表示为二进制码的形式。

本项目用3个process,1s = 1000000000 ns

刚刚编译的时候出现了一条警告信息:

Warning (10631): VHDL Process Statement warning at Second.vhd(46): inferring latch(es) for signal or variable "current_state", which holds its previous value in one or more paths through the process

参考了http://www.itdaan.com/blog/2012/05/28/171e7e47cea3348ae9b125dc8154ecb3.html
看到的说法是:
解释:信号被综合成了latch,锁存器的EN和数据输入端口存在一个竞争的问题

好了,我的代码如下:

library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
use ieee.std_logic_arith.all ;

entity Second is
port (
		clk : in std_logic ;	-- the signal from 50MHZ clock
		key : in std_logic ;	-- the signal from key3 on development board
		hex7 : out std_logic_vector(0 to 6) ;
		hex6 : out std_logic_vector(0 to 6)	;
		hex5 : out std_logic_vector(0 to 6) ;
		hex4 : out std_logic_vector(0 to 6) ;
		hex3 : out std_logic_vector(0 to 6) ;
		hex2 : out std_logic_vector(0 to 6) ;
		hex1 : out std_logic_vector(0 to 6) ;
		hex0 : out std_logic_vector(0 to 6)	;	-- the result to output
		separate1 : out std_logic ;
		separate2 : out std_logic ;
		separate3 : out std_logic ;
		separate4 : out std_logic ;
		separate5 : out std_logic 		-- to separate hour, minute, second.
	 ) ;
end Second ;

architecture Timer of Second is
	constant matrix_num : integer := 9 ;
	constant MAX_INT : integer := 2147483647 ;
	TYPE Number is array (0 to matrix_num) of std_logic_vector(0 to 6);
	signal initial : Number := (('0', '0', '0', '0', '0', '0', '1'),		-- 0
							   ('1', '0', '0', '1', '1', '1', '1'),			-- 1
							   ('0', '0', '1', '0', '0', '1', '0'),			-- 2
							   ('0', '0', '0', '0', '1', '1', '0'),			-- 3
							   ('1', '0', '0', '1', '1', '0', '0'),			-- 4
							   ('0', '1', '0', '0', '1', '0', '0'),			-- 5
							   ('0', '1', '0', '0', '0', '0', '0'),			-- 6
							   ('0', '0', '0', '1', '1', '1', '1'),			-- 7
							   ('0', '0', '0', '0', '0', '0', '0'),			-- 8
							   ('0', '0', '0', '0', '1', '0', '0')			-- 9
							  ) ;
	TYPE state_type is (s1, s2, s3) ;		-- how many states does the circuit have?
	signal current_state : state_type ;
begin
	
	process(key)					-- to decide to change
		variable num : integer := 0 ;			-- how many times does user press the key?
	begin
		if falling_edge(key) then
			num := (num + 1) MOD 3 ;
		end if ;
		if (num = 0) then
			current_state <= s1 ;
		elsif (num = 1) then
			current_state <= s2 ;
		elsif (num = 2) then
			current_state <= s3 ;
		end if ;
	end process ;
	
	process(clk, current_state, initial)
		variable jump : integer ;				-- store the times the clock rising
		variable tenth : integer ;
		variable i : integer ;
	begin
		if (current_state = s1) then
			jump := 0 ;
			tenth := 0 ;
		elsif (current_state = s2) then
			if rising_edge(clk) then
				jump := jump + 1 ;
				if (jump = 5000000) then
					tenth := (tenth + 1) MOD MAX_INT ;
					jump := 0 ;
				end if ;
			end if ;
		end if ;
		hex7 <= initial((tenth/36000)/10) ;
		hex6 <= initial((tenth/36000) MOD 10) ;
		hex5 <= initial(((tenth MOD 36000) / 600) / 10) ;
		hex4 <= initial(((tenth MOD 36000) / 600) MOD 10) ;
		hex3 <= initial((((tenth MOD 36000) MOD 600) / 10) / 10) ;
		hex2 <= initial((((tenth MOD 36000) MOD 600) / 10) MOD 10) ;
		hex1 <= initial(((tenth MOD 36000) MOD 600) mod 10);
		hex0 <= ('1', '1', '1', '1', '1', '1', '1') ;
		separate1 <= '1' ;
		separate2 <= '1' ;
		separate3 <= '1' ;
		separate4 <= '1' ;
		separate5 <= '1' ;
	end process ;
end Timer ;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭配环境—Python解释器

对于一些库&#xff0c;需要创建虚拟环境&#xff08;就是给你电脑创建一个虚拟的地方来存&#xff0c;这个虚拟的地方有很多&#xff0c;需要自己找&#xff09; 对于人脸识别项目存在 使用的这个解释器&#xff0c;其他解释器可以去envs找找

智能高效的Go开发工具GoLand v2023.3发布,支持AI辅助编码!

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

黑豹程序员-原生JS拖动div到任何地方-自定义布局

效果图 代码html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /…

【Docker】ES、Kibana及IK安装配置

目录 一.单节点安装部署 1.版本选择 2.推荐及总结 ​3.官网下载地址 4.创建网络 5.拉取镜像 6.创建文件夹 7.运行docker命令 二、安装kibana 1.安装kibana 2.浏览器访问 3.国际化 三、Elasticsearch查询 1.数据插入&#xff1a;POST或PUT 2.数据查询GET 3.分词…

使用java调用python批处理将pdf转为图片

你可以使用Java中的ProcessBuilder来调用Python脚本&#xff0c;并将PDF转换为图片。以下是一个简单的Java代码示例&#xff0c;假设你的Python脚本名为pdf2img.py&#xff1a; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader…

Linux arm架构下构建Electron安装包

上篇文章我们介绍 Electron 基本的运行开发与 windows 安装包构建简单流程&#xff0c;这篇文章我们从零到一构建 Linux arm 架构下安装包&#xff0c;实际上 Linux arm 的构建流程&#xff0c;同样适用于 Linux x86 环境&#xff0c;只不过需要各自的环境依赖&#xff0c;Linu…

图文教程:从0开始安装stable-diffusion

现在AI绘画还是挺火&#xff0c;Midjourney虽然不错&#xff0c;但是对于我来说还是挺贵的。今天我就来安一下开源的AI绘画stable-diffusion,它的缺点就是对电脑的要求比较高&#xff0c;尤其是显卡。 话不多说开搞。 访问sd的github&#xff0c;https://github.com/AUTOMATIC…

西南科技大学数字电子技术实验四(基本触发器逻辑功能测试及FPGA的实现)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) (1)D触发器 特征方程: Q…

基于python实现原神那维莱特开转脚本

相信不少原友都抽取了枫丹大C那维莱特&#xff0c;其强力的输出让不少玩家爱不释手。由于其转的越快&#xff0c;越不容易丢伤害的特点&#xff0c;很多原友在开转时容易汗流浃背&#xff0c;所以特意用python写了一个自动转圈脚本&#xff0c;当按住鼠标侧键时&#xff0c;即可…

苹果手机怎么将图片转为excel/word?

第一种方案就是用苹果手机自带的OCR功能来实现需求&#xff0c;但低版本的IOS系统不支持此功能&#xff0c;目前已知IOS15以上版本可以支持&#xff0c;只需要在“设置”--“相册”那打开“实况文本”即可&#xff0c;如下图。 IOS15系统打开“实况文本” 开启后&#xff0c;打…

零信任 SASE 办公安全解决方案:提升企业网络安全与灵活性

​零信任 SASE&#xff08;Secure Access Service Edge&#xff09;办公安全解决方案为企业带来了许多好处&#xff0c;相较于以前的解决方案有明显差异。这个方案的出现是为了应对企业面临的新的网络安全挑战和远程办公的需求。 1、统一的网络安全管理&#xff1a;SASE 将网络…

语音机器人话术设计重点

要使用语音机器人&#xff0c;首先得要先准备一套业务的话术脚本&#xff0c;这个话术脚本的设计&#xff0c;可能直接决定了语音机器人后续的使用效果。这个脚本的编写一般不是机器人厂家直接能完成的&#xff0c;只有业务的使用方&#xff0c;他们才最了解自己的业务&#xf…

modbus TCP 应用

Modbus TCP 应用介绍 一、原理 Modbus TCP/IP 协议是工业通信系统领域的基石。它是一种与以太网结合使用的应用层消息传递协议&#xff0c;可实现不同类型网络上连接的设备之间的客户端/服务器通信。Modbus 最初是一种 Modbus 串行协议 (Modbus RTU)&#xff0c;现已发展到包…

[笔记] iperf3.1.3源码下载与交叉编译

由于需要测试一款40G网卡&#xff0c;下载了 iperf3.1.3 用于性能测试。 iperf3.1.3 源码下载 可以在 iperf 官网 下载源代码&#xff1a; 交叉编译 需要运行在 aarch64 linux 环境下&#xff0c;所以需要交叉编译。 进入iperf3 目录下&#xff0c;运行 ./configure 脚本…

java项目dependences下面报错,红色波浪线

1&#xff0c;问题&#xff1a;java项目dependences下面波浪线 方法一&#xff1a;重新加载maven依赖&#xff08;未解决&#xff09; 报错: [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ----------------…

Leetcode—230.二叉搜索树中第K小的元素【中等】

2023每日刷题&#xff08;六十&#xff09; Leetcode—230.二叉搜索树中第K小的元素 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nul…

智能优化算法应用:基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.狮群算法4.实验参数设定5.算法结果6.参考文献7.MA…

三、创建型模式——工厂方法模式

微信公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 注意工厂方法模式中工厂的方法不是静态的 简单工厂模式有一个问题就是&#xff0c;类的创建依赖工厂类&#xff0c;也就是说&#xff0c;如果想要…

luttuce(RedisTempate)实现hash expire lua脚本

话不多说先放脚本&#xff1a; local argv ARGV local length #argv if length > 0 then local unpackArgs {} for i 1, length - 1 dotable.insert(unpackArgs, argv[i]) end if redis.call(exists, KEYS[1]) 1 thenredis.call(del, KEYS[1])redis.call(hset, KEYS[…