存储器是用来存储信息的部件,是计算机的重要组成部分,常见的半导体存储器类型主要有ROM和RAM:ROM是Read Only Memory(只读存储器)的缩写,RAM是Random Access Memory(随机存取存储器)的缩写。ROM存储器一般容量较大,在系统停止供电的时候仍然可以保持数据;ROM只能读出数据,不能写入数据。而RAM存储器一般容量较小,在系统掉电之后就丢失数据;RAM即可读出数据,又可写入数据。
图1所示的存储器电路由ROM、RAM及两条总线构成:ROM存储器是2764(8K×8bit),RAM存储器是6116(2K×8bit),两条总线分别是12位地址总线ABUS_[0…11]和8位数据总线DBUS_[0…7],其中数据总线上的8位数值由两个4位的红色数码管来显示。
ROM芯片2764的数据线D0-D7接到数据总线,地址线A0-A8由地址锁存器74LS273给出,用来对ROM片内存储单元寻址。其余地址线A9-A12接地;2764有两个控制端:#CE(片选)、#OE(读);RAM芯片6116的数据线D0-D7接到数据总线,地址线A0-A7由地址锁存器74LS273给出,用来对RAM片内存储单元寻址。其余地址线A8~A10接地; 6116有三个控制端:#CE(片选)、#OE(读)、#WE(写)。
图1. 存储器电路
存储器电路设计的最重要环节是存储器与地址总线的连接,因为连接方式决定了存储器地址空间的映射关系,即决定了每个存储器芯片在整个存储空间中的地址范围。12位地址总线的理论地址空间为4K(000H-FFFH),本实验分配其中最低的512地址为ROM区(000H-1FFH),最高的128B地址为RAM区(F80H-FFFH),其余留空,如下表1所示:
表1. 存储器的地址空间范围
存储器电路的设计一般将地址总线区分为低位地址线和高位地址线两部分:低位地址线直接和存储器芯片的地址信号连接作为片内地址译码,而高位地址线的连接主要用来产生片选信号(称为片间地址译码),以决定每个芯片在整个存储系统中的地址范围。
在上图1的存储器电路中,12位地址总线分为低8位地址线和高4位地址线。低8位地址线ABUS_0-7分别与ROM和RAM芯片的地址线A0-A7共用;高4位地址线ABUS_8~11则通过两个3-8译码器进行译码。低位3-8译码器U13最低2位之一输出有效,则片选ROM芯片(“负逻辑”判断,使用与门);同样,高位3-8译码器U15最高1位输出与地址线A7同时有效,则片选RAM芯片(“负逻辑”判断,A7先反向,再使用或门)。值得注意的是:相同的存储器地址空间映射,可以有不同的片选电路实现方法(例如使用“正逻辑”判断)。
本书借用8051单片机的伪汇编指令来实现如何把一组程序或数据一次性批量导入ROM中,使ROM在往后的实验中可以充当程序或数据存储器的角色。具体操作步骤如下:
1)新建txt文件,把.txt后缀改名为.asm后缀,然后按照下列伪汇编指令格式输入数据:
注意:上述代码中 的语句“ORG xxxxH”规定该语句后所跟数组存储的首地址,数组末尾必须以其他ORG语句或“END”作为结束。在asm文件中可以使用多个“ORG”语句来规定在存储器的不同位置存放不同长度的数组。在“ORG”语句后的“DB xxxxxxxxB”或“DB xxH”语句都表示一个存储单元存放的8位数据,前者是二进制,x表示0或1;后者是十六进制,x表示09和AF(注:若十六进制数据xxH大于A0H,则要写成0xxH,例如“DB 0A0H”)。
2)在proteus仿真环境的菜单栏里点击 Source Code图标(红色圈标注的地方),弹出Source Code标签页,如下所示:
如果该项目没有打开过asm文件,则打开的标签页为空,需要在菜单栏里选择Source Code->Create Project,弹出的对话框如下图(左)所示。此处,在Family选项中选择8051, Contoller选项中选择80C51,则Compiler选项会自动选择ASEM-51;注意:下方Creat Quick Start Files选项不勾选!最后按下“确定”按钮。
注意:如果使用的proteus版本内没有支持8051内核,则在Source Code的Family和Controller选项中找不到8051/80C51的内容。这意味着在proteus内无法编译asm文件,必须借助支持8051内核的第三方编译软件(例如Keil 软件,1k以内代码有免费版本)把asm文件编译成hex文件,再导入proteus的存储器,生成hex文件后,请直接跳到以下步骤(7)操作。
3)如下图(右)所示,标签页上会出现“”*80C51()”的新project后,右键单击下方的Source Files,在弹出菜单中选择Add files(或Import Existing File)选项,在弹出的视窗中选择所需的asm文件,按确定就添加到当前的project中。
4)在project中已经添加的asm文件上双击,右侧会打开asm文本内容,如下图(左)所示。如果该project之前已经添加且编译过asm文件,则弹出的Source Code标签页右侧会直接显示asm文本内容,可以直接对asm文本内容进行修改和保存。如果要更换asm文件,可以右键单击asm文件,菜单列表中选择Remove file删除当前asm文件,然后选择Add files(或Import Existing File)选项,在弹出的视窗中重新选择新的asm文件。
5)如下图(右)所示,若第一次编译asm文件,则右键单击asm文件,在弹出菜单点击Project Settings,弹出框的controller选项选择80C51,注:要去掉勾选Embed files(或Attach files)!确保编译生成的hex文件在project当前目录下,最后点击OK选项。
6)然后,右键单击asm文件,在弹出框内点击Build Project执行编译。编译成功后,在下方的显示栏里会出现“Compiled successfully!”字样。此时,在项目当前文件夹的子文件夹80C51的孙文件夹Debug里面,就有编译后生成的hex二进制文件(请注意看文件的修改日期,确认是最近编译的文件)。该hex文件默认编译后的文件名为Debug.hex。
注意:一个良好的编程习惯是每次编译生成hex文件后,就重命名为跟asm源程序一致的文件名,然后与同名asm源程序放在另外的固定目录下。否则下一次编译其他asm源程序的时候,会在相同路径生成重名的Debug.hex,把以前编译的hex文件覆盖。
7)双击ROM 芯片,弹出如下图所示的对话框:在Image File中选择所需烧写的hex文件,点击OK,ROM加载成功,操作结束。
注意:尽量避免直接加载路径“80C51Debug”里的Debug.hex文件,因为每一次编译asm源程序,Debug.hex都会自动刷新。但是,相同的文件名很容易混淆,难以确定加载的hex文件与哪个asm源文件对应。最好在每次编译完成后,把Debug.hex文件从路径“80C51Debug”里取出,另存在其他文件夹中,并且根据源文件asm的内容重命名编译生成的hex文件。
8)启动proteus仿真,在仿真过程下按暂停;点击菜单栏里的Debug,在弹出的菜单列表最下方有“Memory Contents-ROM/RAM”,如下图所示。注意:仿真工程有多少个存储器,就有多少个Memory Contents可供选择。点击需查看的Memory Contents选项,则弹出其对应的存储器内容:其中蓝色为该行的首地址(对应的是左边第一个黑色数据xxH),黑色为存储单元中的数据,按顺序从左到右,从上到下排列显示。可以通过调整显示框的宽度来改变蓝色的行首地址显示,方便查看某一个固定的地址。值得注意的是,图中显示的存储器地址是存储器地址线(A0~A7)所定义的地址。而实际的地址空间不仅要看存储器的地址线,还要参考各存储器片选信号的译码逻辑电路。此外,除非被新的hex文件覆盖,否则通过hex文件烧写定义的数据段会永远存在。所以,上图中显示的二进制数据内容比当前hex文件对应的asm源程序中定义的数据要多。
如果仿真出现下图所示的报错,可能是项目路径里面原来加载hex文件的路径被取消,或是被移动到不同路径文件夹,或是文件名变了。特别是在项目里面有多个ROM需要加载的时候,要留意在移动或修改项目的时候不要破坏原有的ROM加载路径。
本文的内容节选自作者编撰的教材专著《基于Proteus的计算机系统实验教程——逻辑、组成原理、体系结构、微机接口》(机械工业出版社),更详细的内容可以直接在书中查阅。
读者如有兴趣,可以在 当当网图书, 京东图书,亚马逊上搜索作者姓名赖晓铮即可找到这本著作。
本书详细描述了在proteus虚拟仿真环境中,从逻辑电路开始,一步一步构造运算器、存储器、控制器,最终用三种CPU体系架构(微程序、硬布线、流水线)实现了一个8位的CPU。并且,这个CPU不仅可以做逻辑、算术运算,拥有循环、分支、堆栈等程序结构,还可以完整实现对8086所有外设的控制,即替代8086完整实现了传统《微机原理》里讲到的所有外设实验。
本书的全部proteus工程文件,PPT,实验视频以及配套的两种形式课程设计(纯汇编、硬件改动)的资料都放在 百度网盘,提取密码:34ad
广州风标为本书配套了实验箱(如下图所示),可以让学生在电脑的proteus虚拟仿真环境中设计CPU或选择已有的8086、8051、ARM等CPU模型,然后通过虚拟总线映射到实验箱的物理总线,控制实验箱面板上的真实外设。有兴趣的读者可以自行联系 广州风标教育技术股份有限公司。
作者:华南理工大学 赖晓铮教授