1单选(2分)
在单总线数据通路实验中,运算过程是通过_________产生ALUop、RXce等一系列控制信号完成的,这次实验的运算过程通过______控制信号完成。
得分/总分
A.开关手工输入,存储器产生
B.开关手工输入,微程序控制器产生
C.微程序控制器产生,开关手工输入
D.存储器产生,开关手工输入
正确答案:B
2单选(2分)
我们为这个实验设计的指令系统中,指令字占_______个二进制位,分为_______个字段。
_______是指令操作码OPCODE,用来区分指令的功能;
_______用来指示目的操作数的寄存器号 ;
IR[3:0]的作用是_______。
得分/总分
A.12,4,IR[11:8],IR[7:6],提供立即数DATA
B.12,4,IR[11:8],IR[7:6],指示源操作数的寄存器号或者提供立即数DATA
C.10,3,IR[9:6],IR[5:4],指示源操作数的寄存器号或者提供立即数DATA
D.10,3,IR[9:6],IR[5:4],指示源操作数的寄存器号
正确答案:C
3单选(2分)
指令分为“装数”和“运算”两种类型,装数指令有_______条,装数指令执行时,_______ALU,运算指令执行时,_______ALU。
得分/总分
A.2,经过,经过,
B.1,不经过,经过,
C.2,经过,不经过
D.1,经过,经过,
正确答案:B
4单选(2分)
实验电路根据数据通路中微操作信号的相容性,相斥性,设计微指令格式,______的微操作放在同一个字段。
微指令字有______位,共7个字段。
F0~F1字段是______部分,用来产生______;
F2和F6字段是______部分,用来产生______。
得分/总分
A.相斥的,17,顺序控制,下一条微指令的地址,微操作控制,控制信号操作
B.相斥的,16,微操作控制,控制信号操作,顺序控制,下一条微指令的地址
C.相容的,17,顺序控制,下一条微指令的地址,微操作控制,控制信号操作
D.相容的,16,微操作控制,控制信号操作,顺序控制,下一条微指令的地址
正确答案:A
5单选(2分)
微指令地址的形成由:
F0字段BM,表示________;
F1字段NA,表示________;
以及指令的操作码OPCODE共同决定。
实验设计了________种微地址转移方式。
得分/总分
A.转移方式,地址常数,2
B.地址常数,转移方式,1
C.转移方式,地址常数,1
D.地址常数,转移方式,2
正确答案:A
6单选(2分)
一条微指令就可以实现的指令是()。
得分/总分
A.XOR
B.OR
C.LD
D.AND
正确答案:C
7多选(3分)
数据通路中由控制器产生的控制信号包括( )
得分/总分
A.Cin
B.PSWce
C.DATAoe
D.RFoe
正确答案:B、C、D
8多选(3分)
实验中的微程序控制器设计包含()。
得分/总分
A.微地址生成uAG,产生后继微指令的控存地址
B.微地址寄存器uAR,用于存放当前要执行的微指令的控存地址
C.微指令译码,用于产生控制信号
D.控制存储器CM,用于存放微程序
正确答案:A、B、C、D你选对了
9多选(3分)
根据微地址生成实验电路的设计要求,选出正确的微指令地址。
说明:一条指令往往需要若干条微指令的执行才能实现,例如ADD指令的实现需要3条微指令,选项中的微地址,是指实现该指令的微程序第一条微指令的地址。
得分/总分
A.MOV指令微程序的微地址入口:00H
B.SUB指令微程序的微地址入口:08H
C.XOR指令微程序的微地址入口:14H
D.OR指令微程序的微地址入口:10H
正确答案:A、B、C、D你选对了
10判断(2分)
根据实验原理图,实验电路分为两个部分:运算数据通路 和 微程序控制器。
得分/总分
A.×
B.√
正确答案:B
11判断(2分)
运算数据通路通过对运算需要的各种控制信号进行编码、保存、读出、执行的过程,有序地控制微程序控制器工作。
得分/总分
A.√
B.×
正确答案:B
解析:微程序控制器通过对运算需要的各种控制信号进行编码、保存、读出、执行的过程,有序地控制运算数据通路工作。
12判断(2分)
包含运算器和微程序控制器的实验电路已经是一个CPU,可以为它设计指令系统,以及为每条指令设计微程序。
得分/总分
A.×
B.√
正确答案:B
13判断(2分)
实验电路中指令由存储器提供。
得分/总分
A.×
B.√
正确答案:A
解析:实验电路没有设计主存储器存放指令,因此实验时用开关手工输入指令来代替从主存储器读出指令的过程,也因为没有主存储器,所以指令的目的操作数仅来自寄存器GRS。
14填空(2分)
根据指令格式,和指令操作码编码,将指令 LD R1,#0101B 翻译成二进制机器码,值为__________B。
得分/总分
1111010101
正确答案:1111010101
15填空(2分)
根据指令格式,和指令操作码编码,将指令 ADD R1,R2 翻译成二进制机器码,值为__________B.
得分/总分
1010010
正确答案:0001010010
16填空(2分)
uAR寄存器表示复位的代码如下:
if (Reset) oQ={N{1'b1}}; //N是定义的参数
所以第一条微指令要存放在控制存储器的________地址(填写答案时,存储器地址用十六进制表示,例如2AH)。
得分/总分
3FH
正确答案:3FH
17填空(2分)
写出指令LD R1,#5的微程序
示例1
指令译码的微程序是________?填写答案如下(@后面是十六进制地址,后面直接写十六进制数据):
@3FH10000H
如果该指令的微程序包含多条微指令,使用#隔开,例如:
@01H000001H#@02H000002H
注意填写数据的时候不要省略高位的0,需要填入字符时用大写字母表示
得分/总分
@3CH0FD90H
2.00/2.00
正确答案:@3CH0FD90H
解析: LD入口微地址3CH,不需要经过ALU,一个微指令就可以完成
字段BM=0,NA=111111,表示下一条微指令到3FH去取(指令译码);
字段D/S=0,取目的寄存器地址
字段DATAoe=11,立即数DATA送总线BUS
字段GRSce=01,寄存器保存
字段其它位为0;
因此,微指令为: 01111110110010000,即0FD90H
18填空(2分)
写出指令 MOV R2,R1的微程序
得分/总分
@00H006B0H#@01H00820H@02H0FD10H
正确答案:@00H006B0H#@01H00820H@02H0FD10H
解析: MOV R2,R1
@00H RX<-(Rs)
BM=0,NA=000001,D/S=1,GRSoe=01,PSW=0,RXce=11,ALU=0000,即006B0H
@01H RF<-(RX)
BM=0,NA=000010,D/S=0,XXoe=00,PSW=0,RFce=10,ALU=0000,即00820H
@02H,Rd<-RF
BM=0,NA=111111,D/S=0,RFoe=10,PSW=0,GRSce=01,ALU=0000,即0FD10H
所以:@00H006B0H#@01H00820H@02H0FD10H
19填空(2分)
写出指令ADD R3,#9的微程序
得分/总分
@04H014B0H#@05H01BE1H@06H0FD10H
正确答案:@04H014B0H#@05H01BE1H@06H0FD10H
解析: ADD R3,#9
@04H RX<-(Rd)
BM=0,NA=000101,D/S=0,GRSoe=01,PSW=0,RXce=11,ALU=0000,即014B0H
@05H RF<-(RX)+(Rs)
BM=0,NA=000110,D/S=1,DATAoe=11,PSW=1,RFce=10,ALU=0001,即01BE1H
@06H,Rd<-RF
BM=0,NA=111111,D/S=0,RFoe=10,PSW=0,GRSce=01,ALU=0000,即0FD10H
所以:@04H014B0H#@05H01BE1H@06H0FD10H
20填空(2分)
写出指令SUB R3,R1的微程序
得分/总分
@08H024B0H#@09H02AE2H@0AH0FD10H
正确答案:@08H024B0H#@09H02AE2H@0AH0FD10H
解析: SUB R3,R1
@08H RX<-(Rd)
BM=0,NA=001001,D/S=0,GRSoe=01,PSW=0,RXce=11,ALU=0000,即024B0H
@09H RF<-(RX)+(Rs)
BM=0,NA=001010,D/S=1,GRSoe=01,PSW=1,RFce=10,ALU=0010,即02AE2H
@0AH,Rd<-RF
BM=0,NA=111111,D/S=0,RFoe=10,PSW=0,GRSce=01,ALU=0000,即0FD10H
所以:@08H024B0H#@09H02AE2H@0AH0FD10H
21填空(2分)
写出指令AND R3,R1的微程序
得分/总分
@0CH034B0H#@0DH03AE3H@0EH0FD10H
正确答案:@0CH034B0H#@0DH03AE3H@0EH0FD10H
解析: AND R3,R1
@0CH RX<-(Rd)
BM=0,NA=001101,D/S=0,GRSoe=01,PSW=0,RXce=11,ALU=0000,即034B0H
@0DH RF<-(RX)+(Rs)
BM=0,NA=001110,D/S=1,GRSoe=01,PSW=1,RFce=10,ALU=0011,即03AE3H
@0EH,Rd<-RF
BM=0,NA=111111,D/S=0,RFoe=10,PSW=0,GRSce=01,ALU=0000,即0FD10H
所以:@0CH034B0H#@0DH03AE3H@0EH0FD10H
22填空(2分)
写出指令OR R3,R1的微程序
得分/总分
@10H044B0H#@11H04AE4H@12H0FD10H
正确答案:@10H044B0H#@11H04AE4H@12H0FD10H
解析: OR R3,R1
@10H RX<-(Rd)
BM=0,NA=010001,D/S=0,GRSoe=01,PSW=0,RXce=11,ALU=0000,即044B0H
@11H RF<-(RX)+(Rs)
BM=0,NA=010010,D/S=1,GRSoe=01,PSW=1,RFce=10,ALU=0100,即04AE4H
@12H,Rd<-RF
BM=0,NA=111111,D/S=0,RFoe=10,PSW=0,GRSce=01,ALU=0000,即0FD10H
所以:@10H044B0H#@11H04AE4H@12H0FD10H
23填空(2分)
写出指令XOR R3,R1的微程序
得分/总分
@14H054B0H#@15H05AE5H@16H0FD10H
正确答案:@14H054B0H#@15H05AE5H@16H0FD10H
解析: XOR R3,R1
@14H RX<-(Rd)
BM=0,NA=010101,D/S=0,GRSoe=01,PSW=0,RXce=11,ALU=0000,即054B0H
@15H RF<-(RX)+(Rs)
BM=0,NA=010110,D/S=1,GRSoe=01,PSW=1,RFce=10,ALU=0101,即05AE5H
@16H,Rd<-RF
BM=0,NA=111111,D/S=0,RFoe=10,PSW=0,GRSce=01,ALU=0000,即0FD10H
所以:@14H054B0H#@15H05AE5H@16H0FD10H
实验代码
VirtualBoard.sv
`default_nettype none module VirtualBoard ( input logic CLOCK, // 10 MHz Input Clock input logic [19:0] PB, // 20 Push Buttons, logical 1 when pressed input logic [35:0] S, // 36 Switches output logic [35:0] L, // 36 LEDs, drive logical 1 to light up output logic [7:0] SD7, // 8 common anode Seven-segment Display output logic [7:0] SD6, output logic [7:0] SD5, output logic [7:0] SD4, output logic [7:0] SD3, output logic [7:0] SD2, output logic [7:0] SD1, output logic [7:0] SD0 ); /********* Seven-segment decoder instantiation **********/ logic [3:0] HD[7:0]; // 8 hexadecimal display SevenSegDecode ssdecode_inst7(.iData(HD[7]), .oSeg(SD7)); SevenSegDecode ssdecode_inst6(.iData(HD[6]), .oSeg(SD6)); SevenSegDecode ssdecode_inst5(.iData(HD[5]), .oSeg(SD5)); SevenSegDecode ssdecode_inst4(.iData(HD[4]), .oSeg(SD4)); SevenSegDecode ssdecode_inst3(.iData(HD[3]), .oSeg(SD3)); SevenSegDecode ssdecode_inst2(.iData(HD[2]), .oSeg(SD2)); SevenSegDecode ssdecode_inst1(.iData(HD[1]), .oSeg(SD1)); SevenSegDecode ssdecode_inst0(.iData(HD[0]), .oSeg(SD0)); /************** The declaration of signals **************/ wire reset; wire clk; wire [3:0] BUS, RX_Q, F, RF_Q, GRS_Q; wire [3:0] FLAG, PSW_Q; wire [3:0] ALUop; wire GRSce, RXce, RFce, PSWce; wire DATAoe, GRSoe, RFoe; wire SRC; wire [3:0] DATA; wire [1:0] index, Rs, Rd; wire [3:0] OPCODE; wire [5:0] uAR_Q, next_addr; wire [16:0] uI; wire [5:0] uAG_Out; wire branch_mode; /** The input port is replaced with an internal signal **/ assign reset = PB[0]; assign clk = PB[1]; assign DATA = S[3:0]; assign Rs = S[1:0]; assign Rd = S[5:4]; assign OPCODE = S[9:6]; /************* The logic of this experiment *************/ //微地址形成 uAG uAG_inst(.uAGOut(uAG_Out), .OPCODE(OPCODE), .NA(next_addr), .BM(branch_mode)); //微地址寄存器 uAR #(6) uAR_inst(.oQ(uAR_Q), .iD(uAG_Out), .Clk(clk), .Reset(reset)); //控制存储器 ROM CM(.iAddress(uAR_Q), .oData(uI)); //微指令译码 wire NOP1, NOP2; assign branch_mode = uI[16]; assign next_addr = uI[15:10]; assign SRC = uI[9]; assign {DATAoe, RFoe, GRSoe, NOP2} = 2**uI[8:7]; assign PSWce = uI[6]; assign {RXce, RFce, GRSce, NOP1} = 2**uI[5:4]; assign ALUop = uI[3:0]; //运算器数据通路 ALU #(4) ALU_inst(.iOp(ALUop), .iX(RX_Q), .iY(BUS), .oF(F), .oFlag(FLAG), .Cin(PSW_Q[0])); assign index = SRC ? Rs : Rd; GRS #(4) GRS_inst(.iD(BUS), .oQ (GRS_Q), .Load(GRSce), .Clk(clk), .Index(index)); DataReg #(4) RX_inst(.oQ(RX_Q), .iD(BUS), .Clk(clk), .Load(RXce), .Reset(reset)); DataReg #(4) RF_inst(.oQ(RF_Q), .iD(F), .Clk(clk), .Load(1'b1), .Reset(reset)); DataReg #(4) PSW_inst(.oQ(PSW_Q), .iD(FLAG), .Clk(clk), .Load(PSWce ), .Reset(reset)); assign BUS = RFoe ? RF_Q : 4'bzzzz; assign BUS = GRSoe ? GRS_Q : 4'bzzzz; assign BUS = DATAoe ? DATA : 4'bzzzz; /****** Internal signal assignment to output port *******/ assign HD[7] = {2'b00,next_addr[5:4]}; assign HD[6] = next_addr[3:0]; assign HD[5] = RX_Q; assign HD[4] = BUS; assign HD[3] = GRS_Q; assign HD[2] = DATA; assign HD[1] = RF_Q; assign HD[0] = F; assign L[35:30] = uAG_Out[5:0]; assign L[29:24] = uAR_Q[5:0]; assign L[23:20] = PSW_Q; assign L[19:18] = index; assign L[17] = DATAoe; assign L[16] = GRSoe; assign L[15] = RFoe; assign L[14] = GRSce; assign L[13] = RXce; assign L[12] = PSWce; assign L[11] = RFce; assign L[10] = SRC; // assign L[6] = ; // assign L[5] = assign L[4] = branch_mode; assign L[3:0] = ALUop; endmodule
ALU.sv
`default_nettype none module ALU #(parameter N=4) ( input logic [N-1:0] iX,iY, input logic [3:0] iOp, input logic Cin, output logic [N-1:0] oF, output logic [3:0] oFlag ); /** The input port is replaced with an internal signal **/ logic M0; logic M1; logic M2; logic M3; logic SL; logic SV; logic SR; logic SS1; logic SS0; logic [8:0] oSeg; always_comb begin case(iOp) 4'h0:oSeg=9'b010000000; 4'h1:oSeg=9'b010000100; 4'h2:oSeg=9'b010011000; 4'h3:oSeg=9'b000000101; 4'h4:oSeg=9'b000000110; 4'h5:oSeg=9'b000000111; 4'h8:oSeg=9'b000001111; 4'h6:oSeg=9'b100000000; 4'h7:oSeg=9'b001000000; 4'hB:oSeg=9'b010100100; 4'hC:oSeg=9'b010101000; 4'h9:oSeg=9'b010010000; 4'hA:oSeg=9'b010001100; default:oSeg=9'bx; endcase end assign {SR,SV,SL,M3,M2,M1,M0,SS1,SS0}=oSeg[8:0]; /************* The logic of this experiment *************/ wire [3:0] A,B,F; wire C0; wire sign, zero, overflow, carryOut; assign A[3]=iX[3]&SR|iX[3]&SV|iX[2]&SL; assign A[2]=iX[3]&SR|iX[2]&SV|iX[1]&SL; assign A[1]=iX[2]&SR|iX[1]&SV|iX[0]&SL; assign A[0]=iX[1]&SR|iX[0]&SV|0&SL; assign B = (iY&{4{M0}})|(~iY&{4{M1}}); assign C0 = M2|(Cin&M3); logic [4:0] result; assign {carryOut,F[3:0]} = A + B + C0; assign sign = F[3]; assign zero = (F==0) ? 1 : 0; // ~|F; assign overflow = (~A[3]) & ~B[3] & F[3] | (A[3]) & B[3] & ~F[3]; /****** Internal signal assign to output port *******/ assign oFlag= {sign, zero, overflow, carryOut}; always_comb begin case ({SS1,SS0}) 2'b00: result=A+B+C0; 2'b01: result=iX&B; 2'b10: result=iX|B; 2'b11: result=iX^B; default: result={5{1'bx}}; endcase end assign oF=result; endmodule
uAG.sv
module uAG ( output logic [5:0] uAGOut, input logic [3:0] OPCODE, input logic [5:0] NA, input logic BM ); // 在下面写出微地址形成逻辑的设计 always_comb begin case (BM) 1'b0: uAGOut=NA; 1'b1: uAGOut={OPCODE[3:0],2'b00}; default: uAGOut={6{1'bx}}; endcase end endmodule
uAR.sv
module uAR #(parameter N = 6) ( output reg [N-1:0] oQ, input wire [N-1:0] iD, input wire Clk, input wire Reset ); always @(posedge Clk or posedge Reset) begin if (Reset) oQ = {N{1'b1}}; else oQ = iD; end endmodule
ROM.sv
module ROM ( input wire [5:0] iAddress, output wire [16:0] oData ); reg [16:0] mem[63:0]; assign oData = mem[iAddress]; initial $readmemb("uprogram.txt",mem); endmodule
uprogram.txt
//格式:@十六进制地址 二进制数据 //在下面插入新行,添加微程序代码。地址可以不连续,但必须由小到大。 // @00 00000011010110000 @01 00000100001100000 @02 01111110100010000 @04 00001010010110000 @05 00001101011100001 @06 01111110100010000 @08 00010010010110000 @09 00010101011100010 @0A 01111110100010000 @0C 00011010010110000 @0D 00011101011100011 @0E 01111110100010000 @10 00100010010110000 @11 00100101111100100 @12 01111110100010000 @14 00101010010110000 @15 00101101011100101 @16 01111110100010000 @3C 01111110110010000 @3F 10000000000000000