还剩47页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
清华大学计算机科学与技术系计算机专业实践报告专题名称开放式教学CPU设计与测试系统姓名学号2001011596班号计13同组姓名学号2001011603班号计13指导老师汤志忠辅导老师李山山成绩二零零四年九月OPCODEDEST_REG0000DATA包括MVRD指令的分组及节拍由于没有中断操作,本机指令的执行步骤可概括如下读取指令地址寄存器v-指令地址,修改PC内容使其指向下一条将要执行的指令读内存,指令寄存器v-读出的内容分析指令执行指令通用寄存器之间的运算或传送,可1步完成;读写内存,通常要两步完成根据指令的执行步骤不同,可以把全部指令分为A、B两组其中A组指令完成的是通用寄存器之间的数据运算或传送,或其他一些特殊操作,在取指之后可一步完成,包括ADDSUB.ANDCMP.XORTESTORMVRR.DECINCSHLSHRADCSBBJRJRCJRNCJRZJRNZJRSJRNSCLCSTC;B组指令完成的是一次内存读写操作,在取指之后可两步完成包括JMPALDRR.STRR.MVRD在编码的时候以指令操作码的最高位来区分A、B组指令,0为A组指令,1为B组指令在控制器方面我们选用了组合逻辑控制器方案使用节拍来标记每条指令的执行步骤由指令而定,在我们的系统中不同的执行步骤只有5个,故使用3位节拍就足够了3指令汇总表:(*表示状态位在指令执行后会被重置,.表示状态位在指令执行后不会被修改)查看源文件
2、结构图:注图中所有奇存器都与时钟信号相连,并当RESET信号到来时清零,查看源文件由于没有流水和CacheCPU的结构还是比较简单的主要的部件就是算逻单元ALU、控制逻辑、通用寄存器组、指令寄存器IR、地址寄存器AR、程序计数器PC、标志寄存器、节拍发生器以及一些数据选择器和译码电路运算器方面,由一个ALU部件完成全部算数、逻辑、移位操作,输出设置了4个标志位c—进位标志位,Z—是否为0标志位,V—溢出标志位,s—是否为负标志位,保存在标志寄存器内与之相关的还有寄存器组和数据选择器16个16位的通用寄存器既是参与运算的数据的来源,乂是运算结果的暂存地,而数据选择器为ALU正确选择了两个输入数据控制器方面,使用了组合逻辑控制器,这也是当前RISC类型计算机普遍选用的控制器方案它的基本运行原理是,用组合逻辑门线路直接提供控制计算机各功能部件协同运行所需要的控制信号其优点是,形成这些控制信号所必需的线路延退时间少,对提高系统运行速度有利,并旦由于使用『大规模现场可编程器件,这些逻辑线路的设计和修改变得非常简单易行组合逻辑控制器主要由4个部件组成程序计数器PC保存指令在内存中的地址;指令寄存器IR保存从内存读来的指令内容,在指令执行过程中提供指令本身的主要信息;节拍发生器,用于标记出每条指令的各执行步骤的相对次序关系控制逻辑,或称时序控制信号产生部件,它根据指令内容(由IR提供)和指令的执行步骤(由节拍发生器提供)及其他一些条件信号(标志寄存器输出),形成并提供出计算机各部件当前时刻要用到的控制信号
2.3各部分说明
1、各个功能部件及其使用的控制信号
(1)ALU组合逻辑部件,对两个16位的输入及进位输入Cin可进行由3位控制信号控制的如下操作由Quartus生成的.bsf图如下查看源文件其VHDL语言的行为描述如下杳看源文件libraryieee;useieee.std_logic_lI
64.all;useieee.sd_logic_arith.alI;useiccc.std_logic_unsigncd.all;entityaluis“实体描述portcin:instdjogic;alu_aalu_b:instd_logic_vector15downto0;alu_func:instd_logic_vector2downto0;一控制信号aki_out:outstd_logic_vector15downto0;czvs:outstdjogic;endalu;architecturebehaveofaluis-ALU行为描述beginproccssalu_aalu_bcinalu_funcvariabletempItemp2temp3:std_logic_vector15downto0;begintempi:=0MX000XX000cin;一进位扩展casealu_funcisJI二表中的内容,i果都暂存为tempiwhen”000”=lemp2:=alu_b+alu_a+temp1;when”001”=temp2:=alu_b-alu_a-templ;when”010”=tenip2:=alu_aandalu_b;when”0ll”=tcmp2:=alu_aoralu_b;when100”=tcmp2:=aiu_axoraki_b;when101”=temp20:=O;forIin15downto1loop-循环实现左移temp2I:=alu_bI-l;endioop;whenH0H=tcmp215:=O;forIin14downto0loop--循环实现右移temp2I:=alu_bI+l;endloop;whenothers=temp2:=0000000000000000;endcase;aiu_out=temp2;一将tcmp2赋给输出aki_out--置标志位Z判断运算结果是否为0iftemp2=”0000000000000000”thenzv=T;elsez=0;endif;--置标志位S判断运算结果的符号位最高位iftemp215=Tthens=1;elses=0;endif;“置标志位V判断运算结果是否溢出casealu_funciswhen000|”001”=ifalu_a15=Tandalu_b15=Tandtemp2l5=0oralu_a15=Oandaki_b15=Oandtemp215=Tthenvv=T;elsev=0;endif;whenothers=vv=;endcase;“置标志位C判断运算结果是否有进位casealu_funciswhen”000”=temp3:=1111111111111111-alu_b-temp1;iflemp3alu_athencV=T;elsec-0;endif;when”001”ifalu_balu_athencv=T;elsec-0;endif;when”11”=c=alu_b15;when”11”=c=a!u_bO;whenothcrs=c=0;endcase;endprocess;endbehave;这部分上要要注意的地方就是标志位C和V的数值根据参考文献
[5]溢出标志位OF在运算过程中,如操作数超出了机器能标似的范围称为溢出,此时OF位置1否则置0进位标志CF记录运算时从最高有效位产生的进位值,例如,执行加法指令时最高有效位有进位时置1否则置0opage22-23后文对此进一步解释说page59OF用来表示带符号数的溢出,CF用来表示无符号数的溢出根据这一说明,可以这样判断V和C标志位的值V如果正数符号位为0与正数之和为负数符号位为I或是负数与负数之和为正数,则发生了溢出,V置1;C两数之和大于1111111111111111则产生了进位,C置1;被减数小于减数,则产生借位,C置1注意要使用无符号数的比较符号、V需包含库函数ieee.stdjogic-arith和ieee.std_logic_unsigneda另外要注意的是,只有算术运算需要考虑进位和溢出标志位,逻辑运算,除非带C移位和循环,否则无需考虑这两个标志位
(2)数据选择器BUS_MUX组合逻辑器件,其输入包括源寄存器数据,目标寄存器数据,带符号位扩展的偏移地址,PC以及从内存读取的立即数、跳转地址等数据在3位控制信号的控制下它进行ALU模块A、B端输入的选择由Quanus生成的.bsf图如下查看源文件其VHDL语言的行为描述如下查看源文件libraryicee;useieee.std_logic_l
164.all;entitybus_muxis--实体描述:instd_logic_vector2downto0;:instd_logic_vector15downto0;:outstd_logic_vector15downto0;architecturebehaveofbus_niuxisbeginprocessaki_in_seLdatapcoffsetsi\drbegincasealu_in_selis--翻详上表中内容when””=alu_sr=sr;alu_dr=dr;when”00l”=alu_sr=sr;alu_drv=”000000000”;when0!=alu_sr=0000000000000000;alu_dr=dr;when011=alu_sr=offsct;alu_dr=pc;when100n=alu_srv=”0000000”;alu_dr=pc;whenSu_srv=”000000000000000;aiu_dr=data:whenolhers=alu_sr=0000000000000000;alu_drv=”X00;endcase;endprocess;endbehave;由于在我们的设计中只有ALU部件有加法器的功能,而对程序计数器的自增并没有再另设一个加法器,故ALU的输入组合情况较多在对全部指令的执行步骤进行了分析后,共列出了表中所示的6种情况,故使用了3位控制信号器件T1组合逻辑器件,用于产生ALU的进位输入Cin受两位控制信号SCI的选择控制,输入为标志寄存的输出FLAG_C由Quartus生成的.bsf图如下查看源文件其VHDL语言的行为描述如下查看源文件libraryiccc;useieee.std_logic_l
164.all;entity11is--实体描述portflag_c:instdjogic;seizinsd_logic_vectorIdownto0;--控制信号alu_cin:outstdjogic;endtl;architecturebehaveoftlisbeginproccsssciflag_cbegincaseseiis翻译上表中的内容when00=alu_cin=0;when01=alu_cinv=T;when10=alu_cin=flag_c;whenothers=alu_cin=0;endcase;endprocess;endbehave;标志寄存器FLAG.REG时序逻辑部件,带有清零端RESET输出只在时钟正跳变时发生变化;接收ALU的标志位输出,在控制信号SST的控制下输出实际需要的标志位由Quartus生成的.bsf图如下查看源文件iinstil其VHDL语言的行为描述如下查看源文件libraryieee;useieee.std_logic_l
164.all;instd_logic_vector1downto0;instdjogic;flag_cflag_zflag_vflag_s:outstdjogic;endfiag_reg;architecturebehaveoftlag_regis--实体的行为描述beginprocessclkresetbeginifreset=Othen-RESET为低电平时寄存器清零ilag_c=0;flag_z=0;tlag_v=0;flag_s=0;clsifclkcvcntandelk=Tthen“时钟.正跳变来临时casesstis--翻译上表中的内容when00=flag_c=c;flag_z=z;flag_v=v;flag_s=s;whenflag_c=0;when10=flag_c=T;whenll”=null;endcase;endif;endprocess;endbehave;T2组合逻辑器件,将8位的OFFSET来自指令的低8位带符号位扩展到16位;由Quartus生成的.bsf图如下查看源文件其VHDL语言的行为描述如下查看源文件libraryieee;引言
31.1实验目的
31.2国内外研究现状
31.3实验环境
61.4主要成果7设计报告
72.1实验方法
72.2总体说明
92.3各部分说明13测试报告
473.1测试程序
473.2测试结果
493.3性能分析49总结
494.1实验总结
494.2取得的收获
494.3意见与建议50参考文献50附录
516.1附录A组员分工
516.2附录B程序或硬件说明(可选)51useieee.sd_logic_lI
64.all;entityt2is-实体描述portoffset_8:instd_logic_vector7downto0;offsct_16:outstd_logic_vcctor15downto0;endt2;architecturebehaveoft2is-实体的行为描述beginprocessoffset_8beginifoffset_87=Tthenoffset_16=11111111offset_8;elseoffset.16=00000000offset_8;endif;endprocess;endbehave;程序计数器PC时序逻辑器件,16位寄存器,在控制信号pc_en的控制下可接收ALU的运算结果(高电平接收,否则保持不变)输出送往地址寄存器(读取指令内容)以及数据选择器(进行自增运算)查看源文件其VHDL语言的行为描述如下查看源文件libraryieee;useieee.std_logic_l
164.all;entitypcis-实体描述portalu_out:insld_logic_veclor15downto0;en:instdjogic;--控制信号clkreset:instd_Iogic;q:outstd_logic_vector15downto0;endpc;architecturebehaveofpcis一实体的行为描述beginprocessclkresetbeginifreset=Othen-RESET为低电平时寄存器清零q=”00000000000;elsifclkeventandelk=*1then--时钟正跳变来临时ifen=Tthenq=alu_out;endif;endif;endprocess;endbehave;
(7)地址寄存器AR和指令寄存器IR都是16位的寄存器,地址寄存器用于存放要读写的内存地址单元的地址,输出送往地址总线,输入可能为PC内容,也可能为ALU的输出(对读写内存指令);指令寄存器存放当前执行指令的内容,它的输入来自从内存读取的指令和数据,输出送往控制逻辑二者共用两位控制信号REC说明如下由Quartos生成的.bsf图如下查看源文件1查看源文件2libraryieee;useieee.std_logic_l
164.all;entityaris--实体描述portalu_ou:instd_logic_vector15downto0;pc:instd_logic_vector15downto0;rcc:instd_logic_vcctor1downto0;一控制信号elkreset:instdjogic;q:outstd_logic_vector15downto0;endar;architecturebehaveofaris--实体的彳亍为描述beginprocessclkresetbeginifreset=Othen-RESET为低电平时寄存器清零q=0000000000000000;clsifclkcvcntandelk=1*then■-时钟止跳变来临时caserecis--翻译上表中的内容when01=q=pc;whenll”=q=alu_out;whenothers=null;endcase;endif;endprocess;endbehave;libraryieee;useieee.std_logic_l
164.all;instd_logic_vector15downto0;instd_ogic_vectorldownto0;instdjogic;outstd_logic_vector15downto0;endir;architecturebehaveofiris“实体的行为描述beginprocessclkresetbeginifreset=-O*then-RESET为低电平时寄存器清零q=”00X00000000000;elsifclkeventandelk=Tthen--时钟正跳变来临时caserecis翻译上表中的内容when10=q=mem_data;whenothers=null;endcase;endif;endprocess;endbehave;寄存器、寄存器组和寄存器的选择本实验中的寄存器都为16位,带有清零端和使能端,实际上在写VHDL程序时,通用寄存器以及AR、IR、PC使用的都是同一个模板按照我们的设计,通用寄存器共有16个,由指令的低8位的全部或其中的高4位或低4位来从寄存器组中选择源寄存器和目的寄存器安排寄存器选择器件reg_mux为组合逻辑器件,用于输出选定寄存器的内容另外,由控制逻辑给出I位控制信号reg_en控制是否对选中寄存器进行写操作,也须由寄存器选择器件给出对特定寄存器的写使能信号不然若由一个使能信号控制全部16个寄存器将对实际不参与写操作的寄存器造成不稳定的情况为了便于调试时查看寄存器内容,另外由外部输入选定寄存器读出其内容,其中读取通用寄存内容的工作也由这个器件完成由Quartus生成的.bsf图如下查看源文件1查看源文件2其VHDL语言的行为描述如下查看源文件1查看源文件2libraryieee;useieee.std_logic_l
164.all;entityregis一实体描述portd:instd_logic_vector15downto0;elkreseten:instdjogic;・・en来自控制信号q:outstd_logic_vcctor15downto0;endreg;architecturebehaveofregis一实体的彳j为描述beginprocessclkresetenbeginifreset=Xthen-RESET为低电平时寄存器清零q=0000000000000000;clsifclkcvcntandelk=1*then--时钟正跳变来临时ifen=!thenq=d;endif;endif;endprocess;endbehave;libraryieee;useieee.std_logic_
1164.all;entityreg_muxis--实体描述portrcg_0:instd_logic_vcctor15downto0;-16个通用寄存器数据输入reg_l:instd_logic_vector15downto0;rcg_2:instd_logic_vcctor15downto0;reg_3:instd_logic_vecor15downto0;reg_4:instd_logic_vector15downto0;reg_5:instd_logic_vector15downto0;reg_6:instd_logic_vector15downto0;reg_7:instd_Iogic_vcctor15downto0;reg_8:instd_logic_vector15downto0;reg_9:instd_logic_vcctor15downto0;reg_a:instd_Iogic_vecor15downto0;reg_b:instd_logic_vector15downto0;reg_c:instd_logic_vector15downto0;reg_d:instd_logic_vector15downto0;reg_e:instd_logic_vector15downto0;reg_f:instd_logic_vector15downto0;dest_rcg:instd_logic_vcctor3downto0;--选杼11的寄存器sour_reg:instd_logic_vector3downto0;--选择源寄存器reg_sei:instd_logic_vector3downto0;一外部选抒寄标器信号en:instdjogic;总使能信号en_0:outstd_logic;—16个通用寄而手器各|I的使能信号en_l:outstdjogic;en_2:outstdjogic;cn_3:outstd_logic;en_4:outstdjogic;en_5:outstd_logic;en_6:outstdjogic;en_7:outstdjogic;en_8:outstdjogic;en_9:outstdjogic;en_a:outstdjogic;en_b:outstdjogic;cn_c:outstdjogic;en_d:outstdjogic;cn_e:outstd_logic;en_f:outstdjogic;dr:outstd_logic_vector15downto0;”II的寄存器的输出数据sr:outstd_logic_vcctor15downto0;--源寄存器的输出数据reg_oul:outsd_logic_veclor15downto0;-输出到外部的寄存器数据endreg_mux;architecturebehaveofreg_muxis--实体的行为描述beginprocessdest_regsour_reg.reg_selreg_0reg_Lrcg_2rcg_3rcg_4rcg_5rcg_6reg_7reg_8reg_9reg_areg_b.rcg_creg_drcg_ercg_fcnvariabletemp:std_logic_vecor15downto0;begincasedest_regis选择信号与输出的-对应,使能信?具体化when0000=dr=rcg_0;temp:=0000000000000001;when”001”=〉dr=reg_l;temp:=0000000000000010;whenXl0=dr=reg_2;temp:=OOOOOOOOOOOOOIOO;when00il=dr=rcg_3;temp:=0000000X0001000;when”0100”dr=reg_4;temp:=0000000000010000;when01!=dr=reg_5;temp:=”00000000100000”;when”0110=dr=reg_6;temp:=X000XX100000;when”0111”dr=reg_7;temp:=0000000010000000;when1”=dr=reg_8;temp:=000001000000”;when1001=dr=rcg_9;temp:=”000001000000”;whenIO1O=dr=reg_a;temp:=0000010000000000;when1011dr=reg_b;temp:=0000100000000000;when”ll”=dr=reg_c;temp:=001000000000”;when”I1O1=dr=rcg_d;temp:=”0010000000000000”;when1110=dr=reg_e;temp:=0100000000000000;whendr=reg_f;temp:=”100000000000000”;endcase;ifen=Othentemp:=XMXXOX;endif;en_=tenipO;en_l=temp1;cn_2=tcnip2;en_3=temp3;en_4=temp4;en_5=temp5;en_6=temp6;en_7=temp7;en_8=temp8;cn_9=tcmp9;en_a=temp10;en_b=tenip11;en_c=temp12;en_d=temp13;en_e=temp14;en_f=temp15;casesour_regiswhen0000=sr=rcg_O;when”0001”=sr=rcg_l;whenXIO=sr=reg_2;when0011=sr=reg_3;when0100=sr=reg_4;when0101=sr=reg_5;when0110=sr=rcg_6;when0111=sr=rcg_7;when”IOOO”=sr=reg_8;whenIOO1=sr=reg_9;when”11”=sr=reg_a;whensr=reg_b;whenI100=sr=reg_c;when”1101”sr=reg_d;when1110=sr=rcg_e;whenIlli=sr=reg_f;endcase;casereg_seliswhenX=reg_out=reg_0;when0001=reg_out=reg_1;when0010=reg_oul=reg_2;when0011=reg_out=reg_3;when0100=reg_out=reg_4;when0101=rcg_out=rcg_5;when”0110=rcg_out=rcg_6;when0111=reg_out=reg_7;when1000=reg_out=reg_8;when1001=reg_oul=reg_9;when1010=reg_out=reg_a;when1011=rcg_out=rcg_b;when”IIOO=rcg_out=rcg_c;when”IIO1”=reg_out=reg_d;when1110=reg_out=reg_e;whenreg_out=reg_f;endcase;endprocess;endbehave;
(9)一位控制信号/WR控制对地址寄存器AR指定的内存地址进行何种操作低电平为写操作,高电平为读操作
(10)综上,在对指令寄存器中的指令进行译码后由控制逻辑产生了15位控制信号,共同控制着ALU和寄存器完成各种操作下表是各指令的具体控制信号值表中的17对应pc_en16对应reg_enI5I4I3对应alu_in_sehID节拍发生器时序逻辑器件,作用是用多位触发器的输出信号的不同组合状态,来标识每条指令的执行步骤其功能相当于一个状态机前文巳述,我们设计的节拍发生器共有3位触发器在编码方面,遵循了这样的原则从一个状态变到下一个状态时,状态发生变化的触发器数目应尽量少由Quarlus生成的.bsf图如下查看源文件:[timerI:elkoutput[
2..0]resetins
15..O].:inst36:.其VHDL语言的行为描述如下其看源文件libraryieee;useieee.std_logic_l
164.all;
1.引言
1.1实验目的与以往的CPU教学实验不同,这次的“开放式教学CUP设计与测试系统”中使用另外一个成品CUP专门运行监控程序,另外还能够将各种测试程序自动转换成用实骑者所设计的指令系统表示的目标代码,并且能够在实验装置上运行、调试和测试所生成的目标代码有了这样的改进,我们做实验就有了新的要求和任务学会使用先进的硬件设计工具和超大规模集成电路FPGA设计并实现一个CPU芯片要求采用先进的工具软件进行模拟和测试,测试通过后再下载到FPGA中制成CPU芯片在过程中需要掌握的主要就是CPU的设计、验证和测试方法,以及学会相关工具软件的使用方法
1.2国内外研究现状首先来说明一下CPU的发展史以及当代业界的主要成果CPU的诞生世界上第一台计算机“爱尼亚克”,有一间屋子那样大如图l-la那时还没有CPU这个概念图1-1a第一台计算机b第一个CPU芯片1971年11月,Intel推出世界上第一个CPU一一Intel4004芯片如图l-lb这一芯片有108千赫,在它3mmx4mm的掩模上,有2250个晶体管,每个晶体管的距离是10微米一一也就是说每个晶体管线条宽度只有一根头发的千分之一,每秒运算6万次个人电脑的芯处理器可用来完成较老和较大设备的计算任务,价格又便宜,这一优势很快被人们认识,于是各半导体公司竞相生产处理器芯片曾经名噪一时的Zilog公司生产了比Intel8080功能更为强大的Z80这是一块直到今天仍然被尊为“经典”的CPUo而在另一家大名鼎鼎的摩托罗拉公司,则诞生了6800从此拉开了摩托罗拉MC68XXX系列和IntelX86系列举世瞩目的竞争在6800系列中有一款entitytimeris--实体描述portelk:instd_logic;时钟reset:instd_logic;一复位ins:instd_logic_vector15downto0;output:outsld_logic_vector2downto0;endtinier;architecturebehaveoftimeristypestate_iypeiss0sls2s3s4s5;自定义类型表示各个状态signalstate:state_type;beginprocessclkresetinsbeginifreset=O*thenstate=sO;--初始状态elsifclkeventandclk-1thencasestateis--状态转换whens0=statc=s1;whensl=statc=s2;whens2=ifins15=0thenstate=s3;elsestate=s4;endif;whens3=state=s1;whens4=state=s5;whens5=stae=sI;endcase;endif;endprocess;processstate-各个状态下的输出begincasestateiswhens0=output=100;whens1=output=000;whens2=output=00r;whens3=output=OH;whens4=outputv=”101;whens5=outpul=111;endcase:endprocess;endbehave;
(12)控制逻辑组合逻辑器件,前面已提到,它根据指令内容(由IR提供)和指令的执行步骤(由节拍发生器提供)及其他一些条件信号(标志寄存器输出),形成并提供出计算机各部件当前时刻要用到的控制信号根据前面所总结的全部控制信号的意义、作用和数值,可以比较容易地写出控制逻辑部件由Quarlus生成的.bsf图如下查看源文件其VHDL语言的行为描述如下查看源文件libraryieee;useieee.std_logic_
1164.all;entitycontrollerisarchitecturebehaveofcontrollerisbeginprocesstimerinstructionczvsvariabletempItcmp2:std_logic_vcctor7downto0;variabletemp3temp4:std_logic_vector3downto0;variablealu_out_sel:std_logic_vcctor1downto0;beginforIin7downto0looptempiI:=instructionI+8;--所存指令高8位temp2⑴:instruction;“暂存指令低8位endloop;forIin3downto0looptcmp3I:=instructionI+4;“暂存低八位中的高四位temp4I:=instructionI;--暂存低八位中的低四位endloop;casetimeriswhen100=“初始状态dest_reg=0X0H;sour_reg=0000;offsctv=00000000;sciv=”00;sstv=ll”;alu_out_sel:=00n;alu_in_selv=”000”;alu_func=0X;wrv=T;recv=”0”;when”000“=-读取指令第一并Idest_reg=0000°;sour_regv=”00”;offsetv=”00000000;sciv=01;ssUll”;alu_out_sel:=10;alu_in_selv=”100”;alu_funcv=”000”;wrv=T;recv=”01;when•001=-读内存,放到指令寄存器dest_regv=”0000;sour_rcg=0000;offset=00000000•;sciv=00;ssiv=ll”;aki_out_sel:=00;alu_in_selv=”OOO”;alu_func=MOOO;wrv=T;recv=10;whenOir=--A组指令wrv=T;recv=”XT;casetempiiswhen”00000000”=dest_reg=temp3;sour_reg=temp4;offsetv=”000000”;sci=nOO;sstbOO”;alu_out_sel:=OI;alu_in_sel=OOO;alu_funcv=OO”;whenOOOOOOOl=-ADD-SUBdcst_rcg=tcnip3;sour_reg=temp4;offsetv=”00000000”;sciv=OO”;sst=HOO;alu_out_sel:=l”;alu_in_selv=”OOO;alu_funcv=l”;when0000010=dest_reg=temp3;sour_reg=temp4;offset=00000000;sciv=”OO”;sstv=”OO;alu_out_sel:=01;aiu_in_sel=OOOu;alu_func=u010;whenXXXir=-AND-CMPdest_reg=temp3;sour_rcg=tcmp4;offset=00000000;sci=00;sstv=”OO”;alu_out_sel:=00;alu_in_selv=”OOT;alu_func=OOr;when”0000100H=-XORdest_reg=temp3;sour_rcg=tcmp4;offset=OOOOOOOOn;sci=X;ssl=OOM;alu_out_sel:=01;alu_in_selv=000;alu_func=100;when”0000101”=-TESTdest_reg=temp3;sour_rcg=tcmp4;offset=00000000;sciv=”00”;ssl=Xn;alu_out_sel:=00;alu_in_selv=”00”;alu_funcv=010”;when0000110=-ORdest_reg=lemp3;sour_rcg=tcmp4;offset=0X0000;sci=00;sst=X;alu_out_sel:=MOr;alu_in_selv=000;alu_funcv=01l;when000001Hn=-MVRRdest_regv=temp3;sour_reg=temp4;offsctv=”000”;sciv=”0”;sst=ll;alu_out_sel:=01;alu_in_sel=001;alu_func=XX;when00001000=-DECdest_rcg=tcmp3;sour_reg=temp4;offsct=”000000”;sci=01;sst=OOH;alu_out_sel:=OI;alu_in_sel=010;alu_funcv=”Ol”;when00001001=dcst_rcg=tcmp3;sour_reg=temp4;offset=0XX0X;sciv=01;sstv=00”;alu_ou_sel:=01;alu_in_sel=010;alu_func=0M;when”00001010=dcst_rcg=tcmp3;sour_reg=temp4;offset=00000000;sci=00;sstv=”00”;alu_out_sel:=01;alu_in_sel=010;alu_func=10r;when00X1011=dest_rcg=tcmp3;sour_reg=temp4;offset=00000000;sciv=””;sst=n00;alu_out_sel:=01;alu_in_sel=010;alu_fiinc=l10;when”000011=dest_reg=temp3;sour_rcg=tcmp4;offset=00000000;sci=H10H;sslv=”00”;alu_out_sel:=01;alu_in_selv=”;alu_funcv=000”;when”000110l=dest_reg=temp3;sour_rcg=tcmp4;offset=OOOOOOOOn;sciv=10”;sslv=”00”;alu_out_sel:=01;-INC-SHL-SHR-ADC-SBBalu_in_sel=XOH;alu_func=001H;when”0100000”=-JRdest_reg=0000;sour_rcgv=”000”;offse«=temp2;sci=nOO;sst=HH;alu_out_sei:=10;alu_in_selv=”01]”;alu_func=000;when01000100=-JRCdest_reg=nOOOO;sour_rcg=0000;offse=emp2;sciv=”OO;sstv=”ll;alu_out_sel:=c0;aiu_in_sd=011;alu_funcv=”OO”;when01000101=-JRNCdes_reg=0000H;sour_reg=0000;offset=temp2;sci=00^;sst=ll”;alu_out_sel:=notc0;alu_in_sel=0H;alu_funcv=”00”;when01000110H=-JRZdcst_rcgv=0”;sour_reg=0000;offsct=tcmp2;sciv=”00”;sstv=ll;alu_out_sel:=z0”;alu_in_sel=011;alu_funcv=000”;when01000111=-JRNZdcst_rcg=0000;sour_reg=0000;offset=temp2;sci=00;sst=ll”;aclourserrAno-z印--0」aclmlseAH-o二--;aclfuncA=ooo-Lwhen=0一00000二HvLRSdcslrcgAHdooo--;sourLegcn-oooo--;offsaAHompISCAH=OO一-;SS-AH==;acloHlserrnsd=;a-ul-nlseAH-o一5aclfuncAH-oxr;when=0一0000---nVLRNSdeslrcgn=oooo=;sourlregAH-oooo--;offssAnompscAn=oo一一;ss-An=5aclou广scrrAno-s--0「ac—一FseAn-o二-a-ulfuncAndoo-Lwhen=0二二
000.-8;CLCdesfsourlregAndoo{二offse_AHomp2-#•scAn=oo=;ss-AHd二acloulserrH--oo-Lac」FseAH--000一.;a_ulfuncA4ooo.-;when=0二二0一0--HV;STCdeslregAn-oooo--;sourlrcgA==-oooo=;offsaAHtempJscAn=oo=;SSLA==O=;acloulserrH-oo--;acl-nlseAn--ooo:a一u」uncAndoo.=wheno-hersnvnu=endcase」when=o==v竺谦Q生ulfuncA
4.000-Lwrv=T;sstv=”ll”;dcst_rcg=tcmp3;sour_reg=temp4;offsetv=”00000000”;casetempiiswhen”10000000”|i0000001°=--读取双字指令的后sciv=01”;alu_out_sel:=10;alu_in_sel=IOO;rec=01n;when1000010H=-目的地址送地址寄存器sciv=”00;a【u_out_sel:=00”;alu_in_selv=”001”;recv=ll”;when10000011M=sci=00;alu_out_scl:=00;alu_in_sel=010;rec=ir;whenolhers=null;endcase;whenlir=一读写内存dest_reg=temp3;sour_reg=temp4;offset=00000000;sciv=0”;sstv=ll”;alu_func=”000”;rec=00;casetemp1iswhenH1000010|”10000001=alu_out_sel:=01;alujn_sel=ior;wrv=T;when10000000”=〉alu_out_sel:=H10;alu_in_scl=10r;wrv=T;when10000011H=alu_out_sel:=00;alu_in_selv=”001;wrv=O;whenothers=null;endcase;whenothcrs=null;endcase:en_reg=alu_oul_sel0;en_pc=alu_out_sel1;endprocess;endbehave;
(13)T3组合逻辑器件,作用相当于一个双向门,是为了解决数据总线的冲突问题设置的控制信号就是控制逻辑输出的读写控制信号wr进行读操作时输出高阻态,写操作时输出ALU的运算结果由Quartus生成的.bsf图如下查看源文件inst38其VHDL语言的行为描述如下查看源文件libraryieee;useieee.sd_logic_l
164.all;endt3;architecturebehaveoft3is“实体的彳j为描述beginprocesswralu_outbegincasewriswhcn*r=“读操作output=ZZZZZZZZZZZZZZZZ;--Z:highimpedanceopencircuitwhen0-oulput=alu_oul;endcase;endprocess;endbehave;MOS6502(如图1・2)值得一提一一它因为被著名的APPLEII个人电脑所采用而名扬四海图1-2MOS65021978年Intel推出世界上第一个16位数据同时工作的处理器一一8086它的最高主频速度达到8MHz、具有16位数据通道、内存寻址能力为1MB处理器性能有大幅提高仅仅一年后,Intel公司开发出了8088它幸运地在1981年被首次用于IBMPC机中,电脑开始走入了家庭个人电脑(PC)的概念也是从8088的问世而出现的1982年Intel在8086的基础上研制出了80286处理器,这个集成了大约130000个晶体管的处理器的最大速度为20MHz内、外部均采用16位工作,使用24位实现内存储器的寻址,内存寻址能力为16MB不久IBM公司将80286处理器用在先进技术微机即AT机中,引起了极大的轰动实际上这也是一块性能出众的芯片,它在支持更大的内存、能够模拟内存空间、能同时运行多个任务以及处理速度等4方面比它的前辈有显著的改进制造工艺的不断进步1971年问世的4004采用10微米技术,8080则采用6微米8086将之突破到3微米1985年,Intel的80386问世,3微米的记录成为了历史,新纪录是
1.5微米1989年4月,这个记录依然是Intel保持4861微米1990年6月,50M的486将纪录提高到了
0.8微米此后该记录沉睡了4年,直到1994年3月IntelDX4319微处理器将这一记录改写为
0.6微米此后IBM与Intel将竞争推向了白热化1995年,当Pentiuml33问世时,创造了
0.35微米的世界纪录,此后不甘示弱的IBM将记录提高到了
0.29微米,不过1997年Intel又扬眉吐气,记录被他们提高到
0.25微米如今
0.13微米的芯片已经开始制造,而Intel与IBM的竞争仍在继续RISE公司的CPU(图l-3(a))一一MP6在IntelPII时代昙花一现REG_OUT对外输出寄存器内容的译码电路,组合逻辑器件,根据外部输入的寄存器选择信号输出制定的寄存器内容(包括为了便于观察引出的内部信号寄存器)由Quartus生成的.bsf图如下查看源文件其VHDL语言的行为描述如下查看源文件libraryieee;useiccc.std_logic_l
164.all;entityreg_outis--实体描述portirpcreg_in:instd_logic_vector15downto0;offsetalu_aalu_b:instd_logic_vector15downto0;alu_outreg_testa:instd_logic_vector15downto0;reg_sel:instd_logic_vector3downto0;sei:instd_logic_vector1downto0;reg_data:outstd_logic_vector15downto0;endreg_out;architecturebehaveofreg_outisbeginprocessirpc.reg_inselreg_seloffsetalu_a.alu_balu_out.reg_testavariabletemp:std_logic_vector5downto0;begintemp:=seireg_sel:caseseiiswhen00=reg_data=reg_in;15号输出通用内容when”01=casercg_scliswhen0000”=-16号输出扩展后的ofTselreg_data=offset;when0001=--
17、18号输出alu的两个输入reg_data=alu_a;when”010=〉reg_data=alu_b;when0011=-19号输出alu的运算结果reg_data=alu_out;when0100=一2号输出特定寄存器rcg_tcsta的内容,包括•些内部信号reg_data=reg_testa:whenothers=reg_datav=0000000000000000”;“没有用到的寄存器置零防止妨碍观察endcase;whcnll=casereg_seliswhenill0°=-62号输出PCreg_data=pc;when-63号输出IRreg_data=ir;whenothers=rcg_datav=00000000”;endcase;whenothcrs=reg_dalav=000000000000000”;endcase;endprocess;endbehave;至此全部的功能部件都2实现,要做的是把它们正确连接起来在Quanus中可以为每一个功能部件现在是.vhd文件创建一个符号文件.bsf它可以自动根据功能部件的输入输出画出外观图,而屏蔽掉内部细节;然后新建一个BlockDiagramFile.bdf按照整个FPGA-CPU的结构图将各个部件的外观图摆上去,对应管脚连接起来,引出输入输出管脚最后根据使用的器件和前面画出的FPGA-CPU外观图指定管脚,通过编译就可以下载到芯片中了,当然在这之前还应当进行反复的模拟验证查看总设计图.bdf文件
2、软件模拟在指令集设计、逻辑设计和各个功能模块的VHDL语言程序编写的基础上应用软件进行FPGA-CPU的软件模拟,验证写出的模块和整个系统是否达到了设计预想主要进行了对时序部件的仿真模拟对组合逻辑器件,由于功能和使用的语句都比较简单,只是对程序本身进行了反复的检查,确保控制信号等与设计没有出入节拍发生器节拍发生器作为标记每条指令的执行步骤的器件,其功能相当于一个状态机,在特定的输入下转换到特定的次状态对我们的节拍设计可画出如下状态转换图:(输入为指令操作码的最高位)在周期1US的时钟作用下得到的模拟波形如下:AYunixig:Can*tfind,5dinvectorsourcefil«forinputpia|ti»tr|:nz[l]RVarnint-Cm*tfindinvectorsoireefileforinputpin|t»er|ns
[0]身Info:Sinulfttioncov«r«is9939%Info Nunberoftransitionsinsir*uL®tionis881♦Info QuartutIISimulatorwattucc«tsful0trrdrt15wtrninc*^lesstce0of25ForH9bpre»Fl|%I■|IdH—WM一勇整]|.应9幽
③»Ln|F VH15%jMxi...Irc ynis»6Ij调漩骨.doc•...||•Quartu^Il-eg..为采O名•否g]Iq£1^13昌.$.517:38
(2)标志寄存器:标志寄存器在控制信号SST控制下,输出或等于输入,或保持不变,或将C置I或置0且变化发生于时钟跳变的正边沿elkfly菖flyvflyxi3*«t寄存器组通用寄存器都为16位的寄存器,RESET信号为低电平时清零,时钟正跳变时接受输入数据将16个通用寄存器视为一组,由器件reg-mux在其中选择需要读写的寄存器,输出从这些寄存器读取的数据,并对要进行写操作的寄存器给出写使能信号书E»eEdR»ewo»ect^sujmertsPtocessJnglock颇lowHelp—~□W旨S电电9,,?商梅三|皿夕0国
⑥A寸惕►
⑨Quart.!l-c:/011596__new/db/cpu_part-cpi_part-[cpu_partSvnulationReport]ForHdppressFl|1%B■IIdU.NLW|域开蛤|||•
①|图等》]盘E011996瑚MJ...|SUSll泌|旦源M1Mx・..・||役Qw3】】y/
0...街亲命名・B8|4Cig国茵■也
5523、硬件调试在软件模拟结果基本正确后进行了硬件调试在这一阶段我们做的工作和遇到的问题有a)将实验箱连接到计算机,使用Quarlusll
4.1tools菜单中的programmer指令将工程中的.sof文件烧入到FPGA芯片中b)编写指令集的交叉汇编配置.文件(.cfg)在DebugController中设置该配置文件;这一步主要是根据各指令的编码和指令格式写一个文本文件供DebugController使用以方便调试时指令的输入仿照实验指导书中的样例可以很容易地编写出该文件,内容如下ADDdr.sr00000000[u4][u4]drsrSUBdrsrOOOOOOOl[u4][u4]”drsrANDdrsr00000010[u4][u4]\drsrCMPdrsr”0000011[u4][u4]”drsrXORdrsr00000100[u4][u4T\drsrTESTdrsr00000101[u4][u4]HdrsrORdrsr00000110[u4]|u4].drsrMVRRdrsr00000111[u4][u4]drsrDECdr0000l0X[u4]xxxxdrINCdr”00001001[u4]xxxx”drSHLdr”0001010[u4]xxxx”drSHRdr”00001011[u4]xxxx”drADCdrsr”000011[u4][u4]”drsrSBBdrsr00001101[u4][u4]”drsrJRaddr0100XX
[8]addr-@-lJRCaddr”01000100
[8]”addr-@-IJRNCaddrM01000101
[8]addr-@-lJRZaddr01000110
[8]addr-@・lJRNZaddr0100011l
[8]”addr-@・lJRSaddr”010000l[8「addr-@-lJRNSaddr01000011
[8]addr-@・lCLC.”0111100000000000“STC.0111101000000000JMPAaddr1000000000000000[u16]addrLDRRdrsr10000010[u4][u4]drsrSTRRdrsr”10000011[u4][u4]”drsrMVRDdrdata”1000000l[u4]xxxx[u16]”drdataR0=0R1=1R2=2R3=3R4=4R5=5R6=6R7=7查看源文件在DebugController的汇编代码编辑窗口中使用配置文件中指定的指令名编写指令代码,通过交叉汇编生成二进制代码然后将调试模式设置为单片机控制RAM模式0100将二进制代码写入到内存中可通过读取指定地址的内容检查写入操作是否成功将FPGA-CPU置为调试运行模式1011由PC控制单片机向CPU发送时钟,通过观察通用寄存器数据的变化完成对CPU的调试由于指令运行只用到32个寄存器中的16个,为了观察内部信号的情况,将部分比较重要的内部信号,如节拍,部分控制信号,ALU的输入输出等,也作为通用寄存器的内容引出以方便观察这里对原设计中的REG.SEL器件做了一定改动,将要观察的内部信号引入该器件,增加选择的情况,完成这些信号的输出调试时遇到的第一个问题是全部寄存器输出恒为零后发现RESET信号管脚1083正常时为高电平,按下CPU_RST键时才为低电平由于没有仔细阅读实验指导书,在编写程序的时候弄反了D修改了RESET信号后,发现数据总线的内容不能正确读入,且数据总线的指示灯亮度不正常,用万用表测量发现电压为
1.7V左右后向助教询问,发现是没有控制数据总线的数据流向以致发生了冲突由于数据总线承载了从内存读出和向内存写入两方向的数据,不能将发送到指令寄存器等的读入线和ALU的运算结果输出线直接和数据总线线与起来,而必须通过读写信号(WR)的控制在必要时将输出线置为高阻态(相当于开路)修改时加入了新器件T3其输入包括读写信号(WR)和ALU的输出当WR为高电平即读入数据时,T3输出为高阻态当WR为低电平即写出数据时,T3输出即为ALU输出将T3的输出与数据总线与起来,就可以实现一个双向门的作用了示意图如下g)在单步运行指令的时候发现RESET后有些内部信号异常,时对时错,导致PC乱跳,指令的运行结果也是时对时错对出现异常的内部信号进行分析后确定是RESET操作进行得不完全在原设计中,RESET信号来临时做的工作是全部寄存器清零,节拍发生器回到SO状态,输出为100但是在编写控制器(Controller)时我们忽略了节拍输入为10()的情况,误认为只要全部寄存器清零就完成了系统的复位,而把100只简单地归入了CASE语句中OTHERS的情况(后面只跟空语句NULL)同时在软件上对控制器进行模拟时结果也忽略了RESET时的情况;这才导致了指令运行时对时错的结果修改时在控制器CASETIMERIS后面加入了WHEN“100”=>这种情况,并对控制信号一一给出了确定值,重新烧片后RESET的结果和指令运行的情况就都变得稳定Toh)在验证B组指令(取指后要进行一次内存读写操作)时发现了一个时序配合上的问题在设计指令系统时,我们对AB组指令的操作码最高位进行了区分,A组指令操作码以()开头,B组则以1开头,以便于对节拍发生器状态转换进行控制但是在设计时误将指令寄存器的最高位输出作为了节拍发生器的输入,导致节拍发生器对控制器的输出滞后了一个时钟周期在测试A组指令时,IR的最高位一直为(),无法测出这个错误;但是在测B组指令时这个错误就很容易发现了只要将数据总线直接送入节拍发生器的输入就可以解决这个问题了i)对连续较多条指令的测试可采取预设置断点的方法;单片机将向FPGA-CPU发送连续的时钟信号,直到检测到FPGA-CPU的PC值与所设断点相同为止需要注意的是,如果将断点设在要执行的指令序列的最后一条指令处,则在FPGA-CPU的PC值与断点相同时最后•条指令还未执行,这将导致从数据窗口获得的数据与预期的不一致因此需要在待测试的程序后加入若干无实际意义的语句,比如MVRRR
0.R0等,然后将断点设在这些语句处以上就是我们调试的全过程,应该说还是比较顺利的出现的问题基本都源自设计和编写程序时的考虑不周,芯片等硬件没有出现任何问题体会就是多注意对硬件的观察,比如观察指示灯,测量电压等都是很有效的发现问题的方法
3.测试报告
3.1测试程序除了逐一对各条指令进行测试外程序1INCROSHLROINCRlADDR1ROORR1ROLI:SHRR1JRNCL1CLCMVRRRLROCMPROR1JRNZL1JMPAO经验证CPU的运行结果都是正确的9月1日晚公布了测试程序后,我们按照自己的指令系统对程序进行了修改,并在机器上分别运行成功了其中第三个测试程序耗时较长,大约用了
3、4分钟查看修改后的测试程序测试程序1测试程序2测试程序3按照检查实验的要求,我们根据本机设计中跳转语句较多的特点设计了含有二重循环的冒泡排序算法,对6个数进行从小到大的排序运行的结果正确且速度较快冒泡排序算法程序如下3个测试程序和自编的冒泡排序程序都通过了设置断点和使用单片机晶振产生高频率时钟两种环境的测试,结果都是正确的测试程序1的运行结果是在寄存器R2中存放了两数的乘积;测试程序2的运行结果是在指定的内存地址写入了相应数据;测试程序3的运行结果是在一段连续的内存中存入了0〜64的质数;冒泡排序的结果是将给出的无序的6个数进行了升序排列并写入原数据的地址
3.3性能分析其中第三个测试程序用时较长,分析原因,应当是其中使用了相当多读写内存的指令,而在我们的设计中,读写内存属于B组指令,需要比A组指令多使用一个节拍才能完成同时我们无流水的设计也决定了CPU运行的速度比起指令执行带有流水设计的CPU要慢很多
4.总结
4.1实验总结如前所述,在本实验中我们主要采用的方法是理清要做的全部工作,将它们划分成几个阶段,明确各个阶段要完成的工作和要实现的目标,在各个阶段都尽量保证工作的正确性;遵循的顺序是,先设计后实现,先整体后局部,文档和设计及实现并行改进的方向我想应该是在软件模拟完毕甚至是硬件调试完毕后再增加一个设计或实现优化的环节,使实验者在初步达到预期目的时再进一步多想些问题,尽快发现自己前面工作中的不足之处比如我们在写VHDL程序时就是以编译通过和便于画图为目标的,在很多地方都不够节俭和经济,如果在程序编写时或是模拟时多考虑一下线路的复杂性,那么最后芯片的资源占用率可能就不是现在的结果了
4.2取得的收获这次实验的规模、难度、开放性、持续时间、学分等等,在本科这几年中都应该算是前所未有的3个多星期下来,收获是多方面的,而同时,遗憾也是相当多的首先,本次实验对我们来说是比较大型的,它培养了我们的科学工作作风,教给我们科IDT的CPU名叫WINCHIP图l-3b可惜在芯片CHIP领域,IDT难以取胜WIN1985年10月17日问世的80386时钟频率到达33MHz成为全32位微处理器芯片的最杰出代表,它也是X86家族中第一款32位芯片而在当时与之抗衡的是摩托罗拉的MC680301989年,经过四年开发和3亿美元资金投入的Intel80486推出这款芯片在当时引起了极大的轰动,其伟大之处就在于它突破了100万个晶体管的界限80486的性能比带有80387数学协处理器的80386DX提高了4倍Pentium的时代1993年,全面超越486的新一代586CPU问世,为了摆脱486时代处理器名称混乱的困扰,Intel公司把自己的新一代产品命名为PentiumPentium以区别AMD和Cyrix的产品AMD和Cyrix也分别推出了K5和6x86处理器来对付芯片巨人,但是由于Pentium处理器的性能最佳,Intel逐渐占据了大部分市场1997年,Intel推出了包含750万个晶体管的Pentiumll处理器这款新产品集成了IntelMMX媒体增强技术,专门为高效处理视频、音频和图形数据而设计公众对Pentiumll处理器以及针对具体市场细分推出的不同型号处理器反响强烈到九十年代末,互联网已经成为电脑发展的主要驱动力量,Intel也充分认识到这一点1999年春季,Intel推出了Pentiums处理器,它带来的最重要的技术创新之一是互联网SSE指令集StreamingSIMDExtensions数据流、单指令多数据、扩展指令集,芯片具有70条SSE指令,极大地提升了电脑在高级图形、三维动画、数据流音频、视频、语音识别应用等方面的性能1999年秋季面市的新款Pentiumlll处理器系列产品采用了更先进的
0.18微米工艺技术,取代了原有的
0.25微米技术,体积更小、耗能更低而性能更强学的工作方法,帮助我们学会化繁为简,学会管理好和高效利用我们的时间我的体会是,一定要在实验伊始制定出比较详尽的进度安排,想清楚什么时间应该做好什么工作,不能太急于求成而忽略一些潜在的问题,也不能拖拖拉拉浪费时间而且在实验这段时间内最好集中全部精力做实验,不做的时候尽量不要花太多心思在其他事情上面,保持思路和状态,对实验的进程会大有好处另外,这次实验对磨练意志也是有相当作用的从开始的无从卜•手设计细节的繁琐乏味,到调试阶段的心急如焚,整个过程都需要实验者的耐心和信心可以说,没有意志和周围同学的鼓励、老师的帮助指导我们是很难完成这个实验的其次,这次实验的开放性给了我们充分发挥的空间,同时也给了我们很多决策的艰难一块现场可编程芯片,任你去写,这就不用于以往大家作出的东西都差不多的情况好的设计和不好的设计就会有天壤之别在这一环节上我们留下了很多遗憾由于担心完不成任务我们没有选择指令流水,而只是设计了一个结构最基本最简单的CPU而旦很多地方明显带有TEC2000的影子虽然由于硬件限制更小而比TEC2000结构更为合理,但我们的设计毕竟脱胎于TEC2000没有太多自己创新的东西实际上在设计的时候我也找了很多书看对各种设计都有所了解,也花了很多时间,但是最后还是没有选择挑战自己,而满足于•个很低级的设计这是自己缺乏自信所致而后来的实驼过程证明,只要努力,我们还是有能力完成一个更好的设计的(我们的模拟调试速度是很快的)这不能不说是我们本次专业时间以至本科阶段的一个遗憾最后,在设计阶段,我们查阅了很多资料,这其中既包括以前的课本,如计算机组成原理、数字电路设计、汇编语言程序设计等,还包括下个学期的课本,计算机体系结构,也包括了一些图书馆查阅的其他资料,这不仅使我们复习了以前所学的知识,同时开阔了我们的眼界,让我们对CPU的设计这-•领域有了更多的了解而逻辑设计的实现,包括VHDL程序的编写,软件模拟等,就犹如是乂做了一个EDA课的实验,既巩固了上学期学的内容,又增加了实践经验,还有对测试程序的编写和阅读,对我们的汇编水平也很有好处另外Quartus软件我们都是第一次用到,也算是又多掌握了一种软件的大致使用方法,虽然它的更多强大功能还不为我们所知还有硬件调试阶段,止我们通过观察去更多地动手动脑,锻炼了实际解决问题的能力总之,只要认真去做,每个阶段都会有不同的收获,每天都会有不同的收获我想在以后的实验中,我们应该学会更正确地评价实验,评价自己,争取少一些遗憾,多一些收获
4.3意见与建议在本实验的硬件调试过程中,软件DcbugControllcr我们提供了很大的方便但是这个软件还存在一些问题,比如运行不够稳定,有时单步运行结果正确,连续则不正确;另外在对伪汇编代码进行编译时,对一些错误的代码不能报错,而是自己忽略掉该条语句,导致测试者不能及时发现程序中的问题,影响了对CPU问题的发现这一点有待改进
5.参考文献[!].JohnP.Uycmura数字系统设计入门教程一一集成方法(英文影印版)北京科学出版社,
2002.王诚计算机组成与设计北京清华大学出版社,
2002.王诚刘卫东董长洪计算机组成与设计实验指导北京清华大学出版社,
2002.郑纬民汤志忠计算机体系结构北京清华大学出版社,199815].沈美明温冬婵IBM-PC汇编语言程序设计北京清华大学出版社,
20016.附录
6.1附录A组员分工柏青所有逻辑部件的编写,软件模拟,部分硬件调试,实验报告相关内容;霍明宇设计指令系统,部分硬件调试,实验报告相关内容,答辩的PPT
6.2附录B程序或硬件说明(可选)本实验所使用的FPGA器件为EP1K100QC208-3共有208个管脚,除少部分指定为时钟、复位信号等,其他可任意指定的管脚有147个其中最多可容纳4992个逻辑元件,记忆模块49152个程序的说明和注释请见前文VHDL语言的语法比较简单,在编写时主要需要弄清行为描述、结构描述、进程等几个概念,知道哪些语句是顺序执行的(进程内),哪些是并行执行的(CASE语句等),以及信号和变量的声明范围(前者用于结构体内,后者用于进程内)在编程方面,要注意CASE语句中未定义的那些情况,要在最后加上whenolhers=>语句加以概括,里面尽量不要写空语句null防止发生•些意想不到的情况,最好是给输出赋适当值,而空语句用在输出保持不变的情况需要说明的是,在程序的编写过程中,我们参考了Quartus提供的VHDL帮助,并使用了里面状态机和寄存器的模版对于对VHDL不是很熟悉的人来说,它们提供了很大的方便微处理器的发展史还远未结束,2000年11月,容纳4200万个晶体管的Pentium4处理器(图1-4)的诞生,其卓越的创新使处理器技术跨入了第7代就处理器的核心架构技术而言,其中的第6代架构(简称P6架构)是从高能Pentium处理器(PentiumPro)开始,以后的Pentiumll处理器、Pentiumlll处理器以及AMD的Athlon处理器系列都属于P6架构的产品而Pentium4处理器则是采用了全新的第7代架构(NetBurst微处理器体系架构),开创了处理器发展史上的一个新时期它最重要的优势在于突破主频提升的瓶颈,使得Pentium4可以利用现有的制造工艺达到更高的频率而且因为采用新的算法,Pentium4的分支预测准确率比Pentiumlll提高了约33%图1-4IntelPentium4处理器Intel之外除了我们耳熟能详的Intel系列CPU还有一些著名的CPU只是由于并非应用于PC领域而较少被大众关注多年以来,处理器领域一直存在着CISC和RISC两大阵营,CISC架构的处理器占据着PC市场,Intel是主角,AMD和VIA(收购了Cyrix)紧随其后;高端服务器的企业级运算市场则是RISC架构处理器的天下RISC因为采用数量较少、相对简单的定长指令,使得它执行命令灵活,速度很快,但价格昂贵比较有名的是HP的PA—
8900、SGI的R12000A和SUNMicrosystem公司的UltraSPARC等尤其值得-提的是摩托罗拉和苹果、IBM-起开发了PowerPCG
3.G4应用于苹果MAC机中,在出版印刷领域占很大部分市场再来介绍一下国内的发展情况以CPU为代表的超大规模集成电路设计和与以操作系统为代表的软件技术是信息产业的两大核心技术,中国在这两个核心技术上,远远落后于世界先进水平,但是随着中国正在取得突飞猛进的发展在最近两年多的时间里,国产CPU发展速度十分迅速,2001年3月,中星微公司开发出星光1号;7月,方舟公司的方舟1号〃嵌入式CPU问世;2002年9月,中科院计算所研制出我国首款通用高性能CPU龙芯1号;11月,上海复旦微电子公司推出高性能嵌入式32位微处理神威1号”;12月,北京众志〃通过验收;2003年2月,上海交通大学的汉芯1号〃面世2003年9月,我们清华大学的CPUThump也研制成功了目前国内CPU方面的发展十分迅速,相关技术人才也在积累,但是要实现这个目标仍然十分艰辛
1.3实验环境牛QuartusII
4.1完成指令集设计、逻辑设计后,用于各个功能模块的vhdl语言程序编写、编译以及FPGA-CPU的软件模拟DebugController用于软件模拟成功后的硬件调试硬件FPGAFieldProgrammableGateArray即现场可编程门阵列FPGA具有掩膜可编程门阵列的通用结构,它由逻辑功能块排成阵列组成,并由可编程互联资源连接这些逻辑功能块来实现不同的设计
1.4主要成果因为我们组的两个人硬件都不是很强,时间也不太充足,所以没有做流水线以及Cache的工作,最终的成品CPU芯片的主频是
15.3MHzFPGA器件的资源占用率为28%
2.设计报告
2.1实验方法本实验要完成的工作主要包括指令系统的设计,FPGA-CPU的整体结构设计及其细化,逻辑设计的具体实现VHDL语言程序的编写,软件模拟,以及硬件调试这几部分的工作之间是先行后续的关系,也就是只有前一个步骤完成了下一个步骤才可以开始进行,不存在并行完成的情况实验主要流程如下图所示其中指令系统和逻辑结构的设计主要参考了附录所列的文献主要的方法是先确定CPU所要实现的功能,根据寄存器等的情况划分指令格式,然后根据功能写出指令,根据不同指令的特点将它们分组并确定操作码;接下来设想每条指令的执行过程,需要哪些硬件支持最后确定整个CPU的逻辑结构图在各个功能模块的实现中主要使用了白底向上的设计方法先实现寄存器,再实现寄存器组,等等,最后将各个器件和模块之间互连,得到顶层设计图要注意的是,根据各个信号所对应的管脚可以画出如下的FPGA-CPU顶视图OUT(送往地址总线)查看源文件可以看出在这个顶层模型中有一些信号并不是CPU本身必须的,比如寄存器选择信号主要是为调试和检查服务的为此还需要在设计中加入•些译码电路以输出各个通用寄存器和指令寄存器等的内容从这个角度说,在设计中还使用了自顶向下的方法软件模拟和硬件调试并无太多方法可言,主要是仔细观察和全面考虑,把各种可能性都验证到
2.2总体说明1指令系统计算机的指令是用户使用计算机与计算机本身运行的最小功能单位一台计算机支持的全部指令就构成该机的指令系统从计算机本身的组成看,指令系统直接与计算机系统的性能和硬件结构的复杂程度等密切相关,它是CPU设计的起始点和基本依据设计指令系统的核心问题是选定指令的格式和功能具体到我们的设计来说,指令的功能应该包括简单的算术和逻辑运算,移位操作,数据传送,跳转,读写内存,另外还可能包括一些其他功能如置条件码等为了指令的规整性和便于译码,我们主要采用了定长的操作码组织方案,操作码只分8位和16位两种寻址方式包括了寄存器寻址、立即数寻址、直接地址和相对寻址
(1)指令格式分类(按指令字长和操作数不同)单字单操作数指令OPCODEDEST_REG000OPCODEOFFSET包括DECINCSHLSHRJR.JRCJRNCJRZJRNZ.JRS.JRNS单字双操作数指令OPCODEDEST_REGSOUR.REG包括ADDSUBANDCMPXORTESTORMVRRADCSBBLDRRSTRR单字无操作数指令OPCODE00000000包括CLCSTC双字单操作数指令OPCODE00X000ADR包括JMPA双字双操作数指令1587430指令格式汇编语句操作数个数CZVS指令类型功能说明00000000DRSRADDDRSR2DR-DR+SR00000001DRSRSUBDRSR2****DR-DR-SR00000010DRSRANDDRSR2DR-DRandSR00000011DRSRCMPDRSR2DR-SR00000100DRSRXORDRSR2****ADR-DRxorSR00000101DRSRTESTDRSR2★***DRandSR00000110DRSRORDRSR2*♦**DR-DRorSR00000111DRSRMVRR2・・・・组DR-SR00001000DR0000DECDR1DR-DR-100001001DR0000INCDR1DR-DR+100001010DR0000SHLDR1*指DRC-DR*200001011DR0000SHRDR1*DRC-DR/200001100DRSRADCDRSR2DR-DR+SR+C00001101DRSRSBBDRSR2****令DR-DR-SR-C010000000FFSETJRADR1无条件跳转010001000FFSETJRCADR1C=1时跳转01000101OFFSETJRNCADR1c=o时跳转010001100FFSETJRZADR1Z=1时跳转01000111OFFSETJRNZADR1z=o时跳转01000001OFFSETJRSADR1S=1时跳转01000011OFFSETJRNSADR1s=o时跳转011110000000000CLC
00...c=o011110100000000STC
01...C=11000000000000000ADRJMPAADR1・・・・B无条件跳转到ADR1000001ODRSRLDRRDR[SR]2组DR-[SR]10000011DRSRSTRR[DR]SR2・・・・指[DR]-SR10000001DR0000MVRDDRDATA2・・・・令DR-DATA121110功能00A+B+Cin001A-B-Cin010A与BOilA或B100A异或B101B左移110B右移jaluJcinalu_out[
15..0]3lU_3[
15..0]calu_b[
15..O]z3lu_func[
2..O]VsT\inst3I5I4I3ALUAALUB000SRDR001SR00100DROilOFFSETPC1000PClOl0DATA:bus_muxalujn_sel[
2..O]alu_sr[
15..O]d3ta[
15..O]alu_dr[
15..O]pc[
15..O]offset[
15..0]q.KClrsri
15..O]:sIdr
15..O]rr;inst3SCICin00001110FLAGCSSTczVs00接受ALU的运算结果10zVs101zVs11czVsifla-sst[
1..O]flag_ckc伯於kflag_s卜TselkHreset__lREC操作00无操作01AR接收PC11AR接收ALU输出10IR接收节拍指令编码SciSST1716151413I2I1I0/WKREC注释000011110100000101AR-PCPCCPC+l0010011000000001101R-MEM011ADD00000000000001000000100DR-DR+SRSUB00000001000001000001100DR-DR-SRAND00000010000001000010100DR-DRandSRCMP00000011000000000001100DR-SRXOR00000100000001000100100DR-DRxorSRTEST00000101000000000010100DRandSR节拍指令编码SciSST1716I5I4I3I2I1I0/WRREC注释OR00000110000001000011100DR-DRorSRMVRR00000111001101001000100DR-SRDEC00001000010001010001100DR-DR-1INC00001001010001010000100DR-DR+1SHL00001010000001010101100DRC-DR*2SHR00001011000001010110100DRC-DR/2ADC00001100100001000000100DR-DR+SR+CSBB00001101100001000001100DR-DR-SR-CJR01000000001110011000100PCCOFFSET+PCJRC010001000011co011000100PC—OFFSET+PCJRNC010001010011/co011000100PCCOFFSET+PCJRZ010001100011zo011000100PCGOFFSET+PCJRNZ010001110011/zo011000100PCCOFFSET+PCJRS010000010011so011000100PC-OFFSET+PCJRNS010000110011/so011000100PCX-OFFSET+PCCLC01111000000100000000100C=0STC01111010001000000000100C=1101JMPA10000000011110100000101AR-PCPC-PC+1MVRD10000001011110100000101AR-PCPC-PC+1LDRR10000010001100001000111AR-SRSTRR10000011001100010000111AR-DR111JMPA10000000001110101000100PC-MEMMVRD10000001001101101000100DR-MEMLDRR10000010001101101000100DR-MEMSTRR10000011001100001000000MEM-SRporttimer:instd_logic_vector2downto0;--H•拍instruction:czvs:dest_regsour_reg:instd_logic_vector15downto0;--指令内容instd_Iogic;--标志位outstd_logic_vector3downto0;--目的和源寄存器的选择信号offset:outstd_logic_vector7downto0;-偏移地址sslscirec:alu_funcalu_in_scl:en_regen_pcwr:endcontroller;outstd_logic_vector1downto0;--输出各个控制信号outstd_logic_vcctor2downto0;oulstdjogic;jreg^outIir[
15..O]reg_data[
15..0Jpc
15..O]reg_in[
15..D]■MHoffset[
15..0]alu_a[
15..O]alu_b[
15..O]3lU_OUt[
15..0]regjesta[
15..D]neg_seip..O]sei[
1.0]!inst40\SX,Info.R*jnr»r»cQuortusIISiviuLatorJ2I知Info•©Info ffl心Inf«Csssd.qu«rtus_sif—inport_s«ttincs.fsl«z3oxi—export.Siftul*tioncoveris
91.67%Nunbaroftransitionsin309Quartux11S«ul«tor«uec«*t£ul0«rrors0warms«ttixu z_fil«s8offcpu_prt-ccpu_p*rt\Srrtem入Prwegn^/Mess«c«0of10金Y[—[LocateJForHe4ppressFtIVDTTIdle|NUM©
①S3铮》|_jF2ii5%_debuoiti-...|_yc yni596|^JillWMLdoc•11QQuartusH-c/0H5%...4
⑤553】MVRDROOxFF;源地址MVRDRLOxlFF;目的地址MVRRR3ROMVRRR4R1MVRDR25STRRR3R2;r2数据r3地址STRRR4R2INCR3INCR4MVRDSTRRSTRRINCINCR23R3R2R4R2R3R4;r2数据r3地址MVRDR22STRRR3R2;r2数据r3地址STRRR
4.R2INCR3INCR4MVRDR2JSTRRR3R2;r2数据r3地址STRRR4R2INCR3INCR4MVRDR26STRRR3R2;r2数据r3地址STRRR4R2INCR3INCR4MVRDR24STRRR
3.R2:r2数据r3地址STRRR4R2MVRRR
6.R4INCR1MVRRR
7.R1DECR1BUB:;外层循环MVRRR4R1LOOP:;内层循环LDRRR8R4INCR4LDRRR9R4CMPR8R9JRSCHECKSTRRR4R8;数据位置交换DECR4STRRR4R9INCR4CHECK:CMPR4R6JRNZLOOPDECR6CMPR6R7JRNSBUBMVRRR
5.R5MVRRR5R51:JRIB
3.2测试结果1587430158743015874301587430。