首页> 中国专利> 基于MCS-51架构的16M字节程序存储器寻址空间扩充方法

基于MCS-51架构的16M字节程序存储器寻址空间扩充方法

摘要

本发明涉及一种16M字节程序存储器寻址空间扩充方法。本方法是基于8051体系,采用分时复用的方法,对程序存储器进行分段辅助设计,将可寻址16M字节的程序存储空间划分为256段,段地址由高八位程序地址决定,共有256个段地址,每一个段内有64K字节的程序寻址空间,由程序地址的中八位和低八位程序地址决定段内地址,在地址总线不增加,和整个指令体系不变的情况下,使外部程序存储器寻址空间从64K字节扩充到16M字节,从而使基于MCS-51架构的微控制器能够运行大量算法极其复杂的程序。本16M字节程序存储器寻址空间扩充方法可应用于基于8051指令体系的单片微控制器,亦可应用于其它微控制器、微处理器等领域。

著录项

  • 公开/公告号CN1728109A

    专利类型发明专利

  • 公开/公告日2006-02-01

    原文格式PDF

  • 申请/专利权人 上海大学;上海电力学院;

    申请/专利号CN200510028228.2

  • 发明设计人 胡越黎;曹家麟;冉峰;景蔚亮;

    申请日2005-07-28

  • 分类号G06F12/02(20060101);

  • 代理机构上海上大专利事务所;

  • 代理人何文欣

  • 地址 200444 上海市宝山区上大路99号

  • 入库时间 2023-12-17 16:59:29

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2013-09-18

    未缴年费专利权终止 IPC(主分类):G06F12/02 授权公告日:20080130 终止日期:20120728 申请日:20050728

    专利权的终止

  • 2008-01-30

    授权

    授权

  • 2006-03-29

    实质审查的生效

    实质审查的生效

  • 2006-02-01

    公开

    公开

说明书

技术领域

本发明涉及一种基于MCS-51架构的16M字节程序存储器寻址空间扩充方法,可应用于基于8051指令体系的单片微控制器,亦可应用于其它微控制器、微处理器等领域。

背景技术

程序存储器(Code Memory)是用来存放用户指令程序的一段空间,微控制器或是微处理器通过执行这些指令程序,从而实现和完成某种特殊的功能和任务。

基于Intel MCS-51架构的微处理器有16位地址总线,可以寻址64K字节的程序存储器空间。根据系统的特定需要和相应的功能要求,这个64K字节的空间一般包括程序主模块以及许多的调用子模块和中段子模块。对于含有算法及其复杂、程序量巨大的系统,主程序有可能包括许多子模块,子模块还有可能嵌套其他子模块,由于算法很复杂,所以每个子模块的容量也极有可能非常庞大,譬如数字图像处理系统,数字图像处理本身就含有海量的算法,且每种算法可能非常复杂,如果此系统还包括知识库的管理、知识自学习等功能,那么64K字节的程序存储器空间将远远不能满足此类系统的需求。又由于基于Intel MCS-51架构的微控制器是应用极为广泛的一类处理器,使用历史悠久,有丰富的第三方支持软件和仿真工具,为广大工程师所熟悉,因此如能在既不改变指令系统又不增加地址总线的情况下,扩充程序存储器的寻址空间到16M字节,将大大提高8051架构微控制器的性能。

发明内容

本发明的目的在于提供一种基于MCS-51架构的程序存储器寻址空间扩充方法,在地址总线不增加,和整个指令体系不变的情况下,外部程序存储器寻址空间从64K字节扩充到16M字节,从而使基于MCS-51架构的微控制器能够运行大量算法极其复杂的程序。

为达到上述目的,本发明的构思如下:

要实现基于MCS-51架构的16M字节程序存储器的寻址能力,不修改与标准8051相兼容的指令集,而采用将程序存储器进行分段的辅助设计方法。即将可寻址16M字节的程序存储空间划分为256个段,段地址由高八位程序地址决定,共有256个段地址。每一个段内有64K字节的程序寻址空间,由程序地址的中八位和低八位程序地址决定段内地址。程序地址寄存器PROGA(Program Address)设计成由段地址和低16位地址组成的24位地址,使之可以访问16M字节的程序存储空间;程序指针计数器PROGRAM_COUNTER(Program Counter)保持低16位地址不变。

根据上述构思,本发明采用下述技术方案:

一种基于MCS-51架构的16M字节程序存储器寻址空间扩充方法,基于8051体系,其特征在于采用分时复用的方法,对程序存储器进行分段辅助设计,将可寻址16M字节的程序存储空间划分为256个段,段地址由高八位程序地址决定,共有256个段地址,每一个段内有64K字节的程序寻址空间,由程序地址的中八位和低八位程序地址决定段内地址,在地址总线不增加,和整个指令体系不变的情况下,对外部程序存储器寻址空间从64K字节扩充到16M字节;

其具体步骤为:

a.设定段地址特殊功能寄存器ROM_DUAN,来确定高八位程序地址;

b.根据段地址产生的条件和情况的不同,对程序存储器寻址空间扩充操作中高八位程序地址的产生考虑以下四种情况,并设定相关信号:

(a)用户直接给出的段地址;

(b)中断/调用操作后返回的段地址;

(c)段地址自增;

(d)相对跳转后的段地址;

c.程序指针计数器PROGRAM_COUNTER的确定;

d.程序地址寄存器PROGA的确定。

上述的设定段地址特殊功能寄存器ROM_DUAN方法为:

确定段地址特殊功能寄存器ROM_DUAN的地址为FFH,大小为8位,程序存储器16M字节寻址空间的高八位地址由此寄存器内的内容决定。

系统复位后,ROM_DUAN的值为#00H;它的值除了可以由用户自行定义以外,还可以由系统自动更新,来确定下一条指令地址的高八位。

上述的根据段地址产生的四种情况下设定相关信号的具体步骤为:

a)与用户自定义段地址内容有关的寄存器和信号:

REG_RESULT:用户自行定义的段地址内容8位寄存器;

ROM_DUAN_WRITE:对段地址特殊功能寄存器ROM_DUAN进行写操作的写有效信号(低电平有效);

当ROM_DUAN_WRITE信号为低电平时,REG_RESULT的值写入段

地址特殊功能寄存器ROM_DUAN内。

b)两个由堆栈内弹出的8位数据:

XRAMDI:从外部数据存储器堆栈弹出的段地址内容;

SOURCE_DI:从内部数据存储器堆栈弹出的段地址内容;

当ISP_INUSE信号为“1”时,SOURCE_DI的值在C1P3先传送给中间变量寄存器ROM_DUAN_RET,先暂存24位程序地址的高八位,在CLP2由ROM_DUAN_RET寄存器传给段地址特殊功能寄存器ROM_DUAN;当ISP_INUSE信号为“0”时,XRAMDI的值在C2P2先传送给中间变量寄存器ROM_DUAN_RET,先暂存24位程序地址的高8位,在CLP2由ROM_DUAN_RET寄存器传给段地址特殊功能寄存器ROM_DUAN。

ISP_INUSE是一个判断信号,值为1时,表示堆栈处在内部数据存储器上;值为0时,表示堆栈处在外部数据存储器上。

c)ROM_0:用户无法访问,由硬件自动产生的值,保存着段地址自增一以后的值;

当程序顺序执行(无跳转和调用情况),发生跨段情况时,既当程序指针计数器PROGRAM_COUNTER的当前值为#0FFFFH时,并且下一个程序地址寄存器NEXT_PROGRAM_ADDR的值为#0000H时,ROM_0的值赋给段地址特殊功能寄存器ROM_DUAN,形成新的程序地址寄存器PROGA高八位值。

d)ROM_1:用户无法访问,由硬件自动产生的值,保存着段地址自减一以后的值;

当程序执行相对跳转指令后,如果发生了跨段的情况,即程序指针指向了下一个段或上一个段时,段地址特殊功能寄存器会自动更新。如果向下跳转,那么ROM_0的值赋给ROM_DUAN;如果向上跳转,那么ROM_1的值赋给ROM_DUAN。

上述程序确定指针计数器PROGRAM_COUNTER的具体步骤为:

16位程序指针计数器PROGRAM_COUNTER由下一个程序地址寄存器NEXT_PROGRAM_ADDR组成。

上述的确定程序地址寄存器PROGA的具体步骤为:

24位程序地址寄存器PROGA由段地址特殊功能寄存器ROM_DUAN和下一个程序地址寄存器NEXT_PROGRAM_ADDR组成。

程序地址寄存器PROGA除执行MOVCS指令外,后十六位地址均与程序指针寄存器PROGRAM_COUNTER相同;当执行诸如MOVC A,@A+PC或MOVC A,@A+DPTR指令的过程中,PROGRAM_COUNTER寄存器的值始终不变,而PROGA寄存器的内容改变为由8位段地址和16位(A+PC)或(A+DPTR)组成,使微控制器能从更新的地址处读取数据赋值给累加器A。

上述的REG_RESULT寄存器的具体设置步骤为:

8位REG_RESULT寄存器的值来自于8位程序存储器输入数据寄存器PROGDI,PROGDI的内容是由外部程序存储器数据线输出的8位数据组成的,既有用户自己定义的段地址的内容。PROGDI与PORT0I相连,PORT0I是微控制器的8位数据输入口,它可以连接在外部程序存储器数据输出线上。

上述的ROM_DUAN_WRITE信号线的具体设置步骤为:

1位ROM_DUAN_WRITE信号由1位特殊功能寄存器写使能信号SFR_WRITE_EN[27]决定;当8位目的地址寄存器DESTIN_ADDR的值为#7FH时,SFR_WRITE_EN[27]被置零,当DESTIN_ADDR的值为其他任何值时,SFR_WRITE_EN[27]被置一;DESTIN_ADDR的值由8位程序存储器输入数据寄存器PROGDI决定,PROGDI连在PORT0I上,PORT0I是微控制器的8位数据输入口,它可以连接在外部程序存储器数据输出线上。

上述的XRAMDI和SOURCE_DI寄存器的具体设置步骤为:

当RET/RETI指令执行后,上一次被保护的现场高八位地址就会从堆栈中弹出,XRAMDI中保存的内容是从外部数据存储器堆栈内弹出的数据;SOURCE_DI中保存的内容是从内部数据存储器堆栈内弹出的数据。

8位XRAMDI的值由PORT0I确定,PORT0I是微控制器的8位数据输入口,它可以连接在外部数据存储器数据输出线上;8位SOURCE_DI与内部数据存储器的数据输出线连在一起。

上述的ROM_0和ROM_1寄存器的具体设置步骤为:

段地址特殊功能寄存器ROM_DUAN内容加一以后的值赋给8位寄存器ROM_0;段地址特殊功能寄存器ROM_DUAN内容减一以后的值赋给8位寄存器ROM_1。

上述的下一个程序地址寄存器NEXT_PROGROM_ADDR的具体设置步骤为:

16位下一个程序地址寄存器NEXT_PROGRAM_ADDR保存着下一条指令的操作码或操作数的低16位地址。

上述的数据指针特殊功能寄存器DPTR的设置方法为:

16位数据指针特殊功能寄存器DPTR由8位DPL寄存器和8位DPH寄存器组成。

确定特殊功能寄存器DPL的地址为82H,大小为8位,程序存储器16M字节寻址空间的低八位地址由此寄存器内的内容决定。

确定特殊功能寄存器DPH的地址为83H,大小为8位,程序存储器16M字节寻址空间的中间八位地址由此寄存器内的内容决定。

系统复位后,DPL和DPH的值均为#00H;它们的值除了可以由用户自行定义以外,还可以由系统自动更新。

本发明与现有技术相比较,具有如下显而易见的突出实质性特点和显著优点:本发明是基于8051体系,采用分时复用的方法,在地址总线不增加,和整个指令体系不变的情况下,外部程序存储器寻址空间从64K字节扩充到16M字节,从而使基于MCS-51架构的微控制器能够运行大量算法极其复杂的程序。本16M字节程序存储器寻址空间扩充方法可应用于基于8051指令体系的单片微控制器,亦可应用于其它微控制器、微处理器等领域。

附图说明

图1是16M字节程序存储器寻址空间扩充方法采用的程序存储器结构。

图2是分时复用总线方法示意图。

图3是基本指令时序图。

图4是段地址多路选择器示意图。

图5是MOV 0FFH,#0AH指令的时序图。

图6是LJMP指令的时序图。

图7是段间相对正跳转指令时序图。

图8是段间相对负跳转指令时序图。

图9是指令跨段被顺序执行时序图。

图10是返回指令(内部数据存储器堆栈)时序图。

图11是返回指令(外部数据存储器堆栈)时序图。

具体实施方式

本发明的一个优选实施例详述如下:

本基于MCS-51架构的16M字节程序存储器寻址空间扩充方法采用下述的程序存储器结构(见图1)

●程序地址(PROGRAM ADDRESS):程序存储器内部单元的绝对地址,共24位,可寻址16M字节的程序存储器空间。

●程序计数器(PROGRAM COUNTER):程序存储器空间被虚拟地划分成256个段,每个段的空间大小为64K字节,程序指针共16位,是每个段内部单元的地址,它的值通常与程序地址的低16位地址相同。

●段地址(BLOCK ADDRESS):程序存储器空间被虚拟地等划分成256个段,每个段都有一个地址,称为段地址,共8位,从00H至FFH,它的值与程序地址的高八位地址相同。

从该程序存储器结构可以看出,程序存储器空间被虚拟地等划分成256段,每一个段的大小为64K字节,这样就形成了16M字节的寻址空间。从而大大的扩展了程序存储器的容量,使基于MCS-51架构的微控制器能够运行大量算法极其复杂的程序。为了保持地址总线的位数与标准8051一致,本发明采用了分时复用地址总线的方法(见图2):

●PORT0口:微控制器的一组8位I/O口,它分时传送24位程序地址的低8位地址和8位数据信号。

●PORT2口:微控制器的一组8位I/O口,它分时传送24位程序地址的高8位地址,即段地址和24位程序地址的中间8位地址。

●锁存器1(LATCH_1):该锁存器锁存24位程序地址的低8位地址。

●锁存器2(LATCH_2):该锁存器锁存24位程序地址的高8位地址。

●地址锁存使能信号(ALE):当地址锁存信号有效时,24位程序地址的低8位和高8位分别被锁存至锁存器1和锁存器2。

●程序存储器选择使能信号(NPSEN):NPSEN是外部程序存储器读选通信号,低电平有效。

从图2可以看出,当ALE信号有效时,锁存器1和锁存器2分别锁存24位程序地址的低8位和高8位,在下一个系统时钟周期内,ALE信号无效,24位程序地址的中间8位从PORT2口直接输出至外部程序存储器中间8位地址信号线上,用此分时复用地址总线的方法实现了标准8051的16M字节程序存储器寻址空间的扩展。其基本时序见图3:

●系统时钟(CLK):系统运行时的工作频率。

●机器周期(MACHINE CYCLE):机器周期由四个时钟周期组成,CNPM代表在第N个机器周期内的第M个时钟周期。

●操作码(OPCODE):即程序的机器码,由二进制数组成。

从图3中可以看出,在时序设计上,NPSEN信号的高低电平都维持一个时钟周期不变,NPSEN信号的高电平持续时间是ALE高电平持续时间的两倍,这样在NPSEN信号低电平读有效时刻到来之前,ALE下降沿处有足够的时间来锁存高八位地址信息和低八位地址信息,并保持该信息的稳定。一旦给出中八位地址就可以形成正确的24位指令地址信息。因外部程序存储器有内部延时,当NPSEN选通外部程序存储器后,指令的读出还需一段较长的时间(不同外部程序存储器的读取时间不一样,一般在100ns)。所以只要在Ts时间(地址建立时间)内能够输出有效的地址信息,并在Th时间(地址保持时间)内保持不变,则从外部程序存储器中读出的指令就是当前地址的指令。这样在NPSEN低电平有效的情况下就可以正确地读出该地址信息中的内容。

PORT0口在CLP3时发出本条指令地址的低八位地址信息,在CLP4时(NPSEN低电平有效时),由PORT2口读入外部存储器的操作码。PORT2口分别在CLP3和CLP4时发出本条指令地址的高八位地址信息和中八位地址信息。其中低八位地址信息和高八位地址信息在ALE下降沿时锁存。

具体实施方法为:

在标准8051保留的特殊功能寄存器(SFR)中定义一个段地址寄存器ROM_DUAN,地址为FFH。

段地址寄存器ROM_DUAN的定义如下:

  Bit7  Bit6  Bit5  Bit4  Bit3  Bit2  Bit1  Bit0

ROM_DUAN                                               地址:FFH

对于用户写入段地址的操作主要用于执行调用或跳转指令之前。用户要指定段地址内容可对该特殊功能寄存器进行写操作。而对于外部16MB程序存储空间段间调用或跳转的操作可由硬件电路完成。

系统复位后程序返回第0段,段地址为00H。当要执行调用或跳转指令时,用户可以对该8位的段地址特殊功能寄存器作整体写操作,写后的数据保存在名为ROM_DUAN_TP的寄存器中,除非对段地址重新进行写操作,否则该ROM_DUAN_TP寄存器中的段地址保持不变。

(1)16M字节程序存储器寻址空间扩充方法的方案:

由于16M字节程序存储器分为256段,每个段的设计与标准8051基本一致,所以怎样设计好段地址多路选择器(见图4)的时序关系显得尤为重要。段地址的来源是除复位后默认段地址00H和用户写入的段地址外,还有众多的段地址选择源,在设计时主要从以下几个方面加以考虑:

a.程序复位后,段地址寄存器的默认值为00H;

b.当有中断发生时,程序要转到中断入口地址。由于中断入口地址都转载在第0段即00H段,所以段地址寄存器的内容要重新写为00H;

c.在执行RET/RETI指令后,为了保证程序能正确返回,原压入堆栈的高八位地址也要写回到段地址寄存器中;

d.在执行调用指令时,在最后一个机器周期的第三个时钟节拍时,程序地址跳变到要调用的子程序入口地址(入口地址在本段中或在其它段中),即段地址要更新为子程序入口地址的高八位地址。在地址指针转跳到子程序入口地址之前,要进行压栈操作,这时压入的高八位段地址应是本段主程序的地址,即是跳转到子程序段入口地址之前的没有更新的段地址。

e.在执行相对跳转指令时,程序指针有可能跳转到下一个段或者上一个段空间去,所以段地址的内容要进行更新,即段地址自动进行加一操作或是减一操作。

f.程序顺序执行到某段的段尾,且并没有执行跳转或者调用指令时,段地址应该自动加一,进入下一个段空间,此时程序指针也更新为#0000H。

产生的段地址和程序指针一起构成程序地址(PROGA)的24位地址,在外部程序存储器中进行寻址操作。

(2)相关指令时序图:

a.用户直接定义程序地址

①段地址定义(见图5):

因为段地址寄存器的地址为FFH,所以给段地址赋值的汇编语言是MOV 0FFH,#0AH,#OAH为段地址,相应的机器码为75 FF 0A。PORT0口分时地传送程序地址低8位和相应地址单元内的机器码;PORT2口分时地传送程序地址的高八位和中间八位。

在上一指令的最后一个时钟周期,PORT0口读到下一条指令的操作码(OPCODE)‘75’;在本条指令的CLP1,立即数#0AH传送到REG_RESULT寄存器内;在本条指令的CLP4,即最后一个时钟周期,特殊功能寄存器写有效信号第27位SFR_WRITE_EN[27]被置‘1’,且立即赋给段地址写信号(ROM_DUAN_WRITE),使之有效,此时REG_RESULT寄存器内的值赋给ROM_DUAN_TP寄存器暂存。

如果在本条指令的最后一个时钟周期预取进来的下一条指令是长跳转/长调用指令,则ROM_DUAN_TP寄存器内的值在下一条指令的执行周期末尾赋值给段地址寄存器ROM_DUAN;如果在本条指令的最后一个时钟周期预取进来的下一条指令不是此两类指令,则ROM_DUAN_TP寄存器内的值保持不变,但不赋值给段地址寄存器ROM_DUAN。

②程序指针确定(见图6)

长跳转/长调用两类指令跟在段地址寄存器赋值指令后,可以确定程序指针,即先前的段地址寄存器赋值确定了段地址,而长跳转/长调用指令可以确定64K字节空间段内的地址,从而确定整个程序绝对地址。

PORT0口上02 BA 44是汇编语言LJMP ADDRESS_0的机器码,02是操作码,BA 44是ADDRESS的具体地址值;在本条指令CLP2,ROM_DUAN_TP寄存器把用户定义的段地址值赋给ROM_DUAN,同时NEXT_PROGRAM_ADDR寄存器内暂存的是下一条指令的程序指针值#0BA44H;在本条指令CLP3,程序地址寄存器PROGA值更新为0ABA44H;在本条指令的最后一个时钟周期CLP4,PORT0口从程序存储器0ABA44地址中读出下一条指令的操作码。

b.段间相对跳转指令

①正跳转(见图7)

图7是指令CJNE A,#0FFH,ADDRESS_1(机器码为B4 FF 78)的时序图,累加器A内的值为#66H,不等于立即数#FFH,所以此相对跳转指令会被执行,跳转的相对量为78H,因为这个相对偏移量最高位为0,所以是正跳转。

在上一条指令的最后一个时钟周期,PORT0从程序存储器17FFFB地址内读出本条指令的操作码B4;在本条指令CLP2的上升沿,ROM_0寄存器(段地址加一)的值赋给段地址寄存器ROM_DUAN,且NEXT_PROGRAM_ADDR寄存器得到下一条指令的程序指针值0076;在本条指令CLP3,程序地址寄存器PROGA得到下一条指令操作码的绝对地址180076,实现了段间正跳转;在本条指令的最后一个时钟周期CLP4,PORT0口从程序存储器180076地址内读出下一条指令的操作码。

②负跳转(见图8)

图8是JB 0D7H,ADDRESS_2(机器码为20D781)指令的时序图,0D7H是位可寻址地址,其内容为0,所以此指令会被执行,81是相对跳转偏移量,其最高位为1,所以是负跳转。

在上一条指令的最后一个时钟周期,PORT0口读入程序存储器150064地址上的本指令的操作码20;在本条指令CLP2的上升沿,ROM_1寄存器(段地址减一)的值赋给段地址寄存器ROM_DUAN,且NEXT_PROGRAM_ADDR寄存器得到下一个程序指针值FFE8;在本条指令CLP3,程序地址寄存器更新为14FFE8,实现了段间负跳转;在本条指令CLP4,即最后一个时钟周期,PORT0口从程序存储器14FFE8地址上读出下一条指令的操作码。

c.跨段顺序执行(见图9)

图9是MOV P1,0D0H(机器码为85 D0 90)指令的时序图,90是P1口的地址。

在上一条指令的最后一个时钟周期,PORT0口从程序存储器16FFFE地址上读出本条指令的操作码85;在本条指令C1P2,NEXT_PROGRAM_ADDR寄存器得到下一条程序指针的地址为0000,因为本条指令还没有执行完,所以,ROM_0寄存器(段地址加一)赋值给段地址寄存器ROM_DUAN;在本条指令C1P3,程序地址寄存器更新为170000;在本条指令C1P4,PORT0口继续从程序存储器170000地址上读出操作数D0,实现了程序存储器16M字节空间的无缝连续性。

d.调用返回指令

①内部数据存储器堆栈(见图10)

图10是RET(机器码为22)指令的时序图。这条指令是某个被调用子程序的最后一条指令,在跳到这个子程序之前,24位程序地址(AA5569)被压入内部数据存储器堆栈。

在上一条指令的最后一个时钟周期,PORT0口从程序存储器AA889A地址上读出本条指令的操作码22;在本条指令C1P3,被压入堆栈的程序地址最高位,即段地址AA从内部数据存储器弹出,传送至SOURCE_DI寄存器,并立刻传送给ROM_DUAN_RET寄存器;在本条指令C2P1,被压入堆栈的程序地址中间八位55从内部数据存储器弹出,传送至SOURCE_DI寄存器;在本条指令C2P2,原来SOURCE_DI寄存器内暂存的程序地址中间八位55被赋值到NEXT_PROGRAM_ADDR寄存器高八位;在本条指令C2P3,程序计数器寄存器被更新为559B;在本条指令CLP1,被压入堆栈的程序地址低八位69从内部数据存储器弹出,传送至SOURCE_DI寄存器;在本条指令CLP2,原来SOURCE_DI寄存器内暂存的程序地址低八位69被赋值到NEXT_PROGRAM_ADDR寄存器低八位,且同时原来ROM_DUAN_RET寄存器内暂存的段地址值AA被赋值到段地址寄存器ROM_DUAN内;在本条指令CLP3,程序计数器寄存器的值被更新为5569,程序地址寄存器被更新为AA5569,此地址就是主程序在调用此子程序前的地址(被保护的现场);在本条指令最后一个时钟周期,即CLP4,PORT0口从程序存储器AA5569地址上读出下一条指令操作码,成功地实现了现场恢复。

②外部数据存储器堆栈(见图11)

图11是RET(机器码为22)指令的时序图。这条指令是某个被调用子程序的最后一条指令,在跳到这个子程序之前,24位程序地址(00018F)被压入外部数据存储器堆栈。

在上一条指令的最后一个时钟周期,PORT0口从程序存储器556678地址上读出本条指令的操作码22;在本条指令C2P1,被压入外部数据存储器堆栈的24位程序地址高8位00弹出,传送至XRAMDI寄存器;在本条指令C2P2,XRAMDI寄存器内暂存的段地址传送至ROM_DUAN_RET寄存器;在本条指令C3P1,被压入外部数据存储器堆栈的24位程序地址中间8位01弹出,送至XRAMDI寄存器;在本条指令C3P2,XRAMDI寄存器值被送入NEXT_PROGRAM_ADDR寄存器;在本条指令C3P3,程序计数器寄存器PROGRAM_COUNTER高8位被更新为01;在本条指令CLP1,被压入外部数据存储器堆栈的24位程序地址低8位数据8F弹出,传送至XRAMDI寄存器;在本条指令CLP2,XRAMDI寄存器的值传送至NEXT_PROGRAM_ADDR寄存器的低8位,且暂存在ROM_DUAN_RET寄存器内的高8位地址被送入段地址寄存器ROM_DUAN;在本条指令CLP3,程序计数器寄存器PROGRAM_COUNTER低8位被更新为8F,程序地址被更新为00018F;在本条指令的最后一个时钟周期,即CLP4,PORT0口从程序存储器00018F地址读出下一条指令的操作码。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号