串行乘法与并行乘法

以下内容摘自《步步惊芯——软核处理器内部设计分析》一书

串行乘法

OR1200中串行乘法采用的是“移位——加”迭代算法,这种算法借鉴了手工计算乘法的过程,对于二进制乘法,比如:1101*1011,手工计算过程如图8.1所示。

图8.1 手工计算二进制乘法的过程

从图中可知手工计算时会将被乘数与乘数中每一位依次相乘,最后将所有的乘积项一并相加。这种方法速度快,但是用硬件实现时,会耗费较多硬件资源。“移位——加”迭代算法对此作了修改:每算出一乘积项,就加到乘积中。假设一开始B等于被乘数的值,A等于乘数的值,中间步骤算出的乘积项称为部分积,保存在D中,那么“移位——加”迭代算法的硬件结构图、运算过程分别如图8.2中(1)、(2)所示。

图8.2 “移位——加”迭代算法的结构图、运算过程

计算步骤如下:

(1)初始化B为被乘数,A为乘数,D为0,进位标志C为0。

(2)判断A[0]是否为1,如果A[0]为1,则D加上B,反之D加上0,无论A[0]为何值,都会将加法结果保存到D中,进位保存到C中。

(3)判断此时的A[0]是否是乘数的最高位,如果是,则将C、D、A联合右移一位,乘法结束,D、A联合起来就是积,反之也将C、D、A联合右移一位,回到第(2)步继续运行。

还是以1101*1011为例,采用“移位——加”迭代算法时计算步骤如表8.1所示。

“移位——加”迭代算法需要的时间与操作数的位数有关,对于32位的OR1200处理器而言,如果采用“移位——加”迭代算法实现乘法运算,那么至少需要32个时钟周期才能得到乘法结果。

并行乘法

串行乘法牺牲了处理器的效率,如果追求高效率的乘法运算,那么可以使用并行乘法,OR1200中实现并行乘法有两种方法。

1、利用FPGA内部的乘法器

利用FPGA内部的嵌入式乘法器,直接实现乘法,在OR1200中如果使用并行乘法,那么乘法的代码实际很简单,如下:

or1200_gmultp2_32x32.v
always @(posedge CLK or `OR1200_RST_EVENT RST)
        if (RST == `OR1200_RST_VALUE)
                p0 <= `OR1200_WW‘b0;
        else
                p0 <=  xi * yi;                            //直接就是xi*yi

当选中了目标FPGA时,EDA综合工具会自动调用目标FPGA内部的乘法器实现乘法运算。笔者使用Altera的EP2C70作为目标芯片,经过QuartusII编译后,可以发现乘法器的使用情况如图8.3所示,从图中可知为了实现32位的乘法运算,最终使用了4个18x18的嵌入式乘法器。

图8.3 QuartusII编译后显示采用并行乘法时,OR1200共使用了4个18x18嵌入式乘法器

2、Booth算法

如果是ASIC设计,则并行算法采用的是Booth算法,本书不对ASIC设计做过多着墨,读者朋友可以直接通过互联网查找Booth算法的介绍。

通过本章后面的分析可以知道:如果OR1200采用并行乘法,那么乘法运算需要5个时钟周期。

串行乘法与并行乘法,布布扣,bubuko.com

时间: 2024-08-14 03:30:27

串行乘法与并行乘法的相关文章

串行队列、并行队列、同步、异步

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispatch_queue_t,队列名称在调试时辅助,无论什么队列和任务,线程的创建和回收不需要程序员操作,有队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_ser

串行除法与并行除法

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 串行除法与并行除法 8.2.1 串行除法 OR1200中使用的串行除法算法是"试商法".设被除数是m,除数是n,商保存在s中,被除数的位数是k,其计算步骤如下(为了便于说明,在此处所有数据的最低位称之为第1位,而不称为第0位): (1)取出被除数的最高位m[k],使用被除数的最高位减去除数n,如果结果大于等于0,则商的s[k]为1,反之为0. (2)如果上一步得出的结果是0,表示当前的被减数小于除数,则取出被除数m[k

iOS开发之GCD 多线程 1.串行队列 2.并行队列 3.分组 4.信号量 详细讲解

GCD多线程下,实现线程同步的方式有如下几种: 1.串行队列 2.并行队列 3.分组 4.信号量 实例: 去网上获取一张图片并展示在视图上. 实现这个需求,可以拆分成两个任务,一个是去网上获取图片,一个是展示在视图上. 这两个任务是有关联的,所以需要同步处理. 下面看这几种方式如何实现. 一. 1.串行队列 1.1[GCD相关:] (1)GCD下的dispatch_queue队列都是FIFO队列,都会按照提交到队列的顺序执行. 只是根据队列的性质,分为<1>串行队列:用户队列.主线程队列 &l

GCD网络多线程---同步执行,异步执行,串行队列,并行队列

总结:同步(不管是串行还是并行)----不开辟子线程 异步(不管是串行还是并行)----开辟子线程 GCD: dispatch queue 主线程的main queue 并行队列 global dispatch queue 串行队列serial queues 一般用于按顺序同步访问 #pragma mark - 加载多线程 - (void) _loadMutil { //GCD基于C语言 //1.主对列:(串行队列) dispatch_queue_t mainQueue=dispatch_get

iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group

同步,指代码在同一个线程运行 异步,代码在另一个线程运行 串行队列,提交到该队列的block会顺序执行 并行队列,提交到该队列的block会并发执行 如果想等某一队列中所有block都执行完了在执行一个操作,在串行队列中,可以把最后需要执行的block放在队列最后即可,但是在并行队列中,可以用dispatch_group,最后通过dispatch_group_notify来执行最后要执行的block. 待编辑,补充例子.

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dispatch_queue_t,一种先进先出的数据结构,线程的创建和回收不需要程序员操作,由队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial); 并

IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispatch_queue_t,队列名称在调试时辅助,无论什么队列和任务,线程的创建和回收不需要程序员操作,有队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, DISPATCH_QUEUE_SER

ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序它是按顺序从上往下执行的, 这个执行顺序我们可以把它看成是一条线,把这条线就叫做线程(个人理解,错了勿喷);每一个程序中至少包含一条线程, 这条线程,我们叫它主线程. 多线程:多线程也就是说一个程序中有多条执行路径.在iOS当中将一些比较耗时的操作放到另一条执行路径里.让它与主线程同时运行.这样不会

iOS:转载:同步、异步、并行、串行的详解

理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念 2014年11月21日iOSasynchronization.concurrency.GCD.iOS.serial.synchronization.串行.同步.并发.异步 iOS 开发过程中,常常需要用到多线程技术,GCD 是常用的实现多线程的技术,其因简洁底层而备受欢迎. GCD 技术中,同步(synchroniza