简单微处理器的设计与实现
- 格式:pdf
- 大小:368.69 KB
- 文档页数:14
基于单片机的简易计算器设计摘要2关键字:80C51 LCD1602 4*4矩阵键盘计算器2第一章绪论21。
1系统开发背景21。
2系统开发意义21.3设计目的21。
4设计任务2第二章单片机发展现状22.1目前单片机的发展状况22。
1。
1单片机的应用场合32.2计算器系统现状42.3简易计算器系统介绍4第三章系统硬件设计及说明43。
1系统组成及总体框图53.2AT89S52单片机介绍63。
3其它器件介绍及说明83.3.1 LCD1602液晶显示83。
3.2 4*4矩阵扫描按键9第四章 PROTEUS模拟仿真11第五章系统硬件设计及说明11第六章软件设计116.1汇编语言和C语言的特点及选择116.2源程序代码12摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算机在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计主要以80C51单片机为控制芯片,用C语言进行编程实现,通过4*4矩阵键盘控制,输出用液晶屏LCD1602显示,该计算器可以实现一般的加减乘除四则混合运算。
关键字:80C51 LCD1602 4*4矩阵键盘计算器第一章绪论1.1 系统开发背景随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。
电子产品的更新速度快就不足惊奇了。
计算器在人们的日常中是比较的常见的电子产品之一。
如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好的为各个行业服务,成了如今电子领域重要的研究课题.1.2 系统开发意义今天,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店,办公室,学校……。
题目:简易计算器的设计学院:机电工程学院班级:机电111班姓名: X X学号: 111401040329指导老师: X X X日期: 2015 年 4 月 3 日课程设计目录摘要 (1)第一章绪论 (1)第二章方案论证与设计 (1)2.1 设计目标和实现方法 (1)2.2方案论证与设计 (2)第三章硬件模块介绍 (2)3.1 运算模块 (3)3.2 单片机(AT89C51)的部分引脚 (3)3.2.1 电源引脚 (3)3.2.2 输入输出(I/O)引脚 (4)3.3 输入模块 (4)3.3.1 键盘介绍 (5)3.4 显示模块 (6)3.5 排阻作用 (6)第四章软件设计 (6)4.1 LCD显示程序流程图设计 (6)4.2 读键输入程序流程图设计 (8)第五章仿真及调试 (8)总结 (9)参考文献 (10)附录1 简易计算器源程序 (11)附录2 仿真电路设计图 (20)摘要该设计系统是以AT89S51为单片机,用LCD显示屏显示的一个装置,用P3口作为输入端,外接4X4的键盘,通过键盘扫描来对输入数控制,并外接驱动电路,软件程序均采用C语言编写,便于移植与升级。
报告详细介绍了整个系统的硬件组成结构、工作原理和系统的软件程序设计,计算器将完成的功能有整数的加,减,乘,除等功能。
通过本课程设计使学生进一步巩固单片机原理与技术的基本概念、理论,分析问题的基本方法;增强学生的软件编程实现能力和解决实际问题的能力,使学生能有效的将理论和实际紧密结合,拓展学生在工程实践方面的专业知识和相关技能。
关键字:计算器 LCD显示屏 AT89S51第一章绪论近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。
与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。
影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。
第1篇实验名称:微机原理实验实验日期:2023年10月25日实验地点:计算机实验室实验教师:[教师姓名]实验学生:[学生姓名]班级:[班级名称]一、实验目的1. 理解微机原理的基本概念和组成结构。
2. 掌握微机硬件的基本操作和调试方法。
3. 熟悉汇编语言编程和程序调试技巧。
4. 通过实验加深对微机原理课程的理解,提高动手能力。
二、实验内容本次实验主要分为以下几个部分:1. 微机硬件系统结构认识:了解微机硬件系统的组成,包括CPU、内存、I/O接口等,熟悉各部件的功能和相互关系。
2. 汇编语言编程:学习汇编语言的基本语法和指令系统,编写简单的汇编程序,实现特定功能。
3. 程序调试:使用调试工具(如DEBUG)对汇编程序进行调试,查找并修正错误。
4. 微机原理实验:完成以下实验任务:1. 编写程序实现两个多位十进制数的相加。
2. 编写程序实现字符串比较功能。
3. 编写程序实现乘除法运算。
三、实验步骤1. 微机硬件系统结构认识:- 观察实验室中的微机硬件系统,了解各部件的连接方式和功能。
- 使用示波器检测实验装置的信号是否正常。
2. 汇编语言编程:- 学习汇编语言的基本语法和指令系统。
- 编写程序实现两个多位十进制数的相加,程序如下:```;加数DATA1 DB 3,4,5,6,7;被加数DATA2 DB 2,3,4,5,6;结果SUM DB 5 DUP(0);程序开始MOV CX, 5 ;循环次数MOV AL, 0 ;结果初始化为0MOV SI, OFFSET DATA1 ;加数地址MOV DI, OFFSET DATA2 ;被加数地址ADD_LOOP:ADD AL, [SI] ;加数加到AL寄存器ADC AL, [DI] ;进位加到AL寄存器MOV [DI], AL ;结果存回DI寄存器ADD SI, 1 ;加数地址加1ADD DI, 1 ;被加数地址加1LOOP ADD_LOOP ;循环;程序结束```- 编写程序实现字符串比较功能,程序如下:```;字符串1STRING1 DB 'Hello';字符串2STRING2 DB 'World';比较结果RESULT DB 0;程序开始MOV SI, OFFSET STRING1 ;字符串1地址MOV DI, OFFSET STRING2 ;字符串2地址CMP_LOOP:MOV AL, [SI] ;读取字符串1的当前字符CMP AL, [DI] ;与字符串2的当前字符比较 JNE NOT_EQUAL ;不相等则跳转到NOT_EQUAL INC SI ;字符串1地址加1INC DI ;字符串2地址加1LOOP CMP_LOOP ;循环MOV RESULT, 1 ;相等则将结果设置为1JMP END ;跳转到ENDNOT_EQUAL:MOV RESULT, 0 ;不相等则将结果设置为0END:;程序结束```- 编写程序实现乘除法运算,程序如下:```;被乘数DATA1 DB 10;乘数DATA2 DB 5;结果PRODUCT DB 0;程序开始MOV AL, [DATA1] ;被乘数加载到AL寄存器MUL [DATA2] ;乘数乘到AL寄存器MOV [PRODUCT], AL ;结果存回PRODUCT;程序结束```3. 程序调试:- 使用DEBUG工具对汇编程序进行调试,查找并修正错误。
《可编程逻辑器件与应用专题》实验讲义附实验指导书清华大学电子工程系2004.8.5第一章绪论§1.1 可编程ASIC综述为特定的产品或应用而设计的芯片被称为专用集成电路ASIC(Application Specific Integrated Circuits),除了全定制的专用集成电路外,目前有五种半定制的元件,可实现ASIC的要求,它们是:*可编程逻辑器件(PLD)*复杂可编程逻辑器件(CPLD)*现场可编程门阵列(FPGA)*门阵列(Gate Array)*标准单元(Standard Cell)在这些器件中,尤其是前三种器件的出现,使得电子系统的设计工程师利用相应的EDA软件,在办公室或实验室里就可以设计自己的ASIC器件,其中近几年发展起来的CPLD和FPGA格外引人注目。
这三种器件都具有用户可编程性,能实现用户需要的各种专门用途,因此被称作可编程专用集成电路。
半导体制造厂家可按照通用器件的规格大批量生产这种集成电路,作为一种通用集成电路,用户可以从市场上选购,再通过设计软件编程实现ASIC的要求。
由于这种方式对厂家和用户都带来了好处而受到欢迎,因此发展特别迅速,已经成为实现ASIC的一种重要手段。
随着半导体技术的迅速发展,从八十年代开始,构造许多电子系统仅仅需要三种标准电路:微处理器,存储器和可编程ASIC。
电子系统设计的这场革命是从70年代开始的,当时存储器已经作为标准产品进入市场,而80年代的微处理器也成为一种标准产品。
值得注意的是,微处理器和存储器作为电子系统的两个主要模块,一直都是可编程的。
但是组成电子系统的各种控制逻辑仍然需要大量的中小规模通用器件。
直到近十年来,随着可编程逻辑器件的出现,才给电子系统的控制逻辑提供了可编程的灵活性。
而可编程门阵列作为一种高密度,通用的可编程逻辑器件与它的开发系统一起为更多的电子系统逻辑设计确定了一种新的工业标准。
越来越多的电子系统设计工程师用CPLD或FPGA作为电子系统设计的第三个模块来实现一个电子系统。
基于硬件描述语言的简易CPU设计肖海燕;杨建波【摘要】Based on FPGA, the hardware description language Verilog and the top-to-down design method of modularization are adopted to achieve the design of a simple CPU logic controller, in which the software design and simulation are conducted for each module of CPU, and then each module is synthesized. The principle analysis is performed for the key function modules of CPU. The time-sequence simulation diagrams are given by means of compilation and adaptation with software MAX+plus II. The water lamp controlled by simple instructions was implemented by using the hardware device. The complete design of simple CPU based on Verilog was accomplished. This design has a strong flexibility and reliability. The CPU can achieve more functions as long as extending or amending the instructions appropriately.%基于可编程逻辑器件FPGA,利用Verilog硬件描述语言,采用自顶向下和模块化的设计方法,先将CPU的每个模块进行软件设计与仿真,再将每个模块综合起来,设计并验证了一种简单CPU逻辑控制器.对CPU关键功能模块进行了原理分析,并通过Max+-PlusⅡ软件编译适配,给出了时序仿真图.同时在硬件上实现了简单指令控制的流水灯实例,完成了完整的Verilog硬件描述语言的简易CPU设计.该设计具有很强的灵活性与可靠性,只要适当扩展或修改指令集就可以使CPU实现更多的功能.【期刊名称】《现代电子技术》【年(卷),期】2011(034)022【总页数】4页(P178-181)【关键词】FPGA;Verilog;CPU;时序仿真【作者】肖海燕;杨建波【作者单位】湖北师范学院物理与电子科学学院,湖北黄石435002;湖北师范学院物理与电子科学学院,湖北黄石435002【正文语种】中文【中图分类】TN710-34;TP2820 引言随着系统级FPGA 及系统芯片的出现,软、硬件协调设计和系统设计变得越来越重要。
简单微处理器的设计与实现刘言(湖北师范学院)摘要:本次设计完全用verilog硬件描述语言编写微处理器的各个部件,在顶层文件里将各个部件连接起来形成一个简单的微处理器,加上一些外围模块来实现一些功能。
一、设计任务和技术指标运用在“数字电路与逻辑设计”课程中学过的基本理论知识,设计并用可编程逻辑器件实现一个简单的八位操作数的微处理器。
完成微处理器硬件系统设计和指令系统设计两方面的任务,使微处理器能够实现两个不带符号位的八位二进制数原码相乘等功能。
二、简单介绍本次设计完全用verilog硬件描述语言编写微处理器的各个部件,在顶层文件里将各个部件连接起来形成一个简单的微处理器,加上一些外围模块来实现一些功能。
本次设计在合理性与实用性上没有考虑,只是为了达到技术指标,从原理上完成了一个简单的RISC_CPU设计。
1.微处理器硬件系统及原理A、内部组成微处理器硬件由一下八个基本部件组成:运算器、控制器、指令寄存分离器、时钟发生器、程序计数器、累加器、地址选择器、数据选择器。
时钟发生器CLK_GEN:利用输入时钟信号生成三个时钟信号送往对应的部件。
程序计数器PC:存放将要执行指令的地址。
指令寄存器IR:存放被执行指令的操作码和操作数的地址,直接供运算器与控制器。
控制器CON:根据操作码产生一系列时序逻辑信号,控制微处理器各个部件协调一致地完成每条指令相应的操作。
运算器ALU:当时钟上升沿来时对累加器与数据总线上的数进行加减乘除或逻辑运算。
累加器ACC:暂时存放运算结果。
地址选择器:选择输出到地址总线上的地址,是PC还是操作数地址。
数据选择器:选通ALU的运算结果输出到数据总线上去。
下面是内部连接图:(见最后一页)B、外围模块程序存储器ROM:存放程序指令。
数据存储器RAM:读取存放运算中间变量等临时数据。
输入输出特殊寄存器:数据的输入输出。
外部部分连接图:外围设备通过总线连接CPU2.处理器指令系统及功能处理器的基本指令字长为W位,指令的每一位从高到低用DW、DW-1、…D1、D0表示,有些微处理器的一条指令包括多个指令字长,即每条指令的长度不一样,例如Intel的80386等。
本实验为了简化设计,规定所有的指令都是单指令字的指令,且所有指令的长度都是8,即一个字节。
因此可以有8种操作,5根地址线寻址空间为32B。
指令的前3位为操作码,后5位为操作数的地址,寻址方式只设计了直接寻址。
详细如下表:指令助记符操作说明000_D DIV除A=A/(D)001_D JMP无条件跳转PC=D010_D ADD加A=A+(D)011_D SUB减A=A-(D)100_D MUL乘TA=A*(D)101_D LDA读A=(D)110_D STO写D=A111_D JNA条件跳转如果A=0,PC=D.三、各模块详细介绍1、时钟发生器:时钟发生器clkgen的波形见下图:2、程序计数器:程序计数器用于提供指令地址,以便读取指令,指令按地址顺序存放在存储器中。
有两种途径可形成指令地址:其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行JMP 指令后,需要形成新的指令地址。
复位后,指令指针为零,即每次CPU重新启动将从ROM的零地址开始读取指令并执行。
每条指令执行完需1个时钟,这时pc_addr已被增1,指向下一条指令。
如果正执行的指令是跳转语句,这时CPU状态控制器将会输出load_pc信号,通过load口进入程序计数器。
程序计数器(pc_addr)将装入目标地址(ir_addr),而不是增1。
Verilog代码:1.module counter(pc_addr,ir_addr,load,clock,rst);2.output[4:0]pc_addr;3.input[4:0]ir_addr;4.input load,clock,rst;5.reg[4:0]pc_addr;6.7.always@(posedge clock or posedge rst)8.begin9.if(rst)10.pc_addr<=0;11.else12.if(load)13.pc_addr<=ir_addr;14.else15.pc_addr<=pc_addr+1;16.end17.endmodule3、指令寄存器指令寄存器的触发时钟是clk1,在clk1的正沿触发下,寄存器将数据总线送来的指令存入opcode(高3位)或ir_addr(低5位)中。
但并不是每个clk1的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。
什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。
load_ir信号通过ena口输入到指令寄存器。
复位后,指令寄存器被清为零。
Verilog代码:1.module register(opcode,ir_addr,data,ena,clk,rst);2.output[2:0]opcode;3.output[4:0]ir_addr;4.input[7:0]data;5.input ena,clk,rst;6.reg[2:0]opcode;7.reg[4:0]ir_addr;8.9.always@(posedge clk)10.begin11.if(rst)12.begin13.opcode<=3'b000;14.ir_addr<=5'b00000;15.end16.else17.begin18.if(ena)19.begin20.opcode<=data[7:5];21.ir_addr<=data[4:0];22.end23.end24.end25.endmodule4、运算器根据输入的8种不同操作码对两个数据(data、accum)分别实现相应的运算,结果由alu_out 输出。
Verilog代码:1.module alu(alu_out,zero,bz,data,accum,alu_clk,opcode);2.output[7:0]alu_out;3.output zero,bz;4.input[7:0]data,accum;5.input[2:0]opcode;6.input alu_clk;7.reg[7:0]alu_out,tmp;8.reg bzt;9.initial bzt=0;10.11.parameter DIV=3'b000,12.JMP=3'b001,13.ADD=3'b010,14.SUB=3'b011,15.MUL=3'b100,16.LDA=3'b101,17.STO=3'b110,18.JA=3'b111;19.20.assign zero=!accum;21.always@(posedge alu_clk)22.begin23.casex(opcode)24.DIV:alu_out<=accum/data;25.JMP:alu_out<=accum;26.ADD:alu_out<=data+accum;27.SUB:alu_out<=accum-data;28.MUL:begin29.if(!bzt)30.begin31.{tmp,alu_out}<=data*accum;32.bzt<=1;33.end34.else35.begin36.alu_out<=tmp;37.bzt<=0;38.end39.end40.LDA:alu_out<=data;41.STO:alu_out<=accum;42.JA:alu_out<=accum;43.default:alu_out<=8'bxxxx_xxxx;44.endcase45.end46.assign bz=bzt;47.endmodule5、累加器累加器用于存放当前的结果,它也是alu其中一个数据来源。
复位后,累加器的值是零。
当累加器通过ena口收到来自CPU状态控制器load_acc信号时,在clk1时钟正跳沿时就收到来自于数据总线的数据。
Verilog代码:1.module accum(accum,data,ena,clk,rst);2.output[7:0]accum;3.input[7:0]data;4.input ena,clk,rst;5.reg[7:0]accum;6.7.always@(posedge clk)8.begin9.if(rst)10.accum<=8'b0000_0000;//Reset11.else12.if(ena)//当CPU状态控制器发出load_acc信号13.accum<=data;//接收来自ALU的数据14.end15.16.endmodule6、地址选择器地址选择器用于选择输出的地址是PC(程序计数)地址还是数据/端口地址。
每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址。
后4个时钟周期用于对RAM或端口的读写,该地址由指令中给出。
地址的选择输出信号由fetch提供。
Verilog代码:1.module addrchoose(addr,fetch,ir_addr,pc_addr);2.output[4:0]addr;3.input[4:0]ir_addr,pc_addr;4.input fetch;5.6.assign addr=(fetch)?pc_addr:ir_addr;7.8.endmodule7、数据选择器:累加器的数据只有在需要往RAM区或输出口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。
所以任何部件往总线上输出数据时,都需要一控制信号。
而此控制信号的启、停,则由CPU状态控制器输出的各信号控制决定。
数据控制器何时输出累加器的数据则由状态控制器输出的控制信号datactl_ena决定。
Verilog代码:1.module datactl(data,in,ena);2.output[7:0]data;3.input[7:0]in;4.input ena;5.6.assign data=(ena)?in:8'bzzzz_zzzz;7.endmodule8、控制器控制器是最重要的模块,它CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。
CPU何时进行读指令读写I/O端口,RAM区等操作,都是由状态机来控制的。
状态机的当前状态,由变量state记录,state的值就是当前这个指令周期中已经过的时钟数。
第1个时钟:读指令,将rd与load_ir置高电平,其余为低电平。