计算机中的交替指令和/或数据位的反转的制作方法

文档序号:6457115阅读:302来源:国知局
专利名称:计算机中的交替指令和/或数据位的反转的制作方法
技术领域
本发明涉及执行算术处理和计算的电子计算机领域,并且更具体地,涉及计算机电路中二进制数字的物理表示。

背景技术
数字计算机通过操作二进制数字(也称作真和假逻辑状态或布尔值)作为物理特性的高和低值的序列而工作,其中,所述物理特性通常是电路电势(电压)。按照惯例,在整个计算机电路中,统一地分配高电压值(或电平)以表示二进制1,并且分配低值以表示二进制0(这里称为1-高表示),或者反之亦然(这里称为1-低或反转(inverted)表示)。位表示变化(以平衡平均信号电平并减小RFI)在连续的数字信号传输中以及在内存芯片中是已知的,但在计算机电路中并非是已知的。计算机或数字处理器的电路中的统一数字表示简化其设计、测试和写入用于操作其的指令。在当前技术中,器件的整个逻辑系列采用固定、统一的表示。例如,1.5伏特CMOS使用大约1.5V的电路电势来表示二进制1,并且使用大约0V的电势来表示二进制0。
可以从例如多位加法的基本计算机操作(其通常尤其对于计算机处理器可以多快地执行有用任务是决定性的)的示例看出传统的二进制数字表示如何与电路需求和操作相关。图1中描绘了本领域中已知的双输入并行加法器10的框图,其中,每个方框12是表示1位全加器的组合电路,该1位全加器执行两个多位加数字A、B的1个位位置(bit-position)以及从相邻的较低位的位位置接收的进位输入(carry-in)值C的加法;从最低有效位(LSB)开始,仅示出了四个最低位的位位置(方框0、1、2、3)。在该图中,A0,B0,A1,V1,A2,B2,A3,B3是输入加数位值,并且,C0,C1,C2,C3分别是位位置0、1、2、3的进位位值。每个方框12计算和字S的位值S0,S1,S2,S3,并且,C4是至下个较高位的位位置(未示出)的进位输出(carry-out)值。可以看到,来自一个方框的进位输出是下个方框的进位输入,因此顺序地计算位位置总和,并且在相应组合电路等待时间内,进位计算的等待时间是累加的,然而不牵涉进位值的计算在一将加数字施加到电路时,就全都可以并行执行。因此,如果位的数量(字大小)较大,则进位延迟将在总等待时间中占主要地位。虽然本领域中已知用以执行多位加法的一些不同技术(其中,以不同方式采用并行性(和位位置的分组)),但是,这些技术全都经受取决于全部较低位的位输入在任何位位置(或位分组)的总和导致的等待时间(延迟时间),或者等效地说,在任何位位置的1位加法需要来自相邻较低位的进位。
图2中示出了加法器10的加法器方框12的部分14的电路图,其描绘了已知最佳CMOS组合电路,其响应于三个1位输入A1,B1,C1而执行位-1方框的进位输出值C2的计算。在此电路中,为了每个方框中的进位输入和进位输出的统一二进制数字表示,需要包括招致等待时间的反转器16,以调节输出端的逻辑电平。在例如根据其它已知技术执行多位加法的组合电路的其它组合电路中,可以需要用于统一数字表示的反转电路部分。无疑地,找出方法来提供下述基本电路是有益的所述电路不需要这样的用于调节数字表示的反转电路部分,从而在计算和信号处理的较高速度、节省地使用芯片(die)面积和功率、以及能够在多处理器阵列和嵌入式系统应用等方面,具有减小的等待时间和更优的计算机性能。然而,就发明人的知识而言,在本发明之前,并不知道满意的解决方案。


发明内容
因此,本发明的目的是提供用于计算机电路中二进制数字的交替(alternate)位反转表示的装置和方法,导致牵涉多位二进制数字的加法和其它组合操作的较快的执行。
本发明的另一目的是提供用于提供具有较小面积的计算机电路的装置和方法。
本发明的又一目的是提供用于提供不需要用于进位计算的反转部分的加法器电路的装置和方法。
简而言之,本发明是用于通过消除引起等待时间的反转器而减少计算机中的等待时间的方法和装置。这通过允许某些数据位保持未反转并且因此在相关联的电路中补偿来实现。
考虑到这里描述的和一些附图中图示的、执行本发明的方式的描述以及它们的工业适用性,本发明的这些和其它目标和优点将对于本领域的技术人员将变得清楚。列出的目的和优点不是本发明的所有可能的优点的穷尽列表。此外,即使在应用中或许不存在或不需要一个或多个预期的目标和/或优点,也将可以实践本发明。
此外,本领域的技术人员将认识到,本方面的各种实施例可以实现所描述的目标和/或优点中的一个或多个,而并非必须是全部。因此,这里描述的目的和/或优点不是本发明的必需要素,并且不应被解释为限制。



在附图中 图1(现有技术)是使用统一二进制数字表示的传统并行加法器的符号框图; 图2(现有技术)是更详细地示出使用传统的统一二进制数字表示的1位加法器方框的进位计算部分的电路图; 图3是使用非统一的二进制数字表示的并行加法器的符号框图,其中,根据本发明实施例而反转交替位; 图4是根据本发明使用交替位反转的1位加法器方框的快速进位计算部分的电路图; 图5比较传统方式与交替位反转的5位二进制数字的加法; 图6是包括连接至算术逻辑单元的两个18位寄存器的基本计算机电路的框图,其中,根据本发明而反转交替位; 图7是根据本发明采用交替位反转的、图6的基本计算机电路的两个相邻寄存器单元(cell)的电路图;以及 图8是根据本发明的可替换的实施例采用交替位反转的、适配为在图6的计算机电路中工作的快速进位计算电路的电路图。

具体实施例方式 参考附图,在下面的说明中描述了本发明,其中同样的数字代表相同或类似的单元。虽然按照用于实现本发明的目的的模式描述了本发明,但是本领域的技术人员将理解,在不违背本发明的精神或范畴的情况下,考虑这些教示可以实现变型。
仅仅为了示例而给出了这里描述的和/或附图中所示的本发明的实施例和变型,并且,它们并不对本发明的范畴进行限制。除非另外特别声明,可以省略或修改本发明的各个方面和组件,或者,因此可以将它们替换为已知的等效物、或仍未知的替代物(例如可以在未来开发的、或例如可以在未来发现是可接受的替代物)。当保持在所主张的发明的精神和范畴内时,可以修改本发明用于各种应用,因为潜在应用的范围是极大的,并且因为意图是本发明可适配用于许多这样的变型。
执行本发明的已知模式是基本计算机电路,例如,交替位反转的多位双输入并行加法器。在图3中的方框视图中描绘了发明的计算机电路,并且,在其中通过总的参考字符20来指明。根据本发明实施例,加法器20使二进制数字表示在交替(奇数编号的和偶数编号的)位位置中反转。本发明认识到二进制数字表示应当贯穿数字电路始终如一的传统实践和假设基本上是无保证的,并且,通过背离此实践并且使用交替表示,可以获得重要的优点。根据传统的补码(complement)表示法,通过A1,B1,A3,B3,C1,C3,S1,S3在该图中表示反转的二进制数字(逻辑)值。具体地,在此实施例中,可以在偶数编号的方框22(对于位位置0、2、4...)中使用1-高表示,而可以在奇数编号的方框23(对于位位置1、3...)中使用反转的(1-低)表示;并且在其它方面,加法器20实质上可以类似于在上文参考图1描述的传统加法器10。在图4中示出了加法器30的位-2方框的进位计算部分24的电路图,其使用最佳CMOS电路实现,包括连接在高电压(Vdd)与低电压(Vss)之间的p沟道和n沟道MOS晶体管。
因为位-2是偶数编号的位位置,所以其数字表示是1-高,与上文参考图2描述的现有技术示例的数字表示相配。然而,通过比较电路可以观察到,图4中的电路24少一个反转器级,因为在输出端无反转器的电路提供关于输入而反转的进位输出,并且,这适合于在所有位位置的进位传递,如图3中所示。对于位-2,进位输入是C2,而进位输出是C3。因为在奇数编号的位位置中数字表示被反转,位-3的输入加数值是A3,B3,进位输入是C3(它们是A3,B3和C3的补码),并且进位输出是C4。显而易见的是,根据本发明的实施例,加数字A、B的交替位中的数字表示的反转可以对于所有的位位置去除对反转器级的需求、以及去除在进位计算电路部分中其相关的操作等待时间,从而可以显著提高多位行波进位加法的速度,在一些情况下提高至因数(factor)2。
对于熟悉本领域的人员将显而易见的是执行逻辑或算术操作(例如,加法)的计算机电路20的功能性不受二进制数字表示的选择的影响。如图5中所示的,这可以通过比较使用传统的和交替位反转的电路执行的、用以产生5位(或6位)和S的两个示例5位二进制数字(A=11101和B=10111)的加法来解释。该比较将显示在1位加法器方框处在物理电路电势电平发生了什么。在图5中,字符1、0表示二进制数字的位值,而字符H、L表示用以代表位值的电路特性(例如电势)的“高”和“低”值。对于此示例,将假设传统固定的表示是1-高,并且还将1-高用在对应于偶数编号的位位置的电路部分中。应当注意,在数字表示对于所有位位置是统一的且固定的为1-高的电路中,位值1、0将在各处分别对应于电路电势H、L,从而可以使用符号(symbol)1代替H,而使用符号0代替L。因此,使用图1中的统一数字表示,加法如图5的加法26中所示的进行;其中,使用和S1-h的下标1-h来强调在此示例中采用1-高表示。根据本发明(如图3中),交替位被反转,加法如图5的加法28中所示的进行。在此情况下,对应于偶数编号的位位置(在多位二进制数字的连续位位置的序列中)的电路部分具有1-高表示;并且,对应于奇数编号的位位置的第二电路部分已经反转,即,1-低表示。在图5中,以粗体印刷字显示了使用反转的电路表示的位。当将加法28的和S的H和L值转换为统一1-高表示时,如该图中紧接在S之下的S1-h所示,可以将和看作与加法26的和相同。对于熟悉本领域的人员将显而易见的是如果采用1-低表示用于固定表示,或者,如果反转的电路部分对应于偶数编号的位位置,则当比较传统情况的电路操作和交替位反转的情况的电路操作时将得到类似的结论。进一步将显而易见的是不管一种还是另一种数字表示,在给定位位置内,1位加法对于给定的输入值组(set)正常进行,并且加数以及和是各个二进制数字(除了进位以外)的位值、或位值的补码。根据本发明使交替位反转,需要正常计算的进位输出的补码(即,反转的值)作为至每个连续位位置的进位输入,如通过交替图3中的直接的(straight)和取补的(complemented)进位值码元、以及通过交替图5中的粗体和非粗体印刷的位值码元而表示的。
可以将图2的电路作为输入值的特定组合逻辑功能的晶体管级CMOS实现,在其中,需要额外的反转器级用于统一数字表示,可以通过在如图3的电路中的交替位位置中使用反转的数字表示来消除对该额外的反转器级的需要,从而减少操作等待时间和电路布局中所需的芯片面积。已知这样的反转器级在使用统一数字表示的计算机和信号处理器的其它组合逻辑电路中也需要,并且,对于熟悉本领域技术的人员将显而易见的是根据此发明,通过在计算机字的交替位位置中使用反转的数字表示,可以预期在一些情况下以同样的方式可以去除这样的级,因此加速了计算机操作并减少了芯片面积。
将参考图6-8描述另一基本计算机电路中的交替位反转的示例。在图6中示出了包括连接至算术逻辑单元(ALU)36的两个18位寄存器32、24的计算机电路30。在电路30的所有单元中,在交替位位置中反转二进制数字表示;可以将1-高数字表示用于奇数编号的位位置,并且,可以将反转表示用于偶数编号的位位置,如该图中由位值的补码表示该表示的。
这里称作T寄存器和S寄存器的寄存器32、34的每个包括18个存储单元38,其可以是例如CMOS静态存储器(位)单元,如图7中所示,图7描绘了分别放置于T寄存器32的位位置3和2处的存储单元38和相邻存储单元38a。每个单元38包括两个连接在高电压(Vdd)与低电压(Vss)之间的交叉耦接的MOS反转器,并且具有两个由在两个互补(complementary)反转器结点40、42处的高和低电势定义的稳定状态,因此被适配为存储1位二进制数字,如本领域中已知的。可以将一个结点(例如,结点40)对于所有位单元指定1-高,并且,另一结点42将因此保持补码值。应当注意,位单元38可以单端的采用一条(读取)线44用于从其结点之一读取其状态,以及采用连接至互补结点的另一(写入)线48,用于通过写通门46而写入至该单元。因此,在此实施例中,读取线44可以连接至奇数编号的位单元中的结点40,并且连接至偶数编号的位单元中的结点42,以在寄存器的交替位位置中实现二进制数字表示的反转。如图7中所示,对于偶数编号的位-2单元38a,读取线44a连接至结点42a,并且,通门46a和写入线48a连接至结点40a;因此,将从该单元读取T2,并且将把T2写入该单元;同时,将从奇数编号的位-3单元读取T3,并且将T3写入该单元。同样在S寄存器34中,可以以上文描述的相同方式实施图7中所示的电路。
ALU 36包括18个1位算术逻辑单元(ALU’s)50,每个根据位位置而连接至寄存器的相应位单元,如图中所示。应当理解,为了清楚,从该图省略了为了例如数据和指令的传输和控制以及操作功率的目的、ALU和T寄存器及S寄存器至计算机的其它部分(例如至存储器、控制定序器、输入/输出端口、其它寄存器和电源)的其它连接。根据行波进位(ripple-carry)技术,例如将电路30适配为将S寄存器中的18位数字加至T寄存器中的18位数字,并且将和放在T寄存器中。为此目的,S寄存器34的位单元的读取线54连接至相应的1位ALU’s 50的一个加数输入,并且,T寄存器的读取线44连接至第二加数输入,如图6中所示;ALU’s的和输出线56通过通门46连接至T寄存器的写入线48;并且,进位线58串联连接ALU’s。在此电路中,进位值在每个18位加法的执行期间从位-0位置传递至位-17位置,从而,加法的等待时间包括18个进位计算等待时间的和。然而,由于交替位反转,可以例如通过采用用于ALU 50的进位计算部分的、上文描述的图4的电路24,仅在一个反转器等待时间内执行针对1位加法的进位计算。对于熟悉本领域的人员将显而易见的是电路24可以使得以与从T寄存器和S寄存器施加至ALU的加数位值进行交替相同的方式,使来自连续位位置的进位输出在进位值与进位值的补码之间交替,如图6中所示的。这导致具有通过行波进位设计而提供的小芯片面积的快速18位加法器。
在可替换的实施例中,可以采用图8中所示的另一电路60用于ALU 50的进位计算部分,以在大约一个反转器等待时间内执行进位计算。在该图中具体识别了针对位-3的连接,其中,C3是线58上的进位输入,C4是连接至位-4ALU的进位输入的线58b上的进位输出,并且,T3、S3分别是线44、54上的两个至(位-3)ALU的加数输入。可以将电路30(图6)适配为异步操作,从而,在将加数值施加至ALU之后的NAND门等待时间和NOR门等待时间内,线62、64上的组合值变为在电路60中可用;这基本上同时在所有位位置中并行发生。在电路60的操作中,进位输出C4在进位输入C3的到达时间加上MOS晶体管66或68的门延迟和相关联的电线延迟(其基本上等效于本领域中已知的一个反转器等待时间)之后变为可用。在图6中所示的实施例中,通过使能适当的写通门(对于T寄存器,写通门46),加数输入保持连接至寄存器读取线,并且,一旦寄存器位单元响应于写入至寄存器的新位值组达到(settle to)新状态,新加数值就变为可用。在其它实施例中,可以存在更多组通门(图6-7中未示出),以选择除了18位加法之外的ALU操作。图8中的线70、72、74指示至ALU的和计算部分的内部连接(未示出)。
在不改变本发明的价值或范畴的情况下,可以对本发明进行各种修改。例如,虽然在并行加法器20和基本计算机电路30方面,这里已经描述了此发明,但是本发明可以应用于传统地使用反转器级用于调节数字表示的其它基本计算机电路中,具有相同效果。
虽然这里已经讨论了计算机电路中发明性的交替位反转的二进制数字表示的具体示例,但是预期到将对于还未预想的这些而存在大量应用。事实上,本发明的优点之一是发明的方法和装置可以适于许多种使用。
上述所有仅是本发明的可用实施例的一些示例。本领域的技术人员将易观察到在不违背本发明的精神和范畴的情况下,可以进行大量其它修改和改变。因此,这里的公开非非意在限制,并且将所附的权利要求书解释为涵盖本发明的全部范畴。
工业适用性 基本计算机电路中的发明性的交替位反转的二进制数字表示意在广泛用在许多种应用中。预期其将在组合电路应用中特别有益,在组合电路应用中,速度、紧凑的电路面积以及较低的功率使用是重要的考虑因素。
如这里先前讨论的,预期本发明的适用性相当全面,因为其属于基本级别的计算机电路。因为可以容易地生产本发明,并且可以将本发明与计算机电路等的现有技术集成,以及因为提供这里描述的优点,所以预期其将在工业中容易接受。为了这些和其它原因,预期本发明的效用和工业适用性在范畴和长久的持续时间上均将有意义。
出现在下面的页面上的应用指南和设备数据手册是此公开的一部分。应用指南和数据手册公开了本发明的多个方面,其提供超越现有技术的重要优势。


联系信息IntellaSys公司 20400 Stevens Creek Blvd. Suite 500 Cupertino,CA 95014USA 408.850.3270v 408.850.3280f www.intellasys.com 第1章引言 此文档呈现通过极度辛勤工作而发现、修改、启发、形成的,或者另外由Palo Cedro,CA的IntellaSys A/V系统工程设备处的Forth程序员Gibson Elliot、JR Stoner和Michael Dennis形成的技术汇编。
特别感谢JeffFox和John Rible最初的培训、以及Charles Shattuck的文档修改,尤其感谢Chuck Moore对此技术创造的坚持。
也许呈现出的信息中的一些是显而易见的,但是如一位伟人曾经告诉我的“一旦你知道,任何事情都是容易的”。我们真诚希望当你开始你在VentureForthTM中的旅程时,此文档将会对你有很大帮助。
第2章约定(convention) 在正文文本中以粗体显示寄存器(mnemonics)。
示例dup dup xor将在数据栈上产生零。
正文文本中规定为被输入的项将置于引号中或为Courier New字体。
示例请输入“12{node”并且按回车。
像大多数Forth实现一样,我们的栈符号使用括号,但是也使用R来区分数据栈和返回栈。
如果数据栈(DS)的顶端包含“4”且DS上的第二项是“2”,并且返回栈(RS)包含“9”且RS上的第二位置包含“7”,则栈符号将以如下方式出现 (2 4 R7 9)

↑ DS的顶端 RS的顶端 在RS上不存在重要数据的情况下,栈注释(comment)将仅包含DS值,并且看起来将是 (2 4)

↑DS的顶端空RS 有时,即使当RS不具有我们跟踪的数据时,R是符号的左侧。有时,并非如此。
注意DS的顶部两个位置称作T和S寄存器(针对顶端和第二个)。我们将以粗体标注这些。
完全空的栈不需要注释,但是有时将被显示为“(--)”。
我们将有时跟踪a或b寄存器的内容,如在此示例中 (2 4 R79

B=IOCS)


DS的顶端 RS的顶端 A和B寄存器 第3章开发环境 SEAforth开发环境(至少这里描述的一个) 使用SwiftForth作为其基础。该环境由SwiftForth 和Forth源代码的主机以及VentureForthTM代码 组成。Gforth也将作为具有非常小的改变的基础 工作。
先决条件 你必须具有SwiftForth或Gforth的合法安 装。每一个是ANS Forth。 你需要在你计算机上具有SEAforth仿真器 文件。此文件夹将包含大量的文件夹。但是其将 总是包含 ·apps ·t18 ·bios 概述 使用你选择的文本编辑器,在apps文件夹 中创建“mytest.mf”。 Mytest.mf应当包含 Include seaforth.f 这里,“include”行控制哪个VentureForthTM 文件将被加载到仿真器中。注意,VentureForthTM 文件使用扩展“.mf”,其支持machineforth。命 名为“seaforth.f”的文件实际上在加载你的 应用程序文件之前加载编译器/仿真器。 你所有的VentureForth源代码应当在apps文 件夹中。这是“mytest.mf”将查找你的申请 文件的剩余部分(如果有)的地方。 如果你正在开发许多VentureForth文件,则 你可以对它们所有给出不同的名称,将它们保存 在apps文件夹中,并且通过改变上面所示的 include行来控制此时你正在测试哪一个。 你必须退出并重新运行SwiftForth,并且重 新加载mytes.mf,以便重新加载你的测试 machineforth文件。
执行样本程序 现在使用你选择的编辑器,打开apps文件 夹中的“mytest.mf”文件,并且将下面的代 码置于其中 \test.mf include seaforth.f decimal 12{node init12 0(n)\从零开始,n=0 begin(n)\ 1(n1) \放置1,用于加法 .+ (n+1) \加法完成 again(n)\n已经递增 node}runs init12 我们已经选择加载并运行结点12中的此代码,并且已经选择将此代码开始编译到存储器地址零中。实际上,{node默认将编译设置为在结点的存储器地址零开始。
“runs init12”使得此结点在其被启动时跳转至init12。
运行SwiftForth,并且加载mytest.mf文件。将产生进程的冗长的显示。可能存在来自重复的字的一些小错误。你可以忽略这些。
当完成加载时,输入“decimal”并且按回车。然后输入“12node!”。或者,你可以输入“hex”并且随后输入“C node!”...然而,剩余用户界面将返回十进制或十六进制的数字(如我们指定的),因此,当解译结果时,我们必须记住我们处于十进制还是十六进制,如下面的情况中 试着输入“.c”并按回车。你将看到如下 .c a=87381 b=341 pc=0 iw=0 slot=4opcode=-1 instruction=fetchData Return t8738187381 r s87381 87381873818738187381873818738187381873818738187381873818738187381873818738187381 ok 上图是结点的主要寄存器的快照(snapshot)。最值得注意的是程序计数器(PC)、指令以及数据和返回栈。同样,A和B寄存器的内容在这里通常是有用的。
现在,输入“step step step.c”并且点击回车。这将在PC取出(fetch)并随后执行操作码。将花费三个循环来执行该取出,因此为三个步骤。你将看到类似 step step step.c a=87381 b=341 pc=1 iw=18866 slot=4 opcode=8 instruction=@p+ Data Return t 8738 187381 r s 87381 8738187381 8738187381 8738187381 8738187381 8738187381 8738187381 8738187381 8738187381 Ok 在上两图之间,我们可以看到已经从存储器的地址0取出@p+操作码,并且PC已经被递增至1。
恭喜!你正在SEAforth仿真器中运行Machine Forth。
再次输入“step step step.c”并且点击回车... step step step.c a=87381 b=341 pc=2 iw=18866 slot=1 opcode=28 instruction=. Data Return t 087381 r s 87381 8738187381 8738187381 8738187381 8738187381 8738187381 8738187381 8738187381 8738187381 Ok 现在在T寄存器中,我们可以看到加载在DS的顶端的零。
我们可以手动控制程序计数器。例如,如果我们想要在下一个“step”执行在地址$19的代码,我们可以输入“

pc!”。
因为我们将经常在多个内核上同时测试代码,所以我们需要一种在调试时从一个结点切换至另一结点的方法。为了切换至结点14,取决于在此刻仿真器被设置为什么基础(base)而输入“14 node!”或“e node!” 虽然我们编码器已经渐渐变为习惯于大部分以十六进制工作,但是我们在提到结点编号时几乎全都是通过它们的十进制符号。
检查存储器的内容使用“.adrs”字来显示存储器内容和反汇编(disassembly)。让我们来看存储器的头5个字的内容。输入“05.adrs”并且按回车。
05.adrs init12 000 18866@p+... 64words 001 0 @b and @b + echo-lo 002 18930 @p + . + . echo-hi 003 1 @b and @b +* 004 73730 jump 2 echo-lo ok 存在许多指定的内置的存储器位置,因此必须忽略一些定义。这是为了清楚而编辑的相同存储器显示/反汇编 05.adrs init12 0 18866 @p+ . . . 1 0 @b and @b +\<-这是数据,不是代码,忽略操作码 2 18930 @p+ .+ . 3 1 @b and @b +*\<-这是数据,不是代码,忽略操作码 4 73730 jump 2 我将“init12”留在那里,因为它是我们的字,而不是来自我们此刻未在使用的bios代码的字。
我们可以在存储器地址1看到0。将这个0加载到存储器的@p+在地址0。还注意到,我们可以在存储器地址3看到1。它的@p+在槽(slot)0是在地址2,而实际的加法操作码在槽2在相同的存储器地址。
输入“hex 05.adrs”并且按回车。
hex 05.adrs init12 0 049B2 @p+ .. . 1 0 @b and @b + 2 049F2 @p+ .+ . 3 1 @b and @b + * 4 12002 jump 2echo-lo ok 开发系统将保持在十六进制模式,直到其接收十进制指示(或八进制)。
第4章VentureForthTM提出的挑战 Machine Forth或许具有程序员可能遭遇到 的最严格的命令集。本章处理一些更明显的挑 战,并且给出一些我们的解决方案。C18在操作 码量中的缺乏,其以简单的效率来弥补,并且, 因为每个内核的微小尺寸,可以将许多内核放置 在单个插件(package)中。SEAforth-24A包含24 个处理器。 同样,我们已经尝试以有用的方式呈现我们 已经用来实现最佳速度和最小存储器占用面积 的方法,以及我们认为将对于你直接应用于当前 问题或对于达到对SEAforth处理器系列的更好 理解有用的代码片段和技术。
减法 不存在减法操作码。非(negation)几乎是 通过导致一个的补码的逐位的not(非)操作来完 成的。将1加到结果将产生两个的补码(这是我 们想要的),因为C18使用两个的补码方案来进 行符号运算,类似几乎所有其它ALU。 因此可以通过如下步骤而实现减法将2个 数字置于DS上,并且将被减数放于顶端,应用 not,然后添加(+),并且最终添加1以校正过 分的(overzealous)not。 如果我们想要从9减去5... 9(9) 5(95) not (9-6) .+ (3) 1(31) .+ (4) 还可以使用以下方法来执行减法。其更加简洁,并且实质上需要更少空间和循环来执行。 为了从9减去5,这次将它们以相反顺序放 置... 5 (5) 9 (59) not(5-10) .+ (-5) not(4) 测试和比较值 看起来开始我们限于两个基本比较。这些是 if和-if。 If检查非零,而-if检查负数。如果测试通过, 则执行紧接在if/-if之后的代码。如果测试失败, 则程序计数器(PC)将被改变至紧接在then之 后的代码的地址。 所以,我们如何检查其它条件? 小于 使用上面提到的用于“实现减法”的技术, 并且用-if检查负数。 示例(注意,在这个和其它示例中,我们将 不显示加载栈的代码,除非其是正在演示的处理 的实际部分) \9小于5?(95) not (9-6) .+ (3) 1(31) .+ (4) -if (4)\if/-if不消耗T \4不是负数 \此代码将被跳过 then (4) \执行在这里继续 \2小于8? (28) not(2-9) .+ (-7) 1 (-71) .+ (-6) -if(-6)\if/-if不消耗T \-6是负数 \将执行此代码 then (-6) \执行在这里继续 大于 如果世界(mundane)会是致命的,则更新 你的人寿保险单。对于大于的测试与小于的测试 相同,除了我们减去另一数字之外。例如,如果 我们从B减去A以测试小于,则我们简单地从A 减去B以测试大于。
大于/小于或等于 使用与上面相同的程序,但是在-if之前消除 对你的结果加一(1),并且,你将实现“>=”或 “<=”。
\2小于或等于8?(28) not(2-9) .+ (-7) -if(-7)\if/-if不消耗T \-6是负数 \将执行此代码 then (-7) \执行在这里继续 零的测试不存在 “零的测试”,也不存在“相等的测试”。
存在一些方法处理这一问题。在此文档中提 及两个方法。方法1在这里描述。方法2将随后 描述,因为其使用next操作码来直接检查零, 并且此方法与next的其它极好的特征放在一起 会更好。
方法1 测试非零以认定不合适(disqualify)。我们 可以使用if操作来检查非零,并且如果通过非零 测试,则从“n-if-zero(如果是零则运行)”代 码分支转移。
\检查零(n)\我们将关于零对T进行测试 if (n)\关于非零对n进行测试 NotZero-; (n)\分支转移至NotZero then (n) \零为真。非零测试失败 \代码执行在这里继续 NotZero (n)\如果T不是零则分支转移至这里。
相等性的测试 为了测试相等性,我们可以减去两个自变 量,并且检查零。然而,存在更好的方法... 检查相等性的更好的方法是xor两个测试 值。如果它们相等,则结果将为零。然后,我们 测试零。
?Equal(n1n2--) xor (result) \检查零 (n)\我们将关于零对T进行测试 if (n)\关于非零对n进行测试 NotZero-; (n)\分支转移至NotZero then (n) \零为真。非零测试失败 \代码执行在这里继续 NotZero (n)\如果T是非零则分支转移至这里。
第5章存储器访问 存储器访问的寄存器操作 存在我们用来访问C18的存储器空间的两码个指针寄存器,a和b寄存器。寄存器a可以如同传统寄存器一样被读写,但是其还可以用于对任何存储器位置的间接读或写。即,我们可以读和写a寄存器的内容,或者,我们可以从/向a寄存器的内容所指向的存储器地址读取/写入。b寄存器如同a寄存器一样工作,除了我们不能直接读取该寄存器的内容之外。我们只可以写入该寄存器。然而,我们可以读和写寄存器b所指向的存储器位置。为此原因,寄存器b专用于访问存储器。这里省略了一些标点符号以避免与操作码的混淆。 ·直接写入a寄存器,我们使用a! ·直接写入b寄存器,我们使用b! ·直接从a寄存器读取,我们使用a@ ·我们不能直接从b寄存器读取 ·读取由a寄存器指定的存储器内容,我们使用@a ·读取由b寄存器指定的存储器内容,我们使用@b ·写入由a寄存器指定的存储器内容,我们使用!a ·写入由b寄存器指定的存储器内容,我们使用!b 将值$08写入存储器地址$A0。


(

) \位于DS上的期望的存储器位置 a! ( ) \

现在在a寄存器中

(

) \

放在DS上 !a () \值

写入地址
带有自动递增的寄存器 存在两个非常有用的对存储器位置读取/写操作码入的寄存器操作码,并且,通过自动递增寄存器 中的值,准备下个要被写入或读取的地址。仅a 寄存器具有自动递增操作码。这些操作码对于输 入和输出缓冲器(循环或非循环的)尤其有用。 !a+写入由a寄存器指定的存储器地址,并 且对a寄存器加一(1)。 @a+从由a寄存器指定的存储器地址读取, 并且对a寄存器加一(1)。
\结点12将使用for-next循环而从63开始递减记数 \结点12将每个计数器值加在一起(63+62+61+...) \结点12将所计算的结果写入结点13 \结点13将从结点12读取值 \结点13将使用!a+将所读取的值存储在存储器的范围中 \″n″是我们的累加器变量,″c″是递减记数变量的值。
decimal 12{node\设置结点12 writer ′r--- (r)\邻结点13的地址。
b! ( )\b寄存器现在″指向″结点13 0 (n)\初始化我们的累加器(n=0) 63 for (n Rc) \″for″将T推至RS(初始c=63) pop (n c) \出栈回到DS dup (n c c)\复制 push(n c Rc) \恢复RS .+ (n+c Rc) \n变为n+c dup (n n Rc) \复制,这样我们可以写一个并保存一个 !b (n Rc) \写入结点13,等待 next(n Rc-1|exit)\递减c直到0,然后退出 writer-; \清洗、漂净、重复 node}runs writer \++++++++++++++++++++++++++++++ 13{node \设置结点13 reader ′r---(r) \邻结点12的地址。
b! ( ) \b寄存器现在″指向″结点12 0a! ( ) \在0(A的值)开始存储器缓冲 -1for (r-1) \开始非常长的循环 @b!a+.unext \从结点12读取值至T \将n写入地址A,A递增 node}runs reader 关于示例5.2.1的注释 自动递增的读和写操作码对于高效循环缓 冲器是非常有用的,因为它们可以被反复执行, 并且将简单地在某点回滚至存储器空间的开始。当前,以64字的RAM来设置SEAforth-24A C18。当a在@a+中递增时,当其通过地址63时 其回绕至0。在上面的读取器中,读取循环是微 循环,其适合于micro-next中的一字结束。这将 循环$40000次,而不需要从存储器取出另一指 令,允许RAM被彻底覆写许多次。当循环结束 时,程序将尝试执行已经被数据覆写的代码,因 此,这不是一个实用的示例,而仅仅是一个有趣 的示例。如果你观察其执行,你将看到a寄存器 多次从0循环到63并再次返回至0。在重要的程序中,必须当心,a寄存器与代 码存储器空间相分离。程序员的责任是确保结点 内的程序代码不作为不受控制的!a+攻击的牺牲 品而结束。当然,我们可以具有适合于未占用存储器的 任意长度的缓冲器,但是,代码必须存在以检测 并且限制a寄存器的值。
第6章邻居(neighbor)通信的介绍 邻居作为存储器位置而被访问。对于任何给定结点,存在多至四个被分配用于访问邻结点的存储器地址。作为替代,我们开始记住指定的常量,而非记住这些存储器地址。
可论证地,关于邻居通信要记住的最重要的事情是任何从邻居读取或写入到邻居的结点将在其轨迹上立刻停止(其将进入睡眠模式),并且等待邻结点将对读取或写入请求提供服务。我们通常将这称为“阻塞(blocking)读取”或“阻塞写入”。
存在特殊的存储器地址,称作IOCS,其可以被读取(不需要停止结点)以确定邻居是否正在请求来自结点的读取或写入。因此,例如,我们不需要执行阻塞读取,仅仅需要看结点是否正在等待写入至我们。
结点12将把值$07写入结点13。
decimal 12{node\设置结点12 writer ′r---(r )\邻结点13的地址 b!()\b寄存器现在″指向″结点13

(

)\

在DS上 !b()\

被写入结点13 \结点12现在处于睡眠模式,等待结点13从其读取 \其它代码在这里继续 node}runs writer 13{node \设置结点13 reader ′r--- (r )\邻结点12的地址。
b! ( )\b寄存器现在″指向″结点12. @b(

)\已经从结点12读取
\结点13将在@b等待(睡眠),直到结点12向其写入。
\其它代码在这里继续 node}runs reader 第7章Next使用(exploit) next的特性 Next通常用作for-next循环的一部分。
For从DS移走顶端的项,并且将其放置在RS上。当遇到next时,对于RS顶端的项进行零测试。如果其是非零,则递减RS的顶端的项,并且next导致至for开始处的地址的分支。
如果RS顶端是零,则执行通过next至紧接着的字。RS的顶端的数据(在此情况下为零)被消耗掉,但是仅当其是零时。
必须注意避免扰乱RS上的for-next计数器。在正常情况下,当next执行时,我们希望计数器在返回栈的顶端。
总之,如果RS是非零,则next导致分支,和递减的RS。如果RS是零,则在RS顶端的那个零被消耗掉,并且递增程序计数器。
当编译器遇到for或begin时,注意下一操作的地址,并且该地址被用于接下来的next(或again)的返回地址。
如果我们知道我们的next的地址,则我们可以在编译时重写操作码以将next重新定向至任何我们满意的位置。我们称此为软编码。其需要一些计划以及额外的维护,但是开启作为next的所有益处。
For-next循环总是运行至少一次。
decimal 12{node\设置结点12 init12 7 (c)\7在DS上,现在称作″c″ for (c)\″for″将T推入RS \这里代码... \将运行8次 next(Rc-1|exit) \c递减直到0,然后退出 \在for-next完成之后... \执行将在这里继续 第8章栈操作与取出直接量(literal) 取出直接量和栈操作 的执行速度直接量 ·占用3个时钟周期来取出直接量,并且将其放在栈上。一个直接量也占用存储器的完整18位字,加上另一存储器地址的一个槽,用于取出操作码(@p+)。 ·当使用直接量时,源代码常常更加容易读取。
栈操作器 ·栈操作器通常占用一个周期,以及字的一个槽。 ·源代码有时不像使用直接量的类似代码一样可读取。然而,通过实践,使用更多的栈操作技术,其日益变得易于读取和写入代码。 因此,通过计划出你的DS以及用你将需要 用于一个例程的值和“变量”来初始化你的DS, 你的例程可以运行得快得多并且占用更少的存 储器。但是,情况不总是这样。有一点技巧来布 局和迅速调整(juggling)栈。 通过认真注意,DS和RS均可以用于数据快 速调整。
0(n)\以零开始,n=0 Begin(n) 1(n 1) \通过直接量取出来放置1,用于加法 .+ (n+1) \加法完成 Again(n)\n已经被递增 Decompile 0 18866 @p+ . . . 1 0 @b and @ b+ 2 16818 @p+ .+ . 3 1 @b and @b +* 4 73730 jump 2 其易于读取,但是1占用四个周期。此例程 将编译大约4个字,且循环占用这些字中的3个。
该循环将每11周期执行一次。
1(1) \我们的要加的值 0(1n)\将累加器初始化为零,n=0 Begin(1n) over (1n 1) \把1给T,用于加法 .+ (1n+1) \加法完成 Again(1n)\n已经被递增 Decompile 6 23986 @p+ @p+ . . 7 1 @b and @b +* 8 0 @b and @b + 9 131506 over . + . 10 73737 jump 9 这是一个好的示例,其中栈操作产生恰恰 与直接量方法一样可读的代码。
此例程编译5个字,包括栈设置。但是该循 环将编译两个字...并且,该循环每8个周期将执 行一次...那是用于先前的方法的时间的大约 2/3。
构建公共值而 由于当直接编译直接量或从存储器取出时 不取出直接量所需的开销,通常通过使用栈操作和ALU而综 合(synthesize)必须的值是有用的。
你可能看到的最普通的示例是dup dup xor,其在DS的顶端(T)产生零。其不占用存 储器的完整字,并且仅占用3个周期来执行。存在综合1(一)的方法,但是我们将在随 后的包括更多公共宏(macro)的加法中覆盖其。 如果你投入时间以将1放置在你的DS(或RS) 中方便的地方,则你可以通过将其左移一些次 数,不仅将其用于1,而且用于2、4或8(或更 多)。因此,我们常常仅需要2的幂,将2的幂的 直接量放置在栈上通常足以综合你的例程所需 要的值,同时通过避免直接量的编译而节省时 间。可以将放置在DS上的四(4)快速地转换为 0、1、2或8、16或32,比编译的直接量可以将 该值传递至你的DS要快得多,虽然利用dup dup xor将更容易创建零。无论这些技术如何有用,存在减少返回的非 常真实的一点。当你需要直接量时,直接编译它 们往往仍然是较好的。
MSB作为布尔标记 C18处理器被设计为支持使用MSB(位17) 用于布尔逻辑。在设计用于串行通信的内核上, SEAforth插脚之一将连接至位17(基于零的), 因此我们可以利用-if容易地检查高输入状态。同样,因为应用至任何正数的not导致负数, 且反之亦然,所以可以容易地使用not和-if作为 高效真-假系统的部分。将任何负数作为真,将 任何正数作为假。Not容易地在真和假之间转换。我常常使用其。接下来是第4章的扩展示例-相等性的测 试。这里,我们将“?Equal”变为可调入 (callable)字,如果T和S相等,其返回负值到T上,或者,如果T和S不等,其返回非负值到T上。
作出对该字的调用的任何代码现在可以利用-if测试结果。
?Equal(n1 n2-boo) \N1和N2相等吗? xor (result) \检查零 (n) \我们将关于零对T进行测试 if (n) \关于非零对n进行测试 dup xor ; (0) \返回假(零是非负) then (0) \T是零 not ; (3FFFF) \返回真(任何负数是真) \这里是一些调用我们的Equal-Checker的样本代码 5(5) \样本值1 8(58) \样本值2 ?Equal (n1n2-boo) -if (boo) \仅当T为负时,此代码将运行 \...其将是仅当两个自变量相等时的情况 drop ( ) \清空栈 then \执行继续 drop ( ) \清空栈 第9章页和字排列(alignment) 理解分支(branch)限制 SEAforth处理器的当前实现通过18位存储 器空间使用512字。不同的产品可以具有不同的 存储器量,但是结构仍然是平坦(flat)512字存 储器映射。这是因为PC是9位宽。并不解码每 个地址。24A在$00-$3A具有64字的RAM,并 且在$80-BF具有64字的ROM。专用函数寄存 器具有位8集,因此存在于地址$100之上。 页在8字边界上。当分支操作码在槽2中, 并且仅剩余3位用于分支地址时,其开始工作。 将3位分支地址加入PC的高6位,将8位设置 为零,以确定分支去向哪里。 SEAforth处理器还在每个字中对多个操作 码进行压缩(pack)。多至4(四)个操作码可以 占据存储器的单个字。存在关于哪些操作码可以 占据那些“槽”的限制。此外,一些操作码取决 于它们被编译至的槽而不同地操作。 能够导致分支的操作码受此结构影响最大。
槽数量越少,则“分支”操作码具有越多的自由。
然而,不论分支可以走多远,其只能分支转移至 给定字的槽0。
如果我们的分支操作码(if,-if,next,;,-;) 和它们的目的地址打破某些规则,则我们的代码 将不编译,或者我们的代码将用nop(.)来填充, 以改善字排列。理解此结构如何工作将帮助我们 避免不利的编译,并且帮助我们写高性能的代码。
转出(roll out)Nop- 压缩和加速代码 转出nop是指为了优化VentureForthTM代码 的速度和大小的目的而优化页和字排列的处理。
用于转出Nop的一般规则如下 如果可能,分支操作码和其目的地应当在相同页上。这样做将增加如下可能性分支操作代码在被编译时将编译到当前字中,编译器不必填充当前字的剩余部分并开始新字。
因为一定的操作码被限制于一定的槽,所以在关键点插入nop可以使得许多其它nop消失。因为相同的理由,找到改变操作码或操作码的顺序以实现相同结果的方法可以导致具有较少nop、较少字以及从而具有较好执行时间的代码。
我们可以使用org、标签和nop来强制代码排列。如果例程的初始化中的一些nop极大地帮助了例程的递归部分的字和页排列,则使用这些nop(或标签)通常是好事。
我们将需要查看反汇编,以便看和修正非最佳的字排列。
IntellaSys公司 20400Stevens Creek Blvd. Suite 500 Cupertino,CA 95014 USA 408.50.3270p 408.850.3280f www.intellasys.com

联系信息 IntellaSys公司 20400 Stevens Creek Blvd,Fifth Floor Cupertino CA 95014 USA 408.850.3270v 408.850.3280f www://www.IntellaSys.net 目录 第1章SEAforth-24A阵列处理器的介绍 处理器内核概述 处理器存储器和I/O VentureForth语言 C18寄存器体系结构概述 第2章理解栈操作 栈结构 栈上溢和下溢 栈‘技巧(tricks)’ 第3章处理器间通信 理解方向 处理器间读取和写入 多个读取和写入 第4章存储器和I/O 存储器和I/O的概述 对内核分配I/O SPI闪存引导 外部存储器 模拟IO 串行IO GPIO 第5章I/O寄存器细节描述 第6章处理器操作码描述 操作码压缩 IF和NEXT测试 每操作码的时钟周期 基于ALU指令的定时 分支指令 地址增量规则 类型(type) 操作码 功能 CALL操作码 RETURN操作码 JUMP操作码 COROUTINE操作码 IF操作码 MINUS IF操作码 NEXT操作码 UNEXT操作码 LITERAL操作码 PUSH操作码 POP操作码 DUP操作码 DROP操作码 OVER操作码 B STORE操作码 A STORE操作码 AFETCH操作码 STORE B操作码 STORE A操作码 STORE P+操作码 STORE A+操作码 FETCH B操作码 FETCH A操作码 FETCH A+操作码 AND操作码 XOR操作码 NOT操作码 RSHIFT操作码 LSHIFT操作码 NOP操作码 PLUS操作码 PLUS STAR操作码 第7章插脚引线和插件 第8章电气规范 附录1.SEAforth-24A引导过程 系统引导 附录2.内部数据表示和电平(level)的注解 表格列表 表1.C18寄存器 表2.数据定向寄存器 表3.处理器间端口 表4.处理器间通信端口-多端口地址映射 表5.I/O资源 表6.ADC和DAC操作的控制位 表7.在IO寄存器位分配中使用的缩写 表8.典型内核I/O寄存器的概述 表9.IO插脚配置控制位 表10.内核N0I/O状态端口$15D 表11.内核N1I/O状态端口$15D 表12.内核N2I/O状态端口$15D 表13.内核N3I/O状态端口$15D 表14.内核N4I/O状态端口$15D 表15.内核N5I/O状态端口$15D 表16.内核N6I/O状态端口$15D 表17.内核N7I/O状态端口$15D 表18.内核N8I/O状态端口$15D 表19.内核N9I/O状态端口$15D 表20.内核N10I/O状态端口$15D 表21.内核N11I/O状态端口$15D 表22.内核N12I/O状态端口$15D 表23.内核N13I/O状态端口$15D 表24.内核N14I/O状态端口$15D 表25.内核N15I/O状态端口$15D 表26.内核N16I/O状态端口$15D 表27.内核N17I/O状态端口$15D 表28.内核N18I/O状态端口$15D 表29.内核N19I/O状态端口$15D 表30.内核N20I/O状态端口$15D 表31.内核N21I/O状态端口$15D 表32.内核N22I/O状态端口$15D 表33.内核N23I/O状态端口$15D 表34.内存N0存储器地址寄存器$171 表35.内核N0存储器数据寄存器$141 表36.SEAforth指令集总结 表37.信号列表(依字母顺序) 表38.绝对最大额定值 表39.电压和温度操作条件 表40.设备特性 附图列表 图1SEAforth-24A可伸缩嵌入式阵列框图 图2SEAforth-24A的24个C18处理器内核中的一个 图3SEAforth方向性定义 第1章SEAforth-24A阵列处理器的介绍 SEAforth-24A是第一个可伸缩嵌入式阵列TM(SEA)处理器芯片。其利用片上(on-chip)程序存储和处理器间通信方法结合24个非常小、快速的处理器内核,以在每美元MIPS和每毫瓦MIPS方面均提供高水平的处理能力。这使得SEAforth-24A成为用于消费应用的理想嵌入式处理器解决方案。
阵列中的每个CPU可以利用ROM、RAM和强大的I/O功能元件集,每秒执行多达十亿条指令。一个SPI接口端口支持串行应用,并且可以加倍为12C、12S或USB 2.0。串行端口可以用于连接多个SEAforth-24A。
图1SEAforth-24A可伸缩嵌入式阵列框图
图1描绘了设备。其由24个CPU内核、加上存储器和I/O组成。内核体系结构称作C18,因为其是18位宽的CPU。24个处理器被编号为N0至N23,它们在指令和体系结构方面相同,但是具有不同的I/O。每个C18处理器具有64字的本地RAM以及64字的本地ROM,并且利用唤醒/睡眠握手电路、通过共享的通信端口而连接至其每一个相邻处理器。
利用与24个内核工作,设计者可以将它们的组专用于特定任务,例如,18位FFT和DFT、无线通信或USB。I/O是极其灵活的。SEAforth-24A不使用专用于特定I/O协议的硅;而是其允许程序员以软件实现快速串行I/O。结果是分配给特定任务的紧密耦合的、极为通用的用户定义的专用处理器组。
每个处理器以硅的固有(native)全速而异步运行。处理器间通信自动发生;程序员不需要创建同步方法。通信通过专用端口在相邻处理器之间发生。等待来自相邻处理器的数据的处理器进入睡眠,消耗小于1微瓦。同样,发送数据至未准备好接收其的相邻处理器的处理器进入睡眠,直到该相邻处理器接受该数据为止。I/O插脚上的外部信号也将唤醒睡眠的处理器。
处理器内核概述 图2中示出了框图。在指令和体系结构方面,SEAforth-24A中的24个C18内核的每一个与其它的相同。(IO和支持ROM代码变化)每个内核是固有的18位处理器,其非常类似传统Forth栈机器。使用用于操作数据的参数栈和用于控制流嵌套的返回栈,剪裁其指令集以执行基本Forth指令。Forth中最频繁使用的操作形成了固有的C18指令集。已知为字的Forth指令序列是从固有的C18指令构建的。结合指令预取,C18Forth处理器运行极快,而不需要复杂的管道设计。
因为许多指令从栈直接获得它们的操作数,所以它们被已知为零-操作数指令。结果,大部分指令的长度仅5位,允许将三个或四个指令压缩到单个18位指令字中,并且从单个18位指令字执行。可以将8个5位指令放置在3位槽中,作为字中的最后一个操作码。
直接量加载、调用和跳转需要操作数和存储器(或端口)周期。跳转或调用可以占用3、8或9位地址的自变量。直接量指令使用5位操作码和18位字,用于指定将被加载至栈的直接量。
处理器存储器和I/O SEAforth-24A设备的每个C18处理器具有64字的RAM和64字的ROM。每个字是18位宽,并且最多可以保持四个压缩的指令。
64字ROM包含引导、任务切换和处理器间通信代码。一些处理器具有特殊的ROM代码,用于处置I/O插脚。64字RAM包含从引导设备下载的代码。
在设备的边缘的处理器(N2-N5、N11、N12、N17和N18-N23)每个连接至它们自己的I/O插脚集。(N1和N16是特殊情况,其将在后面涉及)。所有其它处理器没有I/O。
VentureForth语言VentureForthTM是Forth字的内核集,其被IntellaSys系列中的每个处理器支持作为固有指令集。
基于将大部分数据保持在栈上的思想,Forth是高效的语言。Forth程序由IntellaSys的创建者之一Chuck Moore在20世纪70年代开发,其特征在于小的代码大小、快速执行以及易于扩展。此扩展性是基于Forth‘字’的概念。从全部始于VentureForth词典的其它字创建字。通过作为I/O库的ROM中的Forth字来扩展VentureForth,增加处理器间通信例程和I/O功能性。可以使用ROM中的默认I/O驱动器,或者可以用RAM中的代码取代该默认I/O驱动器。
IntellaSys已经通过对ForthletsTM、可以围绕芯片而从内核至内核移动以进行特殊处理的面向对象的代码的支持,扩展了Forth的能力。图2SEAforth-24A的24个C18处理器内核中的一个
C18寄存器体系结构概述 Forth是面向栈的语言;用于地址、数据和 计算的‘普通’寄存器位于两个栈中,如表1 中所总结的。
C18上的程序计数器和B寄存器每个为9 位宽。B和18位A寄存器用于寻址。B可以被 写入但不能被读取。其被使用B作为指针的取 出和存储指令支持。A寄存器可以被写入并读 回,从而可以用于寻址或暂时存储。其被取出、 存储和在存储器访问之后递增A寄存器的自动 递增取出和存储指令支持。
专用寄存器包括四个数据定向寄存器,其与 相邻的处理器对话。在有关处理器间通信的章中 更详细地讨论数据定向寄存器和它们的操作。
还存在I/O控制和状态寄存器。在此寄存器 中读取I/O插脚和数据定向寄存器两者的状态。
通过写入至IOCS寄存器而设置插脚模式和输 出状态。
表1.C18寄存器 表2.数据定向寄存器 第2章理解栈操作 栈结构C18是双栈处理器。其具有用于由ALU操 作的参数的数据栈、以及用于由CALL和 RETURN指令使用的嵌套的返回地址的返回 栈。返回栈还被PUSH、POP和NEXT指令使 用。 10个数据栈寄存器和9个返回栈寄存器均 是18位宽的。程序计数器是9位宽的。调用指 令将PC推至返回栈上。返回指令将全部18位 出栈,但是丢弃高9位。 C18栈不是由栈指针访问的存储器中的阵 列,而是寄存器的阵列。数据栈顶部的两个位置 具有命名为T(对于顶端)和S(对于第二个) 的专用寄存器。这些之下是另外8个栈寄存器的 循环阵列。任何时候选择循环阵列中的8个寄存 器之一作为S之下的寄存器。 返回栈中的顶端位置是命名为R的专用寄 存器。在R之下是8个返回栈寄存器的循环阵 列。任何时候选择此阵列中的8个寄存器之一作 为R之下的寄存器。
栈上溢和下溢 不存在栈上溢或下溢情况的硬件检测。留意 栈中的项数并且不试图在那里放置比其所能够 保存的更多的项是软件的责任。因为C18的栈 具有在它们的栈的底端的寄存器的循环阵列,所 以栈不能从栈区域中上溢或下溢,它们仅仅回绕 8个栈寄存器的循环阵列。因为栈具有有限深 度,所以将任何东西推至栈的顶端意味着在底部 的某物正在被覆写。 当出栈时,底部的8项重复。在两个参数栈 读取之后,T和S将具有来自8个栈寄存器的循环阵列的两项的副本。在再读取8个之后,T和S将被重新加载相同的值。对于从栈中顺序读出这8项而不必复制项或将它们写回到栈中可以进行多少次没有限制。循环经过在数据栈的8,4或2个单元(或返回栈上的8、4、2个单元)上重复的一组参数的算法能够从栈中重复地读取这些参数,因为低端寄存器将仅仅回绕。
栈‘技巧’ 软件可以以多种方式来利用栈底端的循环缓冲器的优点。软件可以简单地假设栈在任何时候为“空”。不需要从栈清除旧的项,因为当栈满时,它们将被向下推并被覆写。
例如,在串行处理器上的ROM代码中,这在等待起始位的循环中使用。代码从IOCS寄存器读取输入位,并使用-IF指令循环,直到其看到该位变为真为止。因为-IF指令不移除栈的顶端的项,所以该循环每次在T中留下新值。在十次循环之后,在栈底端的旧值正被覆写,并且在此循环中可以将数千个值放在栈上,但是顶端的值是唯一一个在此时程序感兴趣的值。当其退出该循环时,其执行动作,就好像该栈是空的。
这使得循环较短、较小以及较快,并且比起在该循环中的位测试与循环退出之间所发生的,减少抖动量。其还意味着不需要附加的代码以在循环结束处复位栈指针以获得空栈。
第3章处理器间通信 理解方向 SEAforth芯片系列使用灵活的机制以使各 个CPU内核易于通信。特殊端口作为相邻CPU 之间的一种邮箱。这些寄存器被映射到公共地址 上的存储器空间。为了理解其如何工作,首先清 楚被SEAforth用来指示方向的术语是有帮助 的。 通常,北、南、东和西用作全局方向。方向 ‘北’总是指具有较高索引号的内核-例如,从 内核N0向北,带你到达内核N6。类似地,‘东’ 也带你到达具有较高索引号的内核。 本地内核使用上、下、右和左来表示方向, 但是这些不总是映射到N、S、E和W。由于软 件和硬件两者的效率的原因,使相邻内核共享公 共I/O端口地址用于通信是较好的。因此,各个 内核被确定方向以共享公共编号的端口,如图3 中所示。表3中总结了本地方向和它们的端口地 址。
表3.处理器间端口 例如,使得内核N0和内核N6在公共端口$115上通信比不得不跟踪是使用地址$115还是$145要更好。为了适应此设计,某些内核颠倒它们的R/L和/或U/D。如图3中所示,用浅黄色标记的内核颠倒右和左。因此,例如,内核N18和N19经由端口$1D5而对话。其它用淡青色标记的内核将上和下颠倒。N18经由端口$115与N12对话。一些内核则将两者均颠倒;它们在图中用淡绿色标记。
图3.SEAforth方向性定义
处理器间读取和写入 每个内核与其相邻内核共享多达四个唤醒/睡眠数据端口。相邻内核共享单个公共数据端口。通常,处理器间通信是阻塞(blocking)和自同步的,即,处理器将睡眠,直到操作完成为止。
每个处理器间通信端口直接连接至其相邻端口。不存在寄存器或FIFO;一个端口的读取线直接连接至相邻端口的写入线。当处理器读取 时,其阻塞直到相邻处理器写入为止;相反,当 处理器写入时,其阻塞直到相邻处理器读取为 止。 除了提供处理器间通信之外,这还将两个 CPU同步。如果希望,可以通过在执行读取或 写入操作之前测试状态位,避免中断,但是,这 是非常低效的,并且应当仅在端口通信具有很低 的重要性并且很不频繁地进行时使用。 穿过端口的信息可以是数据或指令。内核具 有通过跳转至或调用一个端口地址或多个端口 地址而同时直接执行来自存储器映射的数据端 口的指令的能力。
多读取和写入 由于处理器间通信端口置于I/O空间中的 方式,每个内核具有使用单个指令而读取(或写 入)其数据端口中的一个、两个、三个或全部四 个的能力。一旦挂起的读取或写入中的任何一个 得到满足,内核就将重新唤醒。当重新唤醒的内 核前进至其下一个指令时,删除其它挂起的读取 /写入。此技术可以用于在多个处理器集群当中 分布数据和控制。 在一些应用中,处理器将从其端口中的全部 四个执行读取,随后睡眠直到需要为止。这是有 用的编程技术;下面示出了示例。然而,程序员 必须小心确保两个处理器不在同时在相同公共 数据端口上进行读取或写入时挂起。两个处理器 都将保持睡眠,除了硬件复位之外没有用于唤醒 它们的机制。 如果处理器同时执行多个处理器间通信端 口的读取,则程序员应当保证其相邻处理器中仅 有一个实际上满足读取请求。同时从多于一个相邻处理器接收写入将产生数据冲突,其通常不是所期望的结果。
下面的代码段显示了多端口读取的示例。在引导时,大部分内核唤醒并且进入睡眠状态,等待用代码初始化。在此示例中,结点7(内部结点)唤醒并执行4-方向(4-way)读取,这将其置于睡眠状态中。
7{node [$0aa org] cold ′iocs b!..(+2=ac) warm(--x) ′rdlu a!@a.\读取全部4个端口,睡眠 @b pause warm-;(+4=b0) node} 在表4中示出了处理器间通信的IO端口映射的完整(fuller)版本。四个方向的每一个由地址总线的单个位选择,如表的列3中所示的。设置多个位选择多个端口用于读取或写入。
表4.处理器间通信端口-多端口地址映射 可以通过设置期望的位通过创建二进制值、随后执行与$155的异或,来计算用于任何合并的端口地址。由此,$090与$155的异或产生$1C5。(在附录2中解释了异或步骤的原因) 如果处理器读取,其保持睡眠,直到数据被写入合并的读取(或写入)所针对的所请求端口中的任何一个为止。在那一刻,所有存储的读取(或写入)请求将被第一个单个写入(或读取)清除以完成。
第4章存储器和I/O 存储器和I/O的概述 在SEAforth系列中,在对待外部存储器和 IO上不存在实际差异。围绕在设备边缘的处理 器内核使用它们IO逻辑的一部分来与外部世界 对话,中心的内核(通常)不是如此。特别地, 将存储器看作为一对I/O端口,一个用于地址而 第二个用于数据去往或来自存储器。
对内核分配I/O 如下面所描述的,不同的内核连接至一定的 I/O功能元件。设备的每个边缘或角落内核具有 其自身的特性。每个内核提供对特定I/O插脚集 的排他访问。例如,在具有四个I/O插脚的结点 上提供SPI接口。经由N18和N23访问模拟输 入和输出。
表5.I/O资源 SPI闪存引导 为了引导目的,内核N5支持串行闪存。其 具有实现串行外围接口(SPI)的四个插脚。ROM 代码提供可选地从串行闪存设备引导的能力。通常,该设备将尝试从连接到这里的闪存引导;N5的SPI Data-in插脚上的高电压将阻止默认引导。
此接口典型地与例如串行EE-PROM或闪存设备的引导设备通信。SPI接口将可选地以250Kbps的时钟定时引导芯片,以允许从小的廉价的串行设备引导。在引导之后,接口上的时钟计时可以高达~20Mbps的速度定时。在引导之后,基于RAM的代码可以支持其它SPI功能。
外部存储器 内核N0连接至外部存储器以向闪存、SRAM或类似设备提供存储器扩展。N0可以被编程为在外部存储器与其它处理器之间路由存储器访问。
地址总线具有18位,并且将存储器看做18位字。包括三个存储器控制插脚。提供ROM中的软件,其支持快速18位SRAM设备。ROM软件使用处理器N1和N6,用于对处理器N0上的存储器服务器的输入和输出支持。对N0的输入在N6上缓存,并且输出通过N1。当N1和N6被用于支持N0中的外部RAM服务器时,N1和N6不需要插脚。地址线是只写的;可以经由IO寄存器中的位12而使得数据线为三态的(tri-stated)。
软件确定外部地址总线、外部数据总线和控制插脚的使用方式。连接至此外部接口的设备可以是SRAM、DRAM并行总线EEPROM或闪存。
实际的总线定时和功能性由软件控制;例如DDR2的复杂存储器按照期望地被编码。
如果接口不被用做作外部存储器,则外部地址、数据和控制总线插脚可以用于通用I/O。
模拟IO 内核N18和N23作为模拟至数字和数字至模拟的转换设备工作,并且具有模拟输入和模拟输出插脚。此外,每个内核具有用于其被四分频(divided by four)的压控振荡器的数字输出的插脚。软件入控制转换速率和分辨率(resolution)。
模拟输入插脚上的电压驱动压控振荡器,该压控振荡器驱动计数器。0伏特以大约2GHz驱动计数器,而1.4V以大约1GHz驱动计数器。通过从寄存器$171读取较低位而完成模拟至数字的转换。这是对应于模拟输入的值的VCO的计数器输出。其是反转的模式(pattern),其必须与$15555异或以得到值。可以将两个数字值相减以获得差读数。对于最大速度,可以由相邻处理器来进行差计算和任何线性化。在已知时间段上的两个记数的差表示VCO输出曲线上的点。
通过将9位值写入IOCS寄存器的较低位而完成数字至模拟的转换。写入IOCS寄存器位15、14和13使得接通或断开压控振荡器,并且控制确定VCO电压至频率函数的P和N晶体管。为了接通振荡器并将0发送至D/A,发送$02000。
表6.用于ADC和DAC操作的控制位 串行I/O 一些内核具有两个I/O插脚,并且可以实 现例如这样的功能用于连接控制台、串行I/O 设备或其它SEAforth-24A设备的异步串行接 口(UART)。特别地,N3、N12、N17和N21 上的ROM代码可以经由它们的异步串行端口 来引导。N3和N21上以及N12和N17上的I/O 插脚在IC的相对侧排齐,从而使得一个处理 器的串行输出插脚与另一处理器的串行输入 插脚排齐,以最小化连接距离。串行接口允许SEAforth-24A设备与PC、 控制台、串行I/O设备或另一SEAforth-24A设 备通信。为了更多的处理能力,可以使用串行 接口将多个SEAforth-24A连接在一起。因为 SEAforth-24A可以从基于ROM的串行接口中 的任何一个引导,所以多个连接在一起的 SEAforth-24A可以不需要使用SPI接口来引导 每个SEAforth-24A设备。N3、N12、N17和N22中的ROM代码允 许通过异步串行接口之一上的输入起始位来 将处理器从睡眠中唤醒。
GPIO 内核N2、N4、N11、N19、N21和N22具 有单个双向插脚用于GPIO。大部分内核可以经由从地址读取而从睡 眠中唤醒,以通过在IO的位17中读取的输入 插脚上的高,选择它们未使用的公共端口。(内 核是N2、N3、N4、N5、N11、N12、N17、 N18、N19、N20、N21、N22和N23) 在这些处理器上,来自插脚的输入连接至在不具有邻居的端口上的握手电路。如果处理器在包括不连接至邻居的端口的端口读取上进入睡眠,则这些插脚之一上的高将该处理器从睡眠中唤醒。ROM对于下述结点使用该特征,所述结点在看见它们的输入插脚上的高电压时,唤醒进入异步串行模式。在唤醒之后,这些结点上的ROM确定该结点是否已经被相邻结点的工作请求或通过读取唤醒输入插脚而唤醒。插脚上的高电压显示该结点被串行输入唤醒。ROM代码于是调准(time)定时位以确定波特率并且继续从异步串行输入引导。ROM代码中的唤醒的插脚上的低电压意味着其是被邻居唤醒的,并且处理器执行已经被写入的共享通信端口中的每一个。
第5章I/O寄存器详细描述 每个内核处理器确切地具有一个I/O状态和插脚控制寄存器,其寻址在位置$15D。此寄存器执行两个功能。对于所有内核,其提供它们共享的唤醒/睡眠通信端口寄存器的当前状态。对于那些连线至I/O插脚的内核,其提供配置和读取或写入插脚的方法。
内核N0具有其它内核没有的两个寄存器。这些是在端口地址$171的存储器地址寄存器、以及在端口地址$141的数据寄存器。
表7.IO寄存器位分配中使用的缩写 表8说明了‘普通’内核I/O寄存器。内核可以具有多达四组处理器间通信寄存器状态位,并且其可以具有至外部世界的‘真实’I/O。典型地,所有内核不具有全部选项;特别地,边缘上的内核不使用全部处理器间通信寄存器状态位。同样,中心的内核不具有I/O。
在下列页上的各个寄存器描述中,端口地址值(例如,1D5)用该端口所连接到的内核名称来代替。例如,在内核N0上,1D5端口连接至N1,因此,位位置16和15分别被标以Rd N1和Wr N1。RR=读取寄存器,WR=写入寄存器。
表8.典型内核I/O寄存器的概述 贯穿下面的寄存器描述,存在控制其它输出插脚的状态的输出位对。在所有情况下,该位的功能如表9中所示。
表9.IO插脚配置控制位 表10.内核N0I/O状态端口$15D
位12、DBTS是数据总线三态控制位。
表11.内核N1 I/O状态端口$15D 表12.内核N2I/O状态端口$15D
表13.内核N3I/O状态端口$15D
表14.内核N4I/O状态端口$15D
表15.内核N5I/O状态端口$15D
表16.内核N6I/O状态端口$15D 表17.内核N7I/O状态端口$15D 表18.内核N8I/O状态端口$15D 表19.内核N9I/O状态端口$15D 表20.内核N10I/O状态端口$15D 表21.内核N11I/O状态端口$15D
表22.内核N12I/O状态端口$15D
表23.内核N13I/O状态端口$15D 表24.内核N14I/O状态端口$15D 表25.内核N15I/O状态端口$15D 表26.内核N16I/O状态端口$15D 表27.内核N17I/0状态端口$15D
表28.内核N18I/O状态端口$15D
VCO/4、位2是对VCO的使能。
表29.内核N19I/O状态端口$15D

表30.内核N20I/O状态端口$15D
表31.内核N21I/O状态端口$15D
表32.内核N22I/O状态端口$15D
表33.内核N23I/O状态端口$15D
表34.内核N0存储器地址寄存器$171 存储器地址寄存器是只写入的。读取产生随机结果。写入此寄存器不阻塞;第二个写入将覆写先前的值,不考虑连接至这些信号的外部逻辑的动作。
表35.内核N0存储器数据寄存器$141 数据寄存器是读取/写入的。对此寄存器读取和写入不阻塞;第二个写入将覆写先前的值,不考虑连接至这些信号的外部逻辑的动作。
第6章处理器操作码描述 操作码压缩(packing) C18处理器使用5位来定义操作码。18位指令字包含四个指令槽(instruction slot)。所有指令可以从最左端的三个槽,槽0、槽1和槽2执行。槽3是特殊的。它仅由3位组成,并且仅用于包含那些低位2位是二进制00的指令。
IF和NEXT测试IF或NEXT指令必须快速确定寄存器T或R是否分别包含零。此确定自动发生,作为执行改变T或R的任何指令的一部分。当IF或NEXT开始执行时,它们使用锁存的测试结果来及时选择下一个指令的适当地址,以立即开始取出。
每操作码的时钟周期 大部分操作码在单个时钟周期中执行,但是一些操作码占用更长时间。
·访问IO寄存器的成本是两个周期。
·用以访问其相邻结点总是在等待的握手 端口的标称时间是两个周期。 访问ROM或RAM的时间是三个周期。
基于ALU的指令的定时 如图2中所示,由T和S寄存器供给ALU,并且,ALU将其结果返回至T寄存器。ALU是纯组合的。一些通过ALU的逻辑路径比其它路径长,特别地,加法指令(Plus和Plus-star)需要时间用于进位传递。ALU需要两个指令周期来发生此。这具有下列结果 如果栈影响的指令后紧跟着加法,则必须插入NOP以确保足够的传递时间;例如POP、NOP、PLUS。
如果T和S寄存器对于至少一个指令已经稳定了,则不需要NOP。不影响T或S从而‘有助于’加法指令的传递时间的指令称作“Aids+”,因为有助于Plus的执行时间。进行此操作的指令在“Aids+”列中显示为“是”。
分支指令分支操作码包括CALL、JUMP、IF、-IF和NEXT(但不是micro-next)。
当分支从槽0执行时,用来自13位指令地址栏的所有9个LSB的递增的值更新PC。
每当分支在槽1或2中时,程序计数器的位8(第9位)将被强制为零。因此,槽1和2分支不能到达I/O空间(或保持在其中);它们被限定至RAM或ROM目的地。
当分支在槽1中时,地址的低8位来自于地址域,从而在执行分支指令时,它们可以仅读取与PC相同的256字页上的地址。位8是零。
当分支在槽2中时,地址的位0至2(低3位)来自于地址域。位3至7来自刚递增的PC。
位8是零。因此,槽2分支停留在相同的8字页上。
地址递增规则存在在指令执行期间地址递增的一些实例。这些包括递增PC的正常指令取出、以及直接量取出、“直接量存储”和具有递增的A寄存器取出和存储。存在嵌入到影响所有使用情况的地址递增函数中的特殊逻辑。因为内部地址总线仅9位宽,所以递增可以仅影响任何寄存器的低9位。PC已经限制为9位,因此,此限制仅对A寄存器有影响。
每当地址选择ROM或RAM地址空间,第一种特殊情况发生。在递增期间,进位仅在低7位内传递。在此地址空间内的全部128字边界,递增的地址将绕回至页的起始。因为存储器不解码地址位6,所以在每个64字边界处存在有效的绕回(wrap)。
每当地址选择内部I/O寄存器空间时,第二种特殊情况发生。完全抑制在此区域中的地址递增。这意味着当从端口空间执行时,可以使用指令取出、直接量取出和“直接量存储”,而不影响PC的值。来自端口的调用将返回至该端口。
表36.SEAforth指令集的总结 CALL操作码 将R推至返回栈,并且将当前PC置于R的低9位中。从标签的地址取出下一个指令字。将“递增的”地址加载到PC中。
RETURN操作码 从R的低位9位给出的地址取出下一个指令字。从返回栈出栈,用下一个在下面的值替换R的所有18位。将“递增的”地址加载到PC中。跳过包含RETURN的指令字中任何未使用的槽,并且从新的指令字的槽0恢复执行。
JUMP操作码 从标签的地址取出下一个指令字。将“递增的”地址加载到PC中。
COROUTIN操作码 从R的低9位中的地址取出下一个指令字。将当前PC加载到R的低9位中。随后将递增的地址加载到PC中。跳过包含COROUTINE的字中任何未使用的槽,并且在新的指令字的槽0处恢复执行。效果与在取出下一个指令字和递增新PC之前将PC用R的低9位封装相同。此操作码的使用可以被认为是计算的或导引的(vectored)调用或跳转、或认为是协同例行程序;即,两个函数,其每个可以在另一个的最后的退出/调用点调用/继续另一个中的执行。这还可以被认为是简单的任务切换。
IF操作码 如果T寄存器是零,则从分支地址域计算下一个指令字的地址,否则使用当前PC地址。从此地址取出下一个指令字。将“递增的”地址加载到PC中。
当T寄存器是非零时,执行位于if和then记忆符号之间的代码。当T是零时,程序控制导引至跟随着then记忆符号的指令(不执行if和then记忆符号之间的指令)。还可以通过UNTIL来编译IF操作码。在该情况下,如果T是零,则程序将向后分支转移,否则将退出循环。
注意IF编译操作码,而ELSE或THEN解析分支的地址,并且填充编译的分支操作码的地址域。UNTIL编译IF操作码,并且使用由先前的BEGIN留在编译器的栈上的地址来解析分支地址。
MIMUS IF操作码 如果T的最高有效位是零,则从分支地址域计算下个指令字的地址,否则使用当前PC地址。从此地址取出下一个指令字。将“递增的”地址加载到PC中。
当设置T寄存器的最高位时,执行位于-if与then记忆符号之间的代码。当复位最高位时,程序控制导引至跟随then记忆符号的指令(不执行-if和then记忆符号之间的指令)。还可以通过-until来编译Minus IF。
注意-IF编译操作码,而ELSE或THEN解析分支地址并且填充编译的分支操作码的地址域。-UNTIL编译-IF操作码,并且使用由先前的BEGIN留在编译器的栈上的地址来解析分支地址。
NEXT操作码 如果R寄存器是非零,则从分支地址域计算下一个指令字的地址,否则使用当前PC地址。从此地址取出下一个指令字。将“递增的”地址加载到PC中。在R是非零的情况下,递减所有18位,并且将新值加载到R中。当R在执行的起始为零时,从返回栈出栈并且取代R,并用在下面的下一项替换R。
当前在R中的数字代表NEXT将分支转移到循环的顶端的剩余次数,或比循环主体要被执行的次数少一次。假设已经通过循环外部的明确的PUSH操作码或FOR操作码将循环计数推入至返回栈。
记住,必须在循环外部将循环计数推入到返回栈,但是,当该循环完成时,将自动移除该循环计数。同样,注意平衡下一个循环内部的返回栈的任何其它使用,从而使得该循环计数在next执行期间总是在适当的位置。
UNEXT操作码 UNEXT(正确读作micro-next)不包含地址域。在R为非零的情况下,micro-next将不取出另一指令字,但是将继续执行从槽0开始的当前高速缓存的字。当R达到零时,micro-next将从在那时PC所指向的任何地方取出下一个指令。因为其消除了进行指令取出的需要,所以其允许快速的四个指令循环。仅使用一个时钟来重复该循环。
如果从端口地址的槽3执行UNEXT,则当循环完成时,其将从相同端口取出下一个指令,因为地址递增的规则防止端口地址改变。如果该端口的邻居还未写入新的指令字,则处理器将挂起,直到邻居写入其为止。如果该邻居已经写入操作码以遵循micro-next,则该处理器将加载并执行该操作码,并且该邻居将恢复。
记住,必须在循环外部将循环计数推入到返回栈,但是,当该循环完成时,将自动移除该循环计数。同样,注意平衡下一个循环内部的返回栈的任何其它使用,从而使得该循环计数在next执行期间总是在适当的位置。
LITERAL操作码 从当前PC地址取出程序存储器的下一个字。将18位值推入至数据栈上。将“递增的”地址加载到PC中。
当编译器遇到源代码中的直接量数字或等同的符号时,其自动编译@p+操作码至下一个可用槽中,如果需要则开始新的指令字,并且随后将该直接量值存储到程序存储器的下一个可用字中。这称作隐式(implicit)直接量编译。如果通过名称显式地编译直接量取出操作码,则程序员的责任是将直接量值放入程序存储器中的正确的在后位置中,以便在@p+执行时由当前PC值取出。该直接量值可以是用,(逗号)放置的计算的数字,或者,其可以是意图经由端口存储而传递至另一处理器的另一指令字。当使用此技术时,必须注意确保正确记数槽数字和指令字边界。
PUSH操作码 在数据栈顶端的元素从此栈出栈,并且被推入至返回栈上。
POP操作码 在返回栈顶端的元素从此栈出栈,并且被推入至数据栈。
DUP操作码 复制在数据栈顶端(T寄存器)处的元素,并且将其推回至数据栈。S寄存器和T寄存器随后将包含相同的值。
DROP操作码 在数据栈上执行出栈操作,并且丢弃从数据栈的顶端(T寄存器)移除的元素。
OVER操作码 复制数据栈(S寄存器)中的第二个元素,并且将其推入至该栈上。
B STORE操作码 向9位B寄存器加载从数据栈出栈的数字。
A STORE操作码 向18位B寄存器加载从数据栈出栈的数字 AFETCH操作码 将18位A寄存器的内容入栈至数据栈。A寄存器保持未修改。
STORE B操作码 元素从数据栈出栈,并写入到由B寄存器指定的位置。B寄存器保持不变。
STORE A操作码 元素从数据栈出栈,并写入到由A寄存器指定的位置。A寄存器保持不变 STORE P+操作码 元素从数据栈出栈,并写入由程序计数器指定的位置。如果该地址不在寄存器空间中,则程序计数器将递增。
STORE A+操作码 元素从数据栈出栈,并写入由A寄存器指定的位置。如果该地址不在寄存器空间中,则A寄存器将递增。
FETCH B操作码 读取由B寄存器指定的位置的内容,并且将其推入至数据栈上。B寄存器保持不变。
FETCHA操作码 读取由A寄存器指定的位置的内容,并且将其推入至数据栈上。A寄存器保持不变。
FETCH A+操作码 读取由A寄存器指定的位置的内容,并且将其推入至数据栈上。如果地址不在寄存器空间中,则A寄存器递增。
AND操作码 数据栈(T寄存器和S寄存器)的顶部两个值从数据栈出栈,进行逻辑与,并将结果推回至该栈。
XOR操作码 数据栈(T寄存器和S寄存器)的顶部两个值从数据栈出栈,进行逻辑异或,并将结果推回至该栈。
NOT操作码 对数据栈(T寄存器)的顶端值取补。
RSHIFT操作码 与记忆符号一致,此指令通常称为“2斜杠”。将数据栈(T寄存器)的顶端值右移一位的位置。最高有效位保持不变。
LSHIFT操作码 与记忆符号一致,此指令通常称为“2星”。将数据栈(T寄存器)的顶端值左移一位的位置。0移位到最低位位置。
NOP操作码 使用“无操作”操作码来赢取时间或来填充指令槽。
PLUS操作码 将S和T的算术和加载到T,并且S加载在S之下从数据栈出栈的下一个值。此操作也称作相加。
一个指令时钟仅仅是用于内部进位穿过几乎数字字的长度一半的足够时间。在某些情况下,进位会做的更好,但是,这些情况牵涉栈上的两个数字的相对位置、它们来自于哪里、以及使用什么指令来将它们置于那里。尝试和预测任何最佳情况是不值得的。通常,在一个时钟中,仅具有少数1的位的数字确定地可以被相加。
在除了PLUS之外的指令的执行期间,S和T的值对ALU可用。只要S和T不改变,ALU就有额外的时间来完成求和的计算。PLUS刚好进行以选择哪个ALU输出在结尾处锁存到T中。这里示出了不修改S或T的指令(例如NOP),其在Aids+栏中具有属性是。对于这些指令中的任一个的前述的PLUS(或PLUSSTAR)将保证输入的任何组合的正确的18位结果。
如果PLUS(或PLUS STAR)在由指令预取延伸(stretch)的槽3位置中执行,或者,如果其在被“槽4取出”领先的槽0位置中执行,则将经过足够的时间来产生正确的值,而不考虑哪个明确的指令领先于PLUS(或PLUS STAR)。
PLUS STAR操作码 使用PLUS STAR来使两个数字相乘,并且通过计算一系列部分乘积而工作,所述部分乘积在产生时被加入。
PLUS STAR指令假定T寄存器的最低有效位包含该乘数,以及S寄存器的最高有效位包含被乘数,以及两个位域不重叠。T和S寄存器的部分可以在长度方面不同,但是,在T和S中使用的位的总和必须是18或更少。
将乘数(T)视为无符号数。将S视为有符号数。
当PLUS STAR执行时,如果T寄存器的最低有效位是零,则无符号地、简单地将T寄存器右移一位位置。不需要做其它的。
然而,如果T寄存器的最低有效位是1,则将S寄存器加至T寄存器,产生两个18位有符号值的(可能的)19位和。将此和右移一位位置,并且将其加载到T中。通过此指令,S保持不变。
重复使用PLUS STAR使得两个寄存器相乘。你必须对乘数中的每个位位置执行PLUSSTAR。例如,如果该乘数有9位,则你必须执行9个PLUS STAR指令来完成乘法。当其完成时,结果在T中,向右对齐。将所有乘数位移走。S未改变。
用于行波进位(ripple carry)的相同规则以及对于应用到PLUS的延迟的潜在需要也应用至PLUS STAR。当T的低位是零时,不需要设定时间延迟。同样,当S中的被乘数是9位或更少时(向左对齐),不需要考虑行波进位延迟。
第7章插脚引线和插件 SEAforth-24A封装在100-插脚QFP插件(package)中。在表37中列出了信号和它们的功能。对于关于插件大小、插脚引线和其它机械规范的全部细节,请联系工厂。
表37.信号列表(按字母顺序) 第8章电气规范 表38.绝对最大额定值 表39.电压和温度操作 条件 表40.设备特性 注释1除了具有上拉或下拉的插脚。
附录1.SEAforth-24A引导处理 系统引导 当复位时,C18处理器每个开始执行在地址 AAh处的ROM代码。不是所有的处理结点在引 导时都做相同的事情。 SEAforth-24A可以从结点N5上的SPI接口 引导。SEAforth-24A还可以从结点N0、或四个 ROM驱动的串行引导处理器结点N3、N12、N17 和N21中的任何一个上的外部RAM接口引导。 典型系统将从至基于SPI的引导设备的N5处理 器接口引导。引导设备通常是EEPROM或闪存 设备。 N5上的ROM引导代码可以初始化SPI设 备,并且向其发送命令以开始以250 Kbps速率 从SPI地址0读取。SPI引导加载器通过从SPI 接口读取144字节,将代码的64个18位字加载 到其内部RAM。在SPI中,首先读取最高有效 位。在加载64字之后,代码将跳转至在地址0 的代码。 由已经加载的代码确定在加载了代码的最 先的64字之后设备做什么。典型地,其继续从 SPI加载64-字区块(block),或者其将开始将引 导代码分布到其它内核。当等待读取操作时,所 有的其它内核都在‘睡眠’;当需要时,可以初 始化这些内核。读取到每个内核的RAM中的代 码可以支持额外的SPI特性或对这些插脚的其 它使用。 可以防止N5从SPI插脚引导。如果SPI数 据入在复位时为高,则SPI处理器将不从SPI 引导,并且将进入睡眠,等待来自邻居的写入。
如果该位为低,则其将改变芯片选择插脚,并且 开始触发(toggle)SPI时钟插脚以发送“从地址0读取”命令至SPI设备。
N3、N12、N17和N21具有ROM代码,以支持异步串行引导。这些处理器具有它们在它们的IOCS寄存器的位-17上读取的插脚,其用于串行输入和/或从睡眠唤醒。基于RAM的软件可以使用该插脚、或者关于管脚输入特性的从睡眠唤醒,来用于其它使用。
如果关注从串行引导,则内核将睡眠,并且等待它们的输入插脚上的逻辑高,其将被解译为串行起始位。这些处理器随后将试图调准(time)所读取的第一字节的首标中的定时位,以确定波特率。如果波特率太低,则试图调准定时位将失败,并且ROM代码将使得处理器处于睡眠,等待邻居写入。在~1200波特之下的波特率将不为串行输入而工作。如果使用两个停止位,则异步串行输入的上限将为~20MHz或更高。
在找到起始位之后,ROM代码将调准6位首标中的双倍宽的定时位,并且读取第一8位字节中的2个实际数据位。其随后将再读取两个8位字节,并且累加来自读取的最后18-数据位的18位数字。在标准的异步串行中,首先读取较低有效位。读取64个18位C18指令中的每个,作为三个8位字节,其具有一个起始位和一个或两个停止位。调准在读取的每三个字节字的第一个中的双倍宽定时位,从而在调准下个字的起始位之前,读取的位很少。即使以非常高的位率,也基本没有可能速度可以在该时间充分漂移至错过正确的定时并读取错误位。
在读取64个18位字并且将它们存储在其RAM中之后,串行处理器跳转至在地址0的代码。与SPI引导类似,这些处理器可以继续加载来自串行的64字分组,或者加载可变大小的分组。可以加载串行输出驱动器以允许串行处理器的第二插脚上的串行输出。
N0(RAM服务器)可选地也可以引导芯片。当其复位时,ROM读取插脚Memory_Present来看其是否应当从外部存储器接口引导芯片。如果Memory_Present在复位时为高,则其将从外部存储器接口引导。如果非易失性RAM、闪存或仿真设备连接至外部存储器接口,则可以使用其来引导芯片。
如果当复位N0时,Memory_Present为低,则其将升高其_Write_Enable和_Select插脚以将外部存储器置于静止状态中。如果Memory_Present在那时为高,则其将输出地址0,并且读取要被读取并用于从外部存储器引导的字的数量的计数。为了完成此,其将首先输出地址0,然后其将输出控制信号以读取、延迟、读取数据总线,并且输出控制信号。在外部存储器中的位置0处的代码和计数称作引导Forthlet。
在读取用于引导的18位字的数量的计数之后,ROM代码将执行该计数加1次从增加的外部地址的18位数字的读取。其将该18位数字存储到在地址0的本地存储器中,并且跳转到地址0以引导。通过使在外部数据总线上读取或写入18位数字的例程RAM被导引(vector)经过RAM,将ROM代码设计为支持不同的外部存储器设备。
附录2.内部数据表示和电平的注释 使用什么种类的物理条件来表示真和假的布尔值对于布尔逻辑的法则是无关的。为了方便,真和假经常写为0和1,但是这也仅仅是惯例。多年来,不同的计算机系统已经挑选了不同的电压电平来表示真和假;实际上,许多系统在机器的不同部分中使用不同的电平。存储器芯片通过改变0和1的内部电气表示而继续此惯例。通常找到一半,由电气状态表示的位恰恰是另一半的相反。
已经将处理器的SEAforth系列设计为以小的门计数和低功率来优化性能。设计者已经选择使用各种内部电平来表示0和1。在几乎所有的情况下,这对于程序员是实际上不可见的,但是存在一些情况,理解内部正在做什么将赋予你对于设计、及其功率和能力的更多领悟。
一个示例是在用于处理器间通信寄存器的地址位的操作中。以‘公共’术语来讲,由标准的8-4-2-1序列中的单个位来选择每个寄存器。可以结合位以选择多个寄存器。然而,内部地址总线以从偶数编号的位“反转”的方式表示奇数编号的位。因此,如果你观察到Vss附近的电压表示0并且Vdd附近的电压表示1的功率,则逻辑上为000000000的地址值将显示为101010101。
IntellaSys公司 20400Stevens Creek Blvd.,Fifth Floor Cupertino CA 95014 USA 408.850.3270v 408.850.3280f www://www.IntellaSys.net
权利要求
1.一种数字逻辑电路,用于处理具有多个位位置的多位二进制数字;
其中,物理特性的两个不同值表示二进制数字的位值;以及
其中,在偶数编号的位位置中,所述不同值中的第一值表示二进制1,并且,所述不同值中的第二值表示二进制0;以及
在奇数编号的位位置中,所述值的第一值表示二进制0,并且,所述值的第二值表示二进制1。
2.如权利要求1所述的数字逻辑电路,其中
所述数字逻辑电路的第一多个部分对应于偶数编号的位位置;以及
所述数字逻辑电路的第二多个部分对应于奇数编号的位位置。
3.如权利要求1所述的数字逻辑电路,其中,所述物理特性是电势。
4.如权利要求3所述的电路,其中,所述第一值是高电势,并且,所述第二值是低电势。
5.如权利要求3所述的电路,其中,所述第一值是低电势,并且,所述第二值是高电势。
6.如权利要求1所述的数字逻辑电路,其中,所述数字逻辑电路是多位二进制数字的并行加法器。
7.如权利要求6所述的并行加法器,其中,所述多位二进制数字是18位二进制数字。
8.如权利要求1所述的数字逻辑电路,其中,所述数字逻辑电路包括两个多位寄存器和一个多位算术逻辑单元,它们操作地互联以执行置于所述寄存器中的两个数字的行波进位加法,并且将和放在所述寄存器中的一个中。
9.如权利要求1所述的电路,其中,所述数字逻辑电路是异步逻辑电路。
10.如权利要求8所述的电路,其中,所述多位算术逻辑单元是18位算术逻辑单元。
11.一种用于操作数字逻辑电路中的多位二进制数字的方法;
其中,所述数字具有多个位位置;以及
其中,所述数字逻辑电路的物理特性的两个不同值表示二进制数字的位值;以及
其中,对于偶数编号的位位置,所述不同值中的第一值表示二进制1,并且,所述不同值中的第二值表示二进制0;以及,对于奇数编号的位位置,所述值的第一值表示二进制0,并且,所述值的第二值表示二进制1。
12.如权利要求11所述的方法,其中
数字逻辑电路的第一多个部分对应于偶数编号的位位置;以及
数字逻辑电路的第二多个部分对应于奇数编号的位位置。
13.如权利要求11所述的方法,其中,所述物理特性是电势。
14.如权利要求13所述的方法,其中,所述第一值是高电势,并且,所述第二值是低电势。
15.如权利要求13所述的方法,其中,所述第一值是低电势,并且,所述第二值是高电势。
全文摘要
一种交替位反转的基本计算机电路(30)。两个18位寄存器(32、34)连接至ALU(36)以执行行波进位加法,其中,在对应于奇数编号的位位置的电路部分中实施1-高数字表示,并且,在对应于偶数编号的位位置的电路部分中实施反转表示。由于交替位反转,所以可以仅在一个反转器反应时间中执行1位加法的进位计算,从而导致具有小的芯片面积的快速18位加法器。可以在传统地需要额外的反转器级以调节逻辑电平的其它组合电路中使用交替位位置的反转的数字表示,来减少操作反应时间和芯片面积。
文档编号G06F7/00GK101681250SQ200780051644
公开日2010年3月24日 申请日期2007年12月21日 优先权日2006年12月21日
发明者查尔斯·H·穆尔 申请人:Vns业务有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1