FPGA学习之路——原码二位乘法器及Verilog代码分析

原理

原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异。原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作。而原码二位乘则是对乘数的低二位进行判断,并执行相关操作。
两位乘数的取值可以有四种可能组合,每种组合对应于以下操作:

00相当于0×X,部分积Dresult右移2位,不进行其他运算;
01相当于1×X,部分积Dresult+x之后再右移两位;
10相当于2×X,部分积Dresult+2x后再右移两位;
11相当于3×X,部分积Dresult+3x后再右移两位;

上述过程出现了+x,+2x,+3x三种情况,+x容易实现,+2x可以将x左移一位,但是+3x一般不能在一个时钟周期完成,分两个时钟完成又降低运算速度。所以解决方法是:以+(4x-x)来代替+3x运算,在本次运算中执行-x,将+4x归并到下一步执行。因为下一步运算时,前一次的部分积已经右移了两位,所以上一步欠下的+4x在现在已经变成了+x。实际实现中用触发器C来记录是否有欠下的+4x操作尚未执行,若有,则C<=1。所以实际操作要用乘数的低两位和C三位的组合值来控制乘法运算操作,运算规则如下图所示。

计算过程

1、求乘数、被乘数的绝对值,对被乘数绝对值的相反数求补;初始化部分积为000.0000000(本文以8位数据为例,数点左边为3位符号位,右边7位为绝对值的数值位)
2、对乘数最高位补0,引入标志位C,C初始化为0。
3、根据表格判断相应操作,移位时先将乘数右移两位,高两位由部分积的低两位来补。
4、乘数移动完毕后,被乘数用补码三位符号位移位规则进行右移两位。
5、重复3、4步骤直到移位次数为乘数位数/2。
6、此时还不能得出结果,需要再次对乘数低两位和标志位C进行判断,执行最后一次操作,但乘数不进行移位。
7、结果组成为{乘数和被乘数符号位进行异或(1位),部分积的低6位,乘数8位(绝对值为7位,补完0后变8位)}共15位。

注意事项:
1、步骤2中,乘数位数是奇数位则补1位0即可;若乘数位数是偶数则最高位补2个0。
2、对部分积右移时,采用3位符号的补码形式移位,即最高位符号位不动,正数在最高位添0,负数在最高位添1。
3、表格中的-|x|操作即加上x绝对值相反数的补码。

举例:

Verilog源码分析(完整项目链接见文末)

input clk,en;              //取en对应的上升沿时刻对原码形式的dataA和dataB进行乘法运算
input [7:0] dataA,dataB;   //被乘数与乘数
output dataO;              //结果输出reg [10:0]dataAreg;        //寄存器存放取样时刻dataA的值  被乘数
reg [7:0]dataBreg;         //寄存器存放取样时刻dataB的值  乘数
reg [10:0]negdataAreg;     //存放被乘数绝对值的相反数的补码           -|x|的补码
reg [10:0]twodataAreg;     //存放被乘数绝对值的两倍                   2|x|
reg [10:0]Dresult;         //部分积
reg [10:0]Dresult1;        //部分积+\x\
reg [10:0]Dresult2;        //部分积+2\x\
reg [10:0]Dresult3;        //部分积-|x|
reg [2:0]cnt;              //计数子,记录移位次数
reg C;                     //标志位C
reg [14:0]dataO;           //输出结果
reg sig=1'b0;              //标志位,标志该时钟周期更新Dresult或是Dresult1、2、3//Dresult和Dresult1、2、3不可同时更新,他们互为基础,需按序更新
always @(posedge clk)beginif(en)begindataAreg<={1'b0,1'b0,1'b0,dataA[6:0]};                      //|x|negdataAreg<={1'b1,~{1'b0,1'b0,1'b0,dataA[6:0]}}+1'b1;      //-|x|的补码twodataAreg<={1'b0,1'b0,dataA[6:0],1'b0};                   //2|x|dataBreg<={1'b0,dataB[6:0]};                                //乘数Dresult<=11'b0;                                     Dresult1<={1'b0,1'b0,1'b0,dataA[6:0]};                      //Dresult1、2、3赋初值Dresult2<={1'b0,1'b0,dataA[6:0],1'b0};Dresult3<={1'b1,~{1'b0,1'b0,1'b0,dataA[6:0]}}+1'b1;C<=1'b0;cnt<=3'd1;end
end
always @(posedge clk)beginif(!en&sig)begin                      //未使能且是更新Dresult1、2、3的时钟周期Dresult1=Dresult+dataAreg;Dresult2=Dresult+twodataAreg;Dresult3=Dresult+negdataAreg;endif(!sig && (cnt!=3'b0))begin              //周期开始时,计数子从1记到5,记到5时乘数不进行移位操作。//且是更新Dresult1、2、3的时钟周期……//查表对部分积Dresult和乘数dataBreg进行更新endif(cnt==3'd5)begin                                     //进行数据输出cnt<=3'd0;dataO<={(dataA[7]^dataB[7]),Dresult[5:0],dataBreg[7:0]};endsig<=~sig;
end

仿真结果:

其中dataA,dataB和dataO的数据格式选择Signed Magnitude,原码格式。

实验心得

1、编写Verilog代码前先进行数据流程的分析,分析在每个时钟周期下数据的预期结果,再与波形图对比是否符合预期,如果不符,观察数据是否在紧接着的时钟周期出现。
2、摈弃C语言的顺序思维,好好分析数据的时序。可以引入标志位实现按序更新数据。如本例中引入sig标志位对Dresult和Dresult1、2、3依次进行更新。

项目链接

FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析相关推荐

  1. 计组中原码一位乘和原码二位乘方法和注意事项

    原码乘法可以分为原码一位乘和原码二位乘,两者在实现上规则大同小异 原码一位乘 原码一位乘采用数值位计算,符号位为两操作数异或结果.步骤如下: 对乘数和被乘数取绝对值(数值位不变,符号位换0) 初始化部 ...

  2. FPGA学习之路—接口(3)—SPI详解及Verilog源码分析

    FPGA学习之路--SPI详解及Verilog源码分析 概述 SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线. 优点 支持全 ...

  3. FPGA学习之路—接口(2)—I2C协议详解+Verilog源码分析

    FPGA学习之路--I2C协议详解+Verilog源码分析 定义 I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时 ...

  4. FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU

    FPGA学习之路--基于Verilog设计单总线8位ALU 定义 ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件, ...

  5. 原码一位乘法器设计_对原码、反码和补码的加深理解

    我们知道计算机语言可以简单概括为三类,分别是机器语言.汇编语言和高级语言.机器语言是由二进制组成的编码,由无数个0和1组成.在二进制系统中,每个0或1就是一个位,而位是数据存储的最小单位,可称之为比特 ...

  6. 原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码

    点击上方"程序员大白",选择"星标"公众号 重磅干货,第一时间送达 编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangz ...

  7. FPGA:设计一个原码一位乘法器

    一.运算规则 X*Y=P 引入部分积的概念,每次Y的一位和X相乘的结果叫做部分积 ,每次相乘后需要右移一位,再处理Y下一位的数值 1.符号位单独计算(异或运算) 符号组合就4种(00.01.11.10 ...

  8. 原码一位乘法器设计_数字IC校招基础知识点复习(七)——超前进位加法器、Wallace树、Booth乘法器...

    1.超前进位加法器 看了一些面经,提到会让你用基础的门搭加法器,因此首先得熟悉半加器,全加器等最基础的加法器才能理解之后的超前进位加法器,树型加法器等复杂的加法器. 半加器的输入为a,b,输出为结果s ...

  9. 计组头哥实验 第2关 原码一位乘法器设计

最新文章

  1. idea插件tomcat8-maven-plugin远程部署项目~
  2. 推荐系统resys小组线下活动见闻2009-08-22
  3. linux配环境,一个操作系统的实现linux下环境搭配
  4. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
  5. python每天定时9点执行_python 定时器每天就执行一次的实现代码
  6. 深解微服务架构:从过去,到未来
  7. 方向前沿、计算资源充足,三星通信研究院SAIT China Lab招聘研究员及实习生
  8. pandas 学习 —— 逻辑表达式与布尔索引
  9. Linux下实现一个论文翻译阅读的小工具
  10. 新建web项目上传SVN服务器
  11. 8uftp使用教程 图解,8uftp使用教程 图解
  12. 《了不起的Markdown》之第1章 人人都应学会Markdown
  13. 软件测试培训两个月骗局?培训机构到底如何选择?
  14. 千帆竞发 —— 分布式锁
  15. 02、Verilog例化说明
  16. mysql系列之复制2----主从同步部署
  17. 干货 | 五千字长文带你快速入门FlinkSQL
  18. 依恋类型和我们生活的息息相关
  19. 线性代数(十六) : 矩阵的左零空间及四个基本子空间总结
  20. 思科前员工为报复恶意删除400多台虚拟机,公司损失超1600万

热门文章

  1. When is abap.js loaded by Launchpad
  2. CRM business roles and PFCG roles
  3. Inbound process in CRM
  4. Service order description modify and save
  5. 如何查看其他人的ABAP authorization check log
  6. SAP Kyma和SAP云平台上的Service instance
  7. SAP UI5是如何从浏览器读取语言设置并按照优先级排序的
  8. SAP Gigya(SAP Customer Data Cloud)的数据中心
  9. 一种Java Spring框架里将配置文件里定义的值注入到Java变量的简单办法
  10. SpringBoot应用和PostgreSQL数据库部署到Kubernetes上的一个例子