【计算机组成原理】实验1:定点加法和定点乘法(Verilog)中海大

【计算机组成原理】实验1

        使用Verilog语言实现定点加法和定点乘法,测试平台:Vivado

1. 代码:

①定点加法:

adder.v:

`timescale 1ns / 1ps
module adder(
    input  [31:0] operand1,
    input  [31:0] operand2,
    input         cin,
    output [31:0] result,
    output        cout
    );
assign {cout,result} = operand1 + operand2 + cin;
endmodule

testbench.v:

`timescale 1ns / 1ps
module testbench;
    // Inputs
    reg [31:0] operand1;
    reg [31:0] operand2;
    reg cin;

    // Outputs
    wire [31:0] result;
    wire cout;
    // Instantiate the Unit Under Test (UUT)
    adder uut (
        .operand1(operand1), 
        .operand2(operand2), 
        .cin(cin), 
        .result(result), 
        .cout(cout)
    );
    initial begin
        // Initialize Inputs
        operand1 = 0;
        operand2 = 0;
        cin = 0;
        // Wait 100 ns for global reset to finish
        #100;
        // Add stimulus here
    end
    always #10 operand1 = $random; 
    always #10 operand2 = $random; 
    always #10 cin = {$random} % 2;
endmodule

 

定点乘法:

multiply.v:

`timescale 1ns / 1ps
module multiply(              // 乘法器
    input         clk,        // 时钟
    input         mult_begin, // 乘法开始信号
    input  [31:0] mult_op1,   // 乘法源操作数1
    input  [31:0] mult_op2,   // 乘法源操作数2
    output [63:0] product,    // 乘积
    output        mult_end    // 乘法结束信号
);

    //乘法正在运算信号和结束信号
    reg mult_valid;
    assign mult_end = mult_valid & ~(|multiplier); //乘法结束信号:乘数全0
    always @(posedge clk)
    begin
        if (!mult_begin || mult_end)
        begin
            mult_valid <= 1'b0;
        end
        else
        begin
            mult_valid <= 1'b1;
        end
    end

    //以下:两个源操作取绝对值,正数的绝对值为其本身,负数的绝对值为取反加1
    wire        op1_sign;      //操作数1的符号位
    wire        op2_sign;      //操作数2的符号位
    wire [31:0] op1_absolute;  //操作数1的绝对值
    wire [31:0] op2_absolute;  //操作数2的绝对值
    // 这里需要补充 wire变量赋初值
    assign op1_sign = mult_op1[31];
    assign op2_sign = mult_op2[31];
    assign op1_absolute = op1_sign ? (~mult_op1 + 1) : mult_op1;
    assign op2_absolute = op2_sign ? (~mult_op2 + 1) : mult_op2;

    //以下:加载被乘数,运算时每次左移一位
    reg  [63:0] multiplicand;
    always @ (posedge clk)
    begin
        if (mult_valid)
        begin    // 如果正在进行乘法,则被乘数每时钟左移一位
            multiplicand <= {multiplicand[62:0],1'b0};
        end
        else if (mult_begin) 
        begin   // 乘法开始,加载被乘数,为乘数1的绝对值
            multiplicand <= {32'd0,op1_absolute};
        end
    end

    //以下:加载乘数,运算时每次右移一位
    reg  [31:0] multiplier;
    //这里需要补充 乘数的赋值
    always @ (posedge clk)
    begin
        if(mult_valid)
        begin           //如果正在进行乘法,则乘数每时钟右移一位
            multiplier <= {1'b0,multiplier[31:1]}; 
        end
        else if(mult_begin)
        begin       //乘法开始,加载乘数,为乘数2的绝对值
            multiplier <= op2_absolute;
        end
    end

    // 以下:部分积--乘数末位为1,由被乘数左移得到;乘数末位为0,部分积为0
    wire [63:0] partial_product;
    // 这里需要补充 部分积的赋初值
    assign partial_product = multiplier[0] ? multiplicand : 64'd0;
    
    //以下:累加器
    reg [63:0] product_temp;
    always @ (posedge clk)
    begin
        if (mult_valid)
        begin
            product_temp <= product_temp + partial_product;
        end
        else if (mult_begin) 
        begin
            product_temp <= 64'd0;  // 乘法开始,乘积清零 
        end
    end 
     
    //以下:乘法结果的符号位和乘法结果
    reg product_sign;
    //这里需要补充 reg变量符号位的赋值和乘法结果的赋值
    always @ (posedge clk)
    begin
        if (mult_valid)
        begin
              product_sign <= op1_sign ^ op2_sign;
        end
    end 
    assign product = product_sign ? (~product_temp+1) : product_temp;
    
endmodule

testbench.v:

`timescale 1ns / 1ps
module tb;
    // Inputs
    reg clk;
    reg mult_begin;
    reg [31:0] mult_op1;
    reg [31:0] mult_op2;

    // Outputs
    wire [63:0] product;
    wire mult_end;

    // Instantiate the Unit Under Test (UUT)
    multiply uut (
        .clk(clk), 
        .mult_begin(mult_begin), 
        .mult_op1(mult_op1), 
        .mult_op2(mult_op2), 
        .product(product), 
        .mult_end(mult_end)
    );

    initial begin
        // Initialize Inputs
        clk = 0;
        mult_begin = 0;
        mult_op1 = 0;
        mult_op2 = 0;

        #500;
        mult_begin = 1;
        mult_op1 = 32'H00001111;
        mult_op2 = 32'H00003333; 
        #400;
        mult_begin = 0;

    end
   always #5 clk = ~clk;
endmodule

 

②仿真图像及其分析:

1、加法器:

operand1 + opreand2 = result

a82c66c14f9c4fb796b94fbc4ea27c0e.png

2、乘法器:

        当mult_end=1时 ,product的值等于两个操作数(mult_op1、muilt_op2)的乘积。

adb6c132f71a4eb995aa3717c46bb33d.png

--------------------------------------------------------------------------------------------------------------------------------

白泠Infinity

 

  • 8
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 计算机组成原理MIPS大作业是关于使用Verilog语言实现MIPS指令集的设计与开发。MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集(RISC)架构,广泛应用于嵌入式系统和大规模计算机。 在这个大作业,我们需要使用Verilog语言来实现MIPS处理器的核心功能,包括指令译码、数据通路、控制单元等。首先,我们需要根据MIPS指令集的格式和规则,设计和编写Verilog模块来进行指令译码,将二进制指令解析为对应的操作码和操作数。同时,我们还需要设计和实现数据通路,包括寄存器堆、ALU(算术逻辑单元)、数据存储器等,用于执行指令的操作并存储数据。最后,我们还需要设计和编写控制单元,通过产生控制信号来驱动数据通路的操作。 在实现过程,我们需要注意保持指令的顺序和正确性,确保每一条指令的执行都符合MIPS指令集的规则。我们还需要进行仿真和测试,使用Verilog的仿真工具来模拟和验证实现的正确性。 此外,为了进一步提升处理器的性能,我们可以添加流水线和多级缓存等技术来提高指令的执行效率。流水线可以将指令的执行划分为多个阶段,使得每个阶段可以并行执行,从而提高处理器的吞吐量。而多级缓存可以通过提前缓存数据,减少对主存的访问时间,进一步加快指令的执行速度。 总之,计算机组成原理MIPS大作业是一个重要且具有挑战性的项目,需要我们熟练掌握Verilog语言和MIPS指令集,通过设计与实现MIPS处理器的核心结构和功能,来加深对计算机组成原理的理解和实践。 ### 回答2: 计算机组成原理MIPS大作业Verilog是一门以硬件描述语言Verilog实现MIPS指令集的课程项目。MIPS指令集是一种经典的RISC指令集架构,由于其简洁、清晰的设计,常被用于CPU、嵌入式系统等领域。 该大作业的主要目标是使用Verilog HDL编写一个能够正确执行MIPS指令集的CPU模拟器。实现一个完整的CPU模拟器是一个复杂而庞大的工程,需要包含一系列功能模块,如指令存储器、数据存储器、寄存器组、ALU等。 在实现过程,首先需要了解MIPS指令集的特点和功能,包括指令的格式、指令的执行过程及指令的功能。然后按照MIPS指令集的要求,设计并编写各种功能模块的Verilog代码。同时,还需要设计合适的时钟控制电路和数据通路,以确保指令能够按顺序、正确地执行。最后,进行功能验证和测试,验证所写的模块能够正确地执行各种MIPS指令。 在实现过程,还需要注意一些细节,如处理异常和断、支持乘法和除法指令、实现流水线等。这些都是实际的CPU设计常见的问题。 通过完成这个大作业,可以深入理解计算机组成原理的各个概念和原理,并通过实践掌握Verilog HDL编程技能。此外,通过调试和测试,还可以提高自己的问题解决能力和团队协作能力。 总而言之,计算机组成原理MIPS大作业Verilog是一个能够锻炼自己对计算机硬件设计、MIPS指令集和Verilog HDL编程的综合能力的项目。完成该大作业可以提高我们对计算机原理的理解,并为后续的学习和研究打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值