版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机组成原理-实验四-寄存器堆设计实验实验内容与原理:CPU内部通常包含若⼲个通⽤寄存器,以暂存参加运算的数据和中间结果。寄存器速度快,个数少,但是RISCCPU的设计强调设置⼤量的寄存器。例如,Intel80x86系列CPU中只有8个寄存器,⽽SPARCRISCCPU中却有120个寄存器。MISPCPU中有32个32位的寄存器堆。所谓寄存器堆,就是⼀个寄存器的集合,为⽅便访问其中的寄存器,对寄存器堆中的寄存器进⾏统⼀编码,称为寄存器号或者寄存器地址,每个寄存器均通过制定寄存器好进⾏访问。本实验要求设计⼀个32*32位的寄存器堆,即含有32个寄存器,每个寄存器32位。该寄存器堆有2个读端⼝、1个写端⼝,即能够同时读出2个寄存器的值,写⼊1个寄存器。读操作不需要时钟控制,写操作需要在上跳沿才能写⼊。其他具体实验内容参考计算机组成原理实验指导书。程序模块结构图:ALU运算器模块代码:`timescale1ns/1ps//ALU模块moduleALU(OP,A,B,F,ZF,CF,OF,SF,PF);parameterSIZE=32;//运算位数input[3:0]OP;//运算操作input[SIZE:1]A;//左运算数input[SIZE:1]B;//右运算数output[SIZE:1]F;//运算结果outputZF,//0标志位,运算结果为0(全零)则置1,否则置0CF,//进借位标志位,取最⾼位进位C,加法时C=1则CF=1表⽰有进位,减法时C=0则CF=1表⽰有借位OF,//溢出标志位,对有符号数运算有意义,溢出则OF=1,否则为0SF,//符号标志位,与F的最⾼位相同PF;//奇偶标志位,F有奇数个1,则PF=1,否则为0reg[SIZE:1]F;regC,ZF,CF,OF,SF,PF;//C为最⾼位进位always@(*)beginC=0;case(OP)4'b0000:beginF=A&B;end//按位与4'b0001:beginF=A|B;end//按位或4'b0010:beginF=A^B;end//按位异或4'b0011:beginF=~(A|B);end//按位或⾮4'b0100:begin{C,F}=A+B;end//加法4'b0101:begin{C,F}=A-B;end//减法4'b0110:beginF=A<B;end//A<B则F=1,否则F=04'b0111:beginF=B<<A;end//将B左移A位endcaseZF=F==0;//F全为0,则ZF=1CF=C;//进位借位标志OF=A[SIZE]^B[SIZE]^F[SIZE]^C;//溢出标志公式SF=F[SIZE];//符号标志,取F的最⾼位PF=~^F;//奇偶标志,F有奇数个1,则F=1;偶数个1,则F=0endendmodule寄存器堆模块代码:`timescale1ns/1ps//寄存器堆模块moduleRegFile(Clk,Clr,Write_Reg,R_Addr_A,R_Addr_B,W_Addr,W_Data,R_Data_A,R_Data_B);parameterADDR=5;//寄存器编码/地址位宽parameterNUMB=1<<ADDR;//寄存器个数parameterSIZE=32;//寄存器数据位宽inputClk;//写⼊时钟信号inputClr;//清零信号inputWrite_Reg;//写控制信号input[ADDR:1]R_Addr_A;//A端⼝读寄存器地址input[ADDR:1]R_Addr_B;//B端⼝读寄存器地址input[ADDR:1]W_Addr;//写寄存器地址input[SIZE:1]W_Data;//写⼊数据output[SIZE:1]R_Data_A;//A端⼝读出数据output[SIZE:1]R_Data_B;//B端⼝读出数据reg[SIZE:1]REG_Files[0:NUMB-1];//寄存器堆本体integeri;//⽤于遍历NUMB个寄存器initial//初始化NUMB个寄存器,全为0for(i=0;i<NUMB;i=i+1)REG_Files[i]<=0;always@(posedgeClkorposedgeClr)//时钟信号或清零信号上升沿beginif(Clr)//清零for(i=0;i<NUMB;i=i+1)REG_Files[i]<=0;else//不清零,检测写控制,⾼电平则写⼊寄存器if(Write_Reg)REG_Files[W_Addr]<=W_Data;end//读操作没有使能或时钟信号控制,使⽤数据流建模(组合逻辑电路,读不需要时钟控制)assignR_Data_A=REG_Files[R_Addr_A];assignR_Data_B=REG_Files[R_Addr_B];endmodule顶层综合模块:`timescale1ns/1ps//寄存器堆+ALU组合模块moduleRF_ALU(Clk,Clr,Write_Reg,Write_Select,//控制信号R_Addr_A,R_Addr_B,W_Addr,//读写地址Input_Data,R_Data_A,R_Data_B,//数据IOOP,ZF,CF,OF,SF,PF,F//ALU运算);parameterADDR=5;//地址位宽parameterSIZE=32;//数据位宽//寄存器堆inputClk,Clr;//写⼊时钟信号,清零信号inputWrite_Reg;//写控制信号input[ADDR:1]R_Addr_A;//A读端⼝寄存器地址input[ADDR:1]R_Addr_B;//B读端⼝寄存器地址input[ADDR:1]W_Addr;//写寄存器地址input[SIZE:1]Input_Data;//外部输⼊数据output[SIZE:1]R_Data_A;//A端⼝读出数据output[SIZE:1]R_Data_B;//B端⼝读出数据//ALUinput[3:0]OP;//运算符编码outputZF,//零标志CF,//进借位标志(只对⽆符号数运算有意义)OF,//溢出标志(只对有符号数运算有意义)SF,//符号标志(只对有符号数运算有意义)PF;//奇偶标志output[SIZE:1]F;//运算结果FinputWrite_Select;//写⼊数据选择信号wire[SIZE:1]ALU_F;//ALU运算结果中间变量wire[SIZE:1]W_Data;//写⼊数据//Write_Select⾼电平则写外部输⼊,否则写运算结果assignW_Data=Write_Select?Input_Data:ALU_F;assignF=ALU_F;//输出运算结果F//实例化寄存器堆模块RegFileRF_Test(//输⼊.Clk(Clk),//时钟信号.Clr(Clr),//清零信号.Write_Reg(Write_Reg),//写⼊控制.R_Addr_A(R_Addr_A),//A端⼝读地址.R_Addr_B(R_Addr_B),//B端⼝读地址.W_Addr(W_Addr),//写⼊地址.W_Data(W_Data),//写⼊数据,由外部或ALU输⼊//输出.R_Data_A(R_Data_A),//A端⼝读出数据.R_Data_B(R_Data_B)//B端⼝读出数据);//实例化ALU模块ALUALU_Test(//输⼊.OP(OP),//运算符.A(R_Data_A),//从寄存器读A操作数.B(R_Data_B),//从寄存器读B操作数.F(ALU_F),//ALU_F作为中间变量暂存运算结果,与Input_Data选择输⼊寄存器//输出.ZF(ZF),//零标志.CF(CF),//进借位标志(只对⽆符号数运算有意义).OF(OF),//溢出标志(只对有符号数运算有意义).SF(SF),//符号标志(只对有符号数运算有意义).PF(PF)//奇偶标志);endmodule测试模块代码:`timescale1ns/1psmoduleTest();regClk,Clr,Write_Reg,Write_Select;reg[4:0]R_Addr_A,R_Addr_B,W_Addr;reg[31:0]Input_Data;reg[3:0]OP;wire[31:0]R_Data_A,R_Data_B,F;wireZF,CF,OF,SF,PF;initialbeginClr=0;//不清零Write_Reg=1;//写进去之后读读看R_Addr_A=5'b00000;//A端⼝先读寄存器0R_Addr_B=5'b00001;//B端⼝先读寄存器1OP=4'b0101;//先做⼀个减法运算Write_Select=1'b1;//先写外部输⼊//将32'h7fff_fffd写⼊寄存器0,作为左操作数Input_Data=32'h7fff_fffd;W_Addr=5'b00000;Clk=0;#50;Clk=1;#50;//将32'h7fff_ffff写⼊寄存器0,作为右操作数Input_Data=32'h7fff_ffff;W_Addr=5'b00001;Clk=0;#50;Clk=1;#50;Write_Select=1'b0;//改为写⼊运算结果R_Addr_B=5'b00010;//B端⼝改为读寄存器2//将ALU的运算结果写⼊寄存器,并读读看W_Addr=5'b00010;Clk=0;#50;Clk=1;#50;//到此为⽌我们完成了⼀次减法运算//(其实不是(ALU实时运算),实际上ALU已经做了5次减法)//左右操作数跟运算结果依次写⼊了寄存器0,1,2end//实例化寄存器堆模块RF_ALURF_Test(.Clk(Clk),.Clr(Clr),.Write_Reg(Write_Reg),.Write_Select(Write_Select),.R_Addr_A(R_Addr_A),.R_Addr_B(R_Addr_B),.W_Addr(W_Addr),.Input_Data(Input_Data),.R_Data_A(R_Data_A),.R_Data_B(R_Data_B),.OP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026及未来5年中国有色镁行业市场行情监测及发展前景研判报告
- 动态认知监测在物理治疗中的疗效评价
- 2026年中国重组羧肽酶B行业市场规模及投资前景预测分析报告
- 农业数字化技术员安全培训竞赛考核试卷含答案
- 内镜诊疗质量控制体系的构建与应用
- 内镜活检效率提升:AI辅助部位选择价值
- 内镜手术中出血防控技术
- 内镜出血预测模型的临床价值与成本效益分析
- 内镜中心医疗纠纷处理案例分享
- 内镜中心患者安全目标达成情况
- 碘摄取调控机制研究-洞察及研究
- 人教新课标高一英语寒假作业(共6份)
- 新中国史全文课件
- 原始社会儿童教育
- DGTJ 08-2024-2016 用户高压电气装置规范
- 珍珠商人协议
- 中职汽修专业《汽车底盘构造与原理》说课稿
- 农业生态学课件
- 公司组织架构与职责培训
- 中技开ZJ70钻机总装调试大纲
- 顶板、煤帮事故现场处置方案
评论
0/150
提交评论