串行除法与并行除法

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

串行除法与并行除法

8.2.1 串行除法

OR1200中使用的串行除法算法是“试商法”。设被除数是m,除数是n,商保存在s中,被除数的位数是k,其计算步骤如下(为了便于说明,在此处所有数据的最低位称之为第1位,而不称为第0位):

(1)取出被除数的最高位m[k],使用被除数的最高位减去除数n,如果结果大于等于0,则商的s[k]为1,反之为0。

(2)如果上一步得出的结果是0,表示当前的被减数小于除数,则取出被除数m[k-1],与当前被减数组合为下一轮的被减数;如果上一步得出的结果是1,表示当前的被减数大于除数,则利用第2步中减法的结果与被除数剩下的值的最高位m[k-1]组合为下一轮的被减数。k等于k-1。

(3)新的被减数减去除数,如果结果大于等于0,则商的s[k]为1,否则s[k]为0,后面的步骤重复2-3,直到k等于1。

上述步骤可以使用图8.4描述。

图8.4 试商法的运算过程

以1101除以0010为例, 采用试商法时的计算步骤如表8.2所示。

试商法进行除法运算需要的时间与操作数的位数有关,对于32位的OR1200处理器而言,如果采用试商法进行除法运算,那么至少需要32个时钟周期才能得到除法结果。

并行除法

试商法需要的时间太长,在OR1200中还可以配置采用并行除法,直接使用除法运算符进行除法运算,所有的工作交给综合工具完成,其代码很简单,如下:

or1200_mult_mac.v
always @(`OR1200_RST_EVENT rst or posedge clk) begin
    if (rst == `OR1200_RST_VALUE) begin
	     div_quot_r <=  32‘d0;
	     div_quot_generic <= 32‘d0;
    end
    else begin
	 if (alu_op_udiv & !(|y)) // unsigned divide by 0 - force to MAX
	   div_quot_generic[31:0] <= 32‘hffff_ffff;
	 else if (alu_op_div)
	   div_quot_generic[31:0] <= x / y;                       //直接使用除法运算符进行除法运算
      end
      div_quot_r[31:0] <= div_quot_generic;
   end

使用并行除法虽然提高了除法运算速度,但速度的提高是以资源的消耗为代价的,图8.5、8.6分别给出了并行除法、串行除法两种实现方式在Altera器件上资源占用的比较,可见串行除法比并行除法要少用很多FPGA资源。用户需要根据自己的情况选择合适的除法算法。

图8.5 使用并行除法时OR1200在Altera器件上占用的资源

图8.6 使用串行除法时OR1200在Altera器件上占用的资源

串行除法与并行除法

时间: 2024-08-12 05:24:34

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

串行乘法与并行乘法

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 串行乘法 OR1200中串行乘法采用的是"移位--加"迭代算法,这种算法借鉴了手工计算乘法的过程,对于二进制乘法,比如:1101*1011,手工计算过程如图8.1所示. 图8.1 手工计算二进制乘法的过程 从图中可知手工计算时会将被乘数与乘数中每一位依次相乘,最后将所有的乘积项一并相加.这种方法速度快,但是用硬件实现时,会耗费较多硬件资源."移位--加"迭代算法对此作了修改:每算出一乘积项,就加到乘

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

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

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