打算整理汇编语言与接口微机这方面的学习记录。本部分介绍8086的总线。
参考资料
讲道理这部分学校老师不强调这个,尤其是引脚(说我们记不住),而视频里老师讲得很多。
总线是计算机系统中传输各类信息的公共通道。按照功能层次,有四类:
片内总线
连接集成电路芯片内部各个功能单元的信息通路。
元件级总线(板内总线)
连接同一个插板内各个元件的总线,类似于PCB板上的走线。
内总线/系统总线(版级总线)
连接各个插件板(微处理之间器、主存储器、I/O接口)之间的通路。PCI、ISA、STD总线就是这一层次。
本章涉及也是这一层次的总线。
外总线/通信总线(I/O总线)
连接微机主体与I/O设备、仪表以及其他微机的总线。
视频里老师就讲到这里。课本上后面又讲解了几个系统总线,我对PCI比较感兴趣,操作系统课程设计也用到了这个总线。不过微机角度的PCI主要是结构、时序方面,对编程要求不大。

这块没学过,应该电信方面的数电学过,数字逻辑没有讲过。汇编这门课也没有讲(好像),不整理了。总而总之,这几个芯片是用于总线驱动、管理的封装好的电路。
8位数据单向缓冲器。可用作输入端口的缓冲。

8位数据双向缓冲器。可以用作总线连接的双向缓冲,也能当做74LS244来用(Dir接地,常0)。工程中也更常使用74LS245。

8位锁存器。常让OE接地==0。74LS374与之类似,只是G端变为CP时钟,时钟上升沿能够保持数据。

就是一个3-8译码器。
三个使能端,分别接入1-0-0才能正常工作,A0A2是输入端,输出Y1Y7的8根线。使能端1-0-0后,当A2 A1 A0输入110,则输出端的Y6显示低电平。

为什么又要说引脚呢?引脚就是微处理器级总线,微处理器 通过 微处理器级总线/引脚 与外面的IO电路连接,组成主机板系统,也就形成了系统级总线。
说实话这部分虽然打通数电微机和计组,但是,但这个角度比较难理解。从逻辑设计Verilog角度比较好理解时序,时序是人可以设计出来的,只不过到了8086微机中,Intel规定了一切。
整体上看,8086是40根引脚双列直插,部分引脚分时复用,有两种功能。电源电压为+5V±10%

RESET,复位信号,高电平有效。这里老师讲了8254时钟发生器,使得RESET和时钟上升沿一起到来(具体实现不关心了)。RESET信号的高电平有效至少要持续4T才能复位。
复位后,DS、ES、SS、IP、PSW、指令队列寄存器都清0,CS=0FFFFH。所以启动地址cs:ip是FFFF0H,其他通用寄存器值不确定。
对于FFFF0H,已经在内存的很高地址,所以接下来需要远程跳:
jmp far ptr xxxxh,向低地址跳转。51单片机的复位中PC寄存器直接置0就没有这个问题。
clk时钟输入引脚,8086的工作时钟<5MHZ。基本的总线周期是4个时钟周期,而非基本总线周期则是3个clk+1个等待周期。
MN/MX fei:工作模式选择。加高电平--最小方式;加低电平--最大方式。两种方式不同的是上图中24~31脚。
最小模式下,CPU对外部存储器、IO的读写等控制信号由CPU直接产生。适合构成单处理器系统。
最大模式下,不由CPU直接产生,而由8086CPU外部的总线控制器芯片8288产生。CPU通过26、27、28引脚来控制8288,8288来译码并产生相应控制信号。适合构成多处理器系统。

AD0AD15、A16/S3A19/S6:分时复用,地址线和存储器、IO的数据线;高四位地址线和状态线。

ALE 地址锁存:在上图的T1周期内电位变高。变高就知道了上面最重要的T1已经到来。在拿到T1来到的信息后就可以拿到16位地址,可以用74LS373来存储。
注意,这里已经开始和5.3节总线形成一起讲了。
用ALE来作74LS373的G引脚,可以将地址信息锁存4周期。3片74LS373(总线形成电路)输出的A0~A19就是系统级的总线了。

同理,上面介绍的是地址线,数据总线与其他控制信号结合(元件级总线、微处理器级总线),使用74LS245,就能产生数据系统级总线。
还有S3~S6。
S6没用
S5,状态寄存器的状态位IF置1,S5==1。
S4和S3反应CPU目前操作使用的是哪个段寄存器。

DT/(R fei):数据传输方向控制信号,CPU向外输出高电平,向内输入低电平。
它的时序:比如开始执行mov [BX],AX,向外输出,所以T1~T4高电平,之后高或低取决于下一条指令。
DEN fei:数据有效信号,数据传送进出CPU时,该信号低电平。
M/(IO fei):高电平为操作存储器,低电平选择IO
WR fei:数据信号有效后,产生低电平写信号,并在数据信号有效结束之前,完成写操作。
存储器读是 RD fei
下面画8086数据总线的形成电路:

READY:输入引脚,上升沿采集,下降沿测试,如果READY为低电平,则CPU就得知设备没有准备好,在正常总线周期的第四个T内进入TW等待周期。实现慢速设备和快速设备之间的同步
READY的下降沿要和CPU时钟的下降沿同步,设计比较复杂,这个过程会在8284内做,做到同步输出。

TEST fei:测试信号,低电平有效。CPU执行WAIT指令,每隔5个周期对TEST端进行测试,若高电平继续等待,低电平进入下一条指令。也能达到快慢设备的同步。
BHEfei/S7:高字节允许信号。低电平有效。低电平表示使用高8位数据线,高电平低8位数据线。
类似于ALE,注意在上图5.14中,ALE、BHE也锁存在74LS373,下图看看:

补充:8086和8088的区别:
- 内部,指令队列寄存器8086 6字节,8088 4字节
- 外部,8086 20根地址线,8088 16根地址线,最小方式下且8086 M/IOfei,8088 IO/Mfei
INTAfei(出,CPU回答是否响应可屏蔽中断的信号,会连回两次,第一次回复可响应中断,第二次问内容,此后数据线低八位拿数据),INTR(入)和NMI,不提了。
HOLD(输入),其他总线主控设备申请信号,高电平有效。
HLDA(输出),CPU对总线使用权的应答,如果让出总线,就高电平,此时CPU的三态引脚全部高阻态,与外界隔离。
控制总线的形成。还是参照上图5.14,相当于直接引出。
最大方式的总线结构如下图所示,与最小方式引脚功能有一点不一样,但方法基本一样:


引脚功能区分有:
S2 S1 S0,
最小模式下,CPU对外部存储器、IO的读写等控制信号由CPU直接产生。适合构成单处理器系统。
最大模式下,不由CPU直接产生,而由8086CPU外部的总线控制器芯片8288产生。CPU通过26、27、28引脚来控制8288,8288来译码并产生相应控制信号。适合构成多处理器系统。
这里最大方式的26、27、28就是S2 S1 S0。
见本文3.1之前一段。
24、25脚:QS1 QS2,表明CPU取指令时的状态。

30、31脚:RQfei/GT1fei,RGfei/GT0fei,等效于HLDA和HOLD。
当处理器以外的总线主控设备通过这两个引脚其中之一向CPU申请总线使用权,CPU回复让出,当主控设备停止使用让出总线时,再告知CPU自己让出了总线。
31脚的申请优先级高于30脚。
29脚:LOCKfei,如果某条指令,用户认为非常重要,不允许其他总线主控设备向CPU申请总线,就在该指令前方加一个<总线封锁前缀指令LOCK>,此时该29引脚就是低电平,通知总线主控设备总线已经封锁。
注意!之后的存储器扩展设计和IO扩展设计,都是基于这一章的系统级总线进行的。也就是直接展示的三大总线,具体分为高八位第八位、最高四位、控制引脚线等。
8086最小方式和8088最大方式都是重点
8086最小方式:

8086最大方式:

都可以再加上RESET和INTR等。
8088最小方式:没有BHEfei,数据总线8位

8088最大方式:

下面老师讲解了IBM--PC/XT系统,使用8088CPU且为多处理器系统(也就是最大模式)。
这个我们老师没有讲,而且年代久远现在可能也不考了。我只是对PC/XT这个总线感兴趣,可能对以后深入学习PCI有帮助。
不过讲道理,这里的总线,偏向于电路设计,而我想象的总线是软件协议。
这部分先不着急,先考试。
P178,课本。
此外我搜索了一个总线提纲:01 微型计算机总线 - 最全的接口技术提纲
PC/XT总线是将8088 CPU的引脚经过8282锁存器、8286发送接收器、8288总线控制器、8259中断控制器、8237DMA控制器以及其他逻辑电路的重新驱动和组合控制而形成的。
总线信号线共62条
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题: