基于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


目录
相关文章
|
6月前
|
存储 缓存 并行计算
CPU组成元素:运算器+控制器(一)
CPU组成元素:运算器+控制器
1221 0
|
6月前
|
存储 数据处理 vr&ar
②CPU - 运算器、控制器 【软考-软件设计师考点】
②CPU - 运算器、控制器 【软考-软件设计师考点】
238 0
|
人工智能 并行计算 openCL
魔搭+Xinference 平台:CPU,GPU,Mac-M1多端大模型部署
随着 Llama2 的开源,以及通义千问、百川、智谱等国内大模型的问世,很多用户有了本地部署去尝试大模型的需求,然而硬件的需求阻碍了很多人的尝试,并不是所有人都拥有一块英伟达显卡的,所以 Llama2 问世不久,大神 Andrej Karpathy 的一个 weekend project 爆火——llama2.c。
魔搭+Xinference 平台:CPU,GPU,Mac-M1多端大模型部署
|
2月前
|
Linux
使用funcgraph-retval和bpftrace/kprobe快速定位并解决cpu控制器无法使能的问题
使用funcgraph-retval和bpftrace/kprobe快速定位并解决cpu控制器无法使能的问题
|
6月前
|
存储 缓存 调度
CPU组成元素:运算器+控制器(二)
CPU组成元素:运算器+控制器
122 0
|
5月前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
|
4月前
|
机器学习/深度学习 TensorFlow API
Keras是一个高层神经网络API,由Python编写,并能够在TensorFlow、Theano或CNTK之上运行。Keras的设计初衷是支持快速实验,能够用最少的代码实现想法,并且能够方便地在CPU和GPU上运行。
Keras是一个高层神经网络API,由Python编写,并能够在TensorFlow、Theano或CNTK之上运行。Keras的设计初衷是支持快速实验,能够用最少的代码实现想法,并且能够方便地在CPU和GPU上运行。
|
6月前
|
存储
【头歌·计组·自己动手画CPU】四、控制器设计(理论版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】四、控制器设计(理论版) 【计算机硬件系统设计】
218 0
|
6月前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能平台PAI产品使用合集之如何在CPU服务器上使用PAIEasyRec进行分布式训练
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
6月前
|
开发框架 .NET Java
【自己动手画CPU】控制器设计(一)
《自己动手画CPU》系列博文探讨了一项令人兴奋的计算机科学项目——CPU控制器的设计。在第一篇文章中,作者深入介绍了控制器的设计理念和基本原理。文章首先解释了CPU控制器在计算机系统中的关键作用,然后详细讨论了设计过程中的重要步骤和考虑因素。通过作者的生动解说,读者将了解到CPU控制器设计的基本概念,并感受到从零开始构建计算机核心部件的挑战与乐趣。
236 1
【自己动手画CPU】控制器设计(一)