首页 > 其他分享 >移位相加乘法器

移位相加乘法器

时间:2024-04-13 21:12:44浏览次数:25  
标签:符号 相加 补码 result 乘法器 移位

  在硬件设计中,乘法器是非常重要的一个器件,乘法器的种类繁多,常见的有并行乘法器、移位相加乘法器和查找表乘法器,并行乘法器的实现非常简单,在Verilog中只需要通过 * 实现,若要进行有符号的乘法,需使用 系统函数$signed。查找表乘法器实际上是先将乘法的计算结果提前算好,这样就可以在计算时通过查表的方式直接得到结果,一般用于位宽较小的情况。移位相加乘法器是一种耗费较少资源的算法,其思想是将乘法转化为加法和移位运算,缺点是比较耗时,一般用于对性能要求不高的场合。

一、无符号移位相加乘法器

以a=1011和b=1001相乘为例(均为无符号数)
1.b的第0位为1,所以

result = result + b[0] * a<<0;

2.b的第1位为0,result保持不变

result = result + b[1] * a<<1;

3.b的第2位也为0,result保持不变

result = result + b[2] * a<<2;

4.b的第3位为1,则得到最终的计算结果

result = result + b[3] * a<<3;

可以看到, W 位宽的无符号乘法器,需要 W 个周期才能计算完成。

二、有符号移位相加乘法器

以(-3)x(-6)为例,Verilog中有符号数用补码表示,正数的补码是他本身,负数的补码是符号位不变,其他位的反码加1。(-3)的补码是 1101,(-6)的补码是 1010,为了保证结果的正确,首先要将两个数进行符号位扩展,扩展为8bits。有符号位扩展,高位补1,所以(-3)就变为 11111101 ,(-6)就变为 11111010 。然后其计算步骤与无符号移位相加乘法器计算步骤一致。

注意:

1.无论是有符号数相乘还是无符号数相乘,其乘积的位宽必定位a+b;

2.如果被乘数和乘数均为有符号数,那么相乘之前首先要进行符号位扩展,将被乘数和乘数均扩展位a+b位。

3、有符号数乘法的最终结果也是补码形式。

标签:符号,相加,补码,result,乘法器,移位
From: https://www.cnblogs.com/Bruceson/p/18133360

相关文章

  • 两个纯数字字符串相加Python实现版
    """两个字符串相加模拟两个大整数相加,但是不能直接相加,采用每一位相加的方式"""defadd_large_numbers(num1,num2):#反转字符串,方便从低位开始相加num1=num1[::-1]num2=num2[::-1]#初始化结果列表和进位result=[]carry=0#......
  • momentJS时间相加 eg: 2024-12-12 12:30:12 + 50 = ?
    watch(()=>props.record,()=>{ if(props?.record){ letrecordData=props?.record console.log('output->recordData',recordData) //2-待反馈 if(recordData.status===2){ deadline.value=moment( moment(recordData.cr......
  • Opencv实现边界填充、两个图片像素直接相加后超过255的处理方式(阈值处理方式),一个窗口
     opencv两个图片直接相加,会直接相加,如果超过255,会取模。 print((img_cat+img_cat2)[:5,:,0])#0-255若相加越界后294用294%256获得余数38可以使用这种方式查看。展示的是前5行,所有列的第一个通道的值。还有一种方法是cv2.add(),这个方法会直接将超过255的值设置为25......
  • 04-A64指令集2——算术与移位指令
    本章思考题请简述N、Z、C、V这4个条件标志位的作用。答:如下表所示。条件标志位描述N负数标志(上一次运算结果为负值)Z零结果标志(上一次运算结果为零)C进位标志(上一次运算结果发生了无符号数溢出)V溢出标志(上一次运算结果发生了有符号数溢出)下面两条ADD......
  • BigDecimal相加一直为零的坑,解决BigDecimal相加为0的方法
    BigDecimal相加一直为零的坑,解决BigDecimal相加为0的方法使用BigDecimal时,相加一直为零,感觉有点坑。错误写法:BigDecimalafe=newBigDecimal("0");for(inti=0;i<10;i++){BigDecimaldecimal=newBigDecimal("1000");......
  • 【数据结构】一元多项式的表示与相加(无序输入 有序输出)
    一元多项式的表示与运算——课程设计(无序输入有序输出)目录一元多项式的表示与运算——课程设计(无序输入有序输出)一.例题:(输入无序,指数升序排列的一元多项式)1.链表结点定义2.创建单链表存放一元多项式(将无序的输入有序存放于链表)3.输出一元多项式4.一元多项式求值......
  • 每日一练 两数相加问题(leetcode)
    原题如下:这道题目是一道链表题,我们对于这种链表类,很显然我们最后输出的是初始节点,所以我们要保留我们的初始头指针,那么我们的第一步一定是把头指针保留一份,然后再让头指针往后进行操作。那么我们进行什么操作呢,很简单,就是把l1和l2的对应内容加起来就行了,那么我们就面临这样几......
  • 完数,一个数恰好等于它的因子相加
    示例:6=1+2+3方法:找到num的所有因子,相加后检查是否等于num,如果等于,则按照相应格式输出。找出1000以内的完数。代码:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){intn,i,sum=0,num,count=0;inta[10];intj;for(j=2;j<......
  • LeetCodeHot100 链表 160. 相交链表 206. 反转链表 234. 回文链表 141. 环形链表
    160.相交链表https://leetcode.cn/problems/intersection-of-two-linked-lists/description/?envType=study-plan-v2&envId=top-100-likedpublicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){intlenA=0;intlenB=0;L......
  • Double类型数值相加导致精度缺失问题
    问题描述doublev1=13.01;for(inti=0;i<10;i++){v1+=13;System.out.println(v1);}解决方案doublev1=4.5;doublev2=4.55;BigDecimalb1=newBigDecimal(Double.toString(v1));BigDecimalb2=new......