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

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

思路分析:
参考知乎上的这篇文章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 ;

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

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

相关文章

【NTN 卫星通信】Starlink,卫星互联网的技术革命(一)

1. 什么是Starlink Starlink是由Elon Musk创立的私人太空探索公司SpaceX提供的卫星互联网服务。它旨在为世界上传统互联网服务速度慢或不可用的偏远地区提供价格合理的高速互联网。 为什么Starlink很重要&#xff1f;   Starlink之所以重要&#xff0c;是因为它有可能为数百万…

万能微信在线考试系统:适用于任何行业的在线考试系统 附带完整的搭建教程

互联网技术的发展&#xff0c;线上教育、线上考试逐渐成为主流。特别是在疫情期间&#xff0c;许多传统的线下考试都被迫转为线上。然而&#xff0c;对于许多机构、企业来说&#xff0c;搭建一个稳定、安全的在线考试系统并非易事。这需要专业的技术团队、充足的时间和资源投入…

基于Java SSM框架实现二手交易平台网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现二手交易平台网站系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认…

逆向获取某音乐软件的加密(js逆向)

本文仅用于技术交流&#xff0c;不得以危害或者是侵犯他人利益为目的使用文中介绍的代码模块&#xff0c;若有侵权请联系作者更改。 老套路&#xff0c;打开开发者工具&#xff0c;直接开始找到需要的数据位置&#xff0c;然后观察参数&#xff0c;请求头&#xff0c;cookie是…

TypeScript入门实战笔记 -- 04 什么是字面量类型、类型推断、类型拓宽和类型缩小?

&#x1f34d;开发环境 1&#xff1a;使用vscode 新建一个 04.Literal.ts 文件&#xff0c;运行下列示例。 2&#xff1a;执行 tsc 04.Literal.ts --strict --alwaysStrict false --watch 3&#xff1a;安装nodemon( 全局安装npm install -g nodemon ) 检测.js文件变化重启项…

网络层--TCP/UDP协议

目录 一、TCP/UDP协议介绍 1、UDP(User Datagram Protocol)--用户数据报协议 1.1 UDP报文格式 1.2 UDP协议的特性 2、TCP(Transmission Control Protocol )--传输控制协议 2.1 TCP报文格式 2.2 TCP协议的特性 2.3 TCP三次握手 2.4 四次挥手 三、TCP和UDP的区别 四、t…

HTML字体阴影

目录 1.阴影颜色 color2.水平轴和垂直轴3.模糊半径 blur 效果如下&#xff1a; h-shadow必需&#xff0c;水平阴影的位置&#xff0c;允许负值v-shadow必须&#xff0c;垂直阴影的位置&#xff0c;允许负值blur可选&#xff0c;模糊的距离color可选&#xff0c;阴影的颜色 1…

WebSocket开发

目录 前言 1.介绍 2.原理解析 3.简单的聊天室搭建 4.点到点消息传输 总结 前言 WebSocket 是互联网项目中画龙点睛的应用&#xff0c;可以用于消息推送、站内信、在线聊天等业务。 1.介绍 WebSocket 是一种基于 TCP 的新网络协议&#xff0c;它是一种持久化的协议&…

vim + ctags 跳转, 查看函数定义

yum install ctags Package ctags-5.8-13.el7.x86_64 already installed and latest version 创建 /home/mzh/pptp-master/tags.sh #!/usr/bin/shWORKDIR/home/mzh/pptp-masterfind ${WORKDIR} -name "*.[c|h]" | xargs ctags -f ${WORKDIR}/tags find /usr/inclu…

花裤衩vue-element-admin-master

这个模板是集成度比较高的 在实习的时候老是依赖装不上 今天在公司 把版本切换到16.17.1 一次就成功了 里面的工具还是比较多的&#xff0c; vue3里开源模板里工具比较多的是vben&#xff0c;它同样安装依赖比较难搞

React Native android环境搭建,使用夜神模拟器进行开发(适用于0.73+版本)

前言 本文基于&#xff1a;“react-native” : “^0.73.0” 1.安装 Node Node.js&#xff0c;下载时选择 > 18 版本 2.下载并安装 JDK Java SE Development Kit (JDK)&#xff0c;下载时选择 17 版本 安装 验证是否安装成功 打开命令提示符输入 javac -version 回车 3.…

Springboot集成支付宝支付---完整详细步骤

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明&#xff1a;沙箱环境支持的产品&#xff0c;可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱&#xff0c;配置接口加签方式 在沙箱进行调试前…

网页设计--第7次课后作业

已在qq课程群发送了课程的相关资料。 1、安装nodejJS。 2、安装vue-cli。 3、新建一个自己的vue工程化项目。 4、修改默认的vue项目&#xff0c;体会main.js,app.vue以及其他vue文件之间的调用关系&#xff0c;明白vue工程化项目的运行原理。 可以参考视频讲解&#xff08;…

SQL排列组合

SQL排列组合 1、排列组合概述2、SQL排列组合2.1、排列2.2、组合3、SQL排列组合的应用1、排列组合概述 排列组合是针对离散数据常用的数据组织方法,本节将分别介绍排列、组合的SQL实现方法,并结合实例着重介绍通过组合对数据的处理 如何使用SQL实现排列与组合?本节将通过介绍…

LeetCode 2132. 用邮票贴满网格图:二维前缀和 + 二维差分

【LetMeFly】2132.用邮票贴满网格图&#xff1a;二维前缀和 二维差分 力扣题目链接&#xff1a;https://leetcode.cn/problems/stamping-the-grid/ 给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&…

欧盟eDelivery的AS4解决方案

为实现绿色和数字欧洲的愿景&#xff0c;欧盟启动了“数字欧洲计划&#xff08;DEP&#xff09;”&#xff0c;总预算为75.9亿欧元&#xff0c;重点是将数字技术带给企业、公民和公共行政部门。它将建立数字能力和基础设施&#xff0c;并以创建数字市场为目标&#xff0c;主要通…

escapeshellarg参数绕过和注入的问题

escapeshellcmd escapeshellcmd(string $command): string command--要转义的命令。 escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数&#xff0c;或者 执行操作符 之前进行转义。 …

apk反编译修改教程系列---简单给app添加启动弹窗 添加对话框 跳转指定网页等【七】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

FolkMQ 国产消息中间件,v1.0.21 发布

简介 采用 “多路复用” “内存运行” “快照持久化” “Broker 集群模式”&#xff08;可选&#xff09;基于 Socket.D 网络应用协议 开发。全新设计&#xff0c;自主架构&#xff01; 角色功能生产端发布消息&#xff08;Qos0、Qos1&#xff09;、发布定时消息&#xff…

jenkins-Generic Webhook Trigger指定分支构建

文章目录 1 需求分析1.1 关键词 : 2、webhooks 是什么&#xff1f;3、配置步骤3.1 github 里需要的仓库配置&#xff1a;3.2 jenkins 的主要配置3.3 option filter配置用于匹配目标分支 实现指定分支构建 1 需求分析 一个项目一般会开多个分支进行开发&#xff0c;测试&#x…