杭电计算机组成原理实验RISC-V 实验 实现运算及传送指令的CPU设计实验 实现访存指令的CPU设计实验 实现转移指令的CPU设计实验
杭電計(jì)算機(jī)組成原理實(shí)驗(yàn)RISC-V 實(shí)驗(yàn) 實(shí)現(xiàn)運(yùn)算及傳送指令的CPU設(shè)計(jì)實(shí)驗(yàn) 實(shí)現(xiàn)訪存指令的CPU設(shè)計(jì)實(shí)驗(yàn) 實(shí)現(xiàn)轉(zhuǎn)移指令的CPU設(shè)計(jì)實(shí)驗(yàn)
- 一、實(shí)驗(yàn)?zāi)康呐c要求
- 1、 實(shí)驗(yàn)?zāi)康?#xff1a;
- a) 掌握RISC-V的轉(zhuǎn)移指令的數(shù)據(jù)通路設(shè)計(jì),掌握指令流和數(shù)據(jù)流的控制方法
- b) 學(xué)習(xí)依據(jù)新增指令,修改多周期CPU的系統(tǒng)結(jié)構(gòu)的方法,具備鏈接各模塊構(gòu)建整機(jī)的能力。
- c) 掌握基于有限狀態(tài)機(jī),實(shí)現(xiàn)控制單元的設(shè)計(jì)方法。
- d) 在實(shí)現(xiàn)RISC-V的R型和I型運(yùn)算類指令,U型傳送類指令,訪存指令的基礎(chǔ)上,進(jìn)一步實(shí)現(xiàn)轉(zhuǎn)移類指令beq,jal,jalr真的功能。
- 2、 實(shí)驗(yàn)要求:
- 二、實(shí)驗(yàn)設(shè)計(jì)與程序代碼
- 1、 模塊設(shè)計(jì)說明
- 2、 實(shí)驗(yàn)程序源代碼及注釋等
- 三、實(shí)驗(yàn)仿真
- 1、 仿真代碼
- 五、引腳配置
- 六、思考與探索
- 1、 實(shí)驗(yàn)結(jié)果記錄:
- 2、 實(shí)驗(yàn)結(jié)論:
- 3、 問題與解決方案:
- 4、 思考題:
- a) 可以執(zhí)行三條轉(zhuǎn)移指令,測試?yán)涌梢圆榭磳?shí)驗(yàn)記錄結(jié)果
- b) 分析j的指令1111 1110 1101 1111 1111 0000 0110 1111 發(fā)現(xiàn)這是opcode 為jar的類型,所以為jal。因?yàn)閖al是20位的立即數(shù),而jalr只有12位立即數(shù),則需要壓縮,同時(shí)jalr主要是為了rs1+imm32->PC則需要將PC的數(shù)值放入到rs1中。所以rd和rs1需要一致,綜合得到j(luò)alr指令為:1011 1111 0110 0000 1000 0000 1110 0111。
- c) 可以,但是這里存在的問題在于需要添加一條PC和imm32的加法器,同時(shí)在選擇w_data_s的時(shí)候需要添加更多的選擇,所以CU部分也需要添加相應(yīng)的狀態(tài)才可以實(shí)現(xiàn)。
- d) 判斷轉(zhuǎn)移條件只需要是ZF=0即可,其他的判斷條件其實(shí)只需要在原來的基礎(chǔ)上加上非即可。
- e) 問題很多,找老師,跑板子,查數(shù)據(jù)解決。
一、實(shí)驗(yàn)?zāi)康呐c要求
1、 實(shí)驗(yàn)?zāi)康?#xff1a;
a) 掌握RISC-V的轉(zhuǎn)移指令的數(shù)據(jù)通路設(shè)計(jì),掌握指令流和數(shù)據(jù)流的控制方法
b) 學(xué)習(xí)依據(jù)新增指令,修改多周期CPU的系統(tǒng)結(jié)構(gòu)的方法,具備鏈接各模塊構(gòu)建整機(jī)的能力。
c) 掌握基于有限狀態(tài)機(jī),實(shí)現(xiàn)控制單元的設(shè)計(jì)方法。
d) 在實(shí)現(xiàn)RISC-V的R型和I型運(yùn)算類指令,U型傳送類指令,訪存指令的基礎(chǔ)上,進(jìn)一步實(shí)現(xiàn)轉(zhuǎn)移類指令beq,jal,jalr真的功能。
2、 實(shí)驗(yàn)要求:
本次實(shí)驗(yàn)內(nèi)容:在前述構(gòu)建并實(shí)現(xiàn)了運(yùn)算類指令(R型和I型)、轉(zhuǎn)移指令(U型lui指令)、訪存指令(I型和S型)的RISC-V CPU基礎(chǔ)上,新增三條轉(zhuǎn)移類指令beq、jal、jalr;首先在實(shí)驗(yàn)8基礎(chǔ)上,添加CP0寄存器、相對轉(zhuǎn)移的地址加法器和PC寫入的多路選擇器,并與各個(gè)邏輯模塊正確鏈接;然后修改寄存器堆的寫入數(shù)據(jù)多路選擇器、修改二級譯碼及控制單元,實(shí)現(xiàn)新的目標(biāo)指令集功能;最后,編寫測試程序,檢查CPU是否能正確執(zhí)行基于新目標(biāo)集的程序。
二、實(shí)驗(yàn)設(shè)計(jì)與程序代碼
1、 模塊設(shè)計(jì)說明
(描述整個(gè)實(shí)驗(yàn)的設(shè)計(jì)方案,分幾個(gè)模塊,各模塊的功能,各模塊之間的連接關(guān)系,可附圖)
實(shí)驗(yàn)除了頂層模塊之外還有十一個(gè)模塊,分別為指令的存取,指令放入到IR,ID1對指令的處理,ID2對ID1處理后的數(shù)據(jù)進(jìn)行分析,分析出現(xiàn)在的指令的類型,ALU部分為數(shù)據(jù)的計(jì)算,同時(shí)還包括了判斷B或者imm32,顯示數(shù)據(jù)模塊為數(shù)碼管模塊,對數(shù)碼管進(jìn)行顯示,暫存器模塊是為了A,B的賦值,以及對PC,PC0,W_DATA的賦值,CU模塊是包含有限自動機(jī),對不同的狀態(tài)進(jìn)行轉(zhuǎn)移,數(shù)據(jù)獲得模塊,主要是為了查看相關(guān)的數(shù)據(jù),對不同的數(shù)據(jù)進(jìn)行選擇。DM模塊是存儲器模塊,主要是為了存儲獲取,寫入相關(guān)的數(shù)據(jù)。
2、 實(shí)驗(yàn)程序源代碼及注釋等
(實(shí)驗(yàn)各個(gè)模塊的代碼,包含功能注釋)
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 15:57:20 06/04/2021 // Design Name: // Module Name: main // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module main(input clk,clk_n,clk_25M,input [3:0] SW,output [3:0] AN,output [7:0] seg,output ZF,SF,CF,OF);wire [31:0] PC,PC0,IR,inst_Code,A,B,F,R_Addr_A,R_Addr_B,W_Data,imm32,MDR; wire IR_Write,Reg_Write,rs2_imm_s,PC0_write,Mem_Write,PC_Write; wire [1:0] PC_s,w_data_s; wire [4:0] rs1,rs2,rd; wire [6:0] opcode; wire [2:0] funct3; wire [6:0] funct7; wire [3:0] ALU_OP,ALU_OP_o; wire IS_R,IS_IMM,IS_LUI,IS_LW,IS_SW,IS_BEQ,IS_JAL,IS_JALR; wire [31:0] shownum; IM myIM(clk,PC[7:2],inst_Code);//指令集 Get_Order myGet_Order(IR_Write,PC_Write,PC0_Write,PC_s,inst_Code,imm32,F,clk,clk_n,PC,IR,PC0);//獲得指令 ID1 myID1(IR,rs1,rs2,rd,imm32,opcode,funct3,funct7);//ID1對指令進(jìn)行處理 ID2 myID2(opcode,funct3,funct7,IS_R,IS_IMM,IS_LUI,IS_LW,IS_SW,IS_BEQ,IS_JAL,IS_JALR,ALU_OP);//ID2對指令處理 ALU myALU(A,B,imm32,clk,rs2_imm_s,ALU_OP_o,F,ZF,SF,CF,OF);//ALU部分 ShowNum myShowNum(clk_25M,shownum,seg,AN);//顯示數(shù)據(jù) DataInput myDataInput(clk,rd,clk_n,Reg_Write,rs1,rs2,W_Data,R_Addr_A,R_Addr_B); ABInput myABInput(clk,R_Addr_A,R_Addr_B,imm32,F,MDR,PC,w_data_s,rs2_imm_s,A,B,W_Data); CU myCU(clk,clk_n,IS_R,IS_IMM,IS_LUI,IS_LW,IS_SW,IS_BEQ,IS_JAL,IS_JALR,ZF,ALU_OP,PC_Write,PC0_Write,IR_Write,Reg_Write,Mem_Write,rs2_imm_s,w_data_s,PC_s,ALU_OP_o); getShowNum mygetShowNum(PC,IR,W_Data,A,B,F,MDR,PC0,rd,imm32,rs1,rs2,SW,shownum); DM myDM(clk,Mem_Write,F[7:2],B,MDR); endmodulemodule getShowNum( input [31:0] PC,inst,W_Data,A,B,F,MDR,PC0,rd,imm32,rs1,rs2, input [3:0] sw, output reg [31:0] shownum);always@(*) begincase(sw)0:begin shownum=PC; end1:begin shownum=inst; end2:begin shownum=W_Data; end3:begin shownum=A; end4:begin shownum=B; end5:begin shownum=F; end6:begin shownum=MDR; end7:begin shownum=PC0; end8:begin shownum=rd; end9:begin shownum=imm32; end10:begin shownum=rs1; end11:begin shownum=rs2; enddefault:shownum=0;endcase endendmodulemodule CU( input clk,reset,IS_R,IS_IMM,IS_LUI,IS_LW,IS_SW,IS_BEQ,IS_JAL,IS_JALR, input ZF, input [3:0] ALU_OP, output reg PC_Write,PC0_Write,IR_Write,Reg_Write, output wire Mem_Write, output reg rs2_imm_s, output reg [1:0] w_data_s,PC_s, output reg [3:0] ALU_OP_o);reg [3:0] ST,Next_ST;initial beginST=0; endassign Mem_Write=(Next_ST==4'b1010);always@(posedge clk or posedge reset) beginif(reset) ST<=0;else ST<=Next_ST; endalways@(*) begincase(ST)4'b0000:begin Next_ST=4'b0001; end4'b0001: beginif(IS_LUI) Next_ST=4'b0110;else if(IS_R||IS_IMM||IS_LW||IS_SW||IS_JALR||IS_BEQ) Next_ST=4'b0010;else if(IS_JAL) Next_ST=4'b1011;end4'b0010:beginif(IS_R) Next_ST=4'b0011;else if(IS_IMM) Next_ST=4'b0101;else if(IS_LW||IS_SW||IS_JALR) Next_ST=4'b0111;else if(IS_BEQ) Next_ST=4'b1101;end4'b0011:begin Next_ST=4'b0100; end4'b0100:begin Next_ST=4'b0001; end4'b0101:begin Next_ST=4'b0100; end4'b0110:begin Next_ST=4'b0001; end4'b0111:begin if(IS_LW) Next_ST=4'b1000;else if(IS_SW) Next_ST=4'b1010;else if(IS_JALR) Next_ST=4'b1100;end4'b1000:begin Next_ST=4'b1001; end4'b1001:begin Next_ST=4'b1010; end4'b1010:begin Next_ST=4'b0001; end4'b1011:begin Next_ST=4'b0001; end4'b1100:begin Next_ST=4'b0001; end4'b1101:begin Next_ST=4'b1110; end4'b1110:begin Next_ST=4'b0001; enddefault: Next_ST=4'b0001;endcase endalways@(posedge clk or posedge reset) beginif(reset)begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=0;PC_s<=0;endelsebegincase(Next_ST)4'b0001:begin PC_Write<=1;PC0_Write<=1;IR_Write<=1;Reg_Write<=0;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=0;PC_s<=0;end4'b0010:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=0;PC_s<=0;end4'b0011:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=ALU_OP;rs2_imm_s<=0;w_data_s<=0;PC_s<=0;end4'b0100:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=1;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=0;PC_s<=0;end4'b0101:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=ALU_OP;rs2_imm_s<=1;w_data_s<=0;PC_s<=0;end4'b0110:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=1;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=1;PC_s<=0;end4'b0111:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=0;rs2_imm_s<=1;w_data_s<=0;PC_s<=0;end4'b1000:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=0;PC_s<=0;end4'b1001:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=1;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=2;PC_s<=0;end4'b1010:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=0;PC_s<=0;end4'b1011:begin PC_Write<=1;PC0_Write<=0;IR_Write<=0;Reg_Write<=1;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=3;PC_s<=1;end4'b1100:begin PC_Write<=1;PC0_Write<=0;IR_Write<=0;Reg_Write<=1;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=3;PC_s<=2;end4'b1101:begin PC_Write<=0;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=8;rs2_imm_s<=0;w_data_s<=0;PC_s<=0;end4'b1110:begin PC_Write<=ZF;PC0_Write<=0;IR_Write<=0;Reg_Write<=0;ALU_OP_o<=0;rs2_imm_s<=0;w_data_s<=0;PC_s<=1;endendcaseendendendmodulemodule ID2(input [6:0] opcode,input [2:0] funct3,input [6:0] funct7,output reg IS_R,IS_IMM,IS_LUI,IS_LW,IS_SW,IS_BEQ,IS_JAL,IS_JALR,output reg [3:0] ALU_OP); always@(*) begincase(opcode)7'b0110011://Rbegin IS_R=1;IS_IMM=0;IS_LUI=0;IS_LW=0;IS_SW=0;IS_BEQ=0;IS_JAL=0;IS_JALR=0;ALU_OP={funct7[5],funct3}; end7'b0010011://Ibegin IS_R=0;IS_IMM=1;IS_LUI=0;IS_LW=0;IS_SW=0;IS_BEQ=0;IS_JAL=0;IS_JALR=0;ALU_OP=(funct3==3'b101)?{funct7[5],funct3}:{1'b0,funct3};end7'b0110111://Ubegin IS_R=0;IS_IMM=0;IS_LUI=1;IS_LW=0;IS_SW=0;IS_BEQ=0;IS_JAL=0;IS_JALR=0;ALU_OP=0;end7'b0000011://IWbegin IS_R=0;IS_IMM=0;IS_LUI=0;IS_LW=1;IS_SW=0;IS_BEQ=0;IS_JAL=0;IS_JALR=0;ALU_OP=0;end7'b0100011://SWbegin IS_R=0;IS_IMM=0;IS_LUI=0;IS_LW=0;IS_SW=1;IS_BEQ=0;IS_JAL=0;IS_JALR=0;ALU_OP=0;end7'b1100011://Bbegin IS_R=0;IS_IMM=0;IS_LUI=0;IS_LW=0;IS_SW=0;IS_BEQ=1;IS_JAL=0;IS_JALR=0;ALU_OP=0;end7'b1101111://Jalbegin IS_R=0;IS_IMM=0;IS_LUI=0;IS_LW=0;IS_SW=0;IS_BEQ=0;IS_JAL=1;IS_JALR=0;ALU_OP=0;end7'b1100111://Jalrbegin IS_R=0;IS_IMM=0;IS_LUI=0;IS_LW=0;IS_SW=0;IS_BEQ=0;IS_JAL=0;IS_JALR=1;ALU_OP=0;enddefault: begin IS_R=0;IS_IMM=0;IS_LUI=0;IS_LW=0;IS_SW=0;IS_BEQ=0;IS_JAL=0;IS_JALR=1;ALU_OP=0;endendcaseendendmodulemodule ID1(input [31:0] inst,output reg [4:0] rs1,rs2,rd,output reg [31:0] imm32,output reg [6:0] opcode,output reg [2:0] funct3,output reg [6:0] funct7);reg [5:0] I_fmt;always@(*)beginopcode=inst[6:0];rs1=inst[19:15];rs2=inst[24:20];rd=inst[11:7];funct3=inst[14:12];funct7=inst[31:25];case(opcode)7'b0110011: I_fmt=6'b000001;//R7'b0010011: I_fmt=6'b100000;//I7'b0000011: I_fmt=6'b100000;//L和I型一致7'b0100011: I_fmt=6'b010000;//S7'b1100011: I_fmt=6'b001000;//B7'b0110111: I_fmt=6'b000100;//U7'b1101111: I_fmt=6'b000010;//Jal7'b1100111: I_fmt=6'b100000;//Jalr和I一致default: I_fmt=0;endcasecase(I_fmt)6'b000001: imm32=0;//R6'b100000: beginif(funct3==3'b101||3'b001) imm32={{27{1'b0}},inst[24:20]};else imm32={{20{inst[31]}},inst[31:20]};//Iend6'b010000: imm32={{20{inst[31]}},inst[31:25],inst[11:7]};//S6'b001000: imm32={{20{inst[31]}},inst[7],inst[30:25],inst[11:8],1'b0};//B6'b000100: imm32={inst[31:12],{12{1'b0}}};//U6'b000010: imm32={{12{inst[31]}},inst[19:12],inst[20],inst[30:21],1'b0};//J1,I2default: imm32=0;endcaseend endmodulemodule Get_Order(input IR_Write,PC_Write,PC0_Write,input [1:0] PC_s,input [31:0] inst_Code,imm32,F,input clk,reset,output reg [31:0] PC,IR,PC0);initialbeginPC=0;endalways@(negedge clk or posedge reset)beginif(reset)beginPC<=0;IR<=0;endelsebeginif(IR_Write==1)beginIR<=inst_Code;endif(PC_Write==1)beginif(PC_s==0) PC<=PC+4;else if(PC_s==1) PC<=PC0+imm32;else if(PC_s==2) PC<=F;endif(PC0_Write==1)beginPC0<=PC;endendend endmodulemodule ABInput(//暫存器AB W_Data進(jìn)行賦值模塊input clk_RR,input [31:0] R_DataA,R_DataB,input [31:0] imm32,F,MDR,PC,input [1:0]w_data_s,input rs2_imm_s,output reg [31:0] A,B,W_Data);always@(negedge clk_RR)beginA<=R_DataA;B<=R_DataB;endalways@(*)beginif(w_data_s==0) begin W_Data=F; endelse if(w_data_s==1) begin W_Data=imm32; endelse if(w_data_s==2) begin W_Data=MDR; endelse if(w_data_s==3) begin W_Data=PC;endendendmodulemodule DataInput(//暫存器堆的重置清零和R_Addr_A,R_Addr_B,的賦值input wire clk,input wire [4:0] W_Addr,input wire reset,reg_Write,input wire [4:0] R_Addr_A,R_Addr_B,input wire [31:0] W_Data,output reg [31:0] R_DataA,R_DataB);reg [31:0] regs [31:0];initialbeginregs[0]=0;regs[1]=1;regs[2]=2;regs[3]=3;regs[4]=4;regs[5]=5;regs[6]=6;regs[7]=7;regs[8]=8;regs[9]=9;regs[10]=10;regs[11]=11;regs[12]=12;regs[13]=13;regs[14]=14;regs[15]=15;regs[16]=16;regs[17]=17;regs[18]=18;regs[19]=19;regs[20]=20;regs[21]=21;regs[22]=22;regs[23]=23;regs[24]=24;regs[25]=25;regs[26]=26;regs[27]=27;regs[28]=28;regs[29]=29;regs[30]=30;regs[31]=31;endalways@(negedge clk or posedge reset)beginif(reset)beginregs[0]<=0;regs[1]<=1;regs[2]<=2;regs[3]<=3;regs[4]<=4;regs[5]<=5;regs[6]<=6;regs[7]<=7;regs[8]<=8;regs[9]<=9;regs[10]<=10;regs[11]<=11;regs[12]<=12;regs[13]<=13;regs[14]<=14;regs[15]<=15;regs[16]<=16;regs[17]<=17;regs[18]<=18;regs[19]<=19;regs[20]<=20;regs[21]<=21;regs[22]<=22;regs[23]<=23;regs[24]<=24;regs[25]<=25;regs[26]<=26;regs[27]<=27;regs[28]<=28;regs[29]<=29;regs[30]<=30;regs[31]<=31;endelsebeginif(reg_Write==1'b1)beginif(W_Addr!=0)beginregs[W_Addr]<=W_Data;endendendendalways@(*)beginR_DataA=regs[R_Addr_A];R_DataB=regs[R_Addr_B];endendmodulemodule ALU(//ALU的計(jì)算模塊input [31:0] A,B,imm32,input clk_F,input rs2_imm_s,input [3:0] ALU_OP,output reg [31:0] F,output reg ZF,SF,CF,OF);reg F32;reg ZF_O,SF_O,CF_O,OF_O;always@(negedge clk_F)beginif(rs2_imm_s==0)begincase(ALU_OP)4'b0000:begin {F32,F}=A+B;end4'b0001:begin F=A<<B;end4'b0010:begin F=($signed(A)<$signed(B))?1:0;end4'b0011:begin F=(A<B)?1'b1 : 1'b0;end4'b0100:begin F=A^B;end4'b0101:begin F=A>>B;end4'b0110:begin F=A|B;end4'b0111:begin F=A&B;end4'b1000:begin {F32,F}=A-B;F32=~F32; end4'b1101:begin F=($signed(A))>>>B;endendcaseZF=(F>0)?1'b0:1'b1;SF=F[31];CF=F32;OF=A[31]^B[31]^F[31]^F32;endelsebegincase(ALU_OP)4'b0000:begin {F32,F}=A+imm32;end4'b0001:begin F=A<<imm32;end4'b0010:begin F=($signed(A)<$signed(imm32))?1:0;end4'b0011:begin F=(A<imm32)?1'b1 : 1'b0;end4'b0100:begin F=A^imm32;end4'b0101:begin F=A>>imm32;end4'b0110:begin F=A|imm32;end4'b0111:begin F=A&imm32;end4'b1000:begin {F32,F}=A-imm32;F32=~F32; end4'b1101:begin F=($signed(A))>>>imm32;endendcaseZF=(F>0)?1'b0:1'b1;SF=F[31];CF=F32;OF=A[31]^B[31]^F[31]^F32;endendendmodulemodule ShowNum(//數(shù)碼管模塊用于顯示數(shù)據(jù)input clk_25M,input [31:0] F,output reg [7:0]seg,output reg [3:0]AN);parameter count=10000;reg [31:0] clk_num;reg [3:0] digit;reg [2:0] which;initialbeginclk_num=0;which=0;digit=0;endalways@(posedge clk_25M)beginif(clk_num<count)begin clk_num<=clk_num+1;endelsebegin clk_num<=0;which<=which+3'b001;case(which)0: begin digit<=F[3:0];end1: begin digit<=F[7:4];end2: begin digit<=F[11:8];end3: begin digit<=F[15:12];end4: begin digit<=F[19:16];end5: begin digit<=F[23:20];end6: begin digit<=F[27:24];end7: begin digit<=F[31:28];endendcaseendendalways@(digit,which)begincase(which)1: begin AN=4'b1111;end2: begin AN=4'b1110;end3: begin AN=4'b1101;end4: begin AN=4'b1100;end5: begin AN=4'b1011;end6: begin AN=4'b1010;end7: begin AN=4'b1001;end0: begin AN=4'b1000;enddefault:AN=4'bzzzz;endcasecase(digit)0:seg[7:0]=8'b00000011;1:seg[7:0]=8'b10011111;2:seg[7:0]=8'b00100101;3:seg[7:0]=8'b00001101;4:seg[7:0]=8'b10011001;5:seg[7:0]=8'b01001001;6:seg[7:0]=8'b01000001;7:seg[7:0]=8'b00011111;8:seg[7:0]=8'b00000001;9:seg[7:0]=8'b00001001; 10:seg[7:0]=8'b00010001;11:seg[7:0]=8'b11000001;12:seg[7:0]=8'b01100011;13:seg[7:0]=8'b10000101;14:seg[7:0]=8'b01100001;15:seg[7:0]=8'b01110001;default:seg[7:0]=8'b11111111;endcaseend endmodule三、實(shí)驗(yàn)仿真
1、 仿真代碼
(含仿真源代碼、仿真驗(yàn)證方案)
`timescale 1ns / 1ps// Company: // Engineer: // // Create Date: 22:20:29 06/18/2021 // Design Name: main // Module Name: D:/ShuZiDianLu/example/exam9.1/test1.v // Project Name: exam9.1 // Target Device: // Tool versions: // Description: // // Verilog Test Fixture created by ISE for module: main // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // module test1;// Inputsreg clk;reg clk_n;reg clk_25M;reg [3:0] SW;// Outputswire [3:0] AN;wire [7:0] seg;wire ZF;wire SF;wire CF;wire OF;// Instantiate the Unit Under Test (UUT)main uut (.clk(clk), .clk_n(clk_n), .clk_25M(clk_25M), .SW(SW), .AN(AN), .seg(seg), .ZF(ZF), .SF(SF), .CF(CF), .OF(OF));initial begin// Initialize Inputsclk = 0;clk_n = 0;clk_25M = 0;SW = 0;// Wait 100 ns for global reset to finish#100;// Add stimulus hereendinitial beginforever #1000 clk=~clk; endinitial beginforever #1 clk_25M=~clk_25M; end2、 仿真波形
(運(yùn)行仿真時(shí),波形截圖)
3、 仿真結(jié)果分析
(對仿真波形進(jìn)行分析)
仿真波形基本符合實(shí)驗(yàn)要求
四、電路圖
(開發(fā)工具中顯示的電路模塊圖)
五、引腳配置
(引腳約束文件的內(nèi)容,描述主要配置情況)
NET "AN[3]" LOC = L21; NET "AN[2]" LOC = M22; NET "AN[1]" LOC = M21; NET "AN[0]" LOC = N22; NET "seg[7]" LOC = H19; NET "seg[6]" LOC = G20; NET "seg[5]" LOC = J22; NET "seg[4]" LOC = K22; NET "seg[3]" LOC = K21; NET "seg[2]" LOC = H20; NET "seg[1]" LOC = H22; NET "seg[0]" LOC = J21; NET "SW[3]" LOC = T3; NET "SW[2]" LOC = U3; NET "SW[1]" LOC = T4; NET "SW[0]" LOC = V3; NET "ZF" LOC = R1; NET "SF" LOC = P2; NET "CF" LOC = P1; NET "OF" LOC = N2; NET "clk" LOC = R4; NET "clk_25M" LOC = H4; NET "clk_n" LOC = AA4;#PlanAhead Generated IO constraints NET "AN[3]" IOSTANDARD = LVCMOS18; NET "AN[2]" IOSTANDARD = LVCMOS18; NET "AN[1]" IOSTANDARD = LVCMOS18; NET "AN[0]" IOSTANDARD = LVCMOS18; NET "seg[7]" IOSTANDARD = LVCMOS18; NET "seg[6]" IOSTANDARD = LVCMOS18; NET "seg[5]" IOSTANDARD = LVCMOS18; NET "seg[4]" IOSTANDARD = LVCMOS18; NET "seg[3]" IOSTANDARD = LVCMOS18; NET "seg[2]" IOSTANDARD = LVCMOS18; NET "seg[1]" IOSTANDARD = LVCMOS18; NET "seg[0]" IOSTANDARD = LVCMOS18; NET "SW[3]" IOSTANDARD = LVCMOS18; NET "SW[2]" IOSTANDARD = LVCMOS18; NET "SW[1]" IOSTANDARD = LVCMOS18; NET "SW[0]" IOSTANDARD = LVCMOS18; NET "clk" IOSTANDARD = LVCMOS18; NET "clk_25M" IOSTANDARD = LVCMOS18; NET "clk_n" IOSTANDARD = LVCMOS18; NET "OF" IOSTANDARD = LVCMOS18; NET "SF" IOSTANDARD = LVCMOS18; NET "ZF" IOSTANDARD = LVCMOS18; NET "CF" IOSTANDARD = LVCMOS18; NET "SW[3]" PULLDOWN; NET "SW[2]" PULLDOWN; NET "SW[1]" PULLDOWN; NET "SW[0]" PULLDOWN; NET "clk_25M" PULLDOWN; NET "clk" PULLDOWN; NET "clk_n" PULLDOWN;六、思考與探索
1、 實(shí)驗(yàn)結(jié)果記錄:
實(shí)驗(yàn)8實(shí)驗(yàn)結(jié)果記錄表
| 1 | 0 | 01000f93 | li t6,16 | t6=16 | 4 | 0x10 | 0x10 |
| 2 | 4 | 000fad03 | lw s10,0(t6) | S10=0x11 | 4 | 0x11 | 0x11 |
| 3 | 8 | 004fad83 | lw s11,4(t6) | S11=0x22 | 4 | 0x22 | 0x22 |
| 4 | C | 01bfa023 | sw s11,0(t6) | Mem[4]=0x22 | 4 | 0x22 | |
| 5 | 10 | 01afa223 | sw s10,4(t6) | Mem[5]=0x11 | 4 | 0x11 | |
| 6 | 14 | 000fad03 | lw s10,0(t6) | S10=0x22 | 4 | 0x22 | 0x22 |
| 7 | 18 | 004fad83 | lw s11,4(t6) | S11=0x11 | 4 | 0x11 | 0x11 |
| 8 | 1c | 01bd0e33 | add t3,s10,s11 | t3=0x33 | 4 | 0x33 | |
| 9 | 20 | 01c02823 | sw t3,16(zero) | t3=0x33 | 4 | 0x33 | |
| 10 | 24 | 01002e83 | lw t4,16(zero) | t4=0x33 | 4 | 0x33 | 0x33 |
| 11 | 28 | 87600093 | li ra,22 | ra=0xFFFF_F876 | 4 | 0xFFFF_F876 | |
| 12 | 2c | 00400113 | li sp,4 | sp=0x0000_0004 | 4 | 0x0000_0004 | |
| 13 | 30 | 002081b3 | add gp,ra,sp | gp=0xFFFF_F87A | 4 | 0xFFFF_F87A | |
| 14 | 34 | 40208233 | sub tp,ra,sp | tp=0xFFFF_F872 | 4 | 0xFFFF_F872 | |
| 15 | 38 | 002092b3 | sll t0,ra,sp | t0=0xFFFF_8760 | 4 | 0xFFFF_8760 | |
| 16 | 3c | 0020d333 | srl t1,ra,sp | t1=0x0FFF_FF87 | 4 | 0x0FFF_FF87 | |
| 17 | 40 | 4020d3b3 | sra t2,ra,sp | t2=0xFFFF_FF87 | 4 | 0xFFFF_FF87 | |
| 18 | 44 | 0020a433 | slt s0,ra,sp | s0=0x0000_0001 | 4 | 0x0000_0001 | |
| 19 | 48 | 0020b4b3 | sltu s1,ra,sp | s1=0x0000_0000 | 4 | 0x0000_0000 | |
| 20 | 4c | 0062f533 | and a0,t0,t1 | s0=0x0FFF_8700 | 4 | 0x0FFF_8700 | |
| 21 | 50 | 0062e5b3 | or a1,t0,t1 | a1=0xFFFF_FFE7 | 4 | 0xFFFF_FFE7 | |
| 22 | 54 | 0062c633 | xor a2,t0,t1 | a2=0xF000_78E7 | 4 | 0xF000_78E7 | |
| 23 | 58 | 800006b7 | lui a3,0x80000 | a3=0x8000_0000 | 2 | 0x8000_0000 | |
| 24 | 5c | fff68713 | addi a4,a3,-1 | a4=0x7FFF_FFFF | 4 | 0x7FFF_FFFF | |
| 25 | 60 | 12370793 | addi a5,a4,291 | a5=0x8000_0122 | 4 | 0x8000_0122 | |
| 26 | 64 | 00379813 | slli a6,a5,0x3 | a6=0x0000_0910 | 4 | 0x0000_0910 | |
| 27 | 68 | 0037d893 | srli a7,a5,0x3 | a7=0x1000_0024 | 4 | 0x1000_0024 | |
| 28 | 6c | 4037d913 | srai s2,a5,0x3 | s2=0xF000_0024 | 4 | 0xF000_0024 | |
| 29 | 70 | fff92993 | slti s3,s2,-1 | s3=0x0000_0001 | 4 | 0x0000_0001 | |
| 30 | 74 | fff93a13 | sltiu s4,s2,-1 | s4=0x0000_0001 | 4 | 0x0000_0001 | |
| 31 | 78 | 00192a93 | slti s5,s2,1 | s5=0x0000_0001 | 4 | 0x0000_0001 | |
| 32 | 7c | 00193b13 | seqz s6,s2 | s6=0x0000_0000 | 4 | 0x0000_0000 | |
| 33 | 80 | 0ff67b93 | andi s7,a2,255 | s7=0x0000_00E7 | 4 | 0x0000_00E7 | |
| 34 | 84 | 0ff66b93 | ori s7,a2,255 | s7=0xF000_78FF | 4 | 0xF000_78FF — | |
| 35 | 88 | 00010c37 | lui s8,0x10 | s8=0x0001_0000 | 2 | 0x0001_0000 | |
| 36 | 8c | fffc0c13 | addi s8,s8,-1 | s8=0x0000_FFFF | 4 | 0x0000_FFFF | |
| 37 | 90 | fffc4c93 | not s9,s8 | s9=0xFFFF_0000 | 4 | 0xFFFF_0000 |
表11.1 實(shí)驗(yàn)9實(shí)驗(yàn)結(jié)果記錄表
| 1 | 0 | 01000513 | li a0,16 | a0=16 | 00306593 |
| 2 | 4 | 00306593 | ori a1,zero,3 | a1=3 | 03004613 |
| 3 | 8 | 03004613 | xori a2,zero,48 | a2=48 | 008000ef |
| 4 | C | 008000ef | Jal ra,14 | PC=14 | 000502b3 |
| 5 | 14 | 000502b3 | add t0,a0,zero | t0=16 | 0005e333 |
| 6 | 18 | 0005e333 | or t1,a1,zero | a1=3 | 000073b3 |
| 7 | 1c | 000073b3 | and t2,zero,zero | t2=0 | 0002ae03 |
| 8 | 20 | 0002ae03 | lw t3,0(t0) | t3=4 | 01c383b3 |
| 9 | 24 | 01c383b3 | add t2,t2,t3 | t2=4 | 00428293 |
| 10 | 28 | 00428293 | addi t0,t0,4 | t0=20 | fff30313 |
| 11 | 2c | fff30313 | addi t1,t1,-1 | t1=2 | 00030463 |
| 12 | 30 | 00030463 | beqz t1,38 | 0 | fedff06f |
| 13 | 34 | fedff06f | j 20 | PC=20 | 0002ae03 |
| 14 | 20 | 0002ae03 | lw t3,0(t0) | t3=5 | 01c383b3 |
| 15 | 24 | 01c383b3 | add t2,t2,t3 | t2=9 | 00428293 |
| 16 | 28 | 00428293 | addi t0,t0,4 t | 1 | 00030463 |
| 18 | 30 | 00030463 | beqz t1,38 | 0 | fedff06f |
| 19 | 34 | fedff06f | j 20 | PC=20 | 0002ae03 |
| 20 | 20 | 0002ae03 | lw t3,0(t0) | t3=6 | 01c383b3 |
| 21 | 24 | 01c383b3 | add t2,t2,t3 | t2=f | 00428293 |
| 22 | 28 | 00428293 | addi t0,t0,4 | t0=28 | fff30313 |
| 23 | 2c | fff30313 | addi t1,t1,-1 | t1=0 | 00030463 |
| 24 | 30 | 00030463 | beqz t1,38 | 1 | 00762023 |
| 25 | 38 | 00762023 | sw t2,0(a2) | mem?=f | 00008067 |
| 26 | 3c | 00008067 | Ret | — | 00062403 |
| 27 | 10 | 00062403 | lw s0,0(a2) | s0=f | ---- |
2、 實(shí)驗(yàn)結(jié)論:
(分析實(shí)驗(yàn)結(jié)果,給出實(shí)驗(yàn)結(jié)論)
實(shí)驗(yàn)結(jié)果基本符合實(shí)驗(yàn)的要求,同時(shí)對照數(shù)據(jù)值發(fā)現(xiàn)符合DM提前放進(jìn)進(jìn)去的數(shù)據(jù)值,說明sw和lw沒有問題,同時(shí)跳轉(zhuǎn)指令也符合要求,則說明beq、jal、jalr也符合要求。
3、 問題與解決方案:
問題:實(shí)驗(yàn)中間發(fā)現(xiàn)了很多奇怪的問題,比如跳轉(zhuǎn)不對,數(shù)據(jù)不對,數(shù)碼管位移這一系列的問題。
解決方案:通過反復(fù)實(shí)驗(yàn)和查找數(shù)據(jù),發(fā)現(xiàn)一部分錯(cuò)誤在于沒有必要的代碼,還有一部分代碼問題在于寫代碼時(shí)間過長,導(dǎo)致除了代碼的前后差異過大,從而也會造成差異。
4、 思考題:
a) 可以執(zhí)行三條轉(zhuǎn)移指令,測試?yán)涌梢圆榭磳?shí)驗(yàn)記錄結(jié)果
代碼如下: 00000000 <main>:0: 01000513 li a0,164: 00306593 ori a1,zero,38: 03004613 xori a2,zero,48c: 008000ef jal ra,14 <BankSum>10: 00062403 lw s0,0(a2)00000014 <BankSum>:14: 000502b3 add t0,a0,zero18: 0005e333 or t1,a1,zero1c: 000073b3 and t2,zero,zero00000020 <L>:20: 0002ae03 lw t3,0(t0)24: 01c383b3 add t2,t2,t328: 00428293 addi t0,t0,42c: fff30313 addi t1,t1,-130: 00030463 beqz t1,38 <exit>34: fedff06f j 20 <L>00000038 <exit>:38: 00762023 sw t2,0(a2)3c: 00008067 retb) 分析j的指令1111 1110 1101 1111 1111 0000 0110 1111 發(fā)現(xiàn)這是opcode 為jar的類型,所以為jal。因?yàn)閖al是20位的立即數(shù),而jalr只有12位立即數(shù),則需要壓縮,同時(shí)jalr主要是為了rs1+imm32->PC則需要將PC的數(shù)值放入到rs1中。所以rd和rs1需要一致,綜合得到j(luò)alr指令為:1011 1111 0110 0000 1000 0000 1110 0111。
c) 可以,但是這里存在的問題在于需要添加一條PC和imm32的加法器,同時(shí)在選擇w_data_s的時(shí)候需要添加更多的選擇,所以CU部分也需要添加相應(yīng)的狀態(tài)才可以實(shí)現(xiàn)。
d) 判斷轉(zhuǎn)移條件只需要是ZF=0即可,其他的判斷條件其實(shí)只需要在原來的基礎(chǔ)上加上非即可。
e) 問題很多,找老師,跑板子,查數(shù)據(jù)解決。
總結(jié)
以上是生活随笔為你收集整理的杭电计算机组成原理实验RISC-V 实验 实现运算及传送指令的CPU设计实验 实现访存指令的CPU设计实验 实现转移指令的CPU设计实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 垂直搜死哦,垂直搜索(Verti
- 下一篇: PHP独特学习模式_php基础知识