win32c
2005-07-08 21:03
我自编了一个超标量RISC处理器,方案如下:
我取名为WINX3200,
WINX3200为32位RISC处理器,在此,加入超标量技术,外围寄存器设有16个通用寄存器,寄存器A、B,CPSR,程序计数器PC,PC每跳转一次就读出32*5位,即5条指令。WINX3200设计成通用CPU模式,即在设计WINX3200时,假设与CPU构成系统的部件有内存(RAM),硬盘(慢速RAM)等。
程序空间:
1、每一条指令都是单字指令(32位)。
2、位长:32*5,即PC一次能读出5条指令。
ALU:
1、 能进行32位加、减、乘、除运算,并且互不影响,即在执行加法时,也可以执行乘法等。
2、 都是组合电路,即运算数一加上,立即出结果。
指令微码:
1、 每一条指令的执行独立,互不影响。
2、 除了外围寄存器外,为了减少一些读写冲突,设有一些中间变量(以AHDL语言举例说明,为NODE变量),如果出现程序执行时,在同一时刻内(可以不是一个时钟周期,如果采用上升沿和下降沿都触发,即边沿触发的话,此处所说的“同一时刻内”是指前一边沿和后一边沿之间)出现下一条指令要用到上一条指令结果时,可以直接从NODE变量中取,减少了程序发生冲突的可能性,提高执行速度。
3、 如果发生在同一程序页内(PC加一所给出的5条指令,我们叫它“程序页”)中有好几条指令要对同一寄存器写,则以最后一条为准,其他指令都写在NODE中。
4、 采用这种体系,在同一程序页中仍然存在的冲突有:在同一时刻时,出现相同指令,如果紧挨在一起,则可以处理(只执行后面的一条,前面的一条可以忽略),但要是两条指令中间隔一条或几条,则无法在同一时刻完成——指令微码被占用。
指令译码器的工作:
1、5条指令中出现相同指令的情况——若紧挨在一起,则只执行最后的一条;若中间隔一条或几条指令,则无法在同一时刻完成——指令微码被占用,必须到下一时刻执行。
2、监视跳转指令,设置一个跳转指令监视器,如果发现程序中有无条件跳转,则只执行跳转指令以前的程序,再将跳转值赋给PC,下一沿到时跳转;如果发现程序中存在有条件跳转,则测试跳转条件,如果满足跳转条件,则只执行跳转指令以前的程序,再将跳转值赋给PC,下一沿到时跳转,如果不满足,则跳过跳转指令,不执行。
3、指令译码器将已译码的指令放在一个5*32寄存器组PPA中,具体检测指令由指令微码完成(在每一条指令微码中,必须有对这5*32寄存器组PPA检测的单元,检测到则执行,否则不执行)。
4、指令译码器内部有一个表格,其中记录着每一条指令对各个寄存器的写情况,如果发现在一程序页内存在着队一寄存器写两次或更多次的情况,则第二条写指令将被推迟到下一时刻执行。
指令执行特征:
1、 同一时刻内不会出现两次相同的指令。
2、 每一条指令的执行都是有优先级的,在PPA中,在前面的指令即先被执行的指令优先级高,后被执行的指令优先级低。在执行写操作时,有5条写数据线——WA,WB,WC,WD,WE线,每条线都是32位,具体兜底是那根线写入哪个寄存器,由写逻辑块控制。
3、 在同一时刻执行的指令遇到读寄存器操作时,他们读的不是寄存器的Q端,而是寄存器的D端(读NODE变量);遇到写操作时,(按照上面的第四点假设,是不会出现两个写的)优先级不同的指令写入的总线不同,优先级最高的写入WA线,优先级次之的写入WB线等,具体哪一条总线起作用是由写逻辑快和指令执行交互完成的。
4、 对ALU的使用说明,ADD,ADC虽然在书写上是两条不同的指令,但是在编译时被编译成为操作码相同的指令,只是指令中有一位,或某一不被用户使用的寄存器标有他们的区别,同理减也一样。这样,由于指令译码不允许在同一时刻出现两条指令,所以可以有效地避免在运用ALU时发生冲突(加减乘除是独立进行的,因此进行不同类型的运算时不会发生冲突)。
下面说明验证版规格:
PC[]:32位
8个通用寄存器,寄存器A、B,CPSR
验证版的指令系统取了一些有代表性的指令,用红颜色标出。
1、 BL指令
BL指令的格式为:
BL{条件} 目标地址
BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令:
BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中
2、MOV指令
MOV指令的格式为:
MOV{条件}{S} 目的寄存器,源操作数
MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MOV R1,R0 ;将寄存器R0的值传送到寄存器R1
MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1
3、MVN指令
MVN指令的格式为:
MVN{条件}{S} 目的寄存器,源操作数
MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1
对不起,字数受限,先写这些,如果有兴趣,跟我联系。
我取名为WINX3200,
WINX3200为32位RISC处理器,在此,加入超标量技术,外围寄存器设有16个通用寄存器,寄存器A、B,CPSR,程序计数器PC,PC每跳转一次就读出32*5位,即5条指令。WINX3200设计成通用CPU模式,即在设计WINX3200时,假设与CPU构成系统的部件有内存(RAM),硬盘(慢速RAM)等。
程序空间:
1、每一条指令都是单字指令(32位)。
2、位长:32*5,即PC一次能读出5条指令。
ALU:
1、 能进行32位加、减、乘、除运算,并且互不影响,即在执行加法时,也可以执行乘法等。
2、 都是组合电路,即运算数一加上,立即出结果。
指令微码:
1、 每一条指令的执行独立,互不影响。
2、 除了外围寄存器外,为了减少一些读写冲突,设有一些中间变量(以AHDL语言举例说明,为NODE变量),如果出现程序执行时,在同一时刻内(可以不是一个时钟周期,如果采用上升沿和下降沿都触发,即边沿触发的话,此处所说的“同一时刻内”是指前一边沿和后一边沿之间)出现下一条指令要用到上一条指令结果时,可以直接从NODE变量中取,减少了程序发生冲突的可能性,提高执行速度。
3、 如果发生在同一程序页内(PC加一所给出的5条指令,我们叫它“程序页”)中有好几条指令要对同一寄存器写,则以最后一条为准,其他指令都写在NODE中。
4、 采用这种体系,在同一程序页中仍然存在的冲突有:在同一时刻时,出现相同指令,如果紧挨在一起,则可以处理(只执行后面的一条,前面的一条可以忽略),但要是两条指令中间隔一条或几条,则无法在同一时刻完成——指令微码被占用。
指令译码器的工作:
1、5条指令中出现相同指令的情况——若紧挨在一起,则只执行最后的一条;若中间隔一条或几条指令,则无法在同一时刻完成——指令微码被占用,必须到下一时刻执行。
2、监视跳转指令,设置一个跳转指令监视器,如果发现程序中有无条件跳转,则只执行跳转指令以前的程序,再将跳转值赋给PC,下一沿到时跳转;如果发现程序中存在有条件跳转,则测试跳转条件,如果满足跳转条件,则只执行跳转指令以前的程序,再将跳转值赋给PC,下一沿到时跳转,如果不满足,则跳过跳转指令,不执行。
3、指令译码器将已译码的指令放在一个5*32寄存器组PPA中,具体检测指令由指令微码完成(在每一条指令微码中,必须有对这5*32寄存器组PPA检测的单元,检测到则执行,否则不执行)。
4、指令译码器内部有一个表格,其中记录着每一条指令对各个寄存器的写情况,如果发现在一程序页内存在着队一寄存器写两次或更多次的情况,则第二条写指令将被推迟到下一时刻执行。
指令执行特征:
1、 同一时刻内不会出现两次相同的指令。
2、 每一条指令的执行都是有优先级的,在PPA中,在前面的指令即先被执行的指令优先级高,后被执行的指令优先级低。在执行写操作时,有5条写数据线——WA,WB,WC,WD,WE线,每条线都是32位,具体兜底是那根线写入哪个寄存器,由写逻辑块控制。
3、 在同一时刻执行的指令遇到读寄存器操作时,他们读的不是寄存器的Q端,而是寄存器的D端(读NODE变量);遇到写操作时,(按照上面的第四点假设,是不会出现两个写的)优先级不同的指令写入的总线不同,优先级最高的写入WA线,优先级次之的写入WB线等,具体哪一条总线起作用是由写逻辑快和指令执行交互完成的。
4、 对ALU的使用说明,ADD,ADC虽然在书写上是两条不同的指令,但是在编译时被编译成为操作码相同的指令,只是指令中有一位,或某一不被用户使用的寄存器标有他们的区别,同理减也一样。这样,由于指令译码不允许在同一时刻出现两条指令,所以可以有效地避免在运用ALU时发生冲突(加减乘除是独立进行的,因此进行不同类型的运算时不会发生冲突)。
下面说明验证版规格:
PC[]:32位
8个通用寄存器,寄存器A、B,CPSR
验证版的指令系统取了一些有代表性的指令,用红颜色标出。
1、 BL指令
BL指令的格式为:
BL{条件} 目标地址
BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令:
BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中
2、MOV指令
MOV指令的格式为:
MOV{条件}{S} 目的寄存器,源操作数
MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MOV R1,R0 ;将寄存器R0的值传送到寄存器R1
MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1
3、MVN指令
MVN指令的格式为:
MVN{条件}{S} 目的寄存器,源操作数
MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1
对不起,字数受限,先写这些,如果有兴趣,跟我联系。