简单微处理器的设计与实现
- 格式: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 及系统芯片的出现,软、硬件协调设计和系统设计变得越来越重要。
单片机控制系统的设计和实现单片机是一种集成电路,经常被用于设计和实现各种控制系统。
这篇文章将深入讨论单片机控制系统的设计和实现。
一、单片机控制系统的基础知识单片机控制系统的基础是单片机的控制功能。
单片机是一种集成电路芯片,它集成了微处理器、存储器和输入输出接口等组件,可以通过编程控制其输入输出,完成各种控制功能。
单片机一般采用汇编语言或高级编程语言进行编程,将程序保存在存储器中,通过输入输出接口与外部设备交互。
单片机控制系统一般包括硬件和软件两个部分。
硬件部分包括单片机芯片、外设、传感器等,软件部分则为程序设计和开发。
二、单片机控制系统的设计步骤1. 确定系统需求:首先要明确需要控制什么,控制什么范围以及需要什么样的控制效果,从而确定控制系统的需求。
2. 选定合适的单片机:根据控制系统的需求,选择功能强大、接口丰富且价格合理的单片机,以便实现复杂的控制功能。
3. 确定硬件电路:根据单片机的控制需求设计相应的硬件电路,包括传感器、执行器、通信接口等。
4. 编写程序代码:将控制逻辑转化为编程指令,使用汇编语言或高级编程语言编写程序代码。
5. 完成程序烧录:将编写好的程序代码烧录到单片机芯片中,使它能够正确地执行控制任务。
6. 测试调试:将单片机控制系统连接至外设并进行测试和调试,优化程序代码及硬件电路,确保系统正常运行。
三、实例:智能家电控制系统的设计和实现以智能家电控制系统为例,介绍单片机控制系统的设计和实现。
智能家电控制系统主要负责监测家庭环境,对家用电器进行自动化控制,为用户提供便利。
1. 硬件设计:智能家电控制系统的硬件设计主要包括传感器、执行器和通信接口等。
传感器:设计温度传感器、湿度传感器、气压传感器、烟雾传感器等,用于监测家庭环境的变化情况。
执行器:通过单片机控制继电器、电机等执行器,实现对室内照明、风扇、空调等家电的自动控制。
通信接口:通过单片机的网络通信模块,实现系统与家庭无线网络连接,允许用户通过访问互联网从外部对家电进行远程控制。
《微处理器系统结构与嵌入式系统设计》教学大纲教案课程英文名称:Microcomputer System Theory and Embedded System Design课程代码:E0130340 学时数:64 学分数:4课程类型:学科基础课程适用学科专业:工学,仪器仪表类、电气类、电子信息类、自动化类、计算机类各专业以及机械类、测绘类、航空航天类、能源动力类、交通运输类、生物医疗工程类各相关专业先修课程:数字逻辑设计及应用,高级语言程序设计,软件技术基础执笔者:编写日期:审核人:一、课程简介本课程是工学电子电气信息工程及相关专业的学科基础课程,与实践类课程《微处理器系统与嵌入式系统综合设计》(课程代码:K0175010)互为配套课程。
本课程在阐述通用微处理器系统的架构、组成及工作原理的基础上,介绍了基于ARM CPU的、现代嵌入式微系统的设计与实现技术。
课程全面涵盖了微处理器、存储器、总线及接口等计算机子系统,重点体现了嵌入式系统/片上系统中硬件电路和软件程序的协同工作原理与设计方法,具体讲述了微处理器中数据通路、控制部件及指令的实现技术、分层存储器设计技术、输入/输出接口控制技术,以及ARM微处理器程序设计技术、异常处理技术,嵌入式系统引导程序设计、接口驱动程序设计及操作系统移植等内容。
This course is a basic subject-centered course in electrical and electronic information engineering and other related specialties. It will be helpful to understand the knowledge of the co-requisite experimental course K0175010 - Microprocessor and Embedded System Laboratory.The architecture, organization and operation principles of general-purpose microprocessor systems will be elaborated, as well as the design and implementation technology for current embedded microsystems based on ARM CPU. The subsystems in a computer, including microprocessor, memories, buses, input/output interfaces and others, will be completely involved. The primary goal of this course is to studying the cooperated relationship between the hardware and software in an embedded system or a System-on-Chip, by discussing in detail on the design method for data path and the controller inside CPU, the implementation technology for hierarchy storage system, the control mode for peripherals, and the program skill for APPs, exception handlers, boot codes, drivers and operating system transplantation, and so on.二、课程目标本课程旨在培养学生深入理解微处理器芯片与嵌入式系统的架构、组成及工作原理,熟练掌握现代嵌入式微系统中硬件电路和软件程序的基本分析、设计与实现方法。
简述risc指令集结构的设计原则RISC指令集结构是微处理器设计中重要的一种指令集结构,它可以有效提高微处理器整体的处理速度。
它的设计原则概括为四个单词:精简,标准,异类和可编程性。
一、精简原则精简原则是衡量RISC指令集结构设计的基础原则。
传统的指令集大多由复杂的指令组成,要求微处理器完成复杂操作。
但RISC指令只设计一些最基本的操作,从而减轻处理器的处理压力,提高运算效率。
指令结构的精简使得RISC的运行速度要比现有的指令集快上许多,从而提高了微处理器的处理能力。
二、标准原则RISC指令集的标准原则,是指在设计过程中,每条指令的格式和长度相同,这样可以大大减少指令的处理时间,从而提高处理器的处理速度。
指令也是一致的,并且可以在不同的平台上执行,这样可以大大方便应用程序的开发。
三、异类原则异类原则是指RISC指令集中要求指令有一定的异类效应,即不同的指令在运行的过程中可以相互交换,使微处理器的运行更加高效。
RISC指令集中没有复杂的指令,但是它拥有与复杂指令组合相同功能的简单指令。
这样可以大大降低微处理器的复杂度,提高运算效率。
四、可编程性原则RISC指令集的可编程性原则是其中最重要的设计原则。
可编程性原则要求RISC指令集具有可编程性。
这意味着它可以用许多种语言来实现,如C语言、FORTRAN语言等。
这样可以有效提高程序的可读性和可维护性,让应用程序的开发成为可能。
综上所述,RISC指令集结构的设计原则有精简原则、标准原则、异类原则和可编程性原则。
RISC指令集的设计是实现高效运算的关键,它能够大大减少处理器的处理压力,提高处理器的处理速度,从而使微处理器能够在更多的应用中发挥作用。
课程设计设计名称: 微型计算机技术及应用——简易计算器学院:信息工程学院课程:微型计算机技术及应用姓名:学号:班级:2014级计算机科学与技术二班目录摘要 (3)一、前言 (4)1.1背景 (4)1.2项目介绍 (4)二、课程设计的目的与任务 (5)2.1设计目的 (5)2.2设计任务 (5)三、设计过程 (5)3.1基础理论 (5)3.1.1DOSBox简介 (5)3.1.2中断 (8)四、设计 (11)4.1总体方案 (11)4.2原理框图 (12)4.3程序代码 (13)五、系统模块详细设计与调试 (24)5.1系统模块详细设计 (24)5.1.1设置屏幕显示方式 (24)5.1.2显示主菜单 (24)5.1.3从键盘接收一个数字 (24)5.1.4接收键入用于计算的数 (25)5.1.5显示结果 (25)5.1.6子程序A2——将数的ASCII码转为二进制数 (25)5.1.7将计算结果的二进制数转换为对应的十进制数ASCII码并输出显示(A3程序段) (27)5.2程序编译、运行与调试 (27)六、设计总结 (29)七、参考文献 (31)摘要本次课程设计是通过使用DOSBox汇编语言编程软件实现的利用汇编语言编写的较为复杂的程序设计。
该课程设计主要是设计一个较为简单的计算器,界面显示要求用户从键盘上分别输入两个随机数,完成四则运算,然后将运算结果显示到屏幕上。
该设计智能实现简单的正整数之间的四则运算,无法对小数进行精确地识别。
而除法运算可以精确到3位小数,减法可以显示出负数的结果。
采用DOS调用(INT 21H)来完成键盘的输入和屏幕的输出。
通过这次的课程设计能够进一步加深对专业知识和理论知识学习的认识和理解。
关键词:DOSBox;微机原理;计算器;汇编语言一、前言1.1背景计算器是现代人发明的可以进行数字运算的电子机器。
现代的电子计算器能进行数学运算的手持电子机器,拥有集成电路芯片,但结构比电脑简单得多,可以说是第一代的电子计算机(电脑),且功能也较弱。
简单微处理器的设计与实现刘言(湖北师范学院)摘要:本次设计完全用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置高电平,其余为低电平。