基于Verilog HDL与虚拟实验平台的计算机组成与CPU实验第十三章:微程序控制器

简介: 基于Verilog HDL与虚拟实验平台的计算机组成与CPU实验第十三章:微程序控制器

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


目录
相关文章
|
2月前
|
存储 缓存 并行计算
CPU组成元素:运算器+控制器(一)
CPU组成元素:运算器+控制器
71 0
|
5月前
|
存储 数据处理 vr&ar
②CPU - 运算器、控制器 【软考-软件设计师考点】
②CPU - 运算器、控制器 【软考-软件设计师考点】
196 0
|
7月前
|
人工智能 并行计算 openCL
魔搭+Xinference 平台:CPU,GPU,Mac-M1多端大模型部署
随着 Llama2 的开源,以及通义千问、百川、智谱等国内大模型的问世,很多用户有了本地部署去尝试大模型的需求,然而硬件的需求阻碍了很多人的尝试,并不是所有人都拥有一块英伟达显卡的,所以 Llama2 问世不久,大神 Andrej Karpathy 的一个 weekend project 爆火——llama2.c。
魔搭+Xinference 平台:CPU,GPU,Mac-M1多端大模型部署
|
2月前
|
存储 缓存 调度
CPU组成元素:运算器+控制器(二)
CPU组成元素:运算器+控制器
45 0
|
3月前
|
安全 机器人
ABB PLC自动化可编程逻辑控制器PLC AC500型 CPU
ABB PLC自动化可编程逻辑控制器PLC AC500型 CPU
|
7月前
|
存储 调度
CPU 中控制器的作用
CPU 中控制器的作用
206 0
|
3月前
|
存储 开发框架 算法
【自己动手画CPU】控制器设计(二)
作者深入探讨了自制CPU的控制器设计,为自学者提供了宝贵的实践指导。文章详细介绍了控制器的设计原理与关键步骤,涵盖了寄存器的配置、指令的执行以及时序控制等方面内容。通过图文并茂的演示,读者可以清晰了解如何从零开始搭建一个基本的控制器,并使其能够执行简单的指令。作者以通俗易懂的方式呈现技术细节,使初学者能够轻松理解和模仿。
111 0
【自己动手画CPU】控制器设计(二)
|
3月前
|
开发框架 .NET Java
【自己动手画CPU】控制器设计(一)
《自己动手画CPU》系列博文探讨了一项令人兴奋的计算机科学项目——CPU控制器的设计。在第一篇文章中,作者深入介绍了控制器的设计理念和基本原理。文章首先解释了CPU控制器在计算机系统中的关键作用,然后详细讨论了设计过程中的重要步骤和考虑因素。通过作者的生动解说,读者将了解到CPU控制器设计的基本概念,并感受到从零开始构建计算机核心部件的挑战与乐趣。
102 1
【自己动手画CPU】控制器设计(一)
|
10月前
|
Ubuntu 网络虚拟化 Windows
国产化之虚拟ARM64-CPU安装银河麒麟操作系统
国产化之虚拟ARM64-CPU安装银河麒麟操作系统
871 0
|
12月前
|
前端开发 rax
实验一:查看CPU和内存,用机器指令和汇编指令编程
实验一:查看CPU和内存,用机器指令和汇编指令编程
155 0