FPGA简易加减法计算器设计

news2024/11/27 6:24:39

题目要求:
(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 ;

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

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

相关文章

饥荒Mod 开发(十三):木牌传送

饥荒Mod 开发(十二)&#xff1a;一键制作 饥荒Mod 开发(十四)&#xff1a;制作屏幕弹窗 一键传送源码 饥荒的地图很大&#xff0c;跑地图太耗费时间和饥饿值&#xff0c;如果大部分时间都在跑图真的是很无聊&#xff0c;所以需要有一个能够传送的功能&#xff0c;不仅可以快速…

一种解决Qt5发布release文件引发的无法定位程序输入点错误的方法

目录 本地环境问题描述分析解决方案 本地环境 本文将不会解释如何利用Qt5编译生成release类型的可执行文件以及如何利用windeployqt生成可执行的依赖库&#xff0c;请自行百度。 环境值操作系统Windows 10 专业版&#xff08;22H2&#xff09;Qt版本Qt 5.15.2Qt Creator版本5.0…

数字滤波器设计——Matlab实现数字信号处理<1>

目录 一.实验内容 二.代码分析 1.信号产生部分 2.利用傅立叶级数展开的方法&#xff0c;自由生成所需的x(t) 3.通过选择不同的采样间隔T&#xff08;分别选T>或<1/2fc&#xff09;&#xff0c;从x(t)获得相应的x(n) 3.对获得的不同x(n)分别作傅立叶变换&#xff0c…

[elementPlus] teleported 在 ElSubMenu中的用途

如图 一个菜单对应的路由结构如上图 如果做适配窄屏幕 如果在 <ElSubMenu :index"route.path" >中不加入 teleported 就会出现问题 加上就OK了 <ElSubMenu :index"route.path" teleported>

git 切换远程地址分支 推送到指定地址分支 版本回退

切换远程地址 1、切换远程仓库地址&#xff1a; 方式一&#xff1a;修改远程仓库地址 【git remote set-url origin URL】 更换远程仓库地址&#xff0c;URL为新地址。 git remote set-url https://gitee.com/xxss/omj_gateway.git 方式二&#xff1a;先删除远程仓库地址&…

前端对接 —— 周末

1.点击校验 点击校验 宇哥 记得过滤 不能校验的数据&#xff08;我后端还要检验吗&#xff1f;&#xff09; 2.前端数据对接 这个可以吗&#xff1f; 这种的可以吗&#xff1f;

基于多智能体系统一致性算法的电力系统分布式经济调度策略MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献&#xff1a; 主要内容&#xff1a; 应用多智能体系统中的一致性算法&#xff0c;以发电机组的增量成本和柔性负荷的增量效益作为一致性变量&#xff0c;设计一种用于电力系统经济调度的算法&#x…

力扣第 375 场周赛 解题报告 | 珂学家 | 区间合并+组合数学

前言 整体评价 难得的手速场&#xff0c;这几题都比较套路&#xff0c;确实区间合并很久没考察到了。 不过T4有多种解&#xff0c;栈模拟/差分/链式并查集&#xff0c;都可以的。 欢迎star gitee github T1. 统计已测试设备 思路: 差分思维 class Solution {public int co…

持续集成交付CICD:基于 GitLabCI 与 JenkinsCD 实现后端项目发布

目录 一、实验 1. GitLabCI环境设置 2.优化GitLabCI共享库代码 3.JenkinsCD 发布后端项目 4.再次优化GitLabCI共享库代码 5.JenkinsCD 再次发布后端项目 一、实验 1. GitLabCI环境设置 &#xff08;1&#xff09;GitLab给后端项目添加CI配置路径 &#xff08;2&#xf…

CPU告警不用愁,用C语言编写CPU使用率限制程序

现在云服务已经深入千家万户了&#xff0c;不仅商用&#xff0c;私用也很多。很多云服务厂商也都有配套的服务器安全模块&#xff0c;可以检测网络流量异常、内存占用量和CPU占用率&#xff0c;并且允许人工设置告警阈值。例如&#xff0c;CPU持续大于90%10分钟&#xff0c;那么…

LLM大语言模型(二):Streamlit 无需前端经验也能画web页面

目录 问题 Streamlit是什么&#xff1f; 怎样用Streamlit画一个LLM的web页面呢&#xff1f; 文本输出 页面布局 滑动条 按钮 对话框 输入框 总结 问题 假如你是一位后端开发&#xff0c;没有任何的web开发经验&#xff0c;那如何去实现一个LLM的对话交互页面呢&…

学生管理系统--课程设计项目(Java+SQL server)

本科参与项目文档合集: 点击跳转~ 学生管理系统 Student Management System 学校&#xff1a;山东科技大学 指导老师&#xff1a;杨 * * 教授 学号&#xff1a;2019032**** 学生姓名&#xff1a;安** 专业班级&#xff1a;计算机19-1 山东科技大学 二〇二〇年七月 项目文档目录…

eNSP小实验--实现全网互通

目录 一、建立以下拓扑图&#xff0c;并实现全网互通 二、分析 1、接入层交换机SW4、SW5划分vlan 2、汇聚层交换机SW2,SW3配置ip作为vlan网关&#xff0c;与SW1直连 3、核心交换机SW1配置ip 与汇聚层交换机和R1直连 4、SW1,SW2,SW3,R1配置静态路由&#xff0c;使得vlan10,…

京东体育用品销售数据分析与可视化系统

京东体育用品销售数据分析与可视化系统 前言数据爬取模块1. 数据爬取2. 数据处理3. 数据存储 数据可视化模块1. 数据查看2. 店铺商品数量排行3. 整体好评率4. 不同品牌市场占比5. 品牌差评率排名6. 品牌价格排名7. 品牌评论数量分布 创新点 前言 在体育用品行业&#xff0c;了…

IDEA卡顿,进行性能优化设置(亲测有效)——情况一

需求场景 IDEA重新激活后&#xff0c;运行IDEA卡的非常卡顿&#xff0c;没有运行项目&#xff0c;CPU占比也非常高: 原因分析 可能的原因是&#xff0c;在IDEA的配置中&#xff0c;给他分配的空间比较小 解决方式 步骤一 选择顶部导航栏中的Help&#xff0c;然后点击Edi…

小项目:迷宫二

目录 引言一、题目描述二、解题思路三、代码实现四、测试 引言 这个迷宫项目是今天参加学校的一个比赛出的题目&#xff0c;从早上九点基本搞到了四五点才完成&#xff0c;其实写出来发现基本思路其实挺简单的&#xff0c;就是想不好想&#xff0c;真的要各种的尝试&#xff0…

【数据分析之Numpy】Numpy中复制函数numpy.repeat()与numpy.tile()的使用方法及区别

一、简介 numpy.repeat()与numpy.tile()都是Numpy库中的复制函数&#xff0c;用于将数组中的元素重复指定的次数。 numpy.repeat()函数接受三个参数&#xff1a;要重复的数组、重复的次数和重复的轴。 numpy.tile()函数接受两个参数&#xff1a;要重复的数组和重复的次数。 二…

C语言学习第二十六天(算法的时间复杂度和空间复杂度)

1、算法效率 衡量一个算法的好坏&#xff0c;是从时间和空间两个方面来衡量的&#xff0c;换句话说就是从时间复杂度和空间复杂度来衡量的 这里需要补充一点&#xff1a;时间复杂度是衡量一个算法的运行快慢&#xff0c;空间复杂度是主要衡量一个算法运行所需要的额外空间。 …

面试 Java 算法高频题五问五答第一期

面试 Java 算法高频题五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;括号生成: 数字 n 代表生成括号的对数&#xff0c;请你设计一个…