基于Verilog HDL与虚拟实验平台的计算机组成与CPU实验第十四章:硬布线控制器

简介: 基于Verilog HDL与虚拟实验平台的计算机组成与CPU实验第十四章:硬布线控制器

1单选(2分)

‎在单总线数据通路实验中,运算过程是通过_________产生ALUop、RXce等一系列控制信号完成的,这次实验的运算过程通过______控制信号完成。

得分/总分

A.开关手工输入,存储器产生

B.存储器产生,开关手工输入

C.硬布线控制器产生,开关手工输入

D.开关手工输入,硬布线控制器产生

正确答案:D

2单选(2分)

‌我们为这个实验设计的指令系统中,指令字占_______个二进制位,分为_______个字段。‎

‌_______是指令操作码OPCODE,用来区分指令的功能;

‌_______用来指示目的操作数的寄存器号 ;‎

‌IR[7:4]的作用是_______。‎

得分/总分

A.14,5,IR[3:0],IR[13:12],提供立即数DATA

B.12,5,IR[9:6],IR[11:10],指示源操作数的寄存器号

C.12,4,IR[9:6],IR[7:6],指示源操作数的寄存器号或者提供立即数DATA

D.14,4,IR[3:0],IR[9:8],提供立即数DATA

正确答案:A

3多选(3分)

实验设计了哪几种类型的指令‌

得分/总分

A.R型

B.B型

C.U型

D.I型

正确答案:A、D

4填空(2分)

根据指令编码,R型和I型指令可以通过opcode________(最高位/最低位)进行区分。‌

得分/总分

最高位

正确答案:最高位

5填空(2分)

‎R型指令的第二个操作数来自________(寄存器/立即数)。

得分/总分

寄存器

正确答案:寄存器

6填空(2分)

‍I型指令的第二个操作数来自________(寄存器/立即数)。

得分/总分

立即数

正确答案:立即数

7填空(2分)

‎加1指令(INC)在这个指令集中,可以使用________指令实现。

‎(ADD/SUB/AND/OR/XOR/ADDI/SUBI/ANDI/ORI/XORI)

得分/总分

ADDI

正确答案:ADDI

8填空(2分)

‍减1指令(DEC)在这个指令集中,可以使用________指令实现。

‍(ADD/SUB/AND/OR/XOR/ADDI/SUBI/ANDI/ORI/XORI)

得分/总分

SUBI

正确答案:SUBI

9填空(2分)

逻辑非(NOT)在这个指令集中,可以使用________指令实现。

(ADD/SUB/AND/OR/XOR/ADDI/SUBI/ANDI/ORI/XORI)

得分/总分

XORI

正确答案:XORI

10填空(2分)

传送(MOV)在这个指令集中,可以使用ADD指令和________(R0/R1/R2/R3)寄存器配合实现。

得分/总分

R0

正确答案:R0

实验代码

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 input port is replaced with an internal signal **/
wire reset  = PB[0];
wire clk    = PB[1];
wire [1:0] write_addr = S[13:12];
wire [1:0] read_addr1 = S[11:10];
wire [1:0] read_addr2 = S[9:8];
wire [3:0] imm_data = S[7:4];
wire [3:0] opcode = S[3:0];
//各模块间连线信号
wire [3:0] alu_result, alu_y, read_data1, read_data2;
wire [3:0] flag;
wire write_enable;
wire immToALU;
wire [3:0] ALUctrl;
/************* The logic of this experiment *************/
/*- 
    在这里写出控制器的逻辑设计
-*/
assign write_enable=1;
assign immToALU=opcode[3];
always_comb
 begin 
  case(opcode[2:0])
   3'b001:ALUctrl=4'b0000;
  3'b010:ALUctrl=4'b0100;
  3'b011:ALUctrl=4'b0001;
  3'b100:ALUctrl=4'b0010;
  3'b101:ALUctrl=4'b0011;
default:ALUctrl=4'bx;
endcase
end
// 数据通路部分
assign alu_y = immToALU ? imm_data : read_data2;
RegFile #(4) regfile(.Clk(clk),.iWE(write_enable),.iWA(write_addr),
        .iRA1(read_addr1),.iRA2(read_addr2),.iWD(alu_result),.oRD1(read_data1),.oRD2(read_data2));
sALU #(4) salu(.iX(read_data1),.iY(alu_y),.iCtrl(ALUctrl),.oF(alu_result),.oFlag(flag));
/*- 
    实例化单周期数据通路实验中的sALU模块和寄存器堆模块。
    ALU ...
    RegFile ...  
-*/
/****** Internal signal assignment to output port *******/
assign HD[0] = alu_y;
assign HD[1] = read_data1;
assign HD[2] = read_data2;
assign HD[3] = alu_result;
assign L[21:18] = flag;
assign L[5] = write_enable;
assign L[4] = immToALU;
assign L[3:0] = ALUctrl;
endmodule

Regfile.sv

`default_nettype none 
module RegFile
#(parameter N=4)
 (
    input logic Clk,
   input logic iWE,
   input logic [1:0] iWA,iRA1,iRA2,
   input logic [N-1:0] iWD,
   output logic [N-1:0] oRD1,oRD2
);
/********* Seven-segment decoder instantiation **********/
// 2-4 decode
logic load3, load2, load1, load0;
always_comb begin
    if (iWE)
        case (iWA)
            2'b00: {load3, load2, load1, load0} = 4'b0001;
        2'b01: {load3, load2, load1, load0} = 4'b0010;
        2'b10: {load3, load2, load1, load0} = 4'b0100;
        2'b11: {load3, load2, load1, load0} = 4'b1000; 
            default: {load3, load2, load1, load0} = 4'bx;
        endcase
    else
        {load3, load2, load1, load0} = 4'b0000;
end
// register instantiation
logic [N-1:0] R0_Q, R1_Q, R2_Q, R3_Q;
DataReg #(N) R0(.oQ(R0_Q), .iD(iWD), .Clk(Clk), .Load(load0), .Reset(1'b0));
DataReg #(N) R1(.oQ(R1_Q), .iD(iWD), .Clk(Clk), .Load(load1), .Reset(1'b0));
DataReg #(N) R2(.oQ(R2_Q), .iD(iWD), .Clk(Clk), .Load(load2), .Reset(1'b0));
DataReg #(N) R3(.oQ(R3_Q), .iD(iWD), .Clk(Clk), .Load(load3), .Reset(1'b0));
 always_comb begin
  case (iRA1)
    2'b00 : oRD1=R0_Q;
    2'b01 : oRD1=R1_Q;
    2'b10 : oRD1=R2_Q;
    2'b11 : oRD1=R3_Q;
    default : oRD1=4'bx;
  endcase
  case (iRA2)
    2'b00 : oRD2=R0_Q;
    2'b01 : oRD2=R1_Q;
    2'b10 : oRD2=R2_Q;
    2'b11 : oRD2=R3_Q;
    default : oRD2=4'bx;
  endcase
end
endmodule

sALU.sv

`default_nettype none 
module sALU
#(parameter N=4)
 (
    input logic [N-1:0] iX,iY,
   input logic [2:0] iCtrl,
   output logic [N-1:0] oF,
   output logic [3:0] oFlag
); 
wire M0=iCtrl[2];
wire S1=iCtrl[1];
wire S0=iCtrl[0];
wire [N-1:0] A,F;
wire C0=M0;
assign A=iX;
wire [N-1:0] B=iY^{N{M0}};
logic [N:0] result;
always_comb
begin
  case({S1,S0})
    2'b00:result=A+B+C0;
    2'b01:result=iX&B;
    2'b10:result=iX|B;
    2'b11:result=iX^B;
    default:result={(N+1){1'bx}};
  endcase
end
assign oF=result[N-1:0];
wire sign,zero,overflow,carryOut;
assign sign=F[N-1];
assign zero=~(|F);
assign overflow=~A[N-1]&~B[N-1]&F[N-1]|A[N-1]&B[N-1]&~F[N-1];
assign carryOut=result[N];
assign oFlag={sign,zero,overflow,carryOut};
endmodule


目录
相关文章
|
2月前
|
存储 缓存 并行计算
CPU组成元素:运算器+控制器(一)
CPU组成元素:运算器+控制器
70 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控制器设计的基本概念,并感受到从零开始构建计算机核心部件的挑战与乐趣。
99 1
【自己动手画CPU】控制器设计(一)
|
10月前
|
Ubuntu 网络虚拟化 Windows
国产化之虚拟ARM64-CPU安装银河麒麟操作系统
国产化之虚拟ARM64-CPU安装银河麒麟操作系统
871 0
|
12月前
|
前端开发 rax
实验一:查看CPU和内存,用机器指令和汇编指令编程
实验一:查看CPU和内存,用机器指令和汇编指令编程
155 0