北邮数电实验报告 - 副本
- 格式:docx
- 大小:255.83 KB
- 文档页数:19
数字电路综合实验报告简易智能密码锁一、实验课题及任务要求设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。
基本要求:1、密码设置:通过键盘进行4 位数字密码设定输入,在数码管上显示所输入数字。
通过密码设置确定键(BTN 键)进行锁定。
2、开锁:在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”,提示已输入密码的位数。
输入四位核对密码后,按“开锁”键,若密码正确则系统开锁,若密码错误系统仍然处于闭锁状态,并用蜂鸣器或led 闪烁报警。
3、在开锁状态下,可以通过密码复位键(BTN 键)来清除密码,恢复初始密码“0000”。
闭锁状态下不能清除密码。
4、用点阵显示开锁和闭锁状态。
提高要求:1、输入密码数字由右向左依次显示,即:每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位。
2、密码锁的密码位数(4~6 位)可调。
3、自拟其它功能。
二、系统设计2.1系统总体框图2.2逻辑流程图2.3MDS图2.4分块说明程序主要分为6个模块:键盘模块,数码管模块,点阵模块,报警模块,防抖模块,控制模块。
以下进行详细介绍。
1.键盘模块本模块主要完成是4×4键盘扫描,然后获取其键值,并对其进行编码,从而进行按键的识别,并将相应的按键值进行显示。
键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出高电平,在读入输出的行值时,通常高电平会被低电平拉低,当当前位置为高电平“1”时,没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。
同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。
北京邮电大学电路实验中心<数字电路与逻辑设计实验(下)>实验报告班级: xxx 学院: xxx实验室: xxx 审阅教师:姓名(班内序号): xxx 学号: xxx实验时间: xxx评定成绩:目录一、任务要求 (2)1.基本要求 (2)2.提高要求 (2)二、系统设计 (2)1.设计思路 (2)2.总体框图 (4)3.分块设计 (5)(1)分频器模块 (5)(2)4×4键盘输入模块 (5)(3)数码管显示模块 (6)(4)8×8 LED点阵显示模块 (6)(5)LCD液晶屏显示模块 (6)(6)中心模块 (6)三、仿真波形及波形分析 (6)1.分频器模块 (6)2.4×4键盘输入模块 (7)3.数码管显示模块 (7)4.8×8 LED点阵显示模块 (8)5.LCD液晶屏显示模块 (8)6.中心模块 (8)四、源程序 (9)1.分频器模块 (9)2.4×4键盘输入模块 (9)3.数码管显示模块 (11)4.8×8 LED点阵显示模块 (12)5.LCD液晶屏显示模块 (19)6.中心模块 (23)五、功能说明及资源利用情况 (26)六、故障及问题分析 (27)七、总结和结论 (27)一、任务要求本电路可供甲乙二人进行猜拳游戏。
通过不同的按键控制,选择多种出拳方式,显示猜拳的结果,实现猜拳游戏,防止了作弊的可能。
1.基本要求1、甲乙双方各用4×4 键盘中的三个按键模拟“石头”、“剪刀”、“布”,一个按键为“确认”。
4×4 键盘第一行为甲,第二行为乙;2、裁判用4×4 键盘第三行的一个按键模拟“开”,一个按键为“准备”,一个按键为“复位”;3、裁判宣布“准备”后,甲乙双方分别选择出拳方式并确认;4、裁判“开”以后,用点阵的左右三列同时显示甲乙双方的猜拳选择(如下图所示),并用两个数码管显示甲乙的猜拳比分;图1甲“布”,乙“剪刀”;甲“剪刀”,乙“石头”5、猜拳游戏为五局三胜制。
北京邮电大学数字电路与逻辑设计实验发光二极管走马灯的电路设计与实现实验报告学院:信息与通信工程学院班级:27姓名:付莹学号:班内序号:23【实验目的】(1)进一步了解时序电路描述方法;(2)熟悉状态机的设计方法。
【实验所用仪器及元器件】(1)计算机;(2)直流稳压电源;(3)数字系统与逻辑设计实验开发板。
【实验任务要求】设计并实现一个控制8个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。
(1)单点移动模式:一个点在8个发光二极管上来回的亮(2)幕布式:从中间两个点,同时向两边依次点亮直到全亮,然后再向中间点灭,依次往复。
【实验设计思路及过程】(1)设计思路实验要求有两个,一个是单点移动模式,一个是幕布式。
通过CASE-WHEN 语句实现走马灯的变化。
分别定义一个8个变量的数据类型和一个13变量的数据类型,表示一个周期内的灯的变化,并设计一个变量在两种状态间进行切换。
此时,需要把所有状态罗列到case-when中去。
(2)VHDL代码LIBRARY IEEE;USE ABC ISPORT(A,CLK,RESET:IN STD_LOGIC;DENG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ABC;ARCHITECTURE A OF ABC ISTYPE STATE_TEMP is(s0,s1,s2,s3,s4,s5,s6,s7);TYPE STATE_TEMP1 is(s0,s1,s2,s3,s4,s5,s6,s7,s00,s01,s02,s03,s04,s05);signal STATE:STATE_TEMP;signal STATE1:STATE_TEMP1;BEGINPROCESS(CLK,RESET)BEGINIF RESET='1' THENDENG<="00000000";ELSIF(CLK'EVENT AND CLK='0')THENIF A='0'THEN --KAIMUSHICASE STATE1 ISWHEN s0 => STATE1<=s1;DENG<="";WHEN s1 => STATE1<=s2;DENG<="01000000";WHEN s2 => STATE1<=s3;DENG<="00100000";WHEN s3 => STATE1<=s4;DENG<="00010000";WHEN s4 => STATE1<=s5;DENG<="00001000";WHEN s5 => STATE1<=s6;DENG<="00000100";WHEN s6 => STATE1<=s7;DENG<="00000010";WHEN s7 =>STATE1<=s00;DENG<="00000001";WHEN s00=>STATE1<=s01;DENG<="00000010";WHEN s01=>STATE1<=s02;DENG<="00000100";WHEN s02=>STATE1<=s03;DENG<="00001000";WHEN s03=>STATE1<=s04;DENG<="00010000";WHEN s04=>STATE1<=s05;DENG<="00100000";WHEN s05=>STATE1<=s0;DENG <="01000000";END CASE;ELSECASE STATE ISWHEN s0 => STATE<=s1;DENG<="00011000";WHEN s1 => STATE<=s2;DENG<="00111100";WHEN s2 => STATE<=s3;DENG<="01111110";WHEN s3 => STATE<=s4;DENG<="";WHEN s4 => STATE<=s5;DENG<="01111110";WHEN s5 => STATE<=s6;DENG<="00111100";WHEN s6 => STATE<=s7;DENG<="00011000";WHEN s7 => STATE<=s0;DENG<="00000000";END CASE;END IF;END IF;END PROCESS;END A;【仿真波形及分析】1.仿真波形(1)单点移动式(2)幕布式(3)复位信号2.波形分析(1)单点移动式由图可以看出,当A为0时程序实现单点移动功能,如图所示DENG[7]开始亮,之后依次为DENG[6], DENG[5], DENG[4], DENG[3], DENG[2],DENG[1], DENG[0],然后DENG[1]也开始亮,依此类推,实现了功能要求(2)幕布式由图可以看出,当A为1时,如图所示,先是中间的两个灯DENG[4], DENG[5]亮,然后扩展到四个灯亮DENG[3]至DENG[6]亮,接下来是DENG[2]~DENG[7]亮,最后全亮,接着DENG[2]~DENG[7]亮,继而循环下去。
北京邮电大学数字电路与逻辑设计实验学院:信息与通信工程学院班级: 2013211127 作者:薄士宁学号: 2013212543 ____一.实验名称和任务要求LED 点阵风扇的设计与实现基本要求:1、用8×8 点阵模拟风扇转动,并采用双色点阵显示。
2、风扇转动方式如图1 所示,包括四个点阵显示状态并按顺序循环显示。
风扇转动速度根据环境温度分为4 档,其中1 档的四个显示状态之间的切换时间为2 秒,2 档为1 秒,3 档为0.5 秒,4 档为静止不动。
图1 点阵模拟风扇转动示意图3、环境温度通过2 个BTN 按键设置,一个用来增加,一个用来减少,温度可设置范围为10℃~40℃,温度精度为1℃,并用两个数码管进行温度显示。
风扇根据不同的温度自动采用不同的转动速度,其中20℃~24℃对应1档,25℃~29℃对应2 档,30℃~40℃对应3 档,10℃~19℃对应4 档,用一个数码管显示档位。
4、定时模式:在风扇不同转动速度下,可以通过按键切换进入定时模式。
定时时间可设置范围为20~59 秒,采用两个数码管进行倒计时显示,当倒计时结束后,风扇状态保持静止不动。
5、设置开关键。
风扇开机初始状态为20℃、1 档,并有不小于5 秒的开机音乐。
关机状态为点阵全灭。
提高要求:1、设计LED 风扇的其他工作模式。
2、利用实验板上的温度传感器代替按键直接获取温度数据,实现对LED 风扇四档转速的自动控制。
3、用数码管实时显示温度传感器的温度数据,精度为0.1℃。
4、自拟其他功能。
二.基本思路根据实验要求,画出总的原理图。
实验的基本要求,即8×8双色点阵模拟风扇转动、风扇转动分四个档位(每个档位对应“四种”状态)、通过环境温度控制档位的自动选择、设计定时模式、开关机状态。
为了实现这些既定要求,设计出了温度控制模块、倒计时控制模块、音乐控制模块、点阵风扇模块、数码管显示模块等,通过对时钟的分频、加减法计数器、数据选择器等的运用,来实现上述功能。
北邮数电实验报告北邮数电实验报告一、引言数电实验是电子信息类专业学生必修的一门实验课程,通过实践操作,帮助学生巩固理论知识,培养实际动手能力。
本次实验旨在通过设计和搭建一个简单的数字电路,来理解数字电路的基本原理和工作方式。
二、实验目的本次实验的目的是设计一个4位二进制加法器,实现两个4位二进制数的相加运算。
通过实验,我们可以加深对于数字电路的理解,掌握数字电路的设计和搭建方法。
三、实验原理1. 二进制加法器二进制加法器是一种用于计算二进制数相加的数字电路。
它由若干个逻辑门和触发器组成,可以实现二进制数的加法运算。
在本次实验中,我们将设计一个4位二进制加法器,即可以计算两个4位二进制数的相加结果。
2. 逻辑门逻辑门是数字电路中常用的基本元件,用于实现逻辑运算。
常见的逻辑门有与门、或门、非门、异或门等。
在本次实验中,我们将使用与门和异或门来构建4位二进制加法器。
四、实验步骤1. 设计4位二进制加法器的电路图根据实验要求,我们需要设计一个能够计算两个4位二进制数相加的电路。
首先,我们可以将两个4位二进制数分别用D0~D3和E0~E3表示,其中D0和E0分别为最低位。
然后,我们需要使用与门和异或门来实现加法器的功能。
通过逻辑运算,我们可以得到每一位的和以及进位。
最后,将每一位的和连接起来,即可得到最终的结果。
2. 搭建电路根据电路图,我们可以开始搭建实验电路。
首先,将所需的逻辑门和触发器连接起来,形成一个完整的电路。
然后,将所需的输入信号和电源连接到电路上。
最后,使用示波器等工具检查电路的工作状态,确保电路正常运行。
3. 进行实验测试在搭建好电路后,我们可以进行实验测试。
首先,将两个4位二进制数的输入信号连接到电路上。
然后,通过观察输出信号,判断电路是否正确计算了两个二进制数的相加结果。
如果输出信号与预期结果一致,说明电路设计和搭建成功。
五、实验结果与分析在进行实验测试后,我们可以得到实验结果。
通过观察输出信号,我们可以判断电路是否正确计算了两个二进制数的相加结果。
北邮-数电实验报告数字电路实验报告学院:信息与通信工程专业:信息工程班级:2013211125学号:2013210681姓名:袁普实验一:QuartusⅡ原理图输入法设计与实现一:实验要求①:用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
②:用实验一生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
③:用3线—8线译码器和逻辑门设计实现函数F,仿真验证其功能,下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
二:报告内容①:实验一(2)的原理图用两个已经生成的半加器图形模块单元和一个双输入或门即可实现全加器②:仿真波形图以及分析波形图:波形分析:通过分析ab ci三个输入在8中不同组合下的输出,发现与全加器的真值表吻合,说明实现了全加器的逻辑功能。
同时看见波形中出现了毛刺(冒险),这也与事实一致。
③:故障及问题分析第一次在做全加器的时候发现找不到已经生成的半加器模块,后来发现是因为在建立工程时这两个项目没有建在同一个文件夹里,在调用的时候就找不到。
后来我将全加器工程建在同一个文件夹里解决了此问题。
实验二:用VHDL设计和实现组合逻辑电路一:实验要求①:用VHDL设计一个8421码转换为格雷码的代码转换器,仿真验证其功能。
②:用VHDL设计一个4位二进制奇校验器,要求在为奇数个1时输出为1,偶数个1时输出为0,仿真验证其功能。
③:用VHDL设计一个数码管译码器,仿真验证其功能,下载到实验板测试,要求用拨码开关设定输入信号,数码管显示输出信号,并且只使一个数码管有显示,其余为熄灭状态。
二:故障及问题分析在刚开始实现让一个数码管显示的时候,我本来准备再设置6个输入和输出,通过实验板上的拨码来输入信息分别控制不同的数码管的的开闭状态,但是后来发现这样效率很低而且实验板上的拨码开关数量根本不够。
北邮数电综合实验报告综合实验报告:基于北邮数电实验的电子门禁系统设计与实现摘要:本次实验通过使用北邮数电实验室提供的器件和设备,设计并实现了一个简易的电子门禁系统。
该系统能够通过输入正确的密码或使用合法的身份卡,实现对门禁的控制和管理。
本文将详细介绍系统设计的原理、实验过程和结果,并对实验进行了总结和评价。
一、引言电子门禁系统是当前社会中广泛应用的一种重要安全保障设施。
它通过使用密码、身份卡等识别方式,对人员出入进行控制和管理。
本实验旨在通过北邮数电实验的学习和实践,学习和掌握电子门禁系统的设计与实现。
二、实验器材与原理实验器材:1.键盘2.蜂鸣器3.LCD显示屏4.数码安全码锁5.单片机开发板6.电源模块7.连线模块实验原理:该电子门禁系统的基本原理如下:1.用户通过键盘输入密码或刷合法的身份卡;2.单片机接收到输入的密码或读取身份卡信息;3.单片机对输入的密码或身份卡信息进行核对;5. 若核对失败,则控制蜂鸣器发出门禁错误提示音,并在LCD显示屏上显示“Access Denied”等拒绝信息。
三、实验过程与结果1.按照实验器材的接线要求,将键盘、蜂鸣器和LCD显示屏与开发板连接好;2.根据实验原理,编写相应的控制程序,并将程序烧录到单片机中;3.打开电源模块,开启电子门禁系统;4.用户通过键盘输入密码或刷合法的身份卡;5.系统接收到用户输入并进行核对;7. 核对失败时,蜂鸣器发出门禁错误提示音,LCD显示屏上显示“Access Denied”等拒绝信息。
实验结果显示,该电子门禁系统能够根据用户输入的密码或身份卡信息,进行核对并作出相应的操作。
当核对成功时,系统会解锁门禁并显示欢迎信息;当核对失败时,系统会发出错误提示并拒绝门禁。
四、实验总结本次实验通过设计和实现基于北邮数电实验的电子门禁系统,使得我们更加深入地了解了电子门禁系统的原理和应用。
通过实验,我们学会了利用键盘、蜂鸣器和LCD显示屏等器材,通过单片机控制,实现了一个简易的电子门禁系统。
北京邮电大学实验报告实验名称: 数电电路与逻辑设计实验学院:信息与通信工程学院班 级: 姓 名: 学 号: 班内序号:日期:一. 实验一:QuartusII 原理图输入法设计1. 实验名称和实验任务要求(1)用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块 元。
(2)用(1)中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号入信号。
(3)用3线-8线译码器(74LS138)和逻辑门设计实现函数F=A B C +A B C +AB C +A B C 。
2.实验原理图及波形图(1)半加器(2)全加器(3)74LS383.仿真波形图分析(1)半加器:输入为a,b,输出S,CO(进位)。
当ab都为0时,半加和s=0,进位端co=0。
当ab都为1时,半加和s=0,进位端co=1。
当a=1,b=0或a=0,b=1时,半加和s=1,进位端co=0。
(2)全加器:输入a,b,输出S,CO(进位),ci(低进位)。
当a=0,b=0,ci=0,输出s=0,co=0。
当a=0,b=1或a=1,b=0又ci=0,输出s=1,co=0。
当a=0,b=0,ci=1,输出s=1,co=0。
(3)74LS138输入A,B,C,输出为3。
四个输出对应F中的四个最小项,Y0、Y2、Y4、Y7,以实现函数功能。
二.实验二:用VHDL设计与实现组合逻辑电路1.实验名称和实验任务要求(1)用VHDL语言设计实现一个共阴极7段数码管译码器,仿真验证其功能。
要求用拨码开关设定输入信号,7段数码管显示输出信号。
(2)用VHDL语言设计实现一个8421码转换为余3码的代码转换器,仿真验证其功能。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
(3)用VHDL语言设计实现一个4位二进制奇校验器,输入奇数个’1’时,输出为’1’,否则输出’0’,仿真验证其功能。
北邮数电实验报告1. 实验目的本实验的目的是通过实际操作和实验验证,加深对数字电路的理解和掌握。
具体实验内容包括: 1. 实现各种基本逻辑电路(与门、或门、非门、异或门等)的电路设计。
2. 学习使用开关和LED灯进行数字信号输入和输出。
3. 掌握数字电路实验中常用的仪器设备的使用方法。
2. 实验器材和环境本实验所使用的器材和环境如下: - FPGA实验箱 - 数字逻辑集成电路(与门、或门、非门、异或门等) - 电源 - 接线板 - 数字电路实验仪器3. 实验步骤3.1 实验准备首先,我们需要将实验所需的器材连接好,包括将数字逻辑集成电路插入到FPGA实验箱上的插槽中,并将电源正确连接。
3.2 电路设计与布线根据实验要求,我们需要设计不同的基本逻辑电路。
比如,要设计一个与门电路,可以通过将两个输入端分别与两个开关连接,将输出端连接到一个LED灯上。
其他的逻辑电路同样可以设计类似的方式。
在设计和布线的过程中,需要注意保持电路的连通性,并避免出现短路等问题。
3.3 输入和输出信号设置根据实验要求,我们需要设置输入和输出信号。
可以通过控制开关的开合状态来设置输入信号,然后观察LED灯的亮灭情况来判断输出信号的状态是否符合预期。
3.4 实验数据记录和分析在实验过程中,我们需要记录每个逻辑电路的输入和输出信号状态,并进行分析。
可以通过绘制真值表或者逻辑门表来记录并分析数据。
4. 实验结果与分析根据实验步骤中记录的数据,我们可以得出实验结果,并进行进一步的分析。
比如,可以通过比对设计的逻辑电路输出和预期输出的差异,来判断实验是否成功完成。
5. 总结与反思通过本次实验,我深入了解和掌握了数字电路的基本原理和实验方法。
通过设计和实验验证,加深了对基本逻辑电路的理解,并熟悉了数字电路实验所使用的仪器设备。
在实验过程中,我遇到了一些问题,比如电路连接错误导致的信号不稳定等,但通过仔细调试和排查,最终解决了这些问题。
一、实验目的本次实验旨在通过实践操作,加深对数字电路基本原理和设计方法的理解,掌握数字电路实验的基本步骤和实验方法。
通过本次实验,培养学生的动手能力、实验技能和团队合作精神。
二、实验内容1. 实验一:TTL输入与非门74LS00逻辑功能分析(1)实验原理TTL输入与非门74LS00是一种常用的数字逻辑门,具有高抗干扰性和低功耗的特点。
本实验通过对74LS00的逻辑功能进行分析,了解其工作原理和性能指标。
(2)实验步骤① 使用实验箱和实验器材搭建74LS00与非门的实验电路。
② 通过实验箱提供的逻辑开关和指示灯,验证74LS00与非门的逻辑功能。
③ 分析实验结果,总结74LS00与非门的工作原理。
2. 实验二:数字钟设计(1)实验原理数字钟是一种典型的数字电路应用,由组合逻辑电路和时序电路组成。
本实验通过设计一个24小时数字钟,使学生掌握数字电路的基本设计方法。
(2)实验步骤① 分析数字钟的构成,包括分频器电路、时间计数器电路、振荡器电路和数字时钟的计数显示电路。
② 设计分频器电路,实现1Hz的输出信号。
③ 设计时间计数器电路,实现时、分、秒的计数。
④ 设计振荡器电路,产生稳定的时钟信号。
⑤ 设计数字时钟的计数显示电路,实现时、分、秒的显示。
⑥ 组装实验电路,测试数字钟的功能。
3. 实验三:全加器设计(1)实验原理全加器是一种数字电路,用于实现二进制数的加法运算。
本实验通过设计全加器,使学生掌握全加器的工作原理和设计方法。
(2)实验步骤① 分析全加器的逻辑功能,确定输入和输出关系。
② 使用实验箱和实验器材搭建全加器的实验电路。
③ 通过实验箱提供的逻辑开关和指示灯,验证全加器的逻辑功能。
④ 分析实验结果,总结全加器的工作原理。
三、实验结果与分析1. 实验一:TTL输入与非门74LS00逻辑功能分析实验结果表明,74LS00与非门的逻辑功能符合预期,具有良好的抗干扰性和低功耗特点。
2. 实验二:数字钟设计实验结果表明,设计的数字钟能够实现24小时计时,时、分、秒的显示准确,满足实验要求。
数字电路与逻辑设计实验报告姓名:班级:学号:班内序号:时间:2015/10/19-2015/11/2简易计算器实验报告一、要求要求:基本要求:1、利用4X4 小键盘作为输入,包括:数字键0-9,清除键,等号键及‘+’‘-’‘*’运算符号键。
2、实现输入为99 以内自然数的加、减、乘运算;3、能够实现多次连续计算(无优先级,从左到右计算结果),如:12+34×2-78=144、最大结果为99999(五位),溢出报警;5、用数码管显示输入的数字和结果,最左侧数码管用来表示数字的正负,其他五位数码管表示结果;结果的绝对值大于99999 时,数码管显示‘Error’。
提高要求:1、实现输入为9999 以内自然数的加、减法;2、实现除法运算,不能除尽时小数保留1 位有效数字;3、能够区分运算优先级(先乘除,后加减),如:12+34×2-78=24、自拟其他功能。
二、系统设计:设计思路:1、将该程序进行分模块设计。
可以将程序分为:主程序、译码模块和防抖模块。
其中,主程序负责将输入的数据进行存储,对数据进行运算,将数据输出到数码上等;防抖模块负责对按键输入的数防抖;译码模块负责对输入的数据进行译码(由8421bcd码转化为十进制的编码)。
2、分模块进行相应模块的编写。
3、对编好的模块进行测试。
4、编写主程序并进行调试。
总体框图:流程图:分块设计:(按实际操作的分块)输入模块:由符号开关和拨码开关构成。
采用序列存储的方式存储相应的输入。
输入译码模块:将输入的符号序列转化成先用状态,以便选取对应的计算方法;将输入的8421bcd码转化成相应的两位十进制数。
数码显示模块:将寄存器内的数进行输出到数码管上。
显示所输入的第一个数以及最后的结果。
计算模块:调用相应的计算方式,对所输入的数进行计算。
防抖模块:在用按键输入时,所得到的信号可能会有抖动,因此加入此抖动电路。
三、仿真波形及波形分析:分析(波形仿真时,为了方便观察,将8421bcd码输入方式,改为了十进制的直接输入方式,并将输出,有原来的数码管显示改成了直接数字显示)由图中可以看出,当输入12 ,按下“确定”,数字就输入到了寄存器中,输入“+”号(对应仿真中的fuhao“100000”),在输入一个数35,按下“确定”,该计算器就件寄存器中的数与第二次输入的数进行相加,得到结果47。
此时该结果又被直接保存到了寄存器中,继续输入运算符“-”(对应仿真中得fuhao“010000”),输入第三个数18,按下“确定”,计算器对其做减法运算,得到结果29,该结果又在寄存器中存储着。
继续后续输入相应符号,相应数字可以继续进行相应的计算,只要结果在(-99999,99999)之间,就可以一直进行计算。
四、源程序:主程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_SIGNED.ALL;Entity lzjisuanqi isport(cat: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);digital:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);clk:in std_logic;beep:out std_logic;num:in std_logic_vector(7 downto 0);fuhao:in std_logic_vector(5 downto 0));end entity lzjisuanqi;architecture lz of lzjisuanqi iscomponent transformport(cin:in std_logic_vector(7 downto 0);cout: out integer range 0 to 99);end component;component fangdou ISPORT(clk : IN STD_LOGIC;key_in: IN STD_LOGIC_VECTOR(5 DOWNTO 0);key_out:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) );end component;type state_type is (s0,s1,s2);signal state:state_type;type time_type is (t1,t2,t3,t4,t5,t6);signal time1:time_type;signal num1:integer range 0 to 99;signal result1:integer range -99999 to 99999; signal result2:integer range -99999 to 99999; signal cat0:integer range 0 to 9;signal cat1:integer range 0 to 9;signal cat2:integer range 0 to 9;signal cat3:integer range 0 to 9;signal cat4:integer range 0 to 9;signal cnt : integer range 0 to 50000;signal clk_tmp : std_logic;signal ffuhao: std_logic_vector(5 downto 0); signal h1: integer range 0 to 10;signal l1: integer range 0 to 10;beginm1:process(num)begincase num(7 downto 4) iswhen "0000"=>h1<=0;when "0001"=>h1<=1;when "0010"=>h1<=2;when "0011"=>h1<=3;when "0100"=>h1<=4;when "0101"=>h1<=5;when "0110"=>h1<=6;when "0111"=>h1<=7;when "1000"=>h1<=8;when "1001"=>h1<=9;when others=>h1<=10;end case;end process m1;m2:process(num)begincase num(3 downto 0) is when "0000"=>l1<=0;when "0001"=>l1<=1;when "0010"=>l1<=2;when "0011"=>l1<=3;when "0100"=>l1<=4;when "0101"=>l1<=5;when "0110"=>l1<=6;when "0111"=>l1<=7;when "1000"=>l1<=8;when "1001"=>l1<=9;when others=>l1<=10;end case;end process m2;num1<=h1*10+l1;--u1:transform port map(cin=>num,cout=>num1);u2:fangdou port map(clk=>clk,key_in=>fuhao,key_out=>ffuhao);process(clk) beginif (clk'event and clk='1') thenif cnt=49999 thencnt<=0;clk_tmp<= not clk_tmp;elsecnt<=cnt+1;end if;end if;end process;p1:process(clk_tmp)variable result:integer range -9999999 to 9999999;variable fuhao1:integer range 0 to 6:=0;beginif (clk_tmp'event and clk_tmp='1') thencase state iswhen s0=>result:=num1;state<=s1;when s1=>if(ffuhao="000010")thenfuhao1:=0;state<=s1;elsif(ffuhao="000001")thenresult:=num1;fuhao1:=0;state<=s0;beep<='0';elsif(ffuhao="001000")thenfuhao1:=3;state<=s2;elsif(ffuhao="010000")thenfuhao1:=2;state<=s2;elsif(ffuhao="100000")thenfuhao1:=1;state<=s2;else state<=s1;end if;when s2=>if(fuhao1=0)thenresult:=result;state<=s1;elsif(fuhao1=1)thenresult:=result+num1;if(result>99999 or result<-99999)thenresult:=num1;beep<='1';state<=s0;else beep<='0';state<=s1;end if;elsif(fuhao1=2)thenresult:=result-num1;if(result>99999 or result<-99999)thenresult:=num1;beep<='1';state<=s0;else beep<='0';state<=s1; end if;elsif(fuhao1=3)thenresult:=result*num1;if(result>99999 or result<-99999)thenresult:=num1;beep<='1';state<=s0;else beep<='0';state<=s1;end if;end if;end case;result2<=result;if(result2<0)then result1<=abs(result2);else result1<=result;end if;if(result1>=90000)then cat4<=9;elsif(result1>=80000 and result1<90000)then cat4<=8;elsif(result1>=70000 and result1<80000)then cat4<=7;elsif(result1>=60000 and result1<70000)then cat4<=6;elsif(result1>=50000 and result1<60000)then cat4<=5;elsif(result1>=40000 and result1<50000)then cat4<=4;elsif(result1>=30000 and result1<40000)then cat4<=3;elsif(result1>=20000 and result1<30000)then cat4<=2;elsif(result1>=10000 and result1<20000)then cat4<=1;elsif(result1<10000)then cat4<=0;end if;if((result1-cat4*10000)>=9000 and (result1-cat4*10000)<10000)then cat3<=9; elsif((result1-cat4*10000)>=8000 and (result1-cat4*10000)<9000)then cat3<=8; elsif((result1-cat4*10000)>=7000 and (result1-cat4*10000)<8000)then cat3<=7;elsif((result1-cat4*10000)>=6000 and (result1-cat4*10000)<7000)then cat3<=6;elsif((result1-cat4*10000)>=5000 and (result1-cat4*10000)<6000)then cat3<=5;elsif((result1-cat4*10000)>=4000 and (result1-cat4*10000)<5000)then cat3<=4;elsif((result1-cat4*10000)>=3000 and (result1-cat4*10000)<4000)then cat3<=3;elsif((result1-cat4*10000)>=2000 and (result1-cat4*10000)<3000)then cat3<=2;elsif((result1-cat4*10000)>=1000 and (result1-cat4*10000)<2000)then cat3<=1;elsif((result1-cat4*10000)<1000)then cat3<=0;end if;if((result1-cat4*10000-cat3*1000)>=900and(result-cat4*10000-cat3*1000)<1000)then cat2<=9;elsif((result1-cat4*10000-cat3*1000)>=800 and (result1-cat4*10000-cat3*1000)<900)then cat2<=8;elsif((result1-cat4*10000-cat3*1000)>=700 and (result1-cat4*10000-cat3*1000)<800)then cat2<=7;elsif((result1-cat4*10000-cat3*1000)>=600 and (result1-cat4*10000-cat3*1000)<700)then cat2<=6;elsif((result1-cat4*10000-cat3*1000)>=500 and (result1-cat4*10000-cat3*1000)<600)then cat2<=5;elsif((result1-cat4*10000-cat3*1000)>=400 and (result1-cat4*10000-cat3*1000)<500)then cat2<=4;elsif((result1-cat4*10000-cat3*1000)>=300 and (result1-cat4*10000-cat3*1000)<400)then cat2<=3;elsif((result1-cat4*10000-cat3*1000)>=200 and (result1-cat4*10000-cat3*1000)<300)then cat2<=2;elsif((result1-cat4*10000-cat3*1000)>=100 and (result1-cat4*10000-cat3*1000)<200)then cat2<=1;elsif((result1-cat4*10000-cat3*1000)<100) then cat2<=0;end if;if((result1-cat4*10000-cat3*1000-cat2*100)>=90 and (result1-cat4*10000-cat3*1000-cat2*100)<100)then cat1<=9;elsif((result1-cat4*10000-cat3*1000-cat2*100)>=80 and (result1-cat4*10000-cat3*1000-cat2*100)<90)then cat1<=8;elsif((result1-cat4*10000-cat3*1000-cat2*100)>=70 and (result1-cat4*10000-cat3*1000-cat2*100)<80)then cat1<=7;elsif((result1-cat4*10000-cat3*1000-cat2*100)>=60 and (result1-cat4*10000-cat3*1000-cat2*100)<70)then cat1<=6;elsif((result1-cat4*10000-cat3*1000-cat2*100)>=50 and (result1-cat4*10000-cat3*1000-cat2*100)<60)then cat1<=5;elsif((result1-cat4*10000-cat3*1000-cat2*100)>=40 and (result1-cat4*10000-cat3*1000-cat2*100)<50)then cat1<=4;elsif((result1-cat4*10000-cat3*1000-cat2*100)>=30 and (result1-cat4*10000-cat3*1000-cat2*100)<40)then cat1<=3;elsif((result1-cat4*10000-cat3*1000-cat2*100)>=20 and (result1-cat4*10000-cat3*1000-cat2*100)<30)then cat1<=2;elsif((result1-cat4*10000-cat3*1000-cat2*100)>=10 and (result1-cat4*10000-cat3*1000-cat2*100)<20)then cat1<=1;elsif((result1-cat4*10000-cat3*1000-cat2*100)<10)then cat1<=0;end if;cat0<=result1-cat4*10000-cat3*1000-cat2*100-cat1*10;if(result>=0)thenCASE time1 ISWHEN t1 =>cat <= "101111";CASE cat4 ISWHEN 0=> digital <= "1111110";WHEN 1=> digital <= "0110000";WHEN 2=> digital <= "1101101";WHEN 3=> digital <= "1111001";WHEN 4=> digital <= "0110011";WHEN 5=> digital <= "1011011";WHEN 6=> digital <= "1011111";WHEN 7=> digital <= "1110000";WHEN 8=> digital <= "1111111";WHEN 9=> digital <= "1111011";END CASE;time1 <= t2;WHEN t2 =>cat <= "110111";CASE cat3 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011"; WHEN 6=> digital <= "1011111"; WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; end case;time1 <= t3;WHEN t3 =>cat <= "111011";CASE cat2 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011"; WHEN 6=> digital <= "1011111"; WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; END CASE;time1 <= t4;WHEN t4 =>cat <= "111101";CASE cat1 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011";WHEN 6=> digital <= "1011111"; WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; END CASE;time1 <= t5;WHEN t5 =>cat <= "111110";CASE cat0 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011"; WHEN 6=> digital <= "1011111"; WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; END CASE;time1 <= t1;WHEN OTHERS => time1 <= t1;END CASE;elsif(result<0)thenCASE time1 ISWHEN t1 =>cat <= "101111";CASE cat4 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011"; WHEN 6=> digital <= "1011111"; WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; END CASE;time1 <= t2;WHEN t2 =>cat <= "110111";CASE cat3 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011"; WHEN 6=> digital <= "1011111"; WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; end case;time1 <= t3;WHEN t3 =>cat <= "111011";CASE cat2 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011"; WHEN 6=> digital <= "1011111"; WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; END CASE;time1 <= t4;WHEN t4 =>cat <= "111101";CASE cat1 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011"; WHEN 6=> digital <= "1011111";WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; END CASE;time1 <= t5;WHEN t5 =>cat <= "111110";CASE cat0 ISWHEN 0=> digital <= "1111110"; WHEN 1=> digital <= "0110000"; WHEN 2=> digital <= "1101101"; WHEN 3=> digital <= "1111001"; WHEN 4=> digital <= "0110011"; WHEN 5=> digital <= "1011011"; WHEN 6=> digital <= "1011111"; WHEN 7=> digital <= "1110000"; WHEN 8=> digital <= "1111111"; WHEN 9=> digital <= "1111011"; END CASE;time1 <= t6;when t6=>cat<="011111";digital<="0000001"; time1<=t1;WHEN OTHERS => time1 <= t1;END CASE;end if;end if;end process;end lz;防抖模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY fangdou ISPORT(clk : IN STD_LOGIC;key_in: IN STD_LOGIC_VECTOR(5 DOWNTO 0);key_out:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));END fangdou;ARCHITECTURE behave OF fangdou ISSIGNAL clk_tmp : STD_LOGIC;SIGNAL cnt : integer range 0 to 199999;signal tmp1,tmp2: STD_LOGIC_VECTOR(5 DOWNTO 0);BEGINprocess(clk)beginif (clk'event and clk='1') thenif cnt=199999 thencnt<=0;clk_tmp<= not clk_tmp;elsecnt<=cnt+1;end if;end if;end process;PROCESS(clk_tmp)BEGINIF (clk_tmp'EVENT AND clk_tmp='0') THENtmp2<=tmp1;tmp1<=key_in;END If;END PROCESS;key_out(0)<=clk_tmp and tmp1(0) and (not tmp2(0)); key_out(1)<=clk_tmp and tmp1(1) and (not tmp2(1)); key_out(2)<=clk_tmp and tmp1(2) and (not tmp2(2)); key_out(3)<=clk_tmp and tmp1(3) and (not tmp2(3)); key_out(4)<=clk_tmp and tmp1(4) and (not tmp2(4)); key_out(5)<=clk_tmp and tmp1(5) and (not tmp2(5));END behave;译码模块:library ieee;USE IEEE.STD_LOGIC_UNSIGNED.ALL;use ieee.std_logic_1164.all;entity transform isport(cin:in std_logic_vector(7 downto 0); cout: out integer range 0 to 99);end entity transform;architecture behave of transform is signal h1: integer range 0 to 10;signal l1: integer range 0 to 10;beginm1:process(cin)begincase cin(7 downto 4) iswhen "0000"=>h1<=0;when "0001"=>h1<=1;when "0010"=>h1<=2;when "0011"=>h1<=3;when "0100"=>h1<=4;when "0101"=>h1<=5;when "0110"=>h1<=6;when "0111"=>h1<=7;when "1000"=>h1<=8;when "1001"=>h1<=9;when others=>h1<=10;end case;end process m1;m2:process(cin)begincase cin(3 downto 0) iswhen "0000"=>l1<=0;when "0001"=>l1<=1;when "0010"=>l1<=2;when "0011"=>l1<=3;when "0100"=>l1<=4;when "0101"=>l1<=5;when "0110"=>l1<=6;when "0111"=>l1<=7;when "1000"=>l1<=8;when "1001"=>l1<=9;when others=>l1<=10;end case;end process m2;cout<=h1*10+l1;end behave;五、功能说明:实验的基本要求已经实现。