基于Verilog HDL与虚拟实验平台的【计算机组成】与CPU实验第十四章:硬布线控制器
1单选(2分)在单总线数据通路实验中,运算过程是通过_________产生ALUop、RXce等一系列控制信号完成的,这次实验的运算过程通过______控制信号完成。得分/总分A.开关手工输入,存储器产生B.存储器产生,开关手工输入C.硬布线控制器产生,开关手工输入D.开关手工输入,硬布线控制器产生正确答案:D2单选(2分)我们为这个实验设计的指令系统中,指令字占_______个二进制位,分为
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

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)