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

这篇具有很好参考价值的文章主要介绍了【计算机组成原理】实验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

 文章来源地址https://www.toymoban.com/news/detail-724062.html

定点乘法:

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

vivado实现数据运算定点加法,计算机组成原理实验,硬件工程,嵌入式硬件

2、乘法器:

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

vivado实现数据运算定点加法,计算机组成原理实验,硬件工程,嵌入式硬件

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

白泠Infinity

 

到了这里,关于【计算机组成原理】实验1:定点加法和定点乘法(Verilog)中海大的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机组成原理3个实验-logisim实现“七段数码管”、“有限状态机控制的8*8位乘法器”、“单周期MIPS CPU设计”。

    目录 标题1.首先是七段数码管   标题二:有限状态机控制的8*8位乘法器 标题三:单周期MIPS CPU设计 1看一下实验要求:    2.接下来就是详细设计: 1. 组合逻辑设计        由于7段数码管由7个发光的数码管构成,因为我们想用二进制将0-9这几个数字表示出来。所以他需要

    2024年01月17日
    浏览(34)
  • 计算机组成原理实验

    上学期刚结束了计算机组成原理课程,在这里把上学期做过的实验都记录一下。这里一共有4个:海明码的编码和解码、ALU、字库、RAM。我们是使用的谭志虎:自己动手画CPU。 中间参考了很多大佬,我在gitee上fork一下原来的代码,再把我自己的上传到仓库中。这里贴一下我的

    2024年02月04日
    浏览(49)
  • 计算机组成原理实验——一、ALU实验

    1.掌握ALU模块的组成和接口,理解ALU的功 能。 2.通过编程调用ALU模块计算斐波那契数。 3.掌握Verilog中多模块编程方法和实现。 用 Verilog 设计一个算术运算单元 ALU,采 用纯组合逻辑设计,32bit 宽。 利用该 ALU 完成斐波那契数 f(n),其中 2n16。 可选 –改成3段式实现(已实现)

    2023年04月22日
    浏览(34)
  • 计算机组成原理实验(logisim)

      文章目录 目录 文章目录 实验一:Logisim软件的使用 实验二:数据的表示 1.汉字的编码实验: 实验三:运算器组成实验 1.多位串行加法器和多位可控加减电路的设计 2.快速加法器的设计 3.多位算术逻辑单元ALU设计 4.阵列乘法器设计 4.阵列除法器设计 实验四:存储系统综合实

    2024年02月03日
    浏览(32)
  • Hust计算机组成原理实验

    点击 资源栏-Gates 选项中的门电路,即可在右边画布添加 添加成功后如下: 引脚可在菜单栏中找到 也可在 资源栏-Wiring 中找到 添加入画板后,可在属性表中修改面向方向 最后得到如下图 注:方形为输出,圆形为输入。 使用 光标 连接两个结点即可 灰色:线的位宽未知。发

    2024年02月04日
    浏览(31)
  • 计算机组成原理实验——二、寄存器实验

    1.掌握寄存器堆的工作原理和接口。 2.掌握寄存器堆的实现方法。 3.掌握寄存器堆在微处理器中承担的功能。 设计一32*32bit 的寄存器文件,即32 个 32 位的寄存器文件(寄存器组) –具备两组读端口及一组写端口; –通过读端口可从0~31 号的任意地址读取 数据; –通过写端口可

    2024年02月06日
    浏览(36)
  • 计算机组成原理实验——三、存储器实验

    1.掌握存储器的工作原理和接口。 2.掌握存储器的实现方法和初始化方法。 3.掌握RISC-V中存储器的存取方式。 1.利用vivado IP核创建64 32的ROM,并在 系数文件中设置数据为123489ab; 2.利用vivado IP核创建64 32的RAM,并在 其上封装一个模块,使得其能完成risc-v 的load/store指令功能。

    2024年02月04日
    浏览(39)
  • 计算机组成原理实验 实验一 存储器实验

    目录 实验1  存储器实验 一、实验目的 二、实验原理 三、实验电路 四、实验步骤 五、实验数据分析 六、思考题 1.熟悉DVCC计算机组成原理实验机的结构,掌握其主要操作。 2.掌握静态随机存储器RAM工作特性。 3.掌握静态随机存储器RAM的数据读写方法。 4.能够运用静态随机存

    2023年04月18日
    浏览(46)
  • 计算机组成原理实验——实验1 运算器实验

    (1)掌握算术逻辑运算单元的工作原理。 (2)熟悉简单运算器的电路组成。 (3)熟悉4位运算功能发生器(74LS181)的算术、逻辑运算功能。 (1)做好实验预习,看懂电路图,熟悉实验中所用芯片各引脚的功能和连接方法。 (2)按照实验内容与步骤的要求,认真仔细地完

    2024年02月12日
    浏览(30)
  • 【计算机组成原理实验】CPU设计

    设计并实现一个简单处理器模型完成功能验证。 ASUS VivoBook + Windows10 + Vivado2019.2,语言为 Verilog HDL。 1. 处理器应基于 6.5 指令集或 MIPS 指令集或 RISCV 指令集进行设计或自行设计指令集。 2. 处理器的控制器结构应为微程序控制器或集硬布线控制器。 3. 处理器需支持算术运算、

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包