FPGA简易加减法计算器设计

题目要求:
(1)设计10以内的加减法计算器。
(2)1个按键用于指定加法或减法,一个用于指定加数或被加数,还有两个分别控制加数或被加数的增加或减少。
(3)设置的结果和计算的结果用数码管显示。

本实验我还是将其视作Mealy型向量机,具体的见我之前关于秒表的内容:VHDL实验:基于有限状态机实现秒表
按照题目意思,有4个键是必不可少的,但我还是决定增加两个推键,本实验状态图如下:
在这里插入图片描述
S0:初态模式,所有数码管置零
S1:计算模式,等待用户设置并计算
这两者之间的转换我用开发板上的推键来完成。
另一个推键指示是进行整数运算还是一位小数。

我的代码:(抱歉注释是全英文的)

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

entity Computer is
	port (
		key3 : in std_logic ;						-- is addition or subtraction?
		key2 : in std_logic ;						-- who is augend or minuend?
		key1 : in std_logic ;						-- change the value of augend or minuend
		key0 : in std_logic ;						-- change the value of addend or subtrahend
		sw0 : in std_logic ;						-- change the state of circuit
		sw1 : in std_logic ;
		first1 : out std_logic_vector(0 to 6) ;
		first2 : out std_logic_vector(0 to 6) ;
		second1 : out std_logic_vector(0 to 6) ;
		second2 : out std_logic_vector(0 to 6) ;
		negative : out std_logic_vector(0 to 6) ;	-- Is the result a negative number?
		empty : out std_logic_vector(0 to 6) ;
		result1 : out std_logic_vector(0 to 6) ;	-- the result of computing
		result2 : out std_logic_vector(0 to 6) ;	-- the result of computing
		Point : out std_logic_vector(7 downto 0) ;	-- Radix point
		ledg8 : out std_logic ;						-- if substraction
		ledr16 : out std_logic ;					-- it is augend or minuend
		ledr13 : out std_logic 						-- it is augend or minuend
	) ;
end Computer ;

architecture mathematic of Computer is
	constant matrix_num : integer := 9 ;
	TYPE Number is array (0 to matrix_num) of std_logic_vector(0 to 6);
	signal Display : 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 (s0, s1) ;		-- how many states does the circuit have?
	signal current_state : state_type ;
	-- all of them below are middle data
	signal neg : std_logic_vector(0 to 6) := ('1', '1', '1', '1', '1', '1', '1') ;
	signal led8 : std_logic ;						
	signal led16 : std_logic ;					
	signal led13 : std_logic ;
	signal p : std_logic_vector(7 downto 0) ;					
begin
	process(sw0)											 -- to change the state of circuit
	begin
		if (sw0 = '0') then
			current_state <= s0 ;
		else
			current_state <= s1 ;
		end if ;
	end process ;
	
	process(current_state, key3, key2, key1, key0, sw1) -- take action according to state
		variable First : integer := 0 ;
		variable Second : integer := 0 ;
		variable Result : integer := 0 ;
		variable num3 : integer := 0 ;
		variable num2 : integer := 0 ;
	begin
		if (current_state = s0) then
			First := 0 ;
			Second:= 0 ;
			Result:= 0 ;
			num3  := 0 ;
			num2  := 0 ;
			neg <= ('1', '1', '1', '1', '1', '1', '1') ;					
			p <= ('1', '1', '1', '1', '1', '1', '1', '1') ;
			led8 <= '0' ;
			led16 <= '0' ;				
			led13 <= '0' ;
		elsif (current_state = s1) then
			if (sw1 = '1') then			-- make sure integer or float
				p <= ('0', '1', '0', '1', '1', '1', '0', '1') ;
			else 
				p <= ('1', '1', '1', '1', '1', '1', '1', '1') ;
			end if ;
			
			if falling_edge(key2) then	-- make sure who is augend or minuend?
				num2 := num2 + 1 ;
			end if ;
			if ((num2 > 0) and(num2 MOD 2 = 0)) then
				led16 <= '0' ;
				led13 <= '1' ;
			elsif (num2 MOD 2 = 1) then
				led16 <= '1' ;
				led13 <= '0' ;
			end if ;
			
			if falling_edge(key1) then		-- decide the value of first number
				First := First + 1 ;
				if (First > 10) then
					First := 0 ;
				end if ;
			end if ;
			
			if falling_edge(key0) then 		-- decide the value of second number
				Second := Second + 1 ;
				if (Second > 10) then
					Second := 0 ;
				end if ;
			end if ;
			
			if falling_edge(key3) then
				num3 := num3 + 1 ;
			end if ;
			if (num3 MOD 2 = 1) then
				led8 <= '0' ;
				neg(6) <= '1' ;
				Result := First + Second ;
			elsif ((num3>0) and (num3 MOD 2 = 0)) then
				led8 <= '1' ;
				if (led13 = '1') then
					if (Second < first) then
						neg(6) <= '0' ;
						Result := First - Second ;
					else
						neg(6) <= '1' ;
						Result := Second - First ;
					end if ;
				elsif (led16 = '1') then
					if (first < Second) then
						neg(6) <= '0' ;
						Result := Second - First ;
					else
						neg(6) <= '1' ;
						Result := First - Second ;
					end if ;
				end if ;
			end if ;
		end if ;
		
		empty <= ('1', '1', '1', '1', '1', '1', '1') ;
		first1 <= Display(First/10) ;
		first2 <= Display(First MOD 10) ;
		second1 <= Display(Second/10) ;
		second2 <= Display(Second MOD 10) ;
		negative <= neg ;
		result1 <= Display(Result/10) ;
		result2 <= Display(Result MOD 10);
		Point <= p ;
		ledg8 <= led8 ;
		ledr16 <= led16 ;
		ledr13 <= led13 ;
	end process ;
end mathematic ;

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

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

相关文章

饥荒Mod 开发(十四):制作屏幕弹窗

饥荒Mod 开发(十三)&#xff1a;木牌传送 在上一个文章里面制作了一个传送选择页面&#xff0c;是一个全屏的窗口&#xff0c;那饥荒中如何制作一个全屏的窗口&#xff0c;下面介绍一下如何从零开始制作一个全屏窗口 制作屏幕窗口 饥荒中的全屏窗口都有一个基类 “Screen”,我…

JVM基础入门

JVM 基础入门 JVM 基础 聊一聊 Java 从编码到执行到底是一个怎么样的过程&#xff1f; 假设我们有一个文件 x.Java&#xff0c;你执行 javac&#xff0c;它就会变成 x.class。 这个 class 怎么执行的&#xff1f; 当我们调用 Java 命令的时候&#xff0c;class 会被 load 到…

Kafka相关知识

一、kafka架构 Kafka基础知识 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多生产者、多订阅者&#xff0c;基于zookeeper协 调的分布式日志系统(也可以当做MQ系统)&#xff0c;常见可以用于webynginx日志、访问日志&#xff0c;消息服务等等&…

pycharm依赖管理(不要用pip freeze)

在使用python虚拟环境时&#xff0c;可以使用requirements.txt来管理当前项目的依赖。 注意&#xff0c;不要用 pip freeze > requirements.txt 这个命令&#xff0c;因为它会引入很多无关的包。 可以使用 pipreqs ./ --encodingutf-8 ./ 表示当前项目的目录&#xff0…

QT for Android安卓编译环境搭建+首次编译3个大坑

1、安装 编译环境能否搭建成功&#xff0c;主要是看各个依赖软件的版本是否匹配。依赖的软件有3个&#xff1a;JDK、安卓SDK、安卓NDK。 我的qt版本是5.14.1&#xff0c;我亲测以下版本可以成功让编译安卓&#xff1a; QT5.14 JDK1.8.0 安卓SDK26.1 安卓NDK20.1 在QT-&g…

为什么在Android中需要Context?

介绍 在Android开发中&#xff0c;Context是一个非常重要的概念&#xff0c;但是很多开发者可能并不清楚它的真正含义以及为什么需要使用它。本文将详细介绍Context的概念&#xff0c;并解释为什么在Android应用中需要使用它。 Context的来源 Context的概念来源于Android框架…

【算法Hot100系列】三数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

第十三章总结

一.泛型 1.定义泛型类 泛型机制语法&#xff1a; 类名<T> 其中&#xff0c;T是泛型的名称&#xff0c;代表某一种类型。 【例13.6】创建带泛型的图书类 代码&#xff1a; 结果&#xff1a; 2.泛型的常规用法 (1)定义泛型类时声明多个变量 class MyClass<T1,T2…

python提取图片型pdf中的文字(提取pdf扫描件文字)

前言 文字型pdf提取&#xff0c;python的库一大堆&#xff0c;但是图片型pdf和pdf扫描件提取&#xff0c;还是有些难度的&#xff0c;我们需要用到OCR&#xff08;光学字符识别&#xff09;功能。 一、准备 1、安装OCR&#xff08;光学字符识别&#xff09;支持库 首先要安…

【PostgreSQL】从零开始:(十三)PostgreSQL-SQL语句操作架构(模式) Schema

Schema概述 PostgreSQL 数据库集群包含一个或多个命名数据库。角色和一些其他对象类型在整个集群中共享。与服务器的客户端连接只能访问单个数据库中的数据&#xff0c;该数据库在连接请求中指定。 用户不一定有权访问集群中的每个数据库。共享角色名称意味着不能在同一集群中…

第1章 做一个多模型思考者

目录 1. 概述2. 大数据时代的模型3. 为什么需要多模型4. 智慧层次结构&#xff08;Wisdom Hierarchy&#xff09;5. 做一个多模型思考者 1. 概述 模型是用数学公式和图表展现的形式化结构 在拥有多个模型的情况下&#xff0c;我们能够避免每个模型本身所固有的局限性 多个模型…

信息收集 - 域名

1、Whois查询: Whois 是一个用来查询域名是否已经被注册以及相关详细信息的数据库(如:域名所有人、域名注册商、域名注册日期和过期日期等)。通过访问 Whois 服务器,你可以查询域名的归属者联系方式和注册时间。 你可以在 域名Whois查询 - 站长之家 上进行在线查询。 2、…

Java架构师系统架构内部维度分析

目录 1 导语2.1 安全性维度概述2.2 流程安全性2.3 架构安全性2.4 安全维度总结3 伸缩性维度概述和场景思路3.1 无状态应用弹性伸缩3.2 阿里云Knative弹性伸缩3.3 有状态应用弹性伸缩3.4 伸缩性维度总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语

(数据结构)单链表的查找和长度计算

代码实现 #include<stdio.h> #include<stdlib.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //创建头结点 LNode* InitList(LinkList L) {L (LNode*)malloc(sizeof(LNode));if (L NULL){return NULL;}L->data 0;L->next N…

NBA得分数据可视化

简介 这是上学期的一些课外活动内容&#xff0c;将 NBA 得分数据进行可视化&#xff0c;并进行后续的探索性分析和建模&#xff08;本文未介绍&#xff09;。主要研究动机来源于这篇论文&#xff1a; 该论文使用二元的伽马过程来刻画 NBA 主客场得分数据&#xff0c;并且考虑了…

智能五子棋1

*一、项目需求* 五子棋是一种简单的黑白棋&#xff0c;历史悠久&#xff0c;起源于中国&#xff0c;后传入日本&#xff0c;在日本被称为“连珠”&#xff0c;是一种老少皆宜的益智游戏。 人工智能五子棋系统的目标用户是一切想致力于研究人机对弈算法理论的相关研究者和一切…

【每日一题】【12.17】746.使用最小花费爬楼梯

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.题目链接 746. 使用最小花费爬楼梯https://leetcode.cn/problems/min-cost-climbing-stairs/ 2.题目详情 今天的每日一题又…

04_Web框架之Django一

Web框架之Django一 学习目标和内容 1、能够描述Django的作用 2、能够使用Django创建应用 3、能够使用GET和POST请求方式进行传参 4、能够使用Django的函数式方法定义视图 5、能够进行Django的配置文件修改 6、能够基本使用Django的路由定义 一、Django相关介绍 1、什么是Djan…

ASP.NET MVC实战之权限拦截Authorize使用

1&#xff0c;具体的实现方法代码如下 public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter{/// <summary>/// 如果需要验证权限的时候&#xff0c;就执行进来/// </summary>/// <param name"filterContext"></par…

饥荒Mod 开发(十):制作一把AOE武器

饥荒Mod 开发(九)&#xff1a;物品栏排列 饥荒Mod 开发(十一)&#xff1a;修改物品堆叠 前面的文章介绍了很多基础知识以及如何制作一个物品&#xff0c;这次制作一把武器&#xff0c;装备之后可以用来攻击怪物。 制作武器贴图和动画 1.1 制作贴图。 先准备一张武器的贴图&a…