(精品论文)电子技术课程设计论文 计算器_第1页
(精品论文)电子技术课程设计论文 计算器_第2页
(精品论文)电子技术课程设计论文 计算器_第3页
(精品论文)电子技术课程设计论文 计算器_第4页
(精品论文)电子技术课程设计论文 计算器_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子设计与仿真1、前言12、正文12.1、课程设计名称:计算器12.2、设计内容及要求12.3、系统设计12.3.1、系统框图22.3.2、模块说明23、总结6参考文献:7附录:81、前言随着电子技术和计算机技术的飞速发展,促进电子电路及其应系统设计手段越来越先进。传统的电子电路与系统设计方法,周期长、耗材多、效率低,难以满足电子技术飞速发展的要求。“电子工作台”即EWB,是将先进的计算机技术应用于电子设计与仿真过程的新技术,它已经被广泛应用于电子电路分析、设计、印制电路板的设计等各项工作中。EWB为使用者提供了一个集成一体化的设计与实验环境,创建电路、实验分析和结果输出在菜单系统中全部完成,使电子电路及其系统的设计产生了划时代的变化,极大的提高了设计质量与效率。EWB与的电路分析软件SPICE完美兼容,而且具有界面形象逼真、操作方便,采用图形方式创建电路等软件,EWB有庞大的远器件库和比较齐全的仪器表。掌握现代化设计与仿真软件EWB,已成为电子设计工程师、相关专业的大学本、专科学生及其研究生必备的工具。2、正文2.1、课程设计名称:计算器2.2、设计内容及要求设计一个能进行二进制加减乘除运算的计算器,操作数通过按键输入并用数码管显示。当按下运算符号键后,计算器进行两个数的运算,数码管将结果显示出来。2.3、系统设计通常我们使用的计算器功能包括基本的按键输入、运算和结果显示,此次课程设计所设计的计算器能够实现十进制数09的加减乘除,因为没有复杂运算,因此其显示部分也相对简单,最多只有两位数。现将此简单计算器的设计描述如下:2.3.1、系统框图 计算器 显示数值及运算结果 输入第一个数 输入运算符 输入第二个数 复位信号 开始运算信号 说明:各个输入都是通过对键盘编码得到的,通过键盘的行列扫描得到相应的信号输入,键盘编码如下:8b00010001:data=4b0000; 8b00010010:data=4b0001;8b00010100:data=4b0010;8b00011000:data=4b0011;8b00100001:data=4b0100;8b00100010:data=4b0101;8b00100100:data=4b0110;8b00101000:data=4b0111;8b01000001:data=4b1000;8b01000010:data=4b1001;以上为数据09的编码8b01000100:data=4b1110; 等号的编码8b01001000:data=4b1111; 复位信号的编码8b10000001:data=4b1010; 加号8b10000010:data=4b1011;减号8b10000100:data=4b1100;乘号8b10001000:data=4b1101;除号2.3.2、模块说明(1.1)键盘输入模块 本次课程设计所使用的键盘是4*4矩阵式键盘,共有16个按键,有09十个数字键,加减乘除四个符号键,一个等号键和一个复位键。以上已对键盘编码作过说明,不再赘余。次模块重点在键盘扫描,设计思路如下:先输出全行扫描信号,即四行都输出高电平,当检测到有键按下时开始逐行扫描,检测到某一列为高电平时,行列交叉点处有键按下,此时将编码结果放入指定寄存器。为了使按键所对应的数据能够被保持住,在编程过程中我采用了状态机。状态转换图如下: 无论有无键按下 0000 空闲状态 无键按下 1000 检测第四行 0001 扫描全行 有键按下 0111 准备检测第四行 0010 准备检测第 一行 本行无键按下 有键按下 有键按下 有键按下 0110 检测第三行 0011 检测第一行 本行无键按下 本行无键按下 0101 准备检测第三行 0100 检测第二行 0011 准备检测第二行此模块的输入:3:0kin clk(时钟信号)此模块的输出:3:0scan 3:0data,data作为下一个模块的输入(1.2)运算单元模块 首先考虑将两个运算数保存下来,为了与以后译码显示部分的衔接,将所有需要显示的内容放入一个寄存器。由于0-9的数字可用四位二进制数表示,其运算结果最多八位二进制数,因此设置一个八位寄存器,同时运算符号是不需要显示的,因此存入一个四位寄存器。运算过程如下:每次按下复位清零键将所有寄存器清零,开始传输数据和相应的计算,按等号前,第一个数按下时判断此数是否是09中的某一位。若是,将data送入buff寄存器,再按运算符号键,按下后将buff中的数据送入num1寄存器,将此时的data送入op寄存器,再键入第二个数,将data送入buff寄存器。等号按下后才将buff中的数送入num2寄存器,并判断op存入的是加减乘除中的哪一个,进行相应的运算。由于运算结果是二进制数,要想在数码管上正确显示,必须在必要时将其转换为BCD码。在本模块设计中只有加法和乘法部分需要将结果转换为BCD码,为了减少逻辑单元的使用,转换BCD码不作为一个模块来写,将其写入此模块。在此模块中重点介绍除法的算法。本次设计采用for循环,设置两个寄存器,一个存放被减数,另一个存放商,进入循环以后,判断被减数是否大于等于减数,若是则商加一,被减数减去减数,将结果存入被减数寄存器,直到被减数小于减数,得到余数,由于09的除法最多循环9次,因此可让for循环进行九次。本算法比较简单,但计算机并不是像我们想象得那么聪明,它内部要生成很多逻辑单元,占用的单元数比较多,因此运算比较慢,这个此算法的缺点。(1.3)译码显示模块 此模块比较简单,根据buff存放的结果将高四位和低四位分别译码输出。译码结果如下:4b0000:led=7b0111111;/0 3f 4b0001:led=7b0000110;/1 06 4b0010:led=7b1011011;/2 5b 4b0011:led=7b1001111;/3 4f 4b0100:led=7b1100110;/4 66 4b0101:led=7b1101101;/5 6d 4b0110:led=7b1111101;/6 7d 4b0111:led=7b0000111;/7 07 4b1000:led=7b1111111;/8 7f 4b1001:led=7b1101111;/9 6f 4b1111:led=7b1000000;/负号(1) 输入输出设计输入:列【3:0】kin ,时钟信号clk;输出:扫描信号【3:0】scan,驱动左边数码管【6:0】 led1,驱动右边数码管【6:0】led2;对应管脚分配:25Kin036Scan248Led2367Led1227Kin137Scan349Led2469Led1328Kin238Led2050Led2570Led1429Kin339Led2151Led2671Led1530Scan042Clk65Led1072Led1635Scan147Led2266Led11(4)系统仿真运算模块仿真:加法:减法:乘法:除法:译码显示模块仿真:3、总结在写本次实验报告的过程也是我对本次课程设计从老师开始布置到验收完毕整个过程的回忆,从开始对硬件描述语言的知其然而不知其所以然,到最后自己设计编写的代码能够操作硬件,其中不乏痛苦与苦恼,但更多的是学到知识后的愉悦。确切地说我真正地做本次课程设计是从第二周的周四开始,确定完题目后我将更加的时间投入都了到图书管和网上查阅相关的资料,明确了有关计算器的各个问题后,我着手编写代码。最令我头痛的还是键盘输入模块,由于此模块不能用软件仿真,因此写完后虽然能通过编译,但并不知道连接到硬件上是什么效果,因此这个模块是我最后才修改完成的,最后再三斟酌,决定采用状态机,解决了数据不能保持的问题,现在想想最开始写的代码,之所以按键显示一下数据以后又立刻清零,是因为在显示完以后未设定一个标志。第二部分也是计算器最核心的部分ALU,加减乘的算法比较简单,但我未采用最贴近计算机计算过程的方法,而是简单的用加号,乘号代替那些繁琐的程序,这是我程序中的一个不足之处,当初编程时未考虑到这样写会占用过多的逻辑单元,只是想只要结果是对的就行了,未对程序进行优化。写到除法时我采用了一个循环计算的方法,也是被很多同学借去使用的方法,该算法虽然看起来比较简单,但同样占用了很多逻辑单元,因此也不是最佳方案。但出于想不出其他的算法,只能采用这种方法。ALU部分搞定之后,再就是译码显示部分,由于计算机计算机结果是二进制数,因此必要时需要将其转换为BCD码,此部分最开始采用跟除法一样的算法,但是此算法占用过的逻辑单元,后来在图书馆中找到一种比较好的算法简化加3移位法。此模块的放置位置也让我费了不少脑子,最后将其放在ALU中貌似是最合适的。各个模块完成后再编写顶层模块,因为以前做实验时顶层用过原理图,这种方法用起来比较得心应手,因此在本次课设中我亦采用原理图。在编写程序的过程中当然需要不断的仿真调试,其实仿真和编写代码占用的时间相当长。在整个课设过程中通过与老师 同学的交流使我进一步了解了电子仿真这门课程,使我明白了掌握一门语言必须通过一个具体的编写过程,只看代码自己不亲自编写是永远发现不了其中的问题的。当然本次课设进一步巩固了我以前学过的编程思想,将系统模块化,自底向上编写代码。同时提醒我以后再写程序时要考虑的更加周全,才能编写出好的代码。总之,通过本次课程设计我学会了很多,再次感谢孟洪兵老师的指导和帮助!参考文献:1 申永山,李中波.现代电工电子技术M.北京:机械工业出版社,2002.2 周良权.模拟电子技术基础M.北京:高等教育出版社,1994.3 王至正.电子技术基础M.北京:高等教育出版社,1988.4 王 楚.电子线路原理(上、下册)M.北京:北京大学出版社,1990.5 蓝鸿翔.电子线路基础(上、下册)M.北京:高等教育出版社,1987.6 康华光.电子技术基础(模拟部分第三版、第四版)M.北京:高等教育出版社,1999.7 中南五省师专.电子技术基础与实验M.桂林:广西师范大学出版社,1988.8 宋水孝.实用电子技术教程M.淅江:淅江大学出版社,1987.9 华成英.模拟电子技术基础(第三版)M.北京:高等教育出版社,2001.10 梁明理.电子线路(上、下册)M.北京:高等教育出版社,1991.11 华中师范学院.电子线路基础M.湖北:湖北科学技术出版社,1985.12 曾祥富.电子技术基础M.北京:高等教育出版社,1997.13 晏桂滇.实用电子技术基础M.北京:高等教育出版社,1994.14 李新平.实用电子技术与仿真M.北京:机械工业出版社,2003.附录:Scan_test.v 键盘扫描检测module scan_test(scn,kin,clk,data);/端口说明input3:0 kin; /输入行input clk; /时钟信号output3:0 scn,data; /输出扫描信号,编码值reg3:0 scn,data; /寄存器变量用于always模块reg3:0 current_state,next_state; /状态,用于状态机always(posedge clk) /时钟上升沿触发current_state = next_state; / 将下一个状态赋为当前状态always(current_state) / 将当前状态作为触发事件beginnext_state=4b0000; /进入空闲状态case(current_state)4b0000:next_state=4b0001;/ 进入准备状态4b0001:if(kin=4b0000) /如果第一行无键按下next_state=4b0000; /进入空闲状态else next_state=4b0010; /检测下一行4b0010:next_state=4b0011; /准备检测第一行4b0011: 检测第一行if(kin=4b0000) /如果本行无键按下,检测下一行next_state=4b0100; elsenext_state=4b0000; /否则进入空闲状态4b0100:next_state=4b0101; /准备检测第二行4b0101:if(kin=4b0000) /如果本行无键按下,检测下一行next_state=4b0110;else next_state=4b0000; /否则进入空闲状态4b0110:next_state=4b0111; /准备检测第三行4b0111:if(kin=4b0000)next_state=4b1000;/ 如果本行无键按下,检测下一行else next_state=4b0000;/ 否则进入空闲状态4b1000:next_state=4b1001;/ 准备检测第四行4b1001:if(kin=4b0000)/ 如果本行无键按下,进入空闲状态next_state=4b0000;elsenext_state=4b0000;/ 否则进入空闲状态default:next_state=4b0000;/其余时候处于空闲状态endcaseendalways(posedge clk)case(next_state)/下一个状态作为判断条件4b0000:scn=4b1111;/输出全行扫描信号4b0010:scn=4b0001;/扫描第一行4b0011:case(scn,kin)/对应03的编码8b00010001:data=4b0000;8b00010010:data=4b0001;8b00010100:data=4b0010;8b00011000:data=4b0011;endcase4b0100:/扫描第二行scn=4b0010;4b0101:/对应47的编码case(scn,kin)8b00100001:data=4b0100;8b00100010:data=4b0101;8b00100100:data=4b0110;8b00101000:data=4b0111;endcase4b0110:/扫描第三行scn=4b0100;4b0111:/8 9 复位 等号的编码case(scn,kin)8b01000001:data=4b1000;8b01000010:data=4b1001; 8b01000100:data=4b1110; /等号 8b01001000:data=4b1111;/ 复位endcase4b1000:/扫描第四行 scn=4b1000;4b1001:/case(scn,kin) 8b10000001:data=4b1010;/加号8b10000010:data=4b1011;/减号 8b10000100:data=4b1100;/乘号 8b10001000:data=4b0000)&(data=4b1010)&(data8b00001001)/结果大于九,将16进制数转换为BCD码 begin mid=buff;/将要转换的二进制数保存在中间寄存器中 temp=8b00000000;/将中间寄存器清零 for(i=1;i4b0100)/此时如果temp低四位大于4 begin temp3:0=temp3:0+4b0011;end/低四位加3 if(temp7:44b0100)/ 此时如果temp高四位大于4 begin temp7:4=temp7:4+4b0011;end/高四位加3 buff_reg,res=temp6:0,buff0;/取temp的低7位,buff的最低位并接,组成每次移位结束后转换成的BCD码 end buff=buff_reg,res;/循环结束,得到最终的BCD码 end eoc=1;end / 本次运算结束 sub:/减法 begin if(num1=num2)/如果被减数大于减数 begin buff_reg=num1+(num2)+4b0001);/取补码运算buff=4b0000,buff_reg;flag_neg=1b0;end/ 运算结果取第四位 高四位清零 标志为正数 else begin buff_reg=num2+(num1)+4b0001); /取补码运算buff=4b0000,buff_reg;flag_neg=1b1;end/ 运算结果取第四位 高四位清零 标志为负数if(flag_neg=1) buff7:4=4b1111;/若是负数,高四位存显示负号的编码/ eoc=1; / 运算结束 end mult:/乘法 begin buff=num1*num2;/用*实现 if(buff=8b00001001)/以下同加法部分BCD码的转换 begin mid=buff; temp=8b00000000; for(i=1;i4b0100) begin temp3:0=temp3:0+4b0011;end if(temp7:44b0100) begin temp7:4=temp7:4+4b0011;end buff_reg,res=temp6:0,buff0; end buff=buff_reg,res; end eoc=1;end div:/除法 begin if(num2=4b0000) buff=0;/若除数为0,结果清零 else /若除数不为零 begin buff_reg=num1;/将被除数放入寄存器中 res=0;/ 商赋零 for(i=0;i=num2)/若被除数仍大于除数 begin res=res+1;buff_reg=buff_reg+(num2)+4b0001);end/商加一,被除数减减数 else buff=buff_reg,res;/循环结束,将余数放入高四位,商放在低四位 end eoc=1;/运算结束 end end endcase end end endendendmodule注:由二进制数转换为BCD码算法是参考资料实现的,经本人推导得算法是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论