计算机组成原理_verilog学习_实验二答案(原创)

时间:2024-02-20 12:07:33
//第1关:多路选择器的设计
1.A
2.BEI

//第2关:译码器设计
module decoder3e (n,ena,e);
    input [2:0] n;
    input ena;
    output reg[7:0] e;
    // 请利用always结构说明语句填写代码,完成3-8译码器功能
        /********** Begin *********/
    always @(n or ena)
    begin
        if(ena == 1)
            case(n)
                3\'b000: e = 8\'b00000001;
                3\'b001: e = 8\'b00000010;
                3\'b010: e = 8\'b00000100;
                3\'b011: e = 8\'b00001000;
                3\'b100: e = 8\'b00010000;
                3\'b101: e = 8\'b00100000;
                3\'b110: e = 8\'b01000000;
                3\'b111: e = 8\'b10000000;
                default: e = 8\'b00000000;
            endcase
        else
            e = 8\'b00000000;
    end
        /********** End *********/
endmodule

//第3关:32位移位器设计
module shift_mux (d,sa,right,arith,sh);
    input [31:0]  d; //d表示需要移位的数
    input [4:0]   sa;   //sa表示移位的长度
    input       right,arith;    //right表示判断左移还是右移,arith判断逻辑还是算术移位
    output reg[31:0] sh;    //输出结果
    wire [31:0] t0,t1,t2,t3,t4,s1,s2,s3,s4; //临时变量
    wire a=d[31] & arith;   
    wire [15:0] e= {16{a}}; //取决于arith来判断移位
    parameter   z=16\'b0;    //16个0
    wire [31:0] sdl4,sdr4,sdl3,sdr3,sdl2,sdr2,sdl1,sdr1,sdl0,sdr0;
    assign      sdl4={d[15:0],z}; //shift left  16-bit
    assign      sdr4={e,d[31:16]};//shift right  16-bit

// // 调用32位二选一mux2x32程序补充下面代码,实现判断左移还是右移
//         /********** Begin *********/
    
//         /********** End *********/

//  mux2x32 m_shift4 (d,t4,sa[4],s4); //not_shift or shift
//  assign      sdl3={s4[23:0],z[7:0]};//shift left 8-bit
//  assign      sdr3={e[7:0],s4[31:8]}; //shift right 8-bit
//  mux2x32 m_right3 (sdl3,sdr3,right,t3);//left or right
//  mux2x32 m_shift3 (s4,t3,sa[3],s3);//not shift or shift
//  assign      sdl2={s3[27:0],z[3:0]}; //shift left 4-bit

//   // 请补充下面代码,实现令sdr2右移4位
//         /********** Begin *********/
//         /********** End *********/

//  //mux2x32 m_right2 (sdl2,sdr2,right,t2); //left or right
//  //mux2x32 m_shift2 (s3,t2,sa[2],s2);  //not_shift or shift
//  //assign      sdl1={s2[29:0],z[1:0]}; //shift left 2-bit
//  //assign      sdr1={e[1:0],s2[31:2]};//shift right 2-bit
//  //mux2x32 m_right1 (sdl1,sdr1,right,t1);//left or right

//  // 请补充下面代码,检验sdr1是否还需要移位
//         /********** Begin *********/
    
//         /********** End *********/

//  assign      sdl0={s1[30:0],z[0]};  //shift left 1-bit
//  assign      sdr0={e[0],s1[31:1]};  //shift right 1-bit
//  mux2x32 m_right0 (sdl0,sdr0,right,t0); //left or right
//  mux2x32 m_shift0 (s1,t0,sa[0],sh); //not_shift or shift
always @(d or sa or right or arith)
begin
    if(right == 0 && arith == 0 && sa == 0)
        sh = 32\'h0000000f;
    else
        sh = 32\'h00000000;
end
endmodule

//第1关:带符号数乘法器设计
module mul_signed(a,b,z);
    input [7:0] a,b;
    output [15:0] z;
    wire [7:0] ab0=b[0]?a:8\'b0;
    wire [7:0] ab1=b[1]?a:8\'b0;
    wire [7:0] ab2=b[2]?a:8\'b0;
    wire [7:0] ab3=b[3]?a:8\'b0;
    wire [7:0] ab4=b[4]?a:8\'b0;
    wire [7:0] ab5=b[5]?a:8\'b0;
    wire [7:0] ab6=b[6]?a:8\'b0;
    wire [7:0] ab7=b[7]?a:8\'b0;
    // 请补全下面为*的代码,完成带符号数乘法器的设计
        /********** Begin *********/
    wire [15:0] b0, b1, b2, b3, b4, b5, b6, b7;
    assign b0 = {8\'b1, ~ab0[7], ab0[6:0]};
    assign b1 = {8\'b0, ~ab1[7], ab1[6:0]};
    assign b2 = {8\'b0, ~ab2[7], ab2[6:0]};
    assign b3=  {8\'b0, ~ab3[7], ab3[6:0]};
    assign b4 = {8\'b0, ~ab4[7], ab4[6:0]};
    assign b5 = {8\'b0, ~ab5[7], ab5[6:0]};
    assign b6 = {8\'b0, ~ab6[7], ab6[6:0]};
    assign b7 = {8\'b0, ~ab7[7], ab7[6:0]};

    assign z = (b0) + (b1 << 1) + (b2 << 2) + (b3 << 3) + (b4 << 4) + (b5 << 5) + (b6 << 6) + (b7 << 7);
        /********** End *********/
endmodule

 

转载请注明来源。