实验目的

  • 理解定点乘法的不同实现算法的原理,掌握基本实现算法。
  • 熟悉并运用 Verilog 语言进行电路设计。
  • 为后续设计 CPU 的实验打下基础。

实验内容

定点乘法器有多种实现,实验要求实现迭代乘法器,其结构如图所示。

乘数每次右移一位,根据最低位,判断是加被乘数移位后的值还是加0,不停地累加,最后就得到乘积了。

可以看到迭代乘法是用多次加法完成乘法操作的,故需要多拍时间,其结束标志为乘数移位后为0,故对于32位乘法,最多需要32拍才能完成一次乘法。

原码一位乘

该迭代乘法器的运算过程与原码一位乘相似。

原码一位乘运算规则主要由两部分组成:

  • 乘积的符号位由两原码符号位异或运算结果决定。
  • 乘积的数值部分由两数绝对值相乘。

基本硬件配置框图

图中A、X、Q 均为 n +1位的寄存器,其中 X 存放被乘数的原码,Q 存放乘数的原码。移位和加控制电路受末位乘数 Q 的控制 (当 \(Q_n\) = 1 时,A 和 X 内容相加后,A,Q 右移一位; 当 \(Q_n\) = 0 时,只作 A、Q 右移一位的操作)。计数器 C 用于控制逐位相乘的次数。S 存放乘积的符号。\(G_M\)为乘法标记。

原码一位乘控制流程

乘法运算前,A 寄存器被清零,作为初始部分积,被乘数原码在 X 中,乘数原码在 Q 中,计数器 C 中存放乘数的位数 n。乘法开始后,首先通过异或运算,求出乘积的符号并存于 S,接着将被乘数和乘数从原码形式变为绝对值。然后根据Q的状态决定部分积是否加上被乘数,再逻辑右移一位,重复 n 次,即得运算结果。

设计代码

本乘法器,类似于原码一位乘。为了减少循环加法次数,添加了比较两因数的大小的部分。

所以主要流程如下:

  1. 初始化各信号,得出积的正负符号,将两因数的绝对值存于寄存器。
  2. 比较两因数的绝对值大小,符合条件交换,减少 加法次数
  3. 迭代加法运算,两因数的绝对值分别左移,右移运算。
  4. 加法迭代完成,输出信号。
module multiplier # (parameter WIDTH = 32)(
input sys_clk,
input rst_n,
input [WIDTH - 1 : 0] multiplicand, // 因数
input [WIDTH - 1 : 0] multiplier, // 因数
input start,
output [WIDTH * 2 - 1 : 0] mult_end,
output done
);
reg [WIDTH - 1 : 0] multiplicand_temp;
reg [WIDTH - 1 : 0] multiplier_temp;
reg [WIDTH * 2 - 1 : 0] product;
reg pos_neg_flag;
reg [1:0] i;
reg done_temp;
reg start_temp; assign mult_end = pos_neg_flag ? (~product + 1'b1) : product;
assign done = done_temp; always @(posedge sys_clk) begin
if (!rst_n) begin
done_temp <= 1'b0;
start_temp <= 1'b0;
end
else if (start) begin
start_temp <= start;
end
else if (done_temp) begin
start_temp <= 1'b0;
end
end always @(posedge sys_clk) begin
if (!rst_n) begin
multiplicand_temp <= 0;
multiplier_temp <= 0;
product <= 0;
i <= 2'b0;
end
else if (start_temp) begin
case (i)
0: begin
pos_neg_flag <= multiplicand[WIDTH - 1] ^ multiplier[WIDTH - 1];
multiplicand_temp[WIDTH - 1 : 0] <= multiplicand[WIDTH - 1] ? (~multiplicand + 1'b1) : multiplicand;
multiplier_temp <= multiplier[WIDTH - 1] ? (~multiplier + 1'b1) : multiplier;
i <= i + 1'b1;
end
1: begin // 交换大小,减小加法次数
{multiplicand_temp, multiplier_temp} <= (multiplicand_temp > multiplier_temp)?
{multiplicand_temp, multiplier_temp} : {multiplier_temp, multiplicand_temp};
i <= i + 1'b1;
end
2: begin
if (!multiplier_temp) begin
i <= i + 1'b1;
end
else begin // 加法
if (multiplier_temp[0]) begin
product <= product + multiplicand_temp;
end multiplier_temp <= {1'b0, multiplier_temp[WIDTH - 1 : 1]};
multiplicand_temp <= {multiplicand_temp[WIDTH - 2 : 0], 1'b0};
end
end
3: begin
done_temp <= 1'b1;
i <= 2'b0;
end
endcase
end
end endmodule

仿真

仿真仅有一个测试,\(12 \times -12\),结果应为\(-144\)。

`timescale 1ns / 1ps
module sim();
reg sys_clk;
reg rst_n;
reg start;
reg [31 : 0] multiplicand;
reg [31 : 0] multiplier;
wire [63 : 0] mult_end;
wire done; initial begin
sys_clk = 0;
forever #10 sys_clk = ~sys_clk;
end
initial begin
start = 1;
#1020 start = 0;
end initial begin
rst_n = 0;
#1000 rst_n = 1;
end initial begin
multiplicand = -32'd12;
end initial begin
multiplier = 32'd12;
end multiplier u0 (
.sys_clk(sys_clk),
.rst_n(rst_n),
.start(start),
.done(done),
.multiplicand(multiplicand),
.multiplier(multiplier),
.mult_end(mult_end)
);
endmodule

波形图

其他乘法器

  • Booth乘法器:更适合硬件实现的乘法器算法。
  • 华莱士树:通过面积换时间的方式实现并行加法。

参考文献

唐朔飞. 计算机组成原理[M]. 北京: 高等教育出版社, 2020.

Verilog实现定点乘法器的更多相关文章

  1. 基于Verilog HDL整数乘法器设计与仿真验证

    基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...

  2. 【转载】FPGA算法设计随笔

    FPGA设计算法依次需要完成MATLAB浮点仿真 MATLAB定点仿真 verilogHDL定点运算以及数据对比的流程.其中浮点到定点的转换尤为重要,需要在数据表示范围和精度之间做出权衡.另外掌握定点 ...

  3. 剑指Offer - 九度1506 - 求1+2+3+...+n

    剑指Offer - 九度1506 - 求1+2+3+...+n2013-11-29 19:22 题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switc ...

  4. Verilog乘法器

    乘法器,不能用乘号直接表示,略坑呀 坑归坑,做还是要做的 思路:首先乘法分为有符号乘与无符号乘,所以建立两个module分别运算有符号与无符号.然后在总module中用case语句判断输出应赋的值. ...

  5. [转载]【转】乘法器的Verilog HDL实现

      乘法器如果直接用*来实现的话,会消耗很多的资源.所以有了串行和并行两种实现思路.用串行的话,8位一般会有8位以上的延迟,但是消耗的资源是最少的.低速数据处理比较适合.并行也就是流水线方法,以时间换 ...

  6. verilog乘法器的设计

    在verilog编程中,常数与寄存器变量的乘法综合出来的电路不同于寄存器变量乘以寄存器变量的综合电路.知乎里的解释非常好https://www.zhihu.com/question/45554104, ...

  7. 乘法器的Verilog HDL实现(转载)

    原文地址:http://www.cnblogs.com/shengansong/archive/2011/05/23/2054401.html 1. 串行乘法器 两个N位二进制数x.y的乘积用简单的方 ...

  8. 乘法器的Verilog HDL实现

    原文链接:http://www.cnblogs.com/shengansong/archive/2011/05/23/2054401.html 1. 串行乘法器  两个N位二进制数x.y的乘积用简单的 ...

  9. 转载Verilog乘法器

    1. 串行乘法器 两个N位二进制数x.y的乘积用简单的方法计算就是利用移位操作来实现. module multi_CX(clk, x, y, result); input clk; input [7: ...

  10. 对Verilog 初学者比较有用的整理(转自它处)

    *作者: Ian11122840    时间: 2010-9-27 09:04                                                              ...

随机推荐

  1. web自动化05-鼠标操作

    鼠标操作方法   1.常见的鼠标操作   点击.右击.双击.悬停.拖拽等   2.selenium中的封装鼠标操作   说明:在Selenium中将操作鼠标的方法封装在ActionChains类中   ...

  2. 在树莓派上实现numpy的LSTM长短期记忆神经网络做图像分类,加载pytorch的模型参数,推理mnist手写数字识别

    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是LSTM识别mnist手写数字识别 训练代码在电脑上,cpu就能训练,很快的: import torch imp ...

  3. MySQL中都有哪些锁?

    MySQL中都有哪些锁 为什么需要锁 在计算机系统中,锁(Lock)是一种同步机制,用于控制对共享资源的访问.它确保在任何给定时间内只有一个线程能够访问受保护的共享资源,从而避免了由并发访问导致的数据 ...

  4. ElasticSearch的使用和介绍

    1.概述 功能 Elasticsearch 是一个分布式的 RESTful 搜索和分析引擎,可用来集中存储您的数据,以便您对形形色色.规模不一的数据进行搜索.索引和分析. 例如: 在电商网站搜索商品 ...

  5. 数据库中的可视化和探索性:MongoDB的数据可视化和探索性工具

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...

  6. Pinot2的无人机传感器和摄像头

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 无人机传感器和摄像头在Pinot 2中得到广泛应用,其目的是为Pinot 2提供全面的传感器和 ...

  7. WPF 入门笔记 - 06 - 命令

    我们把世界看错,反说它欺骗了我们. --飞鸟集 前言 相较而言,命令对我来说是一个新概念,因为在Winform中压根没有所谓的命令这个概念.从文字角度理解,"命令"可以指代一种明确 ...

  8. vue3 安装 3d-force-graph

    1.首先创建vue3的项目 2.创建好后通过开发工具打开项目并打开命令行,输入指令 npm install 3d-force-graph 安装即可 3.在使用的页面中引入 3d-force-graph ...

  9. Java扩展Nginx之二:编译nginx-clojure源码

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 为什么要编译nginx-clojure源码 作为< ...

  10. 【SpringBoot】注解

    Controller - @RestController - @RequestMapping("/path") Controller内方法 @GetMapping("/p ...