预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共19页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

同济大学 计算机科学与技术系 计算机组成原理课程实验报告 学号1452312 姓名冯凯 专业计算机科学与技术 授课老师王力生 日期2016.06.18 实验目标 1、熟悉Verilog语言的编写。 2、掌握计算机的每个部件的构成逻辑及工作原理,计算机各部件之间的连接逻辑,计算机整机的工作原理。 3、掌握CPU功能。 4、设计55条单周期指令CPU下板成功 2、.在自己的CPU上跑一个汇编程序 总体设计 作品功能设计及原理说明 modulecomp( inputclock, inputresetn, output[2:0]r, output[2:0]g, output[1:0]b, outpuths, outputvs, ); 硬件逻辑图 主要模块设计 1.ALU modulealu( input[31:0]a, input[31:0]b, input[3:0]aluc, output[31:0]r, outputzero,//零标志 outputcarry,//进位标志位 outputnegative,//负数标志位 outputoverflow//溢出标志位 ); wire[31:0]d_and=a&b;//0100 wire[31:0]d_or=a|b;//0101 wire[31:0]d_xor=a^b;//0110 wire[31:0]d_nor=~(a|b);//0111 wire[31:0]d_lui={b[15:0],16'h0};//100x wire[31:0]d_slt=a<b?1:0; wire[31:0]d_sltu=(a[31]&&~b[31])||(a[31]&&b[31]&&a>b)||(~a[31]&&~b[31]&&a<b); wire[31:0]d_and_or=aluc[0]?d_or:d_and; wire[31:0]d_xor_nor=aluc[0]?d_nor:d_xor; wire[31:0]d_and_or_xor_nor=aluc[1]?d_xor_nor:d_and_or; wire[31:0]d_slt_sltu=aluc[0]?d_slt:d_sltu; wire[31:0]d_lui_slt_sltu=aluc[1]?d_slt_sltu:d_lui; wire[31:0]d_as; wire[31:0]d_sh; wirecarry_as; wirenegative_as; wireoverflow_as; wirecarry_sh; addsub32as32(a,b,aluc[0],aluc[1],d_as,carry_as,overflow_as); shiftshifter(b,a[4:0],~aluc[1],~aluc[0],d_sh,carry_sh); mux4x32select_d(d_as,d_and_or_xor_nor,d_lui_slt_sltu,d_sh,aluc[3:2],r); mux4x1select_carry(carry_as,1'b0,1'b0,carry_sh,aluc[3:2],carry); mux4x1select_overflow(overflow_as,1'b0,1'b0,overflow_sh,aluc[3:2],overflow); assignzero=~|r; assignnegative=r[31]; endmodule 2.regfile moduleregfile( input[4:0]raddr1, input[4:0]raddr2, input[31:0]wdata, input[4:0]waddr, inputwe, inputclk, inputrst, output[31:0]radata1, output[31:0]radata2 ); reg[31:0]register[0:31]; assignradata1=(raddr1==0)?0:register[raddr1]; assignradata2=(raddr2==0)?0:register[raddr2]; integeri; always@(posedgerstornegedgeclk)begin if(rst==1) begin for(i=1;i<32;i=i+1)begin register[i]<=0; end end elsebegin register[0]<=32'b0; if((waddr!=0)&&we)begin reg