8051单片机中DPTR的扩展设计

摘要 首先对比分析在执行大规模数据转移时,传统8051单片机和进行dptr扩展后的8051单片机在数据转移执行效率上的差别。通过详细分析dptr操作所涉及的因素,具体实现对dptr的扩展,并进行实际仿真测试。
关键词 8051单片机 dptr 数据转移执行效率
单片机的出现是计算机技术发展史上的一个里程碑,它使计算机从海量数值计算进入到控制领域。在单片机中,以8051系列最为经典,至今仍是最普及、广泛使用的8位mcu架构。业界许多技术人员在其基础上不断进行性能扩展,使得8051系列芯片不断完善,从而形成一个庞大的体系。在传统的8051系列单片机中,设置了一组双字节寄存器(数据指针dptr),用于访问外接的64 kb数据存储器和i/o接口电路;但在现今的8051单片机应用中,特别是在嵌入式系统中,往往涉及大规模的数据转移操作,而传统8051的一组数据指针使用起来则显得捉襟见肘,因此若在8051设计中将数据指针设计为两组或多组,则在执行大规模数据转移操作时会相当简便、迅速。在这种背景下,本文首先以数据转移执行效率为衡量标准,分析了dptr扩展的意义,并在oregano公司的mcs8051核[1]上实现了dptr扩展。
1 dptr扩展意义
为描述8051中的dptr扩展的意义,我们针对实现大规模数据转移,分别对dptr扩展前后作了对比。为使对比更加清晰明了,提出了数据转移执行效率的概念。
数据转移执行效率v定义为进行单字节数据转移所耗费的机器周期数,即v=nt。其中,n表示所转移数据字节数;t表示所耗费的机器周期,可设定其单位为字节/机器周期。
在未进行dptr扩展的8051中,可通过设置地址缓冲区的方法来实现大规模的数据转移。具体的例程如下:
movpre:
mov50h, #s_adrh
mov51h, #s_adrl
mov52h,#t_adrh
mov53h,#t_adrl
movr2, #64
remove:mov dph, 50h
mov dpl, 51h
movx a, @dptr
inc dptr
mov 50h, dph
mov 51h, dpl
mov dph, 52h
mov dpl, 53h
movx @dptr,a
inc dptr
mov 52h, dph
mov 53h, dpl
djnz r2, remove
在此例程中,50h、51h用于存放数据源地址s_adr(s_adrh为高字节, s_adrl为低字节),52h、53h用于存放数据目的地址t_adr(t_adrh为高字节, t_adrl为低字节),实现将源地址起始64字节数据转移至目的地址。在8051中,执行n字节数据移位操作耗费(14+28×n+2)个机器周期,数据转移执行效率为v=n/(14+28×n+2)。在本例程中,n为64,计算得出共需耗费1 808个机器周期,执行效率v约为0.035 4字节/机器周期,而且在此实现方法中需占用8051的4个片内存储器(ram)单元。
如8051中拥有两组dptr,并可通过特殊指令来实现dptr选取。可设定setdptr0指令表示选取dptr0,setdptr1指令表示选取dptr1,#s_adr表示数据源地址,#t_adr表示数据目的地址,则程序可设计为:
movpre:
setdptr0
movdptr,#s_adr
setdptr1
mov dptr,#t_adr
mov r2,#64
remove2:
setdptr0
movx a,@dptr
inc dptr
setdptr1
movx @dptr,a
inc dptr
djnz r2,remove2
程序中, 对于特殊指令setdptr0和setdptr1,可通过设置特殊功能寄存器(sfr)以表示dptr状态,并对此sfr进行操作,以实现dptr选取。因此dptr选取指令可由3字节指令实现,则在两组dptr情况下执行大规模数据转移需耗费(14+12×n+2)个机器周期,数据转移执行效率为v=n/(14+12×n+2)。在本例程中,执行64字节数据转移需耗费784个机器周期,执行效率约为0.085 64字节/机器周期。
通过以上对比发现,拥用两组dptr的8051比传统8051在大规模数据传输时的数据转移执行效率比为(14+28×n+2)/(14+12×n+2)。由图1可知,随着所转移数据量的不断加大,即n值增大时,执行效率比也不断增大,且最后趋近于2.33。
图1 数据转移执行效率对比图
经过以上分析得出:在8051中设置两组dptr将会使其在数据转移执行效率上有很大提高。从资源占用方面考虑,使用扩展dptr的方式来实现数据转移,仅需在8051中添加一个sfr,因此在8051中实现dptr扩展,可在资源占用很少的条件下,明显加快数据转移速率。这对于在嵌入式系统应用中,进行大规模数据转移意义重大。
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读写模块的修改无误。
3.2 针对pc指针的数据查表测试
针对此模块,进行了一个查表测试,即向dptr0和dptr1中分别写入data1和data2两个数据表的地址;而后利用dps选取dptr0和dptr1,再分别对其进行数据查表输出。具体波形如图5所示。
图5 pc指针的数据查表波形
选取dptr1(已存入data2地址,执行指令75e180)后,将寄存器a清零(执行指令7400),并将查表数据输出(执行指令93),输出数据为11h;而后选取dptr0,再次将寄存器a清零,并进行查表输出,输出数据为44h。对比可发现输出数据与表中数据一致。由此表明,通过dps选取dptr0和dptr1,进行数据查表操作无误,即对pc指针模块的修改无误。
3.3 片外ram数据读写测试
对于片外ram数据读写测试,即大规模数据转移,测试方案为:首先将dptr0和dptr1中分别写入地址adr0和adr1,再分别对这两个地址写入数据,最后将这两个地址的数据通过dptr0和dptr1读出,将读出的结果与写入结果对比,具体测试波形如图6所示。
图6 片外ram数据读写波形
将dps置位(执行指令75e180)选取dptr1后,将片外ram中adr1数据读出,输出数据为77h;将dps复位(执行指令75e100)选取dptr0后,将adr0数据读出,输出数据为44h。经对比可发现与所写入的数据一致。由此可表明,通过dps选择dptr0和dptr1对片外ram进行数据读写无误,即表明对片外ram地址模块的修改无误。
3.4 fpga仿真测试
基于mcs8051这款8051微控制器,我们还进行了实际的fpga仿真测试。首先利用rs232接口,在从计算机上将大规模数据接收并写入到mcs8051片外ram的地址adr0中;再利用例程2所给方法,进行大规模数据转移,将数据转移写入到地址adr1中;最后通过rs232接口将adr1中数据发送到计算机。通过对比发送和接收的数据发现,笔者对于dptr的扩展无误。
结语
通过扩展dptr可使8051在大规模数据转移时的执行效率大大提高,这使得采用扩展8051作为微控制器的嵌入式系统,在大规模数据转移时,其处理速度将大大提高。利用文中所阐述的方法也可将dptr扩展为多组,但其具体应用意义尚需进一步探讨。

微软在欧洲为独特的笔记本电脑申请了一项新专利
苹果A14X芯片性能曝光
汽车ADAS领域成IC设计商重要发力点
市场上为什么没有合适的电池伴侣
中汇翰骑真空环境灌胶设备的工艺说明
8051单片机中DPTR的扩展设计
云视频存储是什么_如何工作_有何优势
TCL引领国产电视品牌持续走向世界前列
轮胎充气泵方案-便携充气泵方案设计
荣耀MagicOS 8.0“任意门”功能是否照抄锤子手机的One Step?
海南航空将向NGF出售2架波音B737-800飞机
化工及医疗设备防水透气膜产品具体应用的分析
一加6琥珀红:是对艺术的追求,对工艺的追求
海思麒麟990或已进入能效调优阶段
浅析PCIE总线信号分布及使用情况
看不见的安全保障 无线电安防监测
微软Xbox Scarlett游戏主机的GPU运算性能将提升
人机界面跟触摸屏有什么区别?
开关电源在专业功放中的应用分析
哪个牌子的无线蓝牙耳机好、高性价比蓝牙耳机推荐