CN1898641A - 微控制器指令集 - Google Patents

微控制器指令集 Download PDF

Info

Publication number
CN1898641A
CN1898641A CNA200480038058XA CN200480038058A CN1898641A CN 1898641 A CN1898641 A CN 1898641A CN A200480038058X A CNA200480038058X A CN A200480038058XA CN 200480038058 A CN200480038058 A CN 200480038058A CN 1898641 A CN1898641 A CN 1898641A
Authority
CN
China
Prior art keywords
instruction
register
kkkk
coding
inoperation
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CNA200480038058XA
Other languages
English (en)
Other versions
CN1898641B (zh
Inventor
爱德华·布赖恩·博尔斯
罗德尼·杰伊·德雷克
达雷尔·雷·约翰森
苏密特·K·米特拉
兰迪·亚奇
詹姆斯·格罗斯巴赫
乔舒亚·M·康纳
约瑟夫·W·特里斯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microchip Technology Inc
Original Assignee
Microchip Technology Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from US10/796,771 external-priority patent/US7203818B2/en
Application filed by Microchip Technology Inc filed Critical Microchip Technology Inc
Priority claimed from PCT/US2004/034355 external-priority patent/WO2005043383A1/en
Publication of CN1898641A publication Critical patent/CN1898641A/zh
Application granted granted Critical
Publication of CN1898641B publication Critical patent/CN1898641B/zh
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/34Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

本发明提供一种微控制器装置,其具备一用于处理微控制器的行为的指令集。本发明提供具有使一模块化仿真成为可能的线性化地址空间的装置和系统。可能通过寄存器文件或数据存储器进行直接或间接寻址。特殊功能寄存器,包括程序计数器(PC)和工作寄存器(W),映射到数据存储器中。一正交(对称)指令集使得可能使用任何寻址模式对任何寄存器进行任何操作。因此,两个文件寄存器可用于一些两个操作数的指令。这允许在两个寄存器之间直接移动数据,而不需要通过所述W寄存器。因此,增强了性能并减少了程序存储器的利用率。

Description

微控制器指令集
本申请案是1999年3月26日申请的美国第09/280,112号的部分接续申请案,所述美国第09/280,112号与本申请案的标题相同,且发明者也相同。本申请案涉及到以下申请案:Randy L.Yach等人的美国专利第6,055,211号“FORCE PAGE ZERO PAGINGSCHEME FOR MICROCONTROLLERS USING DATA ACCESS MEMORY”;Rodney J.Drake等人的美国专利第5,905,880号“ROBUST MULTIPLE WORK INSTRUCTIONAND METHOD THEREFOR”;Sumit Mitra等人的美国专利第6,192,463号“PROCESSORARCHITECTURE SCHEME WHICH USES VIRTUAL ADDRESS REGISTERS TOIMPLEMENT DIFFERENT ADDRESSING MODES AND METHOD THEREFOR”;RodneyJ.Drake等人的美国专利第6,243,798号“COMPUTER SYSTEM FOR ALLOWING ATWOWORD INSTRUCTION TO BE EXECUTED IN THE SAME NUMBER OF CYCLES AS ASINGLE WORD JUMP INSTRUCTION”;Igor Wojewoda、Sumit Mitra和Rodney J.Drake的美国专利第6,029,241号,其标题为“PROCESSOR ARCHITECTURE SCHEMEHAVING MULTIPLE BANK ADDRESS OVERRIDE SOURCES FOR SUPPLYINGADDRESS VALUES AND METHOD THEREFORE”;Rodney J.Drake等人的美国专利第6,098,160号“DATA POINTER FOR OUTPUTTING INDIRECT ADDRESSING MODEADDRESSES WITHIN A SINGLE CYCLE AND METHOD THEREFOR”;Allen等人的美国专利第5,958,039号“MASTER-SLAVE LATCHES AND POSTINCREMENT/DECREMENT OPERATION”;和Triece等人的美国专利第5,987,583号“PROCESSOR ARCHITECTURE SCHEME AND INSTRUCTION SET FORMAXIMIZING AVAILABLE OPCODES AND ADDRESSING SELECTION MODES”,为了所有目的将所述专利案以引用方式并入本文。
技术领域
本发明涉及微控制器,且更具体地说,本发明涉及被集合到一指令集中的操作码指令,所述指令集用于操纵微控制器的行为。
背景技术
微控制器单元(MCU)许多年来用于制造业和电气业中。图1展示用于中型MCU器件的典型的核心存储器总线配置。在许多情况下,微控制器利用精简指令集计算(RISC)微处理器。这些器件中的一些器件的高性能可归因于RISC微处理器所共有的许多架构特征。这些特征包括:
哈佛架构(Harvard architecture)
长字指令
单字指令
单周期指令
指令流水线操作
精简指令集
寄存器文件架构
正交(对称)指令
哈佛架构:
如图2所示,哈佛架构具有程序存储器26和数据存储器22,二者是作为独立存储器且可由CPU 24通过独立总线进行访问。与传统的冯·诺依曼架构(在图3中展示)相比,哈佛架构具有改良的带宽,其中冯·诺依曼架构的程序和数据是由CUP 34通过同一总线从同一存储器36取得。为了执行一条指令,冯·诺依曼机器必须在8位总线上进行一次或一次以上(通常是一次以上)的访问才能取得指令。然后必须取得数据、对数据进行操作,可能还要写入数据。由此描述可见,总线可能会非常繁忙。
与冯·诺依曼机器相反,在哈佛架构下,单个指令周期内即可取得全部14位的指令。因此在哈佛架构下,当访问程序存储器时,数据存储器位于独立总线上,且可被读取和写入。这些独立的总线允许在执行一条指令的同时获取下一条指令。
长字指令:
长字指令的指令总线宽度比8位数据存储器总线宽(位数更多)。由于使用了相互独立的两条总线,所以这就成为了可能。这进一步允许指令大小不同于8位数据字宽度,这允许程序存储器更有效的使用,因为可针对架构需求对程序存储器宽度进行优化。
单字指令:
单字指令操作码为14位宽,从而有可能具有所有单字指令。14位宽的程序存储器访问总线可在单周期中取得一条14位的指令。由于是单字指令,所以程序存储器位置的字数等于用于器件的指令数。这就意味着所有位置都是合法指令。一般在冯·诺依曼架构(在图3中展示)中,大多数指令是多字节指令。然而,具有4K字节的程序存储器的器件一般允许约2K的指令。这个2∶1的比率只是大概情况,且取决于应用代码。由于每一指令可用多个字节,所以不能保证每个位置都是合法指令。
指令流水线:
指令流水线是两级流水线,其重叠进行取指操作和指令执行。取指花费一个机器周期(“TCY”),而执行花费另一TCY。然而,由于当前指令的取指和前一条指令的执行是重叠进行的,故在每一TCY内进行一条指令的取指和另一条指令的执行。
单周期指令:
程序存储器总线是14位宽,因此能在单个TCY中完成整条指令的取指。指令中含有所需的所有信息,并能在单一周期中执行。如果指令的结果修改了程序计数器的内容,那么在执行中可存在一个周期的延迟。这需要流水线排空并获取新指令。
精简指令集:
当指令集设计得很好且高度正交(对称)时,执行所有所需任务只需较少指令。指令越少,就能越迅速地掌握整个指令集。
寄存器文件架构:
寄存器文件/数据存储器可被直接或间接寻址。所有特殊功能寄存器,包括程序计数器,都映射到数据存储器。
正交(对称)指令集:
正交指令有可能使用任何寻址模式对任何寄存器进行任何操作。这个对称性和无“特殊指令”使编程简单且有效。此外,可显著缩短学习曲线。中型指令集只使用两条非面向寄存器的指令,它们用于核心特征中的两者。其中一条是SLEEP指令,可将器件设置成最低功耗使用模式。另一条是CLRWDT指令,所述指令通过防止片内监视定时器(WDT)溢出和使器件复位来检验芯片是否适当地工作。
时钟图/指令周期:
时钟输入(来自OSC1)在内部经过4分频,以产生4个非重叠的正交时钟,即Q1、Q2、Q3和Q4。在每一Q1中,程序计数器(PC)递增;在Q4中,从程序存储器取指,并将指令锁存在指令寄存器中。指令的译码和执行是在下一个Q1到Q4之间完成。图4和图5说明时钟和指令执行流。
指令流/流水线操作:
一个“指令周期”由4个Q周期(Q1、Q2、Q3和Q4)组成,其如4所示,且如图4和图5所示,所述4个Q周期包含TCY。注意在图5中,所有指令在单个周期中执行,除非有一些程序转移。程序转移花费两个周期,因为流水线中的取指指令“排空”,同时获取新指令且然后执行所述指令。
取指花费一个指令周期,而译码和执行花费另一指令周期。然而,由于是流水线操作,所以每一指令可有效地在一个周期中执行。如果一条指令导致程序计数器改变(例如,GOTO),那么需要额外的周期来完成所述指令(图5)。在Q1中开始取指,且程序计数器递增。在执行周期中,在周期Q1中将所取指令锁存“指令寄存器(IR)”中。然后,在Q2、Q3和Q4期间对这条指令进行译码并执行这条指令。在Q2期间对数据存储器进行读取(读取操作数),且在Q4期间进行写入(写入目的地)。图5展示用于所示的指令序列的两级流水线的操作。在TCY0时,从程序存储器取第一条指令。在TCY1期间,执行第一条指令,同时取第二条指令。在TCY2期间,执行第二条指令,同时取第三条指令。在TCY3期间,执行第三条指令(CALL SUB_1),同时取第四条指令。当执行完第三条指令时,CPU将指令4的地址压入栈,且将程序计数器(PC)改变成SUB_1地址。这就意味着需要从流水线中“排空”在TCY3期间所取的指令。在TCY4期间,指令4排空(执行为NOP),且取地址SUB_1处的指令。最后,在TCY5期间,执行指令5,且取地址SUB_1+1处的指令。
尽管现有技术的微控制器有用,但是不可仿真多种模块。此外,图1中所述的微控制器的类型不可使地址空间线性化。最后,现有技术的微控制器易受编译程序错误问题的影响。需要一种能够使地址空间线性化以便能够进行模块化仿真的微控制器的装置、方法和系统。这项技术中还需要减少编译程序错误。
发明内容
本发明通过提供排除现有技术中所经历的许多编译程序错误的微控制器指令集,克服了以上所识别的问题以及现有技术的其它缺点和不足。此外提供一种具有使模块化仿真成为可能的线性化地址空间的装置和系统。
本发明可直接或间接地寻址其寄存器文件或数据存储器。所有的特殊功能寄存器都映射到数据存储器中,其中包括程序计数器(PC)和工作寄存器(W)。本发明具有正交(对称)指令集,它使得使用任何寻址模式对任何寄存器进行任何操作成为可能。这种对称性和无“特殊最佳情况”使利用本发明的编程简单且有效。此外,可显著缩短写软件应用程序的学习曲线。本发明比现有技术的增强之一是允许两个文件寄存器用于一些两个操作数的指令中。这允许在两个寄存器之间直接移动数据,而不需要通过W寄存器,且因此增强了性能并减少了程序存储器的利用率。
本发明的优选实施例包括:ALU/W寄存器、PLA、8位乘法器、带有栈的程序计数器(PC)、表锁存器/表指针、ROM锁存器/IR锁存器、FSR、中断引导电路和最常用的状态寄存器。与现有技术不同,本发明的设计回避了对以下组件的需要:独立模块中的计时器、所有的复位产生电路(WDT、POR、BOR等)、中断标志、使能标志、INTCON寄存器、RCON寄存器、配置位、器件ID字、ID位置和时钟驱动器。
一旦参考了详细说明和附图,所属领域技术人员将很清楚额外的实施例。
附图说明
图1是现有技术的中型微控制器单元的示意性方框图;
图2是现有技术的哈佛架构的示意性方框图;
图3是现有技术的冯·诺依曼架构的示意性方框图;
图4是现有技术时钟/指令周期的时序图;
图5是多个指令的执行的示意说明;
图6是本发明的微控制器核心的示意性方框图;
图7是本发明的Q周期活动的时序图;
图8是本发明的时钟/指令周期的时序图;
图9是本发明的指令流水线流程图;
图10是本发明的指令流水线流程图;
图11是本发明的指令流水线流程图;
图12是本发明的指令流水线流程图;
图13是本发明的指令流水线流程图;
图14是本发明的指令流水线流程图;
图15是本发明的状态寄存器的方框图;
图16是本发明的程序计数器的方框图;
图17是本发明的程序计数器使用CALL和GOTO指令的情况下的方框图;
图18是本发明的栈指针寄存器的方框图;
图19是本发明的栈顶更高寄存器的方框图;
图20是本发明的栈顶高寄存器的方框图;
图21是本发明的栈顶低寄存器的方框图;
图22说明本发明的栈复位操作;
图23说明本发明的已初始化栈上的第一CALL;
图24说明本发明的栈上的第二连续CALL;
图25说明本发明的栈上的第31和第32连续CALL;
图26说明本发明的栈上的返回POP操作;
图27本发明内的导致栈下溢状态的栈返回弹出;
图28说明本发明的栈上PUSH指令;
图29说明本发明的栈上POP指令;
图30是本发明的栈和程序存储器映射的方框图;
图31是本发明的存储器映射的方框图;
图32是本发明的存储器中的指令的方框图;
图33是说明在不同程序模式下的本发明的器件存储器映射的方框图;
图34是描述本发明的MEMCON寄存器的方框图;
图35是描述本发明的CONFIG7配置字节的方框图;
图36是本发明的16位外部存储器连接配置的示意性方框图;
图37是本发明的8位外部存储器连接配置的方框图;
图38是本发明的典型端口功能的列表;
图39是本发明的16位模式的外部程序存储器总线的时序图;
图40是本发明的8位模式的外部程序存储器总线的时序图;
图41是本发明的外部总线周期类型的列表;
图42是本发明的数据存储器映射和指令“a”位的示意性方框图;
图43是本发明的特殊功能寄存器的映射;
图44是本发明的核心特殊功能寄存器的示意图;
图45是图44的核心特殊功能寄存器的示意图的延续部分;
图46是本发明的直接短寻址模式的示意性方框图;
图47是本发明的BSR操作的示意性方框图;
图48是本发明的BSR操作在仿真/测试模式期间的示意性方框图;
图49是本发明的直接强制寻址模式的示意性方框图;
图50是本发明的直接强制寻址模式的示意性方框图;
图51是本发明的直接长寻址模式的示意性方框图;
图52是本发明的间接寻址模式的示意性方框图;
图53是本发明的间接寻址模式的示意性方框图;
图54是本发明的操作码字段的描述列表;
图55是本发明的间接寻址符号的列表;
图56说明本发明的指令的一般格式;
图57是本发明的指令集的部分列表;
图58是本发明的指令集的部分列表;
图59是本发明的指令集的部分列表;
图60是本发明的面向字节的文件寄存器操作的流程图;
图61是本发明的面向字节的文件寄存器操作(执行)的流程图;
图62是本发明的CLRF、NEGF、SETF(取)指令的流程图;
图63是本发明的CLRF、NEGF、SETF(执行)指令的流程图;
图64是本发明的DECFSZ、DCFSNZ、INCFSZ、ICFSNZ(取)指令的流程图;
图65是本发明的DECFSZ、DCFSNZ、INCFSZ、ICFSNZ(取)指令的流程图;
图66是本发明的CPFSEQ、CPFSQT、CPFSLT和TSTFSZ(取)指令的流程图;
图67是本发明的CPFSEQ、CPFSQT、CPFSLT和TSTFSZ(执行)指令的流程图;
图68是本发明的MULWF(取)指令的流程图;
图69是本发明的MULWF(执行)指令的流程图;
图70是本发明的MULFF(取)指令的流程图;
图71是本发明的MULFF(执行1)指令的流程图;
图72是本发明的MULFF(执行2)指令的流程图;
图73是本发明的BCF、BSF、BTG(取)指令的流程图;
图74是本发明的BCF、BSF、BTG(取)指令的流程图;
图75是本发明的BTFSC和BTFSS(取)指令的流程图;
图76是本发明的BTFSC和BTFSS(执行)指令的流程图;
图77是本发明的字面值操作(取)指令的流程图;
图78是本发明的字面值操作(执行)指令的流程图;
图79是本发明的LFSR(取)指令的流程图;
图80是本发明的LFSR(执行1)指令的流程图;
图81是本发明的LFSR(执行2)指令的流程图;
图82是本发明的DAW(取)指令的流程图;
图83是本发明的DAW(执行)指令的流程图;
图84是本发明的MULLW(取)指令的流程图;
图85是本发明的MULLW(执行)指令的流程图;
图86是本发明的CLRWDT、HALT、RESET和SLEEP(取)指令的流程图;
图87是本发明的CLRWDT、HALT、RESET和SLEEP(执行)指令的流程图;
图88是本发明的MOVELB(取)指令的流程图;
图89是本发明的MOVELB(执行)指令的流程图;
图90是本发明的转移操作(取)的流程图;
图91是本发明的转移操作(执行)的流程图;
图92是本发明的BRA和RCALL(取)指令的流程图;
图93是本发明的BRA和RCALL(执行)指令的流程图;
图94是本发明的PUSH(取)指令的流程图;
图95是本发明的PUSH(执行)指令的流程图;
图96是本发明的POP(取)指令的流程图;
图97是本发明的POP(执行)指令的流程图;
图98是本发明的RETURN和RETFIE(取)指令的流程图;
图99是本发明的RETURN和RETFIE(执行)指令的流程图;
图100是本发明的RETLW(取)指令的流程图;
图101是本发明的RETLW(执行)指令的流程图;
图102是本发明的GOTO(取)指令的流程图;
图103是本发明的GOTO(执行1)指令的流程图;
图104是本发明的GOTO(执行2)指令的流程图;
图105是本发明的CALL(取)指令的流程图;
图106是本发明的CALL(执行1)指令的流程图;
图107是本发明的CALL(执行2)指令的流程图;
图108是本发明的TBLRD*、TBLRD*+、TBLRD*-和TBLRD+*(取)指令的流程图;
图109是本发明的TBLRD*、TBLRD*+、TBLRD*-和TBLRD+*(执行1)指令的流程图;
图110是本发明的TBLRD*、TBLRD*+、TBLRD*-和TBLRD+*(执行2)指令的流程图;
图111是本发明的TBLWT*、TBLWT*+、TBLWT*-和TBLWT+*(取)指令的流程图;
图112是本发明的TBLWT*、TBLWT*+、TBLWT*-和TBLWT+*(执行)指令的流程图;
图113是本发明的TBLWT*、TBLWT*+、TBLWT*-和TBLWT+*(执行2)指令的流程图;和
图114是本发明的指令译码映射。
图115是说明根据本发明的教示的替代分页方案的方框图。
图116是说明根据本发明的教示的替代分页方案的方框图。
具体实施方式
本发明是用于在若干实施例中提供微控制器指令集和微控制器架构的装置、方法和系统,所述微控制器架构包括使得能够进行模块化仿真的线性化地址空间。
本发明的优选实施例的装置的架构修改现有技术中的哈佛架构,其中数据路径是8位,且指令长度是16位,且具有四相内部时钟图。此外,优选实施例具有线性化存储器寻址方案,其排除了对分页和分区的需要。本发明的存储器寻址方案允许程序存储器的可寻址能力多达2M字节。本发明也支持模块仿真。
本发明通过提供排除现有技术中所经历的许多编译程序错误的微控制器指令集,克服上文所识别的问题以及现有技术的其它缺点和不足。此外提供起用使模块化仿真成为可能的线性化地址空间的装置和系统。
本发明可直接或间接地寻址其寄存器文件或数据存储器。所有的特殊功能寄存器都映射到数据存储器中,其中包括程序计数器(PC)和工作寄存器(W)。本发明具有正交(对称)指令集,它使得使用任何寻址模式对任何寄存器进行任何操作成为可能。这种对称性和无“特殊最佳情况”使利用本发明的编程简单且有效。此外,可显著缩短学习曲线。本发明系列比现有技术在架构上的增强之一允许两个文件寄存器用于一些两个操作数的指令中。这允许在两个寄存器之间直接移动数据,而不需要通过W寄存器,且因此增强了性能并减少了程序存储器的利用率。图6展示本发明的微控制器核心的方框图。
图6中说明本发明的微控制器核心100。根据惯例,图6中的连接信号线可含有一斜杠和一相邻数字,其指示信号线的带宽(位)。参考图6的右上角,我们可发现一数据存储器104,其用于存储数据且将数据转移到中央处理单元(下文所述)并从中央处理单元转移数据。数据存储器104包含复数个地址位置。在本发明的优选实施例中,数据存储器104是线性化的4K存储器,将其划分成复数个16页或存储区。一般地,每一存储区具有256个地址位置。在优选实施例中,复数个存储区中的一个存储区用于通用寄存器和专用寄存器,在这种情况下,最顶层的存储区是存储区0。
选择电路108通过地址锁存器102耦接到数据存储器104。选择电路108用于选择供应数据存储器104中的存储区地址值的复数个源中的一个源。
本发明的优选实施例包括:带有工作(W)寄存器136的ALU 140、PLA、8位乘法器、带有栈170的程序计数器(PC)168、表锁存器124、表指针148、带有IR锁存器126的只读存储器(ROM)锁存器152、FSR(120、121、122)、中断引导电路(interruptvectoring circuitry)和最常用的状态寄存器。与现有技术不同,本发明的设计回避了对以下组件的需要:独立模块中的计时器、所有的复位产生电路(WDT、POR、BOR等)、中断标志、使能标志、INTCON寄存器、RCON寄存器、配置位、器件ID字、ID位置和时钟驱动器。
I/O列表:
可利用本发明使用输入/输出(I/O)命令的丰富列表,表1中展示I/O列表。
表1  I/O列表
  名称  计数I/O   正常操作   操作测试模块   程序模块   仿真模块
  addr<21:0>  22/0   程序存储器地址
  nqbank<3:0>  4/0   低态有效RAM存储区选择
  d<15:0>  16/I   程序存储器数据
  db<7:0>  8/I/O   数据总线
  forcext  I/I   实行外部指令测试模式
  irp<7:0>  8/O   外围地址
  irp9  1/O   指令寄存器位9
  ncodeprt  1/I   低态有效代码保护
  neprtim  1/I   EPROM的低态有效端
  nhalt  1/I   低态有效异常终止
  nintake  1/I   早期应答低态有效中断并从睡眠中唤醒
  np<7:0>  8/O   表锁存数据
  npcmux  1/O   低态有效PC多工
  npchold  1/O   低态有效PC保持
  nprtchg  1/I   低态有效端口改变中断
  nq4clrwdt  1/O   低态有效清零wdt
  nq4sleep  1/O   低态有效睡眠
  nqrd  1/O   低态有效读文件
  nreset   1/I   低态有效复位
  nwrf   1/O   低态有效写文件
  q1:q4   4/I   4相Q时钟
  q13   1/I   Q时钟的组合
  q23   1/I   Q时钟的组合
  q41   1/I   Q时钟的组合
  test0   1/I  测试模式0
  tsthvdet   1/I   高电压检测
  wreprom   1/O   写eprom
  writem   1/O   写存储器
  wrtbl   1/O   表写入指令
  nintakd   1/I   延迟的中断应答
  intak   1/I   中断应答
时钟图/指令周期
时钟输入(来自OSC1)在内部经过4分频,以产生4个非重叠的正交时钟,即Q1、Q2、Q3和Q4,如图7所示。在内部,程序计数器(PC)逐Q1地增加,且使用Q4从程序存储器取指并将指令锁存在指令寄存器中。指令的译码和执行是在下一个Q1到Q4之间完成。PLA译码是在Q1期间完成。在Q2和Q3周期期间,从存储器或外围设备读操作数,且ALU执行计算。在Q4期间,将结果写入目标位置。图8中展示时钟和指令执行流。
Q周期活动
如图7所示,每一指令周期(TCY)包含4个Q周期(Q1-Q4)。Q周期与器件振荡器的周期(TOSC)相同。Q周期提供用于每一指令周期的译码、读、处理数据、写等的时序/指示。下图(图7)展示Q周期与指令周期的关系。组成一个执行指令周期(TCY)的4个Q周期可概括如下:
Q1:指令译码周期或强制NOP
Q2:指令读周期或NOP
Q3:处理数据
Q4:指令写周期或NOP
每一指令将展示用于这条指令的详细的Q周期操作。
指令流/流水线操作
“指令周期”由4个Q周期(Q1、Q2、Q3和Q4)组成。取指和执行指令是流水线操作,从而使得取指花费一个指令周期,而译码和执行花费另一指令周期。然而,由于是流水线操作,所以每一指令可有效地在一个周期中执行。存在4种类型的指令流。第一种是正常的1个字1个周期的流水线指令。这些指令将花费一个有效周期来执行,如图9所示。第二种是1个字2个周期的流水线排空指令。这些指令包括相关的分支,相关的调用、跳跃和返回。当指令改变PC时,放弃流水线取指。这使得指令花费两个有效周期来执行,如图10所示。第三种是表操作指令。这些指令将暂停取指以将读或写周期插入到程序存储器。将执行表操作时所取的指令保存一个周期,且在紧跟在表操作后的周期中执行所述指令,如图11所示。第四种是新的两字指令。这些指令包括MOVFF和MOVLF。在这些指令中,指令之后的取指含有地址的剩余部分。对于MOVFF指令而言,在执行第一个字期间,机器将执行源寄存器的读操作。在执行第二个字期间获得源地址,且然后指令将完成移动,如图12所示。MOVLF类似,但是MOVLF在2个周期中将2个字面值值(literal value)移动到FSRnH和FSRnL中,如图13所示。第五种是用于CALL和GOTO的两字指令。在这些指令中,指令之后的取指含有跳转或调用目标地址的剩余部分。正常地,这些指令将需要3个周期来执行,2个周期用于取2个指令字,且1个周期用于随后的流水线排空。然而,通过对第二取指提供高速路径,可用指令执行的第一周期中的完全值来更新PC,从而产生一个2周期指令,如图14所示。第六种是中断辨识执行。下文在中断部分论述中断期间的指令周期。
ALU
本发明含有8位算术和逻辑单元(ALU)142和工作寄存器136,如图6所示。ALU142是一个通用算术单元。它执行工作寄存器中的数据与任何寄存器文件之间的算术和布尔函数。ALU 142有8位宽,且能够进行加、减、移位和逻辑运算。除非另外提及,算术运算事实上是二进制补码。工作(W)寄存器136是用于ALU 140运算的8位工作寄存器。W寄存器136是可寻址的,且可直接对它进行写操作或读操作。ALU 140能够对两个操作数或单个操作数进行算术或逻辑运算。所有的单操作数指令都在W寄存器136上操作或在给定的文件寄存器上操作。对于两个操作数的指令而言,一个操作数是W寄存器136,且另一个操作数是文件寄存器或8位立即数(immediate constant)或均等的存储媒体。
视所执行的指令而定,ALU 140可影响STATUS寄存器(下文所论述的)中的进位位(C)、辅助进位位(DC)、零位(Z)、溢出位(OV)和负数位(N)的值。在减法中,C和DC位分别用作借位位和辅助借位位。
如图6所示,本发明的优选实施例包括8×8硬件乘法器134,其包括在器件的ALU142中。通过使乘法成为硬件运算,可在单个指令周期中完成运算。这个硬件运算是得出16位结果的无符号乘法运算。所述结果存储到16位乘积寄存器中(PRODH:PRODL)。乘法器不影响STATUS寄存器中的任何旗标。
状态寄存器
STATUS寄存器含有ALU 140的状态位。图15中展示状态寄存器。在本发明的优选实施例中,位7-5不生效,且写为“0”。
位4是负数位“N”。这个位用于有符号的算术(二进制补码)。它指示结果是否是负数(ALU MSb=1),1=结果为负,0=结果为正。
位3是溢出位“OV”。这个位用于有符号的算术(二进制补码)。它指示7位数值溢出,所述溢出使符号位(位7)改变状态。对于这个位而言,1=符号算术发生溢出(在这个算术运算中),且0=无溢出发生。
位2是零位“Z”。对于这个位而言,1=算术运算或逻辑运算的结果是0,且0=算术运算或逻辑运算的结果是非0。
位1是辅助进位位/辅助借位位“DC”。对于这个位而言,1=结果的第四低位发生进位,且0=结果的第四低位未发生进位。请注意,借位时极性相反。
位0是进位/借位位“C”。对于这个位而言,1=结果的最高有效位发生进位,且0=结果的最高有效位未发生进位。与位1一样,借位时极性相反。
在减法中,C和DC位分别用作借位位和辅助借位位。进位是ALU位7的进位。辅助进位是ALU位3的进位。如果ALU结果位<7:0>为“0”,那么零位为真。N是ALU结果位7。如果二进制补码结果超过+127或小于-128,那么溢出位将被置位。溢出为ALU位6的进位与ALU位7的进位的异或的结果。与所有其它寄存器一样,STATUS寄存器可以是任何指令的目的地。如果STATUS寄存器是影响状态位中的任一位的指令的写目的地,那么禁止写入状态位。所述位根据ALU结果和指令规格而被置位或清零。因此,将STATUS寄存器用作目的地的指令的结果可不同于预期结果。
举例而言,CLRF REG指令通常对寄存器写入0,且将Z位置位。CLRF STATUS指令将禁止写入N、OV、DC和C位,且将Z位置位。这就使得STATUS寄存器为000uuluu。因此,建议仅使用BCF、BSF、SWAPF和MOVWF指令来改变STATUS寄存器,因为这些指令不影响任何状态位。欲知其它指令如何影响状态位,请参阅“指令集概要”。
程序计数器模块
程序计数器(PC)168(见图6)经修改以允许扩展到多达最大21位。这可通过增加5位宽的PCLATU寄存器来完成,所述PCLATU寄存器的操作类似于PCLATH寄存器。PC 168还经修改以在程序存储器中寻址字节而不是字。为了这样实施,在PC 168的LSb处存在一个字节寻址位,其始终是0。PCL的LSb可读但是不可写。如果用户试图写入“1”到LSb中,结果将是“0”。为了允许隐藏测试EPROM,存在PC 168的隐藏的第22位(位21)(见图16)。这个PC位通常为0。当进入测试模式或编程模式时,便置位这个位,且将从测试区域取指。一旦这个位被置位,便不可通过执行程序清零它,所以器件必须复位。
程序计数器(PC)168是多达21位寄存器,如图16所示。PCL 184(PC 168的低字节)映射到数据存储器104中(见图6)。PCL 184像任何其它寄存器一样是可读写的。PCH 182和PCU 180是PC的高字节,且不可直接寻址。因为PCH 182和PCU 184并未映射到数据或程序存储器160中,所以寄存器PCLATH 178(PC高锁存器)和PCLATU176(PC更高锁存器)用作用于PC 168的高字节的保持锁存器。
PCLATH 178和PCLATU 176映射到数据存储器104中。用户可通过PCLATH 178对PCH 182进行读写操作,且可通过PCLATU 176对PCU 180进行读写操作。在Q1期间,每次取指之后,PC 168的字加2,除非:
由GOTO、CALL、RETURN、RETLW、RETFIE或转移指令修改。
由中断回应修改。
由于由指令引起的对PCL 168的目标写操作。
“跳跃”等同于在所跳跃的地址处的强制NOP周期。图16和图17展示多种情形下的程序计数器的操作。
参考图16,PC 168、PCLATH 178和PCLATU 176针对不同指令的操作如下:
a.对PCL的读指令:
对PCL 184进行读操作的任何指令。所有d=0的字节指令,MOVFF PCL,X,CPFSEQ,CPFSGT,CPFSLT,MULWF,TSTFSZ,然后PCL到数据总线,然后到ALU或到目标。最后,PCH到PCLATH且PCU到PCLATU。
b.对PCL的写指令:
对PCL 184进行写操作的任何指令。举例而言,MOVWF,CLRF,SETF,然后,将8位数据写入到数据总线174,且然后到PCL 184。同样,PCLATH到PCH,且PCLATU到PCU。
c.对PCL的读-修改-写指令:
对PCL进行读-修改-写操作的任何指令。所有d=1的字节指令,位指令,NEGF。读:PCL到数据总线到ALU。写:将8位结果写入到数据总线且到PCL;然后PCLATH到PCH,且最终PCLATU到PCU。
读-修改-写仅影响PCL 184的结果。PCH 182和PCU 180分别装载PCLATH 178和PCLATU 176中的值。举例而言,对于指令“ADDWF”,PCL 184将产生以下的跳转。如果执行所述指令之前PC=0003F0h、W=30h、PCLATH=05h且PCLATU=1h,那么执行所述指令之后PC=010520h。为了完成真实的经计算的20位跳转,用户需要计算20位目标地址,写入PCLATH 178和PCLATU 176,且然后将低值写入PCL 168。
d.RETURN指令:
使用图17将<MRU>堆入PC<20:0>,用于GOTO和CALL指令的PC 168、PCLATH178和PCLATU 176的操作如下:
e.CALL和GOTO指令:
在2字指令(操作码)中提供目标地址。第一个字操作码<6:0>到PCL<7:1>。第一个字操作码<7>到PCLATH<0>且到PCH<0>。第二个字操作码<6:0>到PCLATH<7:1>且到PCH<7:1>。第二个字操作码<11:7>到PCLATU<4:0>且到PCU<4:0>。
请注意,下列关于PC 168的操作不改变PCLATH 178和PCLATU 176:
a.RETLW、RETURN和RETFIE指令
b.在PC上实行的中断向量。
c.对PCL的读-修改-写指令(例如,BSF PCL,2)。
返回栈操作
本发明具有31级深度的返回(或硬件)栈。所述栈的深度与现有技术相比有增大,以允许执行更复杂的程序。所述栈不是程序或数据存储空间的一部分。
当执行CALL或RCALL指令或应答中断时,将PC 168压入栈。当执行RETURN、RETLW或RETFIE指令时将PC 168弹出栈。PCLATU 176和PCLATH 178不受任何返回指令的影响。
栈由21位RAM和5位栈指针操作为31字,其中在所有复位之后栈指针初始化为00000b。不存在与栈指针000h相关的RAM字。它只是一个复位值。在执行引起压入栈的CALL类型指令期间,栈指针首先递增,且由栈指针指向的RAM位置写入PC的内容。在执行引起弹出栈的RETURN类型指令期间,由STKPTR指向的RAM位置的内容转移到PC,且然后栈指针递减。
栈顶的访问
栈顶是可读写的。三个寄存器位置(TOSU、TOSH和TOSL)寻址由STKPTR指向的栈RAM位置。这允许用户实施软件栈(若必要的话)。在CALL或RCALL指令或中断之后,软件可通过读TOSU、TOSH和TOSL寄存器来读入栈值。可将这些值置入用户定义的软件栈上。返回时,软件可以替换TOSU、TOSH和TOSL的内容并执行返回操作。请注意,为防止意外的栈操作,在此期间用户必须禁止全局中断使能位。
PUSH和POP指令
因为栈顶(TOS)可以读写,所以能够将值压入栈或从栈弹出而不影响程序的正常执行是一种期望的选择。要将当前PC值压入栈,可以执行PUSH指令。这将使当前PC值压入栈,设置TOS=PC且PC=PC+2。使用POP指令可以从栈中弹出TOS的值,并用前一个入栈值来替换TOS值,而不会影响程序的正常执行。POP指令将TOS值从栈中弹出,但这个值不写入PC,然后前一个入栈值就成为TOS值。
返回栈指针(STKPTR)
STKPTR寄存器含有返回栈指针值和溢出、下溢位。栈溢出位(STKOVF)和下溢位(STKUNF)允许软件检验栈状态。仅在POR复位后,STKOVF和STKUNF位才被清零。
在PC压入栈31次之后(没有任何值从栈弹出),第32次压栈会覆盖第31次压栈的值,并且将STK-OVF位置位,而STKPTR保持为11111b。第33次压栈会覆盖第32次压栈的值(如此反复),而STKPTR保持为11111b。
当栈弹出次数足够清空栈时,下一次出栈会向PC返回一个零值,并将STKUNF位置位,而STKPTR则保持为00000b。再下一次出栈会再次返回零值(如此反复),而STKPTR保持为00000b。注意,下溢时向PC返回一个零值具有以下效果:将程序引导向可验证栈状态的复位向量,且可采取适当行动。
可通过STKPTR寄存器访问栈指针。用户可以读写栈指针的值。实时操作系统(RTOS)可以利用这一点来维护返回栈。图18展示STKPTR寄存器。栈指针的值将会是0到31。复位时,栈指针值为0。入栈时栈指针递增,出栈时栈指针递减。
栈溢出/下溢复位
根据用户的选择,溢出和下溢可引起器件复位,来中断程序代码的执行。复位由配置位STVRE使能。当禁止了STVRE位时,溢出或下溢会将适当的STKOVF或STKUNF位置位,但不会引起复位。当使能了STVRE位时,溢出或下溢会将适当的STKOVF或STKUNF位置位,然后使器件复位,这与WDT复位性质很相似。两种情况都只能通过用户软件或POR复位将STKOVF位和STKUNF位清零。图18-21说明栈寄存器。图22-29说栈操作。
程序存储器
本发明的优选实施例具有多达2兆字节(2M)×8的用户程序存储空间。程序存储空间主要含有用于执行的指令,然而,可使用表读和写指令存储和访问数据表。另一2M×8的测试程序存储空间可用于测试ROM、配置位和识别字。
器件具有能够寻址2M×8的程序存储空间的21位程序计数器。还存在在正常操作期间隐藏的第22个PC位,且当所述位被置位时,有可能访问配置位、器件ID和测试ROM。可在测试模式或编程模式中将这个位置位,且必须复位器件来清零所述位。不可在这个位被置位的情况下访问用户程序存储空间。由于PC必须在程序存储器的偶字节边界访问指令,PC的LSb被强制清零,并且每访问一条指令PC值加2。
复位向量地址为000000h,高优先级中断向量地址为000008h,而低优先级中断向量地址为000018h(见图30)。
程序存储器组织
程序存储器中的每一位置具有字节地址。另外,每2个相邻的字节具有一个字地址。图31展示在所展示的字节和字地址情况下程序存储器的映射。在程序存储器内,指令必须是字对齐的。图32展示在若干实例指令和那些指令的十六进制码(置入映射中)的情况下程序存储器的映射。表操作将与字节实体协作。不需要表块字对齐,因此,表块可在任何字节地址处开始和结束。例外情况是表块用于对内部程序存储器或外部字宽闪存编程。当编程时,写入数据需要与编程方法所使用的字宽对齐。
程序存储器模式
本发明可在5个可能的程序存储器配置中的任一者操作。由配置位选择配置。可能的模式是:
MP-微处理器
EMC-扩展微控制器
PEMC-受保护扩展微控制器
MC-微控制器
PMC-受保护微控制器
微控制器和受保护微控制器模式仅允许内部执行。超出程序存储器外的任何访问读到全0。受保护的微控制器模式也使能码保护特征。微控制器是未编程器件的默认模式。
扩展微控制器模式访问内部程序存储器以及外部程序存储器。执行在内部和外部存储器之间自动切换。21位地址允许2M字节的程序存储器范围。受保护的扩展微控制器模式将通过防止对内部存储器的表读/写入操作同时仍允许对外部程序存储器的执行和表读/写入操作,来代码保护内部程序存储器。
微处理器模式仅访问内部程序存储器。忽略片内程序存储器。21位的地址允许2M字节的程序存储器范围。
通过使用TBLRD指令可在器件的正常操作期间读测试存储器位和配置位。如果RCON寄存器中的LWRT位被置位或器件处于测试和编程模式中,那么仅可使用TBLWT指令来修改这些区域。
仅可在测试和编程模式中执行这些区域。
扩展微控制器模式和微处理器模式仅可在具有定义为I/O引脚的一部分的外部存储器总线的器件上可用。表2列出了哪些模式可访问内部和外部存储器。图33说明不同编程模式中的器件存储器映射。
表2器件模式存储器访问
  操作模式   内部程序存储器   外部程序存储器
  微处理器   不访问   执行/TBLRD/TBLWT
  扩展微控制器   执行/TBLRD/TBLWT   执行/TBLRD/TBLWT
  受保护扩展微控制器   执行   执行/TBLRD/TBLWT
  微控制器   执行/TBLRD/TBLWT   不访问
  受保护微控制器   执行/TBLRD   不访问
外部程序存储器接口
当选择微处理器或扩展微控制器模式时,可将多达4个端口配置为系统总线。两个端口和第三个端口中的一部分是多工地址/数据总线,且另一个端口的一部分用于控制信号。需要外部组件来解多工地址和数据。外部存储器接口可通过8位数据模式或16位数据模式运行。外部存储器接口上的地址总是字节地址。
图36和图37分别描述用于16位和8位数据的外部存储器连接。外部程序存储器总线共享引脚上的I/O端口功能。图38列出I/O引脚功能上的外部总线功能的典型映射。在扩展微控制器模式中,当器件在内部存储器外执行时,控制信号将不会激活。所述信号将达到这样的状态:AD<15:0>和A<19:0>为三态,OE、WRH、WRL、UB和LB信号为“1”,UBA0和ALE为“0”。
16位外部接口
如果外部接口是16位,那么将按照16位字取指。OE输出使能信号将一次使能程序存储器的两个字节,以输出16位字。地址BA0的最低有效位不需要连接到存储器器件。
尽管存储器将在外部读16位字,但外部表读操作逻辑上一次执行一个字节。地址的最低有效位将在内部在高字节和低字节之间选择(LSb=0时选择低字节,LSb=1时选择高字节)。微处理器和扩展微控制器模式中的外部地址是21位宽,这允许多达2M字节的寻址。
16位总线上的外部表写操作逻辑上一次执行一个字节。实际的写操作将取决于所连接的外部器件的类型和MEMCON寄存器中的WM<1:0>位,如图34所示。表操作部分细化了实际的写周期。
8位外部接口
如果外部接口是8位,那么将按照2个8位字节取指。在一个指令周期内取两个字节。地址的最低有效位必须连接到存储器器件。OE输出使能信号和BA0=1将使能指令的最高有效字节,以在周期的Q3部分在程序存储器中进行读操作,然后BA0将改变成0,且将在周期的Q4部分读最低有效字节,以形成16位指令字。
外部表读操作也一次执行一个字节。外部表写操作一次执行一个字节。WRL在每一外部写操作中激活。
当选择8位接口时,不使用WRH、UB和UL线,且引脚回复I/O端口功能。配置位选择外部接口的8位模式。
外部等待周期
外部存储器接口支持“等待周期”。外部存储器等待周期仅应用于外部总线上的表读操作和表写操作。因为器件执行依赖于取指,所以执行比取指速率快毫无意义。因此,如果需要使程序取指变慢,那么必须利用不同的TCY时间使处理器速度变慢。
MEMCON寄存器中的WAIT<1:0>位将在每个存储器取指周期中选择0、1、2或3个额外的TCY周期。等待周期将对于16位接口上的表读操作和写操作有效。在8位接口上,对于表读操作和写操作而言,等待将只在Q4上发生。
上电时的等待的默认设置主张最多3个TCY周期的等待。这可确保慢速存储器复位之后立即在微处理器模式下工作。配置位(称为WAIT)将使能或禁止等待状态。在展示在无等待情况下的程序存储器取指和等待状态下的表读操作两种情况下,图39说明16位接口,且图40说明8位接口。
外部总线信号禁止
为了允许利用接合到外部总线的引脚的灵活性,在配置位中提供若干禁止。又,为了禁止整个外部总线,在扩展微控制器模式中允许DMA功能(MEM-CON寄存器中的EBDIS位(在图35中展示))的情况下,可完成在配置位中提供若干禁止。这个禁止将允许用户使整个外部总线接口具有三态特性。这将允许DMA操作以及程序控制通过I/O引脚功能对外部器件直接进行控制。
在仿真器系统中,-ME器件必须使输入表示总线禁止配置位允许I/O端口功能,以检测引脚作为外部接口的状态。-ME器件还具有特殊输入引脚,其指示仿真器系统是处于微处理器模式还是处于扩展微控制器模式中。
数据存储器
在本发明中,数据存储器和通用RAM的大小可扩展到4096个字节。数据存储器地址为12位宽。数据存储器分割成16个具有256个字节的存储区,其含有通用寄存器(GPR)和特殊功能寄存器(SFR)。
GPR被机械化成一字节宽的RAM阵列,其具有组合GPR寄存器的大小。SFR一般分布在外围设备中,SFR控制所述外围设备的功能。
存储区选择寄存器(BSR<3:0>)选择存储区。BSR存储器可访问16个以上的存储区,然而,直接长寻址模式限于12位地址或16个存储区。BSR相应地受限。
器件指令可在一个指令周期中对特定位置进行读、修改和写操作。每个周期仅存在一个地址产生,因此不可能在单个周期中在一个位置中进行读操作,而在另一位置中进行修改/写操作。图42展示实例数据存储器映射。
通用寄存器
在所有的PIC器件中,所有的数据RAM可用作所有指令的寄存器。数据存储器的大多数存储区仅含有GPR存储器。所有器件上必须存在包括在存储区0中的GPR存储器。
存储区0中的GPR数的绝对最小值为128。这个GPR区域(称为访问RAM)对于允许程序设计者可具有不管BSR的设置如何都可访问的数据结构而言至关重要。
特殊功能寄存器
SFR是特殊寄存器,一般用于器件和外围设备控制和状态功能。所有指令均可访问它们。可能的话,所有的SFR应包含在存储区15的较高的128个字节中。如果SFR不使用特定器件上的所有可用位置,那么未使用的位置将不生效,且作为“0”。某些器件(如LCD控制器)可在不同于存储区15的其它存储区中具有SFR区域。
不同器件的存储区15中的SFR的边界可变化。至少16个GPR必须包括在访问存储区中。图43显示可能的特殊功能寄存器映射。图44和45显示核心特殊功能寄存器一览表。
寻址模式
本发明支持7个数据寻址模式:
固有寻址
字面值寻址
直接短寻址
直接强制寻址
直接长寻址
间接寻址
索引间接偏移寻址
这些模式中的三个模式,直接强制寻址、直接长寻址和间接索引寻址,是PIC架构中的新的寻址模式。
固有寻址
如DAW之类的一些指令除了明确定义在操作码中的寻址之外不需要寻址。
字面值寻址
字面值指令含有字面值常量字段,一般用于如ADDLW之类的数学运算中。字面值寻址也用于GOTO、CALL和转移操作码。
直接短寻址
大多数数学和移动指令用直接短寻址模式操作。在这个寻址模式中,指令含有数据的最低有效地址的8位。地址的剩余的4位来自存储区选择寄存器或BSR。BSR用于在数据存储器区域中的存储区之间切换(见图47)。
对大的通用存储空间的需要指示通用RAM分区方案。BSR的低4位字节选择当前激活的通用RAM存储区。为了辅助这个操作,已在指令集中提供了MOVLB存储区指令。
如果当前选择的存储区未生效(如存储区13),那么任何读操作将读到全“0”。对位桶完成任何写操作,且STATUS寄存器位将视需要被置位/清零。
直接强制寻址
所有的特殊功能寄存器(SFR)映射到数据存储空间。为了允许易于访问SFR,SFR一般全部映射到存储区15中。为了简化访问,指令中存在1位字段,其不管BSR的内容如何,都将地址指向用于共同RAM的存储区0的下半部分和用于SFR的存储区15的上半部分。在BSR设置成BSR=n时,有可能利用任何指令寻址3个存储区,直接强制寻址模式中的存储区0和存储区15以及直接短寻址模式中的存储区“n”。
直接长寻址
直接长寻址将数据地址的所有12位编码到指令中。只有MOVFF指令使用这个模式。
间接寻址
间接寻址是指令中的数据存储器地址由另一寄存器决定的寻址数据存储器的模式。
这个寻址模式可用于数据存储器中的数据表或栈。图53展示间接寻址的操作。FSR寄存器的值用作数据存储器地址。
间接寻址寄存器
本发明具有用于间接寻址的3个12位寄存器。这些寄存器是:
FSR0H和FSR0L
FSR1H和FSR1L
FSR2H和FSR2L
FSR是12位寄存器,且允许在4096字节的数据存储器地址范围中的任何地方寻址。
另外,存在不实体实施的寄存器INDF0、INDF1和INDF2。对这些寄存器的读或写操作启动寻址,其中对应FSR寄存器中的值是数据的地址。如果间接通过FSR对文件INDF0(或INDF1、2)本身进行读操作,那么读到全“0”(零位被置位)。同样,如果间接对INDF0(或INDF1、2)进行写操作,那么操作将等同于NOP,且不影响STATUS位。
间接寻址操作
每一INDF寄存器具有与之相关的4个地址。当对4个INDF位置中的一个位置进行数据访问时,所选的地址将把FSR寄存器配置成:
●间接访问后将FSR中的值(地址)自动递减(后递减)
●间接访问后将FSR中的值(地址)自动递增(后递增)
●间接访问前将FSR中的值(地址)自动递增(预递增)
●间接访问后不改变FSR中的值(地址)(不改变)
当使用自动递增或自动递减特征时,FSR上的效果并不在STATUS寄存器中反映出来。举例而言,如果间接地址导致FSR等于“0”,那么Z位将被置位。添加这些特征允许FSR除了用于数据表操作外,还用作栈指针。
索引间接寻址
每一INDF具有一个与其相关的执行索引间接访问的地址。当对这个INDF位置的数据访问发生时,FSR配置成:
●在间接访问前加上W寄存器中的有符号值和FSR中的值以形成地址。
●FSR值不改变。
间接寻址(INDF)寄存器的间接写操作
如果FSR寄存器含有指向间接寄存器中的一个寄存器的值(FEFh-FEBh、FE7h-FE3h、FDFh-FDBh),那么间接读操作将读到00h(零位被置位),而间接写操作将等同于NOP(STATUS位不受影响)。
指针(FSR)寄存器的间接写操作
如果间接寻址操作是在目标地址是FSRnH或FSRnL寄存器的情况下完成,那么写操作将支配预递增/递减功能或后递增/递减功能。举例而言:
FSR0=FE8h(小于FSR0L的位置的一者)
W=50h
MOVWF*(++FSR0);(PREINC0)
将使FSR0递增成为FE9h,其指向FSR0L。然后,W到FSR0L中的写操作将把FSR0L改变成50h。然而,
FSR0=FE9h(FSR0L的位置)
W=50h
MOVWF*FSR0++;(POSTINC0)
将在FSR0的递增将发生时尝试将W写到FSR0L中。W的写入将比后递增占优势,且FSR0L将为50h。
指令集概要
本发明的指令集由77条指令组成。由于在现有架构中存在过度的页和存储区的切换,所以程序和数据存储器映射需要线性化,且本指令集经修改以便利这个线性化。本发明的优选实施例的数据存储空间最大为4K字节,其由16个存储区组成,且每一存储区具有256个字节。在本发明的优选实施例中,所有特殊功能寄存器位于一个存储区中,优选指示执行文件处理的所有指令的操作码中的位,其可实行虚拟存储区。因此,不必切换存储区来访问特殊功能寄存器。
在优选实施例中,程序存储空间在现有系统上经修改以最大具有2M字节。PC从13位增加到多达21位,且将引起跳转(CALL、GOTO)的一些指令改变成两字指令,以装载用于PC的21位值。对现有技术的另一改良是模块化仿真器的包括。这需要在用于仿真的两个芯片之间通信,且为了达成所要的速度,不可能在同一指令周期内具有不同的源和目标寄存器。因此,消除了现有技术中的MOVPF和MOVFP指令。为了保持这个功能,添加了两字指令MOVFF。
本发明的指令集可分组成三种类型:
●面向字节的指令集
●面向位的指令集
●字面值和控制操作的指令集
这些格式在图56中展示。图54展示操作码的字段描述。这些描述用于理解图57-59中和附录A中的每一特殊指令描述中的操作码。图114展示指令译码映射。
对于面向字节的指令而言,“f”表示文件寄存器指示符,且“d”表示目标指示符。文件寄存器指示符指定哪一文件寄存器将由指令使用。目标指示器指定将操作结果放在哪里。如果“d”=“0”,那么将结果置于W寄存器中。如果“d”=“1”,那么将结果置于由指令指定的文件寄存器中。
又,对于面向字节的指令而言,“a”表示虚拟存储区选择位。如果“a”=“0”,那么覆盖BSR,且选择虚拟存储区。如果“a”=“1”,那么不覆盖存储区选择寄存器(BSR)。
位于面向位的指令,“b”表示位字段指示符,其选择由操作影响的位数,而“f”表示所述位所处的文件的地址。
对于字面值和控制操作而言,“k”表示8、12、16或20位常量或字面值值。此外,“s”表示快速调用/返回选择位。如果“s”=“0”,那么不使用影像寄存器(shadow register)。如果“s”=“1”,那么在RETURN或RETFIE指令时根据影像寄存器更新W、BSR和STATUS寄存器,或者在CALL指令时根据对应寄存器装载影像寄存器。最后,“n”是二进制补码数,其确定用于相对转移指令的跳转的方向和数值。
指令集高度正交,且分组成:
●面向字节的操作
●面向位的操作
●字面值和控制操作
所有的指令都在一个单个指令周期内执行,除非:
●状态测试为真
●程序计数器改变成指令的结果
●执行文件到文件的转移
●执行表读指令或表写指令
在那种情况下,执行花费两个指令周期,且第二个周期执行为NOP。
特殊功能寄存器作为源/目的地
本发明的正交指令集允许所有文件寄存器(包括特殊功能寄存器)的读和写操作。用户应注意一些特殊情况:
STATUS寄存器作为目的地
如果将指令写到STATUS寄存器中,可将Z、C、DC、OV和N位置位或清零以作为指令的结果,且重写已写的原始数据位。
PCL作为源或目的地
对PCL的读、写或读-修改-写操作可具有下列结果:
●对于对PCL的读操作而言,首先PCU到PCLATU,然后PCH到PCLATH,且然后PCL到dest。
●对于对PCL的写操作而言,首先PCLATU到PCU,然后PCLATH到PCH,且然后8位结果值到PCL。
●对于读-修改-写操作而言,首先PCL到ALU操作数,然后PCLATH到PCH,然后PCLATU到PCU,且然后8位结果值到PCL。
其中:
PCL=程序计数器低字节
PCH=程序计数器高字节
PCLATH=程序计数器高保持锁存器
PCU=程序计数器更高字节
PCLATU=程序计数器更高保持锁存器
dest=目标、W或f。
位处理
通过首先读整个寄存器、对所选位进行操作且将结果写回(读-修改-写(R-M-W)),来完成所有的位处理指令。当在一些特殊功能寄存器(如端口)上操作时用户应紧记这点。请注意,由器件处理的状态位(包括中断旗标位)在Q1周期中被置位或清零。因此,在含有这些位的寄存器上执行R-M-W指令时不存在争端。
图60-113含有用于本发明的指令集内的每一指令的一般操作的流程图。各图展示用于本发明的指令集内的指令的取指和执行的通用步骤和特殊步骤。举例而言,图60展示面向字节的文件寄存器操作的取指步骤,所述操作包括指令ADDWF、ADDWFC、ANDWF、COMF、DECF、INCF、IORWF、MOVF、RLCF、RLNCF、RRCF、RRNCF、SUBFWB、SUBWF、SUBWFB、SWAPF、XORWF、MOVWF和NOP。类似地,图61展示用于面向字节的文件寄存器操作的执行步骤,所述操作包括指令ADDWF、ADDWFC、ANDWF、COMF、DECF、INCF、IORWF、MOVF、RLCF、RLNCF、RRCF、RRNCF、SUBFWB、SUBWF、SUBWFB、SWAPF和XORWF(但MOVWF仅执行假读,且NOP执行假读和假写)。
图77展示字面值操作的取指步骤,所述操作包括指令:ADDLW、ANDLW、IORLW、MOVLW、SUBLW和XORLW。如前所述,图78展示字面值操作的执行步骤,所述操作包括指令:ADDLW、ANDLW、IORLW、MOVLW、SUBLW和XORLW。
图90展示用于转移操作的取指的流程图,所述操作包括指令:BC、BN、BNC、BNN、BNV、BNZ、BV和BZ。类似地,图90展示用于转移操作的执行的流程图,所述操作包括指令:BC、BN、BNC、BNN、BNV、BNZ、BV和BZ。其余的图展示指令集内的其它指令的取指和执行步骤。
对于那些需要两次取指来获得完整指令的多字指令而言,三个流程图用于描述整个取指和执行过程。举例而言,图70-72描述MOVFF指令。图70展示相对标准的取指操作。然而,图71在操作框的左边展示MOVFF的第一部分的执行,而操作框的右边部分展示指令的第二个字的取指。因此,图72仅展示MOVFF指令的第二个字的执行步骤。为其它多字指令提供了类似的流程图:LFSR(图79-81),GOTO(图102-104),CALL(图105-107),TBLRD*、TBLRD*+、TBLRD*-和TBLRD+*(图108-110),TBLWT*、TBLWT*+、TBLWT*-和TBLWT+*(图111-113)。
附录A含有本发明的指令集的操作码和指令的详细列表。附录A中的材料为了全部目的以引用的方式并入本文。
利用字面值偏移的索引寻址
图115说明另一寻址模式,具体地说是利用字面值偏移的索引寻址模式。在一个实施例中,通过将称为索引位(index bit)的上下文位编程为“1”来使能利用字面值偏移的索引寻址模式。索引位将可能实施为熔丝,但是也可利用软件或任何旗标/开关使能技术实施。当索引位经编程以使能索引位时,利用字面值偏移的索引寻址模式将取决于地址且将取决于指令字中的访问位的值。这个模式将仅应用于使用直接强制寻址的指令。
如果访问位被设置成“1”,那么不改变在现有架构中确定地址的方式,且寻址模式默认为直接短寻址。如果访问位的值为“0”,那么就对包含在指令字中的地址进行译码,且将其与值5Fh相比较。如果地址大于5Fh,那么将寻址模式译码成直接强制寻址。如果访问位是零,且指令字中的地址小于或等于05Fh,那么寻址模式是利用字面值偏移的索引寻址。当发生利用字面值偏移的索引寻址时,指令字中的地址默认为加入FSR2的内容的字面值值。然后,结果值用作在其上操作的地址。
图116展示当使能利用字面值偏移的索引寻址时如何分割访问存储区。位置00h到5Fh可映射到存储器中的任何位置。访问存储区的这部分的开始地址映射到包含在FSR2H:FSR2L寄存器中的地址。
对FSR2的修改
为了支持利用字面值偏移的索引模式,指令寄存器的较低7位包括为4个可能的值之一,以加入FSR2的内容。认为包含在IR中的数据是无符号整数,且结果不存储在FSR2中。存在4个寻址模式:
●间接寻址(INDF);
●利用递增/递减的间接寻址(FSR2+)、(+FSR2)和(FSR2-);
●利用偏移的间接寻址(FSR2+W,其中W的内容用于偏移);和
●利用字面值偏移的间接寻址(FSR2+字面值)。
本发明包括一组指令,当调用所述组指令时,在微控制器上执行一个或一个以上的任务。所述指令中的一些在下文中描述。在特殊情况下可由(例如)开关或其它均等方法调用这些指令。
“PUSHL”指令将8位字面值值推入栈。PUSHL指令的精确语法是“PUSHL k”,其中0<=k<=225。这个命令的调用不影响微控制器的状态。PUSHL指令的编码是“11101010kkkk kkkk”。在这里,8位字面值复制到第二文件选择寄存器(“FSR2”)寻址的位置,然后将FSR2递减。
“SUBFSR”指令从文件选择寄存器(“FSR”)中减去5位字面值。这个命令的语法是“SUBFSR f,k”,其中0<=f<=2且0<=k<=63。这个命令的调用不影响微控制器的状态。这个命令的编码是“11101001 ffkk kkkk”,当调用这个命令时,从FSRf中减去6位(无符号)字面值,且将结果存储回FSRf中,其中指令的“ff”部分指示特定文件选择寄存器,且指令的“kk kkkk”部分指示字面值。
“SUBULNK”指令从第二文件选择寄存器(“FSR2”)中减去5位字面值,且返回结果值。这个命令的语法是“SUBULNK k”,其中0<=k<=63。这个命令的调用不影响微控制器的状态。这个命令的编码是“1110 1001 11kk kkkk”,当调用这个命令时,从FSR2中减去6位(无符号)字面值,将结果存储回FSR2中,且将结果和执行返回调用者。
“ADDFSR”指令将5位字面值加到FSR。这个指令的语法是“ADDFSR f,k”,其中0<=f<=2且0<=k<=63。这个指令不影响微控制器的状态。这个指令的编码是“11101000 ffkk kkkk”,一旦调用这个指令,便将6位(无符号)字面值加入FSRf中,且将结果值存储回FSRf中,其中指令的“ff”部分指示特定文件选择寄存器,且指令的“kk kkkk”部分指示字面值。
“ADDULNK”指令将5位字面值加到FSR2且将结果和执行返回调用程序。这个指令的语法是“ADDULNK k”,其中0<=k<=63。这个指令的调用不影响微控制器的状态。这个指令的编码是“1110 1000 11kk kkkk”,一旦调用这个指令,便将6位(无符号)字面值(由指令的“kk kkkk”部分指示)加入FSR2中,且将结果存储回FSR2中,且将执行返回调用者。
“MOVSF”指令将栈位置存储到通用寄存器(“GPR”)。这个指令的语法是“MOVSFs,d”,其中0<=.s<=127且0<=d<=4095。这个指令的调用不影响微控制器的状态。这个指令的编码是两个字,其中字1是“1110 1011 0sss ssss”,字2是“1111 dddd dddddddd”,其中指令的第一个字的“sss ssss”部分指示源,且第二个字的“dddd dddd dddd”部分指示目标。一旦调用这个指令,便将7位字面值值s加入FSR2中的值,从而产生8位值源地址,随后将这个值复制到由12位值d所指示的位置。FSR2值不受MOVSF指令的影响,且微控制器的状态也不受影响。
“MOVSS”指令将一个栈位置复制到另一栈位置。这个指令的语法是“MOVSS s,d”,其中0<=.s<=127且0<=d<=127。这个指令的调用不影响微控制器的状态。这个指令的编码是两个字,其中字1是“1110 1011 1sss ssss”,字2是“1111 xxxx xddd dddd”,其中指令的第一个字的“sss ssss”部分指示源,且第二个字的“ddd dddd”部分指示目标。一旦调用这个指令,将7位字面值值s加入FSR2中的值,从而产生8位值源地址,随后将这个值复制到由一地址所指示的位置,所述地址是通过将7位值d加入FSR2中的值来确定的。FSR2值不受MOVSS指令的影响,且微控制器的状态也不受影响。
“CALLW”指令是间接调用。这个指令的语法是“CALLW”。这个指令的调用不影响微控制器的状态。这个命令的编码是“0000 0000 0001 0100”,一旦调用这个指令,便将下一指令的地址压入硬件栈。具体地说,将第一寄存器(如PCLATU:PCLATH)的值复制到程序计数器(“PC”)的高16位,且将第二寄存器(如w寄存器(“WREG”))中的值复制到PC的低8位中。
因此,本发明非常适于实现这些目标并获得所提到的结果和优势,以及其中所固有的其它优势。尽管已参考本发明的特定优选实施例描绘、描述并定义了本发明,但是所述参考并不暗示对本发明的限制,且不可推断出所述限制。本发明能够有形式和功能上的大量修改、改变和均等物,其可由所属领域的普通技术人员想到。本发明的已描绘和描述的优选实施例仅为示范性的,且并不是本发明的详尽范畴。因此,希望仅由附加的权利要求书的精神和范畴限制本发明,从而可从各个方面全面认识均等物。
  ADDLW  将字面值加入W
  语法:  [标号]ADDLWk
  操作数:  0≤k≤255
  操作:  (W)+k→W
  受影响的状态:   N、OV、C、DC、Z
  编码:   0000   1111   kkkk   kkkk
  说明:   将W的内容加到8位字面值“k”,且将结果置入W中。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3  Q4
  译码   读字面值“k”   处理数据  写入W
实例:ADDLW 0x15
执行指令前:
W=0x10
执行指令后:
W=0x25
  ADDWF   将W加入f
  语法:   [标号]ADDWFf,d,a
  操作数:   0≤f≤255
  d∈[0,1]
  a∈[0,1]
  操作:   (W)+(f)→dest
  受影响的状态:   N、OV、C、DC、Z
  编码:   0010   01da   ffff   ffff
说明:将W加入寄存器“f”。如果“d”为0,那么将结果存储在W中。如果“d”为1,那么将结果存储回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区。如果“a”为1,那么将不覆盖BSR(默认的)。
字:1
周期:1
Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
  实例:ADDWF REG,0,0
  执行指令前:
  W=        0x17
  REG=      0xC2
  执行指令后:
  W=    0xD9
  REG=  0xC2
  ADDWFC   将W和进位加入f
  语法:   [标号]ADDWFC f,d,a
  操作数:   0≤f≤255 d∈[0,1]a∈[0,1]
  操作:   (W)+(f)+(C)→dest
  受影响的状态:   N、OV、C、DC、Z
  编码:   0010   00da   ffff   ffff
  说明:   加入W、进位旗标和数据存储器位置“f”。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置于数据存储器位置“f”中。如果“a”为0,那么将选择虚拟存储区。如果“a”为1,那么将不覆盖BSR。
  字:   1
  周期:   1
  Q周期活动:
  Q1  Q2   Q3   Q4
  译码  读寄存器“f”   处理数据   写入目的地
实例:ADDWFC REG,0,1
执行指令前:
进位=1
REG=0x02
W=0x4D
执行指令后:
进位=0
REG=0x02
W=0x50
  ANDLW   对字面值和W进行与运算
  语法:   [标号]ANDLW  k
  操作数:   0≤k≤255
  操作:   (W)AND k→W
  受影响的状态:   N、Z
  编码:   0000   1011   kkkk   kkkk
  说明:   将W的内容和8位字面值“k”进行与运算。将结果置于W中。
  字:   1
  周期:   1
 Q周期活动:
  Q1  Q2   Q3  Q4
  译码  读字面值“k”   处理数据  写入W
实例:ANDLW    0x5F
执行指令前:
W    =0xA3
执行指令后:
W    =0x03
  ANDWF   对W和f进行与运算
  语法:   [标号]ANDWF  f,d,a
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (W).AND.(f)→dest
  受影响的状态:   N、Z
  编码:   0001   01da   ffff   ffff
  说明:   将W的内容和寄存器“f”进行与运算。如果“d”为0,那么将结果存储在W中。如果“d”为1,那么将结果存储回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区。如果“a”为1,那么将不覆盖BSR(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1  Q2   Q3   Q4
  译码  读寄存器“f”   处理数据   写入目的地
实例:ANDWF REG, 0,0
执行指令前:
W    =0x17
REG  =0xC2
执行指令后:
W    =0x02
REG  =0xC2
  BC   如果进位,那么转移
  语法:   [标号].BC  n
  操作数:   -128≤n≤127
  操作:   如果进位为“1”,那么(PC)+2+2n→PC
  受影响的状态:   无
  编码:   1110   0010   nnnn   nnnn
  说明:   如果进位为“1”,那么程序将转移。
  将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地址将是PC+2+2n。然后指令是2周期指令。
  字:   1
  周期:   1(2)
  Q周期活动:如果跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
  不操作   不操作   不操作   不操作
  如果不跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   不操作
实例:HERE    BC  5
执行指令前:
PC      =(HERE)的地址
执行指令后:
如果进位=1,那么
PC      =(HERE+12)的地址
如果进位=0,那么
PC    =(HERE+2)的地址
  BCF   将f位清零
  语法:   [标号]BCF  f,b,a
  操作数:   0≤f≤2550≤b≤7a∈[0,1]
  操作:   0→f<b>
  受影响的状态:   无
  编码:   1001   bbba   ffff   ffff
  说明:   将寄存器“f”中的位“b”清零。如果“a”为0,那
 么将选择虚拟存储区。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
  字:  1
  周期:  1
Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写寄存器“f”
实例:BCF FLAG_REG,7,0
执行指令前:
FLAG_REG=0xC7
执行指令后:
FLAG_REG=0x47
  BN   如果为负数,那么转移
  语法:   [标号]BN  n
  操作数:   -128≤n≤127
  操作:   如果负数位为“1”,那么(PC)+2+2n→PC
  受影响的状态:   无
  编码:   1110   0110   nnnn   nnnn
  说明:   如果负数位为“1”,那么程序将转移。将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地址将是PC+2+2n。然后指令是2周期指令。
  字:   1
  周期:   1(2)
Q周期活动:
如果跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
  不操作   不操作   不操作   不操作
如果不跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   不操作
实例:HERE  BN Jump
执行指令前:
PC    =(HERE)的地址
执行指令后:
如果负数位=1,那么
PC        =(Jump)的地址
如果负数位=0,那么
PC        =(HEHE+2)的地址
  BNC   如果无进位,那么转移
  语法:   [标号]BNC  n
  操作数:   -128≤n≤127
  操作:   如果进位为“0”,那么(PC)+2+2n→PC
  受影响的状态:   无
  编码:  1110   0011   nnnn   nnnn
  说明:  如果进位为“0”,那么程序将转移。将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地址将是PC+2+2n。然后指令是2周期指令。
  字:  1
  周期:  1(2)
Q周期活动:
如果跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
  不操作   不操作   不操作   不操作
如果不跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   不操作
实例:HERE  BNC JUMP
执行指令前:
PC      =(HERE)的地址
执行指令后:
如果进位=0,那么
PC      =(Jump)的地址
如果进位=1,那么
PC      =(HERE+2)的地址
 BNN   如果不是负数,那么转移
  语法:   [标号]BNN  n
  操作数:   -128≤n≤127
  操作:   如果负数位为0,那么(PC)+2+2n→PC
  受影响的状态:   无
  编码:   1110   0111   nnnn   nnnn
  说明:   如果负数位为0,那么程序将转移。将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地址将是PC+2+2n。然后指令是2周期指令。
  字:   1
  周期:   1(2)
Q周期活动:如
果跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
  不操作   不操作   不操作   不操作
如果不跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   不操作
实例:HERE  BNN    Jump
执行指令前:
PC        =(HERE)的地址
执行指令后:
如果负数位=0,那么
PC        =(Jump)的地址
如果负数位=1,那么
PC        =(HERE+2)的地址
  w  如果未溢出,那么转移
  语法:  [标号]BNV  n
  操作数:  -128≤n≤127
  操作:  如果溢出位为“0”,那么(PC)+2+2n→PC
  受影响的状态:  无
  编码:   1110   0101   nnnn   nnnn
  说明:   如果溢出位为“0”,那么程序将转移。将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地址将是PC+2+2n。然后指令是2周期指令。
  字:   1
  周期:   1(2)
  Q周期活动:如果跳转,那么:
  Q1  Q2   Q3   Q4
  译码  读字面值“n”   处理数据   写入PC
  不操作  不操作   不操作   不操作
如果不跳转,那么:
  Q1  Q2   Q3   Q4
  译码  读字面值“n”   处理数据   写入PC
实例:HERE  BNV  JUMP
执行指令前:
PC        =(HERE)的地址
执行指令后:
如果溢出位=0,那么
PC        =(JUMP)的地址
如果溢出位=1,那么
PC        =(HERE+2)的地址
  BNZ   如果不为零,那么转移
  语法:   [标号]BNZ  n
  操作数:   -128≤n≤127
  操作:   如果零位为“0”,那么(PC)+2+2n→PC
  受影响的状态:   无
  编码:   1110   0001   nnnn   nnnn
  说明:   如果零位为“0”,那么程序将转移。将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地址将是PC+2+2n。然后指令是2周期指令。
  字:   1
  周期:   1(2)
  Q周期活动:如果跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
  不操作   不操作   不操作   不操作
如果不跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
实例:HERE BNZ JUMP
执行指令前:
PC=(HERE)的地址
执行指令后:
如果零位=0,那么
PC=(JUMP)的地址
如果零位=1,那么
PC=(HERE+2)的地址
  BRA   无条件转移
  语法:   [标号]BRA  n
  操作数:   -1024≤n≤1023
  操作:   (PC)+2+2n→PC
受影响的状态   无
  编码:   1101   0nnn   nnnn   nnnn
  说明:   将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地
  址将是PC+2+2n。然后指令是2周期指令。
 字:   1
 周期:   2
 Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
  不操作   不操作   不操作   不操作
实例:HERE BRA  JumD
执行指令前:
PC=(HERE)的地址
执行指令后:
PC=(Jump)的地址
  BSF   将f的位置位
  语法:   [标号]BSF f,b,a
  操作数:   0≤f≤2550≤b≤7a∈[0,1]
  操作:   1→f<b>
  受影响的状态:   无
  编码:   1000   bbba   ffff   ffff
  说明:   将寄存器“f”中的位“b”置位。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写寄存器“f”
实例:BSF  FLAG_REG,7,1
执行指令前:
FLAG_REG=0x0A
执行指令后:
FLAG_REG=0x8A
BTFSC    位测试文件,如果被清零那么跳跃
  语法:   [标号]BTFSC f,b,a
  操作数:   0≤f≤2550≤b≤7
  a∈[0,1]
  操作:   如果(f<b>)=0那么跳跃
  受影响的状态:   无
  编码:  1011   bbba   ffff   ffff
  说明:  如果寄存器“f”中的位“b”为0,那么跳过下一条指令。如果位“b”为0,那么放弃在当前指令执行期间所取的下一条指令,且替代地执行NOP,从而形成2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
字:  1
周期:1(2)
注意:如果跳跃且其后跟随两字指令,那么为3个周期。
  Q周期活动:Q1  Q2   Q3   Q4
  译码  读寄存器“f”   处理数据   不操作
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随2字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE  BTFSC FLAG,1,0
FALSE:
TRUE:
执行指令前:
PC    =(HERE)的地址
执行指令后:
如果FLAG<1>=0,那么
PC         =(TRUE)的地址
如果FLAG<1>=1,那么
PC         =(FALSE)的地址
BTFSS    位测试文件,如果被置位那么跳跃
  语法:   [标号]BTFSS f,b,a
  操作数:   0≤f≤2550≤b<7
  a∈[0,1]
  操作:   如果(f<b>)=1那么跳跃
  受影响的状态:   无
  编码:   1010   bbba   ffff   ffff
  说明:   如果寄存器“f”中的位“b”为1,那么跳过下一条指令。如果位“b”为1,那么放弃在当前指令执行期间所取的下一条指令,且替代地执行NOP,从而使其成为2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1(2)
注意:如果跳跃且其后跟随两字指令,那么为3个周期。
Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   不操作
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随2字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE  BTFSS FLAG,1,0
FALSE           :
TRUE            :
执行指令前:
PC    =(HERE)的地址
执行指令后:
如果FLAG<1>=0,那么
PC         =(FALSE)的地址
如果FLAG<1>=1,那么
PC         =(TRUE)的地址
  BTG   将f的位转换
  语法:   [标号]BTG f,b,a
  操作数:   0≤f≤2550≤b≤7a∈[0,1]
  操作:   (f<b>)→f<b>
  受影响的状态:   无
  编码:   0111   bbba   ffff   ffff
  说明:   将数据存储器位置“f”中的位“b”取补码。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写寄存器“f”
实例:BTG PORTC,4,0
执行指令前:
PORTC    =0111 0101[0x75]
执行指令后:
PORTC    =01100101[0x65]
  BV   如果溢出那么转移
  语法:   [标号]BV  n
  操作数:   -128≤n≤127
  操作:   如果溢出位位为“1”,那么(PC)+2+2n→PC
  受影响的状态:   无
  编码:   1110   0100   nnnn   nnnn
  说明:   如果溢出位位为“1”,那么程序将转移。将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地址将是PC+2+2n。然后指令是2周期指令。
  字:   1
  周期:   1(2)
  Q周期活动:如果跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
  不操作   不操作   不操作   不操作
如果不跳转,那么
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   不操作
实例:HERE BV JumD
执行指令前:
PC        =(HERE)的地址
执行指令后:
如果溢出位=1,那么
PC        =(Jump)的地址
如果溢出位=0,那么
PC=(HERE+2)的地址BZ   如果为零那么转移
语法:   [标号]BZ  n
操作数:   -128≤n≤127
操作:   如果零位为“1”,那么(PC)+2+2n→PC
受影响的状态:   无
编码:   1110   0000   nnnn   nnnn
说明:   如果零位为“1”,那么程序将转移。将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令所以新的地址将是PC+2+2n。然后指令是2周期指令。
字:   1
周期:   1(2)
Q周期活动:如果跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   写入PC
  不操作   不操作   不操作   不操作
如果不跳转,那么:
  Q1   Q2   Q3   Q4
  译码   读字面值“n”   处理数据   不操作
实型:HERE BZ Jump
执行指令前:
PC      =(HERE)的地址
执行指令后:
如果零位=1,那么
PC      =(Jump)的地址
如果零位=0,那么
PC      =(HERE+2)的地址
  CALL   子程序调用
  语法:   [标号]CALL k,s
  操作数:   0≤k≤1048575s∈[0,1]
  操作:   (PC)+4→TOS,k→PC<20:1>,如果s=1,那么(W)→WS,(STATUS)→STATUSS,(BSR)→BSRS
  受影响的状态:   无
  编码:第一个字(k<7:0>)第二个字(k<19:8>) 11101111 110sk19kkk k7kkkkkkk kkkk0kkkk8
  说明:   整个2M字节存储器范围的子程序调用。首先,将返回地址(PC+4)压入返回栈。如果“s”=1,那么W、STATUS和BSR寄存器也压入其个别影像寄存器(W、STATUSS和BSRS)中。如果“s”=0,那么不更新(默认的)。然后将20位值“k”装载到PC<20:1>中。CALL是2周期指令。
  字:   2
  周期:   2
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读字面值“k”<7:0>,   将PC压入栈   读字面值“k”<19:8>,写入PC
  不操作   不操作   不操作   不操作
实例:HERE  CALL    THERE,Fast
执行指令前:
PC    =HERE)的地址
执行指令后:
PC    =(THERE)的地址
TOS   =(HERE+4)的地址
WS    =W
BSRS     =BSR
STATU SS =STATUS
  CLRF   对f清零
  语法:   [标号]CLRF  f,a
  操作数:   0≤f≤225a∈[0,1]
  操作:   000h→f1→Z
  受影响的状态:   Z
  编码:  0110   101a   ffff   ffff
  说明:  对指定寄存器中的内容清零。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写寄存器“f”
实例:CLRF  FLAG_REG,1
执行指令前:
FLAG_REG    =0x5A
执行指令后:
FLAG_REG    =0x00
  CLRWDT   对监视计时器清零
  语法:   [标号]CLRWDT
  操作数:   无
  操作:   000h→WDT,000h→WDT后分频器,1→ TO1→ PD
  受影响的状态:   TO、 PD
  编码:   0000   0000   0000   0100
  说明:  CLRWDT指令将监视计时器复位。它也将WDT的后分频器复位。状态位 TO和 PD被置位。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   不操作   处理数据   不操作
实例:CLRWDT
执行指令前:
WDT计数器  =?
执行指令后:
WDT计数器  =0x00
WDT后分频器=0
TO         =1
PD         =1
  COMF  对f取补码
  语法:  [标号]COMF  f,d,a
  操作数:  0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (f)→dest
  受影响的状态:  N、Z
  编码:  0001   11da   ffff   ffff
  说明:  对寄存器“f”的内容取补码。如果“d”为0,那么将结果存储在W中。如果“d”为1,那么将结果存储回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:  1
  周期:  1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例:COMF RFG,0,0
执行指令前:
REG    =0x13
执行指令后:
REG    =0x13
W      =0xEC
  CPFSEQ  将f与W相比较,如果f=W那么跳跃
  语法:  [标号],CPFSEQ  f,a
  操作数:  0≤f≤255a∈[0,1]
  操作:  (f)-(W),如果(f)=(W)那么跳跃(无符号比较)
  受影响的状态:  无
  编码:  0110   001a   ffff   ffff
  说明:  通过执行无符号减法来比较数据存储器位置“f”的内容与W的内容。如果“f”=W那么放弃取指,且替代地执行NOP,使得这条指令是2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1(2)
  注意:如果跳跃且其后跟随两字指令,那么为3个周期
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   不操作
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随两字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE    CPFSEQ  REG,0
NEQUAL:
EQUAL:
执行指令前:
PC地址     =HERE
W    =?
REG      =?
执行指令后:
如果REG  =W,那么
PC       =(EQUAL)的地址;
如果REG  ≠W,那么
PC       =(NEQUAL)的地址。
  CPFSGT   将f与W相比较,如果f>W那么跳跃
  语法:   [标号]CPFSGT  f,a
  操作数:   0≤f≤255a∈[0,1]
  操作:   (f)-(W),如果(f)>(W)那么跳跃(无符号比较)
  受影响的状态:   无
  编码:   0110   010a   ffff   ffff
  说明:   通过执行无符号减法来比较数据存储器位置“f”的内容与W的内容。如果“f”的内容大于W的内容,那么放弃取指,且替代地执行NOP,使得这条指令是2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1(2)注意:如果跳跃且其后跟随两字指令,那么为3个周期
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   不操作
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随两字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE  CPFSGT REG,0
NGREATER  :
GREATER:
执行指令前:
PC    =(HERE)的地址
W     =?
执行指令后:
如果REG  >W,那么
PC       =(GREATER)的地址;
如果REG  ≤W,那么
PC       =(NGREATER)的地址。
  CPFSLT   将f与W相比较,如果f<W那么跳跃
  语法:   [标号]CPFSLT  f,a
  操作数:   0≤f≤255a∈[0,1]
  操作:   (f)-(W),如果(f)<(W)那么跳跃(无符号比较)
  受影响的状态:   无
  编码:   0110   000a   ffff   ffff
  说明:   通过执行无符号减法来比较数据存储器位置“f”的内容与W的内容。如果“f”的内容小于W的内容,那么放弃取指,且替代地执行NOP,使得这条指令是2周期指令。如果“a”为0,那么将选择虚拟存储区。如果“a”为1,那么将不覆盖BSR(默认的)。
  字:   1
  周期:   1(2)
  注意:如果跳跃且其后跟随两字指令,那么为3个周期
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   不操作
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随2字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE CPFSLT REG,1
NLEESS     :
LESS       :
执行指令前:
PC    =(HERE)的地址
W     =?
执行指令后:
如果REG  <W,那么
PC       =(LESS)的地址;
如果REG  ≥W;
PC       =(NLESS)的地址
  DAW  对W寄存器进行数字调整
  语法:  [标号]DAW
  操作数:  无
  操作:  如果[W<3:0>>9]或[DC=1],那么(W<3:0>)+6→W<3:0>;否则(W<3:0>)→W<3:0>;如果[W<7:4>>9]或[C=1],那么(W<7:4>)+6→W<7:4>;否则(W<7:4>)→W<7:4>;
  受影响的状态:  C
  编码:  0000   0000   0000   0111
  说明:  DAW调整W中的由先前将两个变量(每个变量都是封装的BCD格式)相加而产生的8位值,并产生正确的经封装的BCD结果。
  字:  1
  周期:  1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读存器W   处理数据   写入W
实例1:DAW
执行指令前:
W    =0xA5
c    =0
DC   =0
执行指令后:
W    =0x05
c    =1
DC   =0
实例2:
执行指令前:
W    =0xCE
c    =0
DC   =0
执行指令后:
W    =0x34
c    =1
DC   =0
  DECF   将f递减
  语法:   [标号]DECF f,d,a
  操作数:   0≤f≤255d∈[0.1]a∈[0,1]
  操作:   (f)-1→dest
  受影响的状态:   C、DC、N、OV、Z
  编码:   0000   01da   ffff   ffff
  说明:   将寄存器“f”递减。如果“d”为0,那么将结果存储在W中。如果“d”为1,那么将结果存储回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例:DECF  CNT,1,0
执行指令前:
CNT  =0x01
Z    =0
执行指令后:
CNT  =0x00
Z    =1
  DECFSZ  将f递减,如果为0那么跳跃
  语法:  [标号]DECFSZ f,d,a
  操作数:  0≤f≤255d∈[0,1]a∈[0,1]
  操作:  (f)-1→dest,如果结果为0那么跳跃
  受影响的  无
  编码:  0010   11da   ffff   ffff
  说明:  寄存器“f”的内容递减。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置回寄存器“f”中(默认的)。如果结果为0,那么放弃已取得的下一条指令,且替代地执行NOP,使得这条指令是2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:  1
  周期:  1(2)注意:如果跳跃且其后跟随两字指令,那么为3个周期
  Q周期活
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随2字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE DECFSZ CNT,1,1
GOTO LOOP
CONTINUE
执行指令前:
PC    =(HERE)的地址
执行指令后:
CNT    =CNT-1
如果CNT=0,那么
PC     =(CONTINUE)的地址;
如果CNT≠0;
PC     =(HERE+2)的地址
  DCFSNZ   将f递减,如果不为0那么跳跃
  语法:   [标号]DCFSNZ f,d,a
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (f)-1→dest,如果result≠0那么跳跃
  受影响的状态:   无
  编码:   0100   11da   ffff   ffff
  说明:   寄存器“f”的内容递减。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置回寄存器“f”中(默认的)。如果结果不为0,那么放弃已取得的下一条指令,且替代地执行NOP,使得这条指令是2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1(2)注意:如果跳跃且其后跟随两字指令,那么为3个周期
  Q周期活动:
  Q1  Q2   Q3   Q4
  译码  读寄存器“f”   处理数据.   写入目的地
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随2字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE DCFSNZ TEMP,1,0
ZERO:
NZERO:
执行指令前:
TEMP  =?
执行指令后:
TEMP  =TEMP-1,
如果TEMP=0;
PC    =(ZERO)的地址
如果TEMP≠0;
PC    =(NZERO)的地址
  GOTO   无条件转移
  语法:   [label]GOTO k.
  操作数:   0≤k≤1048575
  操作:   k→PC<20:1>
  受影响的状态:   无
  编码:第一个字(k<7:0>)第二个字(k<19:8>) 11101111 1111k19kkk k7kkkkkkk kkkk0kkkk8
  说明:   GOTO允许在整个2M字节存储器范围内的无条件转移。将20位值“k”装载到PC<20:1>中。GOTO总是2周期指令。
  字:   2
  周期:   2
  Q周期活动:
  Q1  Q2   Q3   Q4
  译码  读字面值“k”<7:0>,   不操作   读字面值“k”<19:8>,写入PC
  不操作   不操作   不操作   不操作
实例:GOTO THERE
执行指令后:
PC  =(THERE)的地址
  HALT   异常终止处理器
  语法:   [标号].HALT
  操作数:   无
  操作:   在HALT指令后处理器异常终止执行
  受影响的状态:   无
  编码:   0000   0000   0000   0001
  说明:   在仿真模式中工作时,halt指令的执行将使处理器的执行异常终止。转换HALT引脚或复位( MCLR=0)将使装置不异常终止。不会在非仿真模式下识别HALT指令。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   不操作   不操作   异常终止
  NCF   将f递增
  语法:   [标号]INCF f,d,a
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (f)+1→dest
  受影响的状态:   C、DC、N、OV、Z
  编码:   0010   10da   ffff   ffff
  说明:   将寄存器“f”的内容递增。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例:INCF    CNT,1,0
执行指令前:
CNT  =0xFF
Z    =0
C    =?
DC   =?
执行指令后:
CNT  =0x00
Z    =1
C    =1
DC   =1
  INCFSZ   将f递增,如果为0那么跳跃
  语法:   [标号]INCFSZ f,d,a
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (f)+1→dest,如果结果=0那么跳跃
  受影响的状态:   无
  编码:   0011   11da   ffff   ffff
  说明:   寄存器“f”的内容递增。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置回寄存器“f”中(默认的)。如果结果为0,那么放弃已取得的下一条指令,且替代地执行NOP,使得这条指令是2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1(2)
  注意:如果跳跃且其后跟随两字指令,那么为3个周期
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随2字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE  INCFSZ  CNT, 1,0
NZERO   :
ZERO    :
执行指令前:
PC      =(HERE)的地址
执行指令后:
CNT     =CNT+1
如果CNT =0,那么
PC      =(zero)的地址;
如果CNT ≠0,那么
PC      =(NZERO)的地址。
  INFSNZ   将f递增,如果不为0那么跳跃
  语法:   [标号]INFSNZ f,d,a
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (f)+1→dest,如果结果≠0那么跳跃
  受影响的状态:   无
  编码:   0100   10da   ffff   ffff
  说明:   寄存器“f”的内容递增。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置回寄存器“f”中(默认的)。如果结果不为0,那么放弃已取得的下一条指令,且替代地执行NOP,使得这条指令是2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1(2)
  注意:如果跳跃且其后跟随两字指令,那么为3个周期
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随2字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE  IHFSNZ REG,1,0
ZERO
NZERO
执行指令前:
PC    =(HERE)的地址
执行指令后:
REG      =REG+1
如果REG  ≠0,那么
PC       =(NZERO)的地址;
如果REG  =0,那么
PC       =(ZERO)的地址。
  IORLW  将字面值和W进行异或运算
语法:  [标号]IORLW  k
  操作数:  0≤k≤255
  操作:  (W).OR.k→W
  受影响的状态:  N、Z
  编码:  0000   1001   kkkk   kkkk
  说明:  将W的内容与8位字面值“k”进行或运算。将结果置于W中。
  字:  1
  周期:  1
  Q周期活动
  Q1   Q2   Q3   Q4
  译码   读字面值“k”   处理数据   写入W
实例:
IORLW    0x35
执行指令前:
W    =0x9A
执行指令后:
W    =0xBF
  IORWF   将W与f进行或运算
  语法:   [标号]IORWF  f,d,a
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (W).OR.(f)→dest
  受影响的状态:   N、Z
  编码:   0001   00da   ffff   ffff
  说明:   将W与寄存器“f”进行或运算。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例:IORWF RESULT,0,1
执行指令前:
RESULT=0x13
W     =0x91
执行指令后:
RESULT=0x13
W     =0x93
  MOVF   移动f
  语法:   [标号]MOVF f,d,a
  操作数:   O≤f≤1255d∈[0,1]a∈[0,1]
  操作:   f→dest
  受影响的状态:   N、Z
  编码:   0101   00da   ffff   ffff
  说明:   视“d”的状态而定将寄存器“f”的内容移动到目的地。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置回寄存器“f”中(默认的)。位置“f”可以是256字节存储区中的任何地方。如果“a”为0,那么将选择虚拟
 存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
 字:  1
 周期:  1
 Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写W
实例:MOVF    REG,0,0
执行指令前:
REG=0x22
W  =0xFF
执行指令后:
REG=0x22
W  =0x22
  MOVFF   将f移动到f
  语法:操作数:   [标号]MOVFF fs,fd0≤fs≤40950≤fd≤4095
  操作:   (fs)→fd
  受影响的状态:   无
  编码:第一个字(源)第二个字(目标) 11001111 ffffffff ffffffff ffffsffffd
  说明:   将源寄存器“fs”的内容移动到目标寄存器“fd”的内容。源寄存器“fs”的位置可以是4096字节数据空间(000h到FFFh)的任何地方,且目的地“fd”的位置也可以是000h到FFFh的任何地方。源或目的地都可以是W(在有用的特殊情况下)。MOVFF特别用于将一个数据存储器位置转移到外围寄存器(如传输缓冲器或I/O端口)。MOVFF指令不可将PCL、TOSU、TOSH或TOSL用作目标寄存器。
  字:   2
  周期:   2(3)
  Q周期活动:
  Q1   Q2   Q3  Q4
  译码   读寄存器“f”(src)   处理数据  不操作
  译码   不操作   不操作  写寄存器“f”(dest)
  不假读
实例:MOVFF  REG1,REG2
执行指令前:
REG1=0x33
REG2=0x11
执行指令后:
REG1=0x33
REG2=0x33
  MOVLB   将字面值移动到BSR中的低4位字节
  语法:   [标号]MOVLB  k
  操作数:   0≤k≤255
  操作:   k→BSR
  受影响的状态:   无
  编码:   0000   0001   kkkk   kkkk
  说明:   将8位字面值“k”装载到存储区选择寄存器(BSR)中。
  字:   1
  周期:   1
  Q周期活动:
  Q1  Q2   Q3   Q4
  译码  读字面值“k”   处理数据   将字面值“k”写入BSR
实例:MOVLB 5
执行指令前:
BSR寄存器=0x02
执行指令后:
BSR寄存器=0x05
  LFSR   将字面值移动到FSR
  语法:   [标号].LFSR f,k
  操作数:   0≤f≤20≤k≤4095
  操作:   k→FSRf
  受影响的状态:   无
  编码: 11101111 11100000 00ffk7kkk K11kkkkkkk
  说明:   将12位字面值“k”装载到由“f”指向的文件选择寄存器中。
  字:   2
  周期:   2
  Q周期活动:
  Q1  Q2   Q3   Q4
  译码  读字面值“k”MSB   处理数据   将字面值“k”的MSB写入FSRfH
  译码  读字面值“k”的LSB   处理数据   将字面值“k”写入FSRfL
实例:LFSR 2,0x3AB
执行指令后:
FSR2H    =0x03
FSR2L    =0xAB
  MOVLW   将字面值移动到W
  语法:   [标号]MOVLW k
  操作数:   0≤k≤255
  操作:   k→W
  受影响的状态:   无
  编码:   0000   1110   kkkk   kkkk
  说明:   将8位字面值“”装载到W中。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读字面值“k”   处理数据   写入W
实例:MOVLW  0x5A
执行指令后:
W    =0x5A
  MOVWF   将W移动到f
  语法:   [标号]MOVWF  f,a
  操作数:   0≤f≤255a∈[0,1]
  操作:   (W)→f
  受影响的状态:   无
  编码:   0110   111a   ffff   ffff
  说明:   将数据从W移动到寄存器“f”。位置“f”可以是256字节存储区中的任何地方。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动.
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写寄存器“f”
实例:MOVWF    REG,0
执行指令前:
w      =0x4F
REG    =0xFF
执行指令后:
w      =0x4F
REG    =0x4F
  MULLW   将字面值与W相乘
  语法:   [标号]MULLW  k
  操作数:   0≤k≤255
  操作:   (W)×k→PRODH:PRODL
  受影响的状态:   无
  编码:   0000   1101   KKKK   KKKK
  说明:   在W的内容与8位字面值“k”之间执行无符号乘法。16位结果置于PRODH:PRODL寄存器对中。PRODH含有高字节。W不改变。所有状态旗标都不受影响。注意,在这个操作中溢出和进位都不可能发生。可能出现零结果,但是检测不到。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读字面值“k”   处理数据   写寄存器PRODH:PRODL
实例:MULLW    0xC
执行指令前:
W    =0xE2
PRODH=?
PRODL=?
执行指令后:
W    =0xE2
PRODH=0xAD
PRODL=0x08
  MULWF   将W与f相乘
  语法:   [标号]MULWF  f,a
  操作数:   0≤f≤255a∈[0,1]
  操作:   (W)×(f)→PRODH:PRODL
  受影响的状态:   无
  编码:   0000   001a   ffff   ffff
  说明:   在W的内容与8位寄存器文件位置“f”之间执行无符号乘法。16位结果存储于PRODH:PRODL寄存器对中。PRODH含有高字节。W和“f”两者都不改变。所有状态旗标都不受影响。注意,在这个操作中溢出和进位都不可能发生。可能出现零结果,但是检测不到。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1  Q2   Q3   Q4
  译码  读寄存器“f”   处理数据   写寄存器PRODH:PRODL
实例:MOLWF    REG,1
执行指令前:
W      =0xC4
REG    =0xB5
PRODH  =?
PRODL  =?
执行指令后:
W      =0xC4
REG    =0xB5
PRODH  =0x8A
PRODL  =0x94
  NEGF  取f的反码
  语法:  [标号].NEGF  f,a
  操作数:  0≤f≤255a∈[0,1]
  操作:  (f)+1→f
  受影响的状态:  N、OV、C、DC、Z
  编码:  0110   110a   ffff   ffff
  说明:  使用二进制补码取“f”位置的反码。将结果置于数据存储器位置“f”中。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”=1,那么将按照BSR值选择存储区。
  字:  1
  周期:  1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写寄存器“f”
实例:NEGF REG,1
执行指令前:
REG    =0011 1010[0x3A]
执行指令后:
REG    =1100 0110[0xC6]
  NOP   不操作
  语法:   [标号]NOP
  操作数:   无
  操作:   不操作
  受影响的状态:   无
  编码:   00001111   0000xxxx   0000xxxx   0000xxxx
  说明:   不操作.
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   不操作   不操作   不操作
实例:
无.
  POP   弹出返回栈的栈顶
  Syntax:   [标号]POP
  操作数:   无
  操作:   (TOS)→位桶
  受影响的状态:   无
  编码:   0000   0000   0000   0110
  说明:   TOS值被弹出返回栈,且被放弃。然后TOS值变成压入返回栈的先前值。提供这个指令使得用户能适当地管理返回栈以并入软件栈。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   不操作   弹出TOS值   不操作
实例:POP
GOTO    NEW
执行指令前:
TOS=0031A2h
Stack(向下的1级)=014332h
执行指令后:
TOS=014332h
PC=NEW
  压入  压入返回栈的栈顶
  语法:  [标号]PUSH
  操作数:  无
  操作:  (PC+2)→TOS
  受影响的状态:  无
  编码:  0000   0000   0000   0101
  说明:  将PC+2压入返回栈的栈顶。先前的TOS值压入栈。
 这条指令允许通过修改TOS来实施软件栈,然后将其压入返回栈。
 字:  1
 周期:  1
 Q周期活动:
  Q1   Q2   Q3   Q4
  译码   将PC+2压入返回栈   不操作   不操作
实例:PUSH
执行指令前:
TOS             =00345Ah
PC              =000124h
执行指令后:
PC              =000126h
TOS             =000126h
Stack(向下的1级)=00345Ah
  RCALL   转移子程序
  语法:   [标号]}RCALL n
  操作数:   -1024≤n≤1023
  操作:   (PC)+2→TOS,(PC)+2+2n→PC
  受影响的状态:   无
  编码:   1101   lnnn   nnnn   nnnn
  说明:   子程序调用使得从当前位置跳转多达1K。首先,将返回地址(PC+2)压入栈,然后,将二进制补码数“2n”加入PC。因为PC将递增以取下一条指令,所以新地址将是PC+2+2n。这条指令是2周期指令。
  字:   1
  周期:   2
  Q周期活动:
  Q1  Q2   Q3   Q4
  译码  读字面值“n”,将PC压入栈   处理数据   写入PC
  不操作  不操作   不操作   不操作
实例:HERE    RCALL Jump
执行指令前:
PC =(HERE)的地址
执行指令后:
PC =(Jump)的地址
TOS=(HERE+2)的地址
  ESET   复位
  语法:   [标号]RESET
  操作数:   无
  操作:   复位所有由 MCLR复位影响的寄存器和旗标
  受影响的状态:   所有
  编码:   0000   0000   1111   1111
  说明:   这条指令提供在软件中执行 MCLR复位的方式。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   开始复位   不操作   不操作
实例:RESET
执行指令后:
寄存器=复位值
旗标* =复位值
  RETFIE   从中断返回
  语法:   [标号]RETFIE s
  操作数:   s∈[0,1]
  操作:   (TOS)→PC,1→GIE/GIEH或PEIE/GIEL,如果s=1,那么(WS)→W,(STATUSS)→STATUS,(BSRS)→BSR,PCLATU、PCLATH不改变。
  受影响的状态:   GIE/GIEH、PEIE/GIEL、STATUS寄存器。
  编码:   0000   0000   0001   000s
  说明:   从中断的返回。出栈且将栈顶(TOS)装载到PC中。通过设置高优先权全局中断使能位或低优先权全局中断使能位来使能中断。如果“s”=1,那么将影像寄存器WS、STATUSS
 和BSRS的内容装载到其对应的寄存器W、STATUS和BSR中。如果“s”=0,那么不更新这些寄存器(默认的)。
  字:   1
  周期:   2
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   不操作   不操作   从栈弹出PC设置GIEH或GIEL
  不操作   不操作   不操作   不操作
实例:RETFIE    Fast
中断后:
PC     =TOS
W      =WS
BSR    =BSRS
STATUS =STATUSS
GIE/GIEH,PEIE/GIEL  =1
Figure A20048003805800741
Q1 Q2 Q3 Q4
  译码   读寄存器   处理数据   写入目的地
实例:RLCF  REG  ,0,0
执行指令前:
REG    =11100110
C      =0
执行指令后:
REG    =1110 0110
W      =1100 1100
C      =1
Figure A20048003805800751
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例:RLNCFREG,1,0
执行指令前:
REG    =1010 1011
执行指令后:
REG    =0101 0111
Figure A20048003805800761
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例:RRCF REG,0,0
执行指令前:
REG    =1110 0110
C      =0
执行指令后:
REG    =1110 0110
W      =0111 0011
C      =0
  RRNCF   将f循环右移(不进位)
  语法:   [标号]RRNCF f,d,a.
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (f<n>)→dest<n-1>,(f<0>)→dest<7>
  受影响的状态:   N、Z
  编码:   0100   00da   ffff   ffff
  说明:   将寄存器“f”的内容循环右移1位。如果“d”为0,那么将结果置于W中。如果
Figure A20048003805800771
  Q1  Q2   Q3   Q4
  译码  读寄存器“f”   处理数据   写入目的地
实例1:RRNCF    REG,1,0
执行指令前:
REG    =1101 0111
执行指令后:
REG    =1110 1011
实例2:RRNCF REG,0,0
执行指令前:
W      =?
REG    =1101 0111
执行指令后:
W      =1110 1011
REG    =1101 0111
  SETF   将f置位
  语法:   [标号]SETF  f,a
  操作数:   0≤f≤255a∈[0,1]
  操作:   FFh→f
  受影响的状态:   无
  编码:   0110   100a   ffff   ffff
  说明:   将指定寄存器的内容设置为FFh。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写寄存器“f”
实例:SETF    REG,1
执行指令前:
REG    =0x5A
执行指令后:
REG    =0xFF
  SLEEP   进入SLEEP模式
  语法:   [标号]SLEEP
  操作数:   无
  操作:   00h→WDT,0→WDT后分频器,1→, TO0→ PD
  受影响的状态:   TO、 PD
  编码:   0000   0000   0000   0011
  说明:   将断电状态位( PD)清零。将超时状态位( TO)置位。将监视计时器和其后分频器清零。使处理器进入SLEEP模式且使振荡器停止。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   不操作   处理数据   进入睡眠
实例:SLEEP
执行指令前:
TO    =
PD  =?
执行指令后:
TO  =1
PD  =0
如果WDT引起唤醒,那么将对这个位清零
  SUBFWB   从W与借位减去f
  语法:   [标号]SUBFWB f,d,a
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   {W}-(f)-( C)→dest
  受影响的状态:   N、OV、C、DC、Z
  编码:   0101   01da   ffff   ffff
  说明:   从W减去寄存器“f”与进位旗标(借位)(二进制补码方法)。如果“d”为0,那么将结果存储在W中。如果“d”为1,那么将结果存储回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
SUBFWB
实例1:SUBFWB REG,1,0
执行指令前:
REG    =3
W      =2
C      =1
执行指令后:
REG    =FF
W      =2
C      =0
Z      =0
N      =1;结果为负数
实例2:SUBFWB  REG,0,0
执行指令前:
REG    =2
W      =5
C      =1
执行指令后:
REG    =2
W      =3
C      =1
Z      =0
N      =0;结果为正
实例3:SDBFWB    REG,1,0
执行指令前:
REG    =1
W      =2
C      =0
执行指令后:
REG    =0
W      =2
C      =1
Z      =1;结果为0
N      =0
  SUBLW   字面值减去W
  语法:   [标号]SUBLW k
  操作数:   0≤k≤255
  操作:   k-(W)→W
  受影响的状态:   N、OV、C、DC、Z
  编码:   0000   1000   kkkk   kkkk
  说明:   从8位字面值“k”减去W。将结果置于W中。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3  Q4
  译码   读字面值“k”   处理数据  写入W
实例1:SUBLW 0x02
执行指令前:
W    =1
C    =?
执行指令后:
W    =1
C    =1;结果为正
Z    =0
N    =0
实例2:SUBLW 0x02
执行指令前:
W    =2
C    =?
执行指令后:
W    =0
C    =1;结果为0
Z    =1
N    =0
实例3:SUBLW 0x02
执行指令前:
W    =3
C    =?执行指令后:
W    =FF;(二进制补码)
C    =0;结果为负
Z    =0
N    =1
  SUBWF   从f减去W
  语法:   [标号]SUBWF f,d,a;
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (f)-(W)→dest
  受影响的状态:   N、OV、C、DC、Z
  编码:   0101   11da   ffff   ffff
  说明:   从寄存器“f”减去W(二进制补码方法)。
 如果“d”为0,那么将结果存储在W中。如果“d”为1,那么将结果存储回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
 字:  1
 周期:  1
 Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例1:SUBWF    REG,1,0
执行指令前:
REG    =3
W      =2
C      =?
执行指令后:
REG    =1
W      =2
C      =1;结果为正
Z      =0
N      =0
实例2:SUBWF    REG,0,0
执行指令前:
REG    =2
W      =2
C      =?
执行指令后:
REG    =2
W      =0
C      =1;结果为0
Z      =1
N      =0
实例3:SUBWF    REG,1,0
执行指令前:
REG    =1
W      =2
C      =?
执行指令后:
REG    =FF;(二进制补码)
W      =2
C      =0;结果为负
Z      =0
N      =1
  SUBWFB语法:   从f与借位减去W[标号]SUBWFB f,d,a
  操作数:   0≤f≤255d ∈[0,1]a∈[0,1]
  操作:   (f)-(W)-( C)→dest
  受影响的状态:   N、OV、C、DC、Z
  编码:   0101   10da   ffff   ffff
  说明:   从寄存器“f”减去W与进位旗标(借位)(二进制补码方法)。如果“d”为0,那么将结果存储在W中。如果“d”为1,那么将结果存储回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
SUBWFB
实例1:SUBWFB    REG,1,0
执行指令前:
REG  =0x19  (0001 1001)
W    =0x0D  (0000 1101)
C    =1
执行指令后:
REG  =0x0C  (0000 1011)
W    =0x0D  (0000 1101)
C    =1
Z    =0
N    =0;结果为正
实例2:SUBWFB  REG,0,0
执行指令前:
REG  =0x1B  (0001 1011)
W    =0x1A  (0001 1010)
C    =0
执行指令后:
REG  =0x1B  (0001 1011)
W    =0x00
C    =1
Z    =1;结果为0
N    =0
实例3:SUBWFB    REG,1,0
执行指令前:
REG  =0x03  (0000 0011)
W    =0x0E  (0000 1101)
C    =1
执行指令后:
REG  =0xF5(1111 0100)(二进制补码)
W    =0x0E  (0000 1101)
C    =0
Z    =0
N    =1;结果为负
  SWAPF  交换f
  语法:  [标号]SWAPF f,d,a
  操作数:  0≤f≤255
  d∈[0,1]a∈[0,1]
  操作:   (f<3:0>)→dest<7:4>,(f<7:4>)→dest<3:0>
  受影响的状态:   无
  编码:   0011   10da   ffff   ffff
  说明:   交换寄存器“f”的高4位字节和低4位字节。如果“d”为0,那么将结果置于W中。如果“d”为1,那么将结果置于寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例:SWAPF    REG,1,0
执行指令前:
REG    =0x53
执行指令后:
REG    =0x35
  TBLRD   表读操作
  语法:  [标号]TBLRD(*;*+;*-;+*)
  操作数:无
  操作:  如果TBLRD*,那么(Prog Mem(TBLPTR))→TABLAT;TBLPTR不改变;如果TBLRD *+,那么(Prog Mem(TBLPTR))→TABLAT;(TBLPTR)+1→TBLPTR;如果TBLRD*-,那么(Prog Mem(TBLPTR))→TABLAT;(TBLPTR)-1→TBLPTR;如果TBLRD+*,那么(TBLPTR)+1→TBLPTR;(Prog Mem(TBLPTR))→TABLAT;
  受影响的状态:无
  编码:   0000   0000   0000   10nn
  nn=0 *
  =1   *+
  =2  *-
  =3  +*
  说明:   TBLRD指令有4个选项来确定21位表指针(TBLPTR)发生什么:不改变、后递增、后递减和预递增。确定当前选项且适当地修改TBLPTR,且由TBLPTR指向的程序存储器位置的内容装载到8位表锁存器(TABLAT)中。TBLPTR的LSb选择将读程序存储器位置的哪一字节。如果LSb=1,那么将高字节装载到TABLAT中。如果LSb=0,那么将低字节装载到TABLAT中。
  字:   1
  周期:   2
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   不操作   不操作   不操作
  不操作   不操作(地址总线上的表指针)   不操作   不操作( OE变低)TABLAT经更新
  TBLRD    表读操作
  实例1:  TBLRD*+;
  执行指令前:TABLAT          =0x55TBLPTR          =0x00A356MEMORY(0x00A356)=0x34
  执行指令后:TABLAT          =0x34TBLPTR          =0x00A357
  实例2:TBLRD    +*;
  执行指令前:TABLAT          =0xAATBLPTR          =0x01A357MEMORY(0x01A357)=0x12MEMORY(0x01A358)=0x34
  执行指令后:TABLAT          =0x34TBLPTR          =0x01A358
TBLWT   表写操作
语法:  [标号]TBLWT(*;*+;*-;+*)
操作数:无
操作:如果TBLWT*,那么
      (TABLAT)→Prog Mem(TBLPTR);
      TBLPTR不改变;
      如果TBLWT*+,那么
      (TABLAT)→Prog Mem(TBLPTR);
      (TBLPTR)+1→TBLPTR;
      如果TBLWT*-,那么
      (TABLAT)→Prog Mem(TBLPTR);
      (TBLPTR)-1→TBLPTR;
      如果TBLWT+*,那么
      (TBLPTR)+1→TBLPTR;
      (TABLAT)→Prog Mem(TBLPTR);
受影响的状态:无
  编码:   0000   0000   0000   11nn
  nn =0*
     =1*+
     =2*-
     =3+*
说明:
TBLWT指令有4个选项。这些选项确定表指针(TBLPTR)发生什么:不改变、后递增、后递减和预递增。确定当前选项且适当地修改TBLPTR。将表锁存器(TABLAT)的内容写入由TBLPTR指向的程序存储器位置。如果TBLPTR指向外部程序存储器位置,那么在两个周期中执行指令。因为TABLAT只有一个字节宽,所以必须执行两个TBLWT指令的乘法以对内部程序存储器位置编程。举例而言,如果确定装置一次编程一个字,那么按以下方式编程内部存储器位置:
1)将TBLPTR设置为偶字节
2)将低字节写入TABLAT
3)执行TBLWT*+(2个周期)
4)将高字节写入TABLAT
5)执行TBLWT*+(长写操作)
当接收到中断时终止对内部EPROM位置的长写操作。后递增TBLWT指令是推荐写入内部存储器的唯一的TBLWT指令。(写入内部EPROM仅可用于有64个或更多引脚的装置)。
字:1
TBLWT  表写操作
周期:2(如果对片内EPROM程序存储器进行长写操作那么有许多周期)
Q周期活动:
  Q1   Q2   Q3  Q4
  译码   不操作   不操作  不操作
  不操作   不操作(地址总线上的表指针)   不操作  不操作(地址总线上的表锁存器,WR变低)
实例1:TBLWT*+;
执行指令前:
TABLAT          =0x55
TBLPTR          =0x00A356
MEMORY0x00A356) =OxFF
执行指令后(表写操作完成):
TABLAT          =0x55
TBLPTR          =0x00A357
MEMORY(0x00A356)=0x55
实例2:TBLWT    +*;
执行指令前:
TABLAT          =0x34
TBLPTR          =0x01389A
MEMORY(0x01389A)=0xFF
MEMORY(0x01389B)=0xFF
执行指令后(表写操作完成):
TABLAT          =0x34
TBLPTR          =0x01389B
MEMORY(0x01389A)=OxFF
MEMORY(0x01389B)=0x34
  TRAP   调试器子程序调用
  语法:   [标号]TRAP
  操作数:   无
  操作:   (PC)+2→TOS,000028h→PC<20:1>
  受影响的状态:   INBUG
  编码:   0000   0000   1110   0000
  说明:   到00028h的调试器陷阱。首先将返回地址(PC+2)压入返回站。然后,将20位值“000028h”装载到PC<20:1>中。将INBUG状态位置位。TRAP是2周期指令。
字:   1
  周期:   2
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   将PC压入栈   不操作   将000028h写入PC
  不操作   不操作   不操作   不操作
实例:HERE TRAP
执行指令前:
PC    =(HERE)的地址
执行指令后:
PC    =000028h
TOS   =(HERE+2)的地址
INBUG =1
  TRET   从子程序的陷阱返回
  语法:   [标号]TRET
  操作数:   无
  操作:   (TOS)→PCPCLATU、PCLATH不改变
  受影响的状态:   INBUG
  编码:   0000   0000   1110   0001
  说明:   从调试器陷阱返回。出栈且将栈顶(TOS)装载到程序计数器中。将INBUG状态位清零。
  字:   1
  周期:   2
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   不操作   不操作   从栈弹出PC
  不操作   不操作   不操作   不操作
实例:TRET
中断后:
PC    =TOS
INBUG =O
  TSTFSZ   测试f,如果为0那么跳跃
  语法:   [标号]TSTFSZ f,a
  操作数:   0≤f≤255
  a∈[0,1]
  操作:   如果f=0那么跳跃
  受影响的状态:   无
  编码:   0110   011a   ffff   ffff
  说明:   如果“f”=0,那么放弃已在当前指令执行期间取得的下一条指令,且执行NOP,使得这条指令是2周期指令。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
字:  1
周期:1(2)
注意:如果跳跃且其后跟随两字指令,那么为3个周期
Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   不操作
如果跳跃,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
如果跳跃且其后跟随2字指令,那么:
  Q1   Q2   Q3   Q4
  不操作   不操作   不操作   不操作
  不操作   不操作   不操作   不操作
实例:HERE    TSTFSZ  CNT,1
NZERO:
ZERO:
执行指令前:
PC       =(HERE)的地址
执行指令后:
如果CNT  =0x00,那么
PC       =(ZERO)的地址;
如果CNT  ≠0x00,那么
PC       =(NZERO)的地址。
XORLW    将字面值与W进行异或运算
  语法:   [标号]XORLW k.
  操作数:   0≤k≤255
  操作:   (W).XOR.k→W
  受影响的状态   N、Z
  编码:   0000   1010   kkkk   kkkk
  说明:   将W的内容与8位字面值“k”异或。将结果置于W中。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读字面值“k”   处理数据   写入W
实例:XORLW  0xAF
执行指令前:
W    =0xB5
执行指令后:
W    =0x1A
  XORWF   将W与f进行异或运算
  语法:   [标号]XORWF  f,d,a
  操作数:   0≤f≤255d∈[0,1]a∈[0,1]
  操作:   (W).XOR(f)→dest
  受影响的状态:   N、Z
  编码:   0001   10da   ffff   ffff
  说明:   将W的内容与寄存器“f”异或。如果“d”为0,那么将结果存储在W中。如果“d”为1,那么将结果存储回寄存器“f”中(默认的)。如果“a”为0,那么将选择虚拟存储区,从而覆盖BSR值。如果“a”为1,那么将按照BSR值选择存储区(默认的)。
  字:   1
  周期:   1
  Q周期活动:
  Q1   Q2   Q3   Q4
  译码   读寄存器“f”   处理数据   写入目的地
实例:XORWF    REG,1,0
执行指令前:
REG    =0xAF
W      =0xB5
执行指令后:
REG    =0x1A
W      =0xB5

Claims (20)

1.一种微控制器,其包含:
一中央处理单元;
一数据存储器,其具有一线性化地址空间,且与所述中央处理单元耦接,其被分成n个存储区;
所述中央处理单元包含:
一存储区选择单元,其或者访问所述存储区中的一者或者访问一虚拟存储区,由此所述虚拟存储区组合所述数据存储器的两个存储区的部分存储空间,且其中所选的存储区形成一寄存器文件;
一算术逻辑单元,其与所述寄存器文件耦接;
复数个特殊功能寄存器,其映射到所述数据存储器中的所述存储区中的一者,其中所述特殊功能寄存器中的一者是一与所述算术逻辑单元耦接的工作寄存器;
一程序计数器寄存器,其位于所述中央处理单元内,所述程序计数器映射到所述数据存储器中;和
一工作寄存器,其位于所述中央处理单元内,且与所述算术逻辑单元耦接,所述工作寄存器映射到所述数据存储器中;
其中所述微控制器具有一用于控制所述算术逻辑单元的指令集,且其中至少一个指令包含一指示所述存储区选择单元是访问所述存储区中的一者还是访问所述虚拟存储区的位。
2.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码1110 1010kkkk kkkk的指令,其中一旦调用所述指令,便将一8位字面值复制到由一文件选择寄存器所指向的位置,然后所述文件选择寄存器递减,所述字面值“k”由所述指令的kkkk kkkk部分指示。
3.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码1110 1001 ffkkkkkk的指令,其中一旦调用所述指令,便从一文件选择寄存器中减去一6位无符号字面值以形成一结果,所述结果被存储到所述文件选择寄存器中,所述字面值由所述指令的kk kkkk部分指示,所述文件选择寄存器由所述指令的ff部分指示。
4.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码1110 100111kk kkkk的指令,其中一旦调用所述指令,便从一文件选择寄存器中减去一无符号6位字面值以形成一结果,所述结果被存储回所述文件选择寄存器中且被返回,所述字面值由所述指令的kk kkkk部分指示。
5.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码1110 1000 ffkkkkkk的指令,其中一旦调用所述指令,便将一无符号6位字面值加入一文件选择寄存器,将结果存储到所述文件选择寄存器中,所述字面值由所述指令的kk kkkk部分指示,所述文件选择寄存器由所述指令的ff部分指示。
6.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码1110 100011kk kkkk的指令,其中一旦调用所述指令,便将一由所述指令的kk kkkk部分指示的6位字面值加入一文件选择寄存器,且将结果存储回所述文件选择寄存器。
7.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码1110 1011 0sssssss 1111 dddd dddd dddd的指令,其中一旦调用所述指令,便将一8位值复制到一由所述12位值dddd dddd dddd指示的目的地,复制到所述目的地的所述8位值的位置通过将所述7位字面值值sss ssss加入一文件选择寄存器中的值来指示。
8.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码1110 1011 lsssssss 1111 xxxx xddd dddd的指令,其中一旦调用所述指令,便将一8位值复制到一由所述指令的ddd dddd部分指示的位置,所述8位值的位置通过将所述7位字面值值sss ssss加入一文件选择寄存器中的值来确定。
9.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码0000 00000001 0100的指令,其中一旦调用所述指令,便将一下一条指令的一地址推入一硬件栈中。
10.根据权利要求1所述的微控制器,其中所述指令集包括一具有一编码0000 00000001 0100的指令,其中一旦调用所述指令,便将一第一寄存器中的值复制到一程序计数器的一高16位中,且将一第二寄存器中的一值复制到所述程序计数器的一低8位中。
11.一种微处理器,其包含:
一中央处理单元;
一数据存储器,其与所述中央处理单元耦接且被分成n个存储区,所述中央处理单元包含:
一存储区选择单元,其用于选择所述数据存储器中的所述存储区中的一者,其中所述所选择的存储区形成一寄存器文件;
一算术逻辑单元,其与所述寄存器文件耦接;和
复数个特殊功能寄存器,其映射到所述数据存储器中的所述存储区中的一者;
其中所述特殊功能寄存器中的一者是一与所述算术逻辑单元耦接的工作寄存器。
12.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码1110 1010kkkk kkkk的指令,其中一旦调用所述指令,便将一8位字面值复制到由一文件选择寄存器所指向的位置,然后所述文件选择寄存器递减,所述字面值“k”由所述指令的kkkk kkkk部分所指示。
13.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码1110 1001ffkk kkkk的指令,其中一旦调用所述指令,便从一文件选择寄存器中减去一6位无符号字面值以形成一结果,所述结果被存储到所述文件选择寄存器中,所述字面值由所述指令的kk kkkk部分所指示,所述文件选择寄存器由所述指令的ff部分所指示。
14.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码1110 100111kk kkkk的指令,其中一旦调用所述指令,便从一文件选择寄存器中减去一无符号6位字面值以形成一结果,所述结果被存储回所述文件选择寄存器中且被返回,所述字面值由所述指令的kk kkkk部分所指示。
15.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码1110 1000ffkk kkkk的指令,其中一旦调用所述指令,便将一无符号6位字面值加入一文件选择寄存器,将结果存储到所述文件选择寄存器中,所述字面值由所述指令的kkkkkk部分所指示,所述文件选择寄存器由所述指令的ff部分所指示。
16.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码1110 100011kk kkkk的指令,其中一旦调用所述指令,便将一由所述指令的kk kkkk部分所指示的6位字面值加入一文件选择寄存器,且将结果存储回所述文件选择寄存器。
17.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码1110 10110sss ssss 1111 dddd dddd dddd的指令,其中一旦调用所述指令,便将一8位值复制到一由所述12位值dddd dddd dddd指示的目的地,复制到所述目的地的所述8位值的位置通过将所述7位字面值值sss ssss加上一文件选择寄存器中的值来指示。
18.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码1110 1011lsss ssss 1111 xxxx xddd dddd的指令,其中一旦调用所述指令,便将一8位值复制到一由所述指令的ddd dddd部分指示的位置,所述8位值的位置通过将所述7位字面值值sss ssss加入一文件选择寄存器中的值来确定。
19.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码0000 00000001 0100的指令,其中一旦调用所述指令,便将一下一条指令的一地址推入一硬件栈中。
20.根据权利要求11所述的微控制器,其中所述指令集包括一具有一编码0000 00000001 0100的指令,其中一旦调用所述指令,便将一第一寄存器中的值复制到一程序计数器的一高16位中,且将一第二寄存器中的一值复制到所述程序计数器的一低8位中。
CN200480038058.XA 2003-10-23 2004-10-18 微控制器指令集 Expired - Lifetime CN1898641B (zh)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US51391003P 2003-10-23 2003-10-23
US60/513,910 2003-10-23
US10/796,771 US7203818B2 (en) 1999-03-26 2004-03-09 Microcontroller instruction set
US10/796,771 2004-03-09
PCT/US2004/034355 WO2005043383A1 (en) 2003-10-23 2004-10-18 Microcontroller instruction set

Publications (2)

Publication Number Publication Date
CN1898641A true CN1898641A (zh) 2007-01-17
CN1898641B CN1898641B (zh) 2015-03-25

Family

ID=37610221

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200480038058.XA Expired - Lifetime CN1898641B (zh) 2003-10-23 2004-10-18 微控制器指令集

Country Status (3)

Country Link
KR (1) KR100960095B1 (zh)
CN (1) CN1898641B (zh)
TW (1) TWI339354B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101868780A (zh) * 2007-11-30 2010-10-20 密克罗奇普技术公司 增强的微处理器或微控制器
CN102282538A (zh) * 2009-02-11 2011-12-14 密克罗奇普技术公司 具有特殊分组指令的微控制器

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8327379B2 (en) * 2006-08-24 2012-12-04 Kernelon Silicon Inc. Method for switching a selected task to be executed according with an output from task selecting circuit
US9747105B2 (en) 2009-12-17 2017-08-29 Intel Corporation Method and apparatus for performing a shift and exclusive or operation in a single instruction
KR102514717B1 (ko) * 2016-10-24 2023-03-27 삼성전자주식회사 메모리 컨트롤러 및 이를 포함하는 메모리 시스템
TWI707272B (zh) * 2019-04-10 2020-10-11 瑞昱半導體股份有限公司 可執行指令的電子裝置以及指令執行方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6708268B1 (en) * 1999-03-26 2004-03-16 Microchip Technology Incorporated Microcontroller instruction set

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101868780A (zh) * 2007-11-30 2010-10-20 密克罗奇普技术公司 增强的微处理器或微控制器
CN101868780B (zh) * 2007-11-30 2014-08-13 密克罗奇普技术公司 增强的微处理器或微控制器
CN102282538A (zh) * 2009-02-11 2011-12-14 密克罗奇普技术公司 具有特殊分组指令的微控制器
CN102282538B (zh) * 2009-02-11 2015-04-22 密克罗奇普技术公司 具有特殊分组指令的微控制器

Also Published As

Publication number Publication date
KR100960095B1 (ko) 2010-05-31
TW200530920A (en) 2005-09-16
TWI339354B (en) 2011-03-21
KR20080053960A (ko) 2008-06-16
CN1898641B (zh) 2015-03-25

Similar Documents

Publication Publication Date Title
CN1186718C (zh) 微控制器指令集
CN1584824A (zh) 一种基于cisc结构的微处理器构架及指令实现方式
CN1135468C (zh) 对存储设备中信号数据字执行数字信号处理的方法和装置
CN1246772C (zh) 处理器
CN1103961C (zh) 协处理器的数据访问控制装置和方法
CN1117316C (zh) 采用多个向量寄存器组的单指令多数据处理方法及其装置
CN1112635C (zh) 多媒体信号处理器中的单指令多数据处理方法及其装置
CN100338568C (zh) 开发片上系统用的开发环境的生成方法
CN1080906C (zh) 一种数据处理系统及其方法
CN1202470C (zh) 处理器
CN1625731A (zh) 具有多种长度指令集体系结构的可配置数据处理器
CN1605058A (zh) 关于嵌入式字段可编程门阵列核心的接口结构
CN101040292A (zh) 数据管理装置及其方法
CN1875345A (zh) 在编译过程中表示和检查程序组件的一致性的可扩展类型系统
CN1484787A (zh) 处理器流水线中的硬件指令翻译
CN1226323A (zh) 数据处理装置寄存器
CN1226026A (zh) 数据处理装置
CN1886744A (zh) 在可扩展的处理器架构中增加高级指令所用的方法和装置
CN1774712A (zh) 在数据表中管理递归可缩放模板实例中的插入操作的系统和方法
CN1269052C (zh) 支持缩小代码长度的常量还原型处理器
CN1103959C (zh) 数据处理装置和操作数据处理装置的方法
CN1898641A (zh) 微控制器指令集
CN1152300C (zh) 多媒体信号处理器中的单指令多数据处理方法及其装置
CN1104679C (zh) 数据处理装置和数据处理方法
CN1777887A (zh) 用于创建递归可缩放模板实例的数据表中的系统和方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant