CPU计算机组成原理实验报告.docx
计算机组成与系统构造试验报告CPU设计与实现院系:专业班级: 组员:指导教师:计算机科学与技术试验目的:设计实现 CPU 部件。试验仪器:PC机安装Altebra 公司的开发软件 QuartusII,Modelsim两台TEC-CA计算机组成原理试验箱试验过程:一、理论设计1.1 、设计指令集设计 CPU 第一步,就是依据需求,确定功能,并且设计出指令集。指令集包括每一条指令的编码方式,操作码以及每一条指令实现的功能。考虑到第一次设计 CPU,在指令集设计过程中难免会消灭考虑不周全或者指令集设计不科学的问题,我们借鉴了经典的 31 条 MIPS 指令集。在对指令集每一条指令进展解读、分析后,我们确定:31 条 MIPS 指令可以满足我们的 CPU 的根本功能。下面将 31 条 MIPS 指令的编码格式、对应的操作类型以表格的形式列举出来:MIPS 指令集(共 31 条助例如含记指令格式例如符Bit 31. 25. 20. 15. 10. 5.0#262116116义操作及其解释R-oprsrtrd shafunctypemtadd0000 rs00rtrd000 1000 add0000 $1,$2,$3rd <- rs + rt;其$1=$2+$3 中 rs$2,rt=$3, rd=$1add 0000 rsu000000rtrd000 1000 addu0001 $1,$2,$3000 1000 subrd <- rs + rt;其$1=$2+$3 中 rs$2,rt=$3,rd=$1,无符号数rd <- rs - rt;其中sub00rssub 0000 rsu00rtrdrtrd0010 $1,$2,$3000 1000 subu0011 $1,$2,$3$1=$2-$3 rs$2,rt=$3,rd=$1rd <- rs - rt;其中$1=$2-$3 rs$2,rt=$3,rd=$1,无符号数and0000 rs00rtrd 000 1001 and$1=$2 & $ 0000 $1,$2,$33rd <- rs & rt;其中 rs$2,rt=$3, rd=$1orxornor0000 rs00rtrd 000 1001 nor$1=($2 | 0011 $1,$2,$3$3)if($2<$3)rd <- rs | rt;其中rs$2,rt=$3, rd=$10000000 1001or$1=$2 | $00rsrtrd0001$1,$2,$330000000 1001xor$1=$2 $00rsrtrd0010$1,$2,$33rd <- rs xor rt;其中 rs$2,rt=$3, rd=$1(异或rd <- not(rs |rt) ;其中 rs$2, rt=$3, rd=$1(或非 if (rs < rt)slt0000 rsrtrd000 1010 slt$1=1 else rd=1 else rd=0 ;其000010 $1,$2,$3$1=0中 rs$2,rt=$3, rd=$1if (rs < rt)sltusll 0000 000rtif($2<$3) rd=1 else rd=0 ;其0000000 1010sltu00rsrtrd0011$1,$2,$3$1=1 else 中 rs$2,rt=$3,$1=0rd=$1(无符号数 rd <- rt <<shamt ;shamt 存放rd sha 0000 sll$1=$2<< 移位的位数,srlsrasllvsrlvsrav00000000 000rt00000000 000rt0000mt00 $1,$2,1010rd sha 0000 srl$1=$2>> mt10 $1,$2,1010rd sha 0000 sra$1=$2>> mt11 $1,$2,1010也就是指令中的立即数,其中 rt=$2, rd=$1rd <- rt >>shamt ;(logical) , 其中 rt=$2, rd=$1 rd <- rt >>shamt ;(arithmetic) 留意符号位保存其中 rt=$2, rd=$10000000 0001sllv$1=$2<<00rsrtrd0000$1,$2,$3$30000000 0001srlv$1=$2>>00rsrtrd0010$1,$2,$3$3rd <- rt << rs ;其中 rs$3,rt=$2, rd=$1rd <- rt >> rs ;(logical)其中 rs$3,rt=$2, rd=$1 rd <- rt >> rs ;0000000 0001srav$1=$2>>00rsrtrd0011$1,$2,$3$3(arithmetic) 留意符号位保存其中 rs$3,rt=$2,rd=$1jr000000rs000 000 000 001000000000jr $31goto $31PC <- rsI-typeoprsrtimmediateaddi001000rsrtimmediateaddi $1,$1=$2+102,1000rt <- rs + (sign- extend)immediate ; 其中 rt=$1,rs=$2addi 0010 rsrt u010011immediateaddiu $1,$ $1=$2+102,1000andi $1,$1=$2 &rt <- rs + (zero- extend)immediate ; 其中 rt=$1,rs=$2rt <- rs & (zero-andiorixori00rsrt0011 rsrt010011 rsrt10immediate2,1010immediateandi $1,$1=$2 |2,1010immediateandi $1,$1=$2 2,1010extend)immediate ; 其中 rt=$1,rs=$2rt <- rs | (zero-extend)immediate ; 其中 rt=$1,rs=$2rt <- rs xor (zero-extend)immediate ; 其中 rt=$1,rs=$2rt <-immediate*65536 ;lui 0011 000rtimmediatelui $1,100$1=100*6 将 16 位马上数放到1100lw 1000 rsrt 11immediatelw $1,10($2)5536$1=memo ry$2+10目标存放器高 16位,目标存放器的 低 16 位填 0 rt <- memoryrs + (sign- extend)immediate;rt=$1,rs=$2sw 1010 rsrt11immediatesw $1,10($2)memory$ memoryrs + (sign- 2+10extend)immediate=$1<- rt ;rt=$1,rs=$2beq0001 rsrt00immediateif($1=$2 if (rs = rt) PC <-beq $1,$2 )PC+4 + (sign-,10goto PC+4 extend)immediate<<+402if($1!=$2)if (rs != rt) PC <-bne 0001 rsrtimmediatebne $1,$2goto PC+4 PC+4 + (sign-01,10+40extend)immediate<< 2slti0010 rsrt10immediateslti$1,$2,10if($2<10)if (rs <(sign-$1=1 else extend)immediate)$1=0rt=1 else rt=0 ;其中 rs$2, rt=$1if (rs <(zero-sltiu 0010 rsif($2<10)11rtimmediatesltiu$1,$2,10$1=1 else extend)immediate)$1=0rt=1 else rt=0 ;其中 rs$2,rt=$1J-typeopaddressj000010addressj 10000PC <-goto 1000 (PC+4)31.28,addr0ess,0,0;address=10000/4$31<-$31<-PC+4;PC <-(PC+4)31.28,addrjal000011addressjal 10000PC+4;goto 1000 ess,0,00;address=10000/4经典的 MIPS 指令有三种格式:RTYPE 、ITYPE 、JTYPE 。其编码格式各不一样,分别代表存放器操作指令、马上数操作指令、跳转指令。存放器操作主要是将存放器中的树取出进展运算并存回存放器;马上数操作为一个存放器数与指令中的扩展后的马上数进展运算得到结果再存回存放器;跳转我们后面的设计都是对这 31 条指令进展具体实现,全部的内容严密围绕这31 条指令。1.2 、画数据通路图在设计完指令后,要做的就是依据指令描述的功能确定 CPU 有哪些部件, 并且确定各部件之间的连线方式。首先,一个 CPU 最重要的部件肯定是掌握器。掌握器就像人的大脑,掌握其他各个部件的工作。其次,由于是基于MIPS 指令集的 CPU,大多数操作基于存放器,因此必需设计一个存放器堆。此外,ALU 运算部件对于 CPU 来说也是必不行少的。由于有六条指令涉及比较操作,并且给有效位置位。考虑到本 CPU 设计初衷是四级流水掌握,假设一条指令多个节拍使用 ALU 部件会造成部件冲突,后期掌握会比较简单。因此,在本 CPU 中额外设计了一个比较部件。此外,还有其他部件,如 PC 部件、马上数扩展部件、数据存放器、地址存放器等。再依据 31 条指令,画出数据通路图。这只是一个初步的数据通路图,却奠定了 CPU 的根本构架。可能在后续的具体设计过程中,会对这个数据通路有所改动,但肯定是以现有的图为根底。可以说,这就是我们将要设计的 CPU 的一个初步蓝图。二、具体设计2.1 、掌握信号的提取与分析这一局部可以说是整个 CPU 设计过程里最重要、最简单的过程之一了。在这一局部,我们将依据数据通路图,分析数据通路中全部掌握信号的组成与赋值。第一步,我们将 31 条指令都划分为四个节拍执行完成:取指与译码、取数与 ALU 操作、主存取数、写回存放器。我们需要对每一条指令的每一个掌握信号进展分析,推断它应当在第几节拍给出。经分析,我们在CPU 工作过程中共需要掌握信号38 个其中包括4 位ALUCtr,分别是:COM0,COM1,ALU_AR,PC_1,RT_DR,PC_AB,DB_IR,DB_DR,RS_ALU, RT_ALU,DE_ALU,PC_ALU,ZERO_ALU,HEX_ALU,SHAMT_ALU,DR_REG,REG_W,REG_R,ALUCtr0,ALUCtr1,ALUCtr2,ALUCtr3,ADDR_PC,DR_DB,ALU_DR,AR_AB, DR_PC,DR_REG31,PC_W,PC_R,J_PC,IMM_DE,DE_U,RD_REG,RS_REG,RT_REG, RS_COM,RT_COM,DE_COM,COM_NVST,ZERO_REG,PC_JIE。具体的信号表在附件的 Excel 中。列出全部掌握信号后,对每一条指令需要哪些掌握信号,在第几节拍需要这些掌握信号都要标识清楚。如对于一号指令有符号数加:在第一节拍取指与译码,要给出掌握信号 PC_1,PC_AB,DB_IR,将 PC 地址传入地址总线并取出相应的指令送入指令存放器,PC 再完成自加一的操作;其次节拍取数与 ALU 操作需要的掌握信号是 RS_ALU,RT_ALU,REG_R,ALU_DR,RS_REG,RT_REGALUCtr为 0,四个掌握信号都不给出,将指令中 rs,rt 地址传给存放器,存放器将对应存放器中的数取出送到 ALU,ALU 依据给出的 ALUCtr 进展不同的操作。第三节拍是写回存放器,给出掌握信号 DR_REG,REG_W,RD_REG,将 DR 中的数、rd 地址送至存放器,并翻开存放器写开关。用这种方式分析全部指令。在分析完掌握信号后,我们就可以对掌握器进展具体设计了。2.2 、各部件具体设计2.2.1 、ALU 部件编号操作类型二进制编码ALU 是基于指令集来设计的,可完成二进制信息的算术运算、规律运算和移位操作,共包含 31 条 MIPS 指令。我们将其总结为 13 种 ALU 操作类型,用四位二进制数进展编码,如以下图所示。这些二进制编码作为 ALU 掌握信号,即aluctr。1有符号加00002无符号加00013有符号减00104无符号减00115与01006或01017异或01108非或01119有符号比较100010无符号比较100111规律左移101012规律右移101113数字右移1100在 ALU 中,为符合它的双操作数功能,我们设计了两个存放器 r1 和 r2, 作为 ALU 的两个输入。经过对指令集的分析,将进入 ALU 数据来源分为 rt、rs,shamt,imm,PC 几种类型,为了避开数据操作时发生冲突,将其分别放在两个存放器中,其中 rt、imm 放在 r1 中,rs、shamt 和 PC 放在 r2 中。除了两个存放器输入外,还有 ALU 掌握信号输入端口 aluctr。一个输出端口 out。在ALU 运行过程中,从 r1、r2 中取出数据,依据 aluctr 给出的掌握信号进展相应的运算,从 out端口输出。ALU 部件的代码见附录。2.2.2 、PC 部件PC 部件是用来计算下一条指令的,在一般状况下,指令都是挨次执行下去的,即 PC+1,而在遇到跳转指令时,则需要进展其他简单的操作,所以我们制作的 PC 部件主要分了这两种操作方法。在编写的 PC 部件代码中,共有四个输入端口,分别是从当前执行的指令中取来的地址 address,用于下一条 PC 的拼接,既然有 PC 拼接和 PC+1 的两种操作,我们就分别给出了两个输入的 PC 操作信号:pc_ctr 和 pc_pj,另外还有从ALU 来的运算结果 alu_pc 作为第四个输入端口。输出端口有 pc_out 和pc_alu。当接收到 pc_ctr 信号时,进展 PC+1 的操作,而当接收到 pc_pj 信号时,进展 PC 的拼接操作。PC 部件的代码见附录。2.2.3 、存放器组存放器是计算机的一个重要部件,用于暂存数据和指令等。由于考虑到存储空间的大小,我们将原有的 32 个 32 位的存放器组修改为 4 个 32 位的存放器组。在存放器组中,存在两个掌握信号,分别为读和写,当收到读信号时,我们接收到的地址所对应的存放器的数据取出,假设接收到的是写信号,我们就将接收到的数据写回之前发过来的地址所指示的存放器中。其中,地址的来源有指令中的 rs_add,rrt_addr 和 rd_addr,数据来源为 rd_data,共有两个输出端口,分别为 rt_out,rs_out。存放器组的代码见附录。2.2.4 、马上数扩展部件马上数扩展部件的主要工作是将指令中的 16 位的马上数扩展成为 32 位的数,并且有有符号扩展和无符号扩展两种。因此,对于一个马上数扩展部件来说, 有两个输入一个输出。输入分别是 16 位的马上数和掌握扩展方式的掌握信号, 输出是扩展之后的 32 位的数。马上数扩展部件具体代码见附录。2.2.5 、比较部件比较部件是我们在本次设计中的一个创点。考虑到每一次比较操作都要经过 ALU,而涉及到比较操作的指令除了比较操作本身还会用一次 ALU 操作,这在流水设计中无疑会带来部件冲突。尽管在发生冲突时,我们可以承受检测冲突、参加堵塞的方法进展排解,但这无疑给掌握的设计带来了很大的困难。我们考虑: 能否为比较操作特地设置一个比较部件,用来推断两个操作数大小并依据指令类型为标志位赋值。为后面的操作供给依据。我们设计的比较部件,可以完成如下四种操作:判等置 1,判不等置 1,判大于置 1,判小于置 1。因此比较部件有四个输入:比较掌握信号 1,比较掌握信号 2两个信号组合起来表示现在在做哪一种推断,比较数 1 以及比较数 2,一个输出对标志位置位。具体代码见附录。2.2.、6 信号发生器信号发生器是依据脉冲信号循环给出节拍掌握信号的部件。学过生疏规律的都应当就得不难。首先将 clk 进展分频,将分频后的信号与 clk 组合起来,表示四个节拍,从一到四分别为:00,01,10,11。在仿真后消灭了下面的状况图2.6.1:图 2.6.1认真观看可以觉察,途中输出信号 w1,w2,w3,w4 消灭了毛刺如 4600ns 处 w1 信号。在查阅相关资料并向教员请教后我们意识到,这就是数电中说到的“毛刺”。由于从“01”到“10”,两个输入信号同时发生了变化,所以在变化的一瞬间消灭了不想要的“毛刺”。我们又查阅数电书,觉察解决毛刺的方法就是承受“格雷码”编码方式,即每次信号变化时只有一个信号发生变化。因此我们又添加了一个分频信号在 clk 的时钟下降沿翻转,与原先始终上升沿翻转的信号一起, 组成了的掌握信号,从一到四分别为:00,01,11,10。这样产生的信号就符合“格雷码”编码方式,也不会产生“毛刺”。如图 2.6.2图 2.6.2信号发生器源码见附录。2.2.7、硬布线掌握器在设计 CPU 之初,我们就打算了使用硬布线方式设计掌握器。在 IDE 工具的帮助下设计硬布线掌握器比真实的大规模集成电路设计硬布线要简洁的多。运用一些固定的格式,IDE 会自动生成硬布线电路。之前在 2.1 的局部,我们就已经完成了掌握信号的提取与分析,这时候只需要细心地将 Excel 表格中的内容转换成代码。掌握器的输入有六个:6 位的 OP,6 位的 FUNC,节拍信号 w1,w2,w3,w4, 输出为全部掌握信号。如在某条指令中,需要在第几节拍给出哪个信号,就将该信号等于对应的节拍输入即可,IDE 会自动生成硬布线电路。源码见附录。试验感悟唐玲芳的试验感悟经过几个星期的努力,虽然没能把 CPU 制作出来,却收获了不少。在这次试验中,我最大的收获是对计算机组成原理这门课程的理解更加深刻了。在制作的过程中,我们不懂就问,自己动脑去理解,由于我们知道,假设不理解,试验是无法进展下去的,在教员的悉心帮助下,我们也取得了一些成果。在试验的前期,我们一步一个脚印:确定 CPU 的功能、能执行指令集,制定通路路线图, 分析出全部的掌握信号等等。在这个过程中,我们也充分理解到“构造打算功能” 这句话,在没能全面考虑到全部的功能时,在通路图上总会少几个部件,只有将全部功能走通了,都能实现了,我们的通路才真的制定完整了。在试验的过程中, 我主要参与了 ALU 部件、存放器组、PC 部件的制作。在编写程序的过程中,也遇到了不少麻烦。比方说部件的中心思想、主要构造没有弄清楚,导致程序出错, 而无法进展下去。在之前我们始终以为掌握器所给的掌握信号是在 ALU 内部的, 掌握信号一来,才知道数据是从哪来 ALU 的,然后再从 ALU 中的存放器中取出来进展相应的运算,但是后来才觉察,掌握器的掌握信号并不归 ALU 管,它是各部件连接的通路上的,在 ALU 中我们只需要从存放器中取数,依据 ALU 掌握信号进展相应的运算就可以了。明白了这一点后,我们的 ALU 才根本完成了正确的实现。另外就是我对所用的 Verilog 语言不够生疏,很多语法都没有完全把握,在写程序时,断断续续,影响进度。总的来说,在这次试验中,我的收获还是很大的。无论是对课程的理解还是对编程、动手力量的提高,都有肯定程度的帮助。戚洪源的试验感悟在回到信大之前,心里是格外向往这次试验的。在科大学习了一学期计算机原理,第一次如此深入地接触计算机,当时教员说会在暑期学期用整整两周时间来做这个试验。原本以为自己没有这样的时机,但很幸运还是解除了这个试验。整体感觉是:很难。设计 CPU 不是纸上谈兵,是要实实在在写代码烧板子的, 一个小小的错误可能就导致了最终的失败。我在试验中最大的感受有以下几点:一、万事开头难做这个试验摆在面前的第一个问题就是:现在干嘛?这是一个很实际的问题, 假设没有教员指导,应当怎么开头?在试验开头前我就着手资料预备,和很多研 究生学长沟通之后确定了从指令集到通路图的方案。浴室我着手开头搜关于设计 指令集的资料,并且确定以 31 条 MIPS 指令集为根底。事后回想起来,真是万事开头难。当一个简单的任务降临不知道从何入手时,肯定要留意,千万不能自己搞自己那一套,很可能一开头就走到了一个错误的道路上。既然不知道从何入 手,就去查资料,请教别人,这是本次试验的收获之一。二、模块化设计思想和黑盒设计思想CPU 这几工作量很大,而且各局部之间严密联系。首先时间紧,一个人去完成不太可能实现,而合作的话,如何将一个联系格外严密的东西分开去做呢?这就要用到模块化设计思想和黑盒设计思想。将这个数据通路图中的元器件依据功能进展最小化划分。一个元器件有什么输入什么输出,实现什么样的功能,这和总体连线是没有太大关联的。确定出来大致有哪几个元器件,分别是什么输入输出,比方 ALU 部件,就两个操作数输入,一个掌握信号输入,一个结果输出, 至于怎么和存放器堆相连,输出到哪里之类的问题,不需要 AlU 设计者去考虑。最终,在全部元器件确认没有问题之后进展顶层连线。讲一个个元件看成黑盒, 元件设计者不需要知道外界怎么连接它,顶层设计者不需要知道内部如何运行。这样,就可以把 CPU 这个有机的整体合理划分成几小块,交给不同人去分别实现。这种思想还是令我感受格外深的。在以后的大工程、大问题消灭的时候,也可以考虑这种方式进展分工合作。三、对于中心处理器有了更深一步的生疏实践是检验真理的唯一标准。经过这一次的试验,我对于 CPU 的理解又深了一层。在科大的时候做过一个简洁的,七条指令的单周期 CPU 的元器件连线图,连掌握信号都是教员给出来的,也可以跑指令,当时觉得格外感动。这一次, 我自己动手设计 31 条指领的流水 CPU。从设计指令集开头,一步一步地提取掌握信号,这个过程的收获格外大。这一次试验让我彻底理解了设计 CPU 的掌握器应当遵循一个什么样的流程,绝不是简洁复制某本书上的真值表。在走遍 31 条指令后,整个 CPU 的数据通路图已经深深刻在我的脑海里。还有太多太多, 整个过程确实让我受益匪浅。四、对于硬件设计有了更深的了解原先也学习过数字设计课程,不过几乎没有接触试验。以至于学完之后很多规律上的问题根本无法理解。这一次做了试验,再回过头来想想,很多东西就可以理解了。特别是一些问题的处理,必需用到数电的学问。如:设计信号发生器的时候遇到的“毛刺”问题,一开头一头雾水,根本不懂为什么会消灭这个东西。后来经教员点拨,一下子想起来这是数电中学习过的“格雷码”编码问题。这时运用数电学问问题迎刃而解。五、总结总结起来,这一次试验即使最终没有完整地拿出结果来,但是已经有了很多收获了。今年暑假的时候和科大的教员沟通,说到 CPU 试验的问题时,她说作为一个计算机专业的学生,没有去自己尝试过做一个 CPU,还是有点圆满的。做过一次,不管结果如何,都会有所收获。现在这学期的试验也告一段落,收获确定远比上面说的要多。真的不虚此行,后面有时机,肯定要把这个 CPU 再拿出来,把它做完。不知道这个可不行以算一个毕业设计。假设做出来,能算信大 CPU 第一人吗?哈哈,开玩笑了。附录ALU 部件源码module ALU(alucrt,r1,r2,out); input 3:0alucrt;input 31:0r1,r2; output reg31:0out;always(*) begincase(alucrt) 0000:beginif(r231=r131)beginout31=r231; out30:0=r230:0+r130:0;end else beginif(r230:0>r130:0)beginout31=r231; out30:0=r230:0-r130:0;end else beginout31=r131; out30:0=r130:0-r230:0;endendend0001:beginout=r2+r1;end0010:beginif(r231=r131)beginif(r230:0>r130:0)beginout31=r231; out30:0=r230:0-r130:0;end else beginout31=r131; out30:0=r130:0-r230:0;endendelse beginout31=r231; out30:0=r230:0+r130:0;endend0011:beginout=r2-r1;end0100:beginout=r2&r1;end0101:beginout=r2|r1;end0110:beginout=r2r1;end0111:beginout=r2r1;end1000:beginif(r231=r131)beginif(r231=1)beginif(r230:0>r130:0)beginout=1;end else beginout=0;endendelsebeginif(r230:0<r130:0)beginout=1;end else beginout=0;endendendelse beginif(r131=1)beginout=1;end else beginout=0;endendend1001:beginif(r2<r1) beginout=1;end else beginout=0;endend1010:beginout=(r2<<r1);end1011:beginout=(r2>>r1);end1100:beginout=(r2>>>r1);endend endcaseendmodulePC 部件源码module PC(address,alu_pc,pc_alu,pc_ctr,pc_pj,pc_out); input 25:0address;input 31:0alu_pc,pc_ctr,pc_pj; output 31:0pc_out,pc_alu;reg 31:0r;always(*) beginif(pc_ctr) beginr=r+4;end if(pc_pj) beginr=r+4; r27:2=address; r1:0=0;endendendmodule存放器组源码module Register(rs_addr,rt_addr,rd_addr,rd_data,read,write,rt_out,rs_out);input 4:0rs_addr,rt_addr,rd_addr; input 31:0rd_data;input read,write;output 31:0rt_out,rs_out; reg 31:0rt_out,rs_out; reg 31:0r0:3;always(*) beginif(read) beginif(rs_addr) begin case(rs_addr)00000:beginrs_out=r0;end00001:beginrs_out=r1;end00010:beginrs_out=r2;end00011:beginrs_out=r3;endendcase endif(rt_addr) begin case(rt_addr) 00000:beginrt_out=r0;end00001:beginrt_out=r1;end00010:beginrt_out=r2;end00011:beginrt_out=r3;endendendcase endelse begincase(rd_addr)00000:beginr0=rd_data;end00001:beginr1=rd_data;end00010:beginr2=rd_data;end00011:beginr3=rd_data;endendendendcaseendmodule马上数扩展部件源码module DE(DE_U,IMM,DE_OUT); input DE_U;input 15:0IMM; output 31:0 DE_OUT;reg 31:0 DE_OUT;always(*) beginDE_OUT15:0=IMM; if(DE_U=0)beginDE_OUT31=IMM15; DE_OUT30=IMM15; DE_OUT29=IMM15; DE_OUT28=IMM15; DE_OUT27=IMM15; DE_OUT26=IMM15; DE_OUT25=IMM15; DE_OUT24=IMM15; DE_OUT23=IMM15; DE_OUT22=IMM15; DE_OUT21=IMM15; DE_OUT20=IMM15; DE_OUT19=IMM15; DE_OUT18=IMM15; DE_OUT17=IMM15; DE_OUT16=IMM15;end else beginDE_OUT31=0; DE_OUT30=0; DE_OUT29=0;end endDE_OUT28=0; DE_OUT27=0; DE_OUT26=0; DE_OUT25=0; DE_OUT24=0; DE_OUT23=0; DE_OUT22=0; DE_OUT21=0; DE_OUT20=0; DE_OUT19=0; DE_OUT18=0; DE_OUT17=0; DE