2 具体设计实现
在8051中对DPTR实现扩展,首先需要对DPTR的相关指令进行分析,再确定对其进行扩展会影响到哪些指令操作;并根据其所涉及的指令,分析相应的模块,最后针对各模块分别进行设计修改。
2.1 相关指令分析
在8051标准指令集的111条指令中,与DPTR有关的指令共有5类,分别为:
① 程序存储器查表指令,“MOVC A,@A+DPTR”;
② 片外RAM传送指令,“MOVX A, @DPTR”和“MOVX @ DPTR , A”;
③ 寄存器数据传送指令,即可对DPTR进行读写操作,在8051中DPTR由DPH(DPTR高8位字节)和DPL(DPTR低8位字节)构成,且DPH和DPL与一般的SFR一样,都可作为寄存器进行读写、压栈等操作;
④ 程序转移指令,“JMP @A+DPTR”;
⑤ 运算指令,可分别对DPH和DPL进行运算操作。
通过对以上与DPTR相关的5类指令分析可知:第③类指令和第⑤类指令是将DPTR作为SFR进行操作的。第①类指令和第④类指令都是DPTR与PC指针进行的数据传送操作;第②类指令是对片外RAM地址寄存器进行的数据传送操作。因此,DPTR的操作具体涉及8051中以下3个模块:SFR读写模块、PC指针模块及片外RAM地址模块,故对DPTR的扩展也在这3个模块中进行。
2.2 具体模块设计
对于DPTR状态寄存器可设为dptr_sel,通过对DPTR状态标志位dps操作,实现DPTR选取。当dps=0时,选取DPTR0;当dps=1时,选取DPTR1。在8051中,DPTR分别由DPH和DPL组成,因此对DPTR的选取实际上是对特殊功能寄存器DPH0、DPL0和DPH1、DPL1的选取。
基于以上的设计思路,笔者分别在涉及DPTR操作的3个模块中进行了相应的修改。本设计所选用MCS8051核由VHDL语言设计,完全兼容标准8051指令集。
在SFR读写模块中,应针对读、写模块分别进行修改。通过分析MCS8051设计代码可知,对于DPTR的读操作,是通过将DPTR中数据传送给数据暂存寄存器S_REGDATA,再通过对S_REGDATA进行读操作来实现的,因此可在进行DPTR数据暂存前,利用选择位dps来对DPTR进行选取。具体示意如图2所示。
在对DPTR进行写操作时,实际上是对DPH和DPL进行操作(DPH地址为83H,DPL地址为82H),因此对DPTR进行写操作时需对DPH和DPL分别进行操作。在MCS8051中对SFR的写操作,实际上是先将要写入的数据暂存在S_DATA寄存器中,再通过将S_DATA数据分别写入DPH和DPL来实现的。因此可在S_DATA数据写入前对DPTR0和DPTR1进行选择判断,来实现对DPTR0和DPTR1的写操作,即dps=1时,将S_DATA数据写入DPH1和DPL1;dps=0时,将S_DATA数据写入DPH0和DPL0,具体结构如图3所示。

图2 DPTR读模块示意图 图3 DPTR写模块结构图
在PC指针模块和片外RAM地址模块中,由于也是涉及DPTR的读操作,因此该模块的修改与SFR读模块中的修改类似,也是利用dps来实现DPTR0、DPTR1的选取。
3 仿真测试
在MCS8051中,针对以上3个模块分别作了修改,将DPTR扩展为两组,通过对DPTR_SEL(设定为SFR的E1H)中DPTR状态标志位dps进行操作,来实现对DPTR0和DPTR1的选取,并利用仿真软件Modelsim6.0进行了仿真测试。由于在实现DPTR扩展时主要针对SFR读写模块、PC指针模块和片外RAM地址模块这3个模块进行了修改,因此对于DPTR扩展的仿真测试也分3个模块进行。
3.1 针对SFR读写模块的测试
该模块的测试主要为测试DPTR0和DPTR1的数据传输。首先对DPTR状态标志dps位进行操作,分别选取DPTR0和DPTR1;其次分别对其进行写操作;最后将DPTR0和DPTR1中数据值依次输出寄存器A中。具体波形如图4所示。

图4 SFR读写测试波形
由图4可知,在执行指令75E100前后(即将dps复位,选取DPTR0),DPH和DPL输出(执行指令E583,E582)到寄存器A中的值不同。指令75E100执行前DPH输出为55,DPL输出为66,执行后输出分别为11和22,因此表明通过dps进行DPTR选取,读写操作无误,即对SFR读写模块的修改无误。