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

Logo

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

更多推荐