MIPS64乘法器模拟实验

2023-10-19 13:52

本文主要是介绍MIPS64乘法器模拟实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

忽略溢出的乘法器

溢出提示的乘法器


忽略溢出的乘法器

首先,我们得了解乘法器如何由加法器设计得到,此处,我们以32位乘法为例。

总共分为4步:

1.     测试乘数最低位是否为1,是则给乘积加上被乘数,将结果写入乘积寄存器;

2.     被乘数寄存器左移1位;

3.     乘数寄存器右移一位;

4.     判断是否循环了32次,如果是,则结束,否则返回步骤1。

流程图如图1所示

图1

首先初始化一些数据,包括要输出的两个字符串提示信息和两个内容映射地址,如图2所示。

图2

然后写代码输出这两个字符串,其中输出pleas enter two numbers的代码如图3所示。

图3

然后需要获取被乘数和乘数,将CONTROL的值改为8,获取整数输入,如图4所示。

图4

然后开始乘法计算过程,如图5所示,测试乘数最低位是否为1,是则给乘积加上被乘数,将结果写入乘积寄存器,否则跳到下一步,下一步是被乘数寄存器左移1位,乘数寄存器右移一位,最后判断是否循环了32次,如果是,则结束,否则返回第一步。

图5

最后把CONTROL改为2,输出乘积结果,如图6所示。

图6

运行显示运行结果的例子如下,由于我们这里展示的是忽略了溢出的乘法,所以结果有两种:1、小于32位;2、大于32位。

第一种情况截图如图7所示:

图7

第二种情况截图如图8所示:

图8

根据上面的程序代码和截图,我们可以很清楚的看出,当结果小于32位时,结果正常;当结果大于32位时,结果只截取了低32位的结果,而高32位的结果直接忽略掉了。

	.data
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
cue1:	.asciiz "please enter two numbers:\n"
cue2:   .asciiz "results:\n".textdaddi r1,r0,cue1 	# please enter two numberslw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw r2,CONTROL(r0)sd r1,0(r2)daddi r1,r0,8	 	# r3=alw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)lw r3,0(r2)daddi r1,r0,8 		# r4=blw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)lw r4,0(r2)dadd r5,r0,r0		# r5=0 for r5=a*bdaddi r1,r0,32
loop:	andi r2,r4,1		# r4[-1]beq r2,r0,zero		# r4[-1]==1?dadd r5,r5,r3
zero:	dsll r3,r3,1dsra r4,r4,1daddi r1,r1,-1bne r1,r0,loopdaddi r1,r0,cue2	# resultslw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)		# output a*bsd r5,0(r2)daddi r1,r0,2lw r2,CONTROL(r0)sd r1,0(r2)halt

溢出提示的乘法器

上述的程序,用加法实现了32位乘法,但是,其中,对溢出情况没有进行考虑是其中的弊端。这里,我们来完善上述的乘法器,使得该乘法器会在结果溢出时候提示。

其实,这个小优化是十分简单的,只需要对64位的寄存器中的高32位进行检测即可。当高32位为0时,说明结果没有溢出,否则,结果溢出。

首先在数据里加上一条提示字符串,如图9所示。

图9

将乘积寄存器进行算术右移32位取其高32,如图10所示,因不能一次移32位,所以分两次移位,然后判断是否为0,如果高32位为0说明没有溢出,如果不为0则说明已经溢出了,则输出提示字符串。

图10

上述代码运行结果也有两个,一个是没有溢出的情况下的结果,一个是溢出了的情况下的结果。

首先,我们看没有溢出的情况结果,如图11所示:

图11

结果正确,其次,我们看溢出的情况结果如何,如图12所示:

图12

可以看到,当结果溢出时,程序会给出提示“warning:result overflow”。

	.data
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
cue1:	.asciiz "please enter two numbers:\n"
cue2:   .asciiz "results:\n"
cue3:   .asciiz "warning: result overflow\n".textdaddi r1,r0,cue1 	# please enter two numberslw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw r2,CONTROL(r0)sd r1,0(r2)daddi r1,r0,8	 	# r3=alw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)lw r3,0(r2)daddi r1,r0,8 		# r4=blw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)lw r4,0(r2)dadd r5,r0,r0		# r5=0 for r5=a*bdaddi r1,r0,32
loop:	andi r2,r4,1		# r4[-1]beq r2,r0,zero		# r4[-1]==1?dadd r5,r5,r3
zero:	dsll r3,r3,1dsra r4,r4,1daddi r1,r1,-1bne r1,r0,loopdaddi r1,r0,cue2	# resultslw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)		# output a*bsd r5,0(r2)daddi r1,r0,2lw r2,CONTROL(r0)sd r1,0(r2)dsra r1,r5,16		# r1=r5[0:31]dsra r1,r1,16		beq r1,r0,enddaddi r1,r0,cue3	# output overflowlw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw r2,CONTROL(r0)sd r1,0(r2)end:	halt

这篇关于MIPS64乘法器模拟实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240241

相关文章

关于FPGA设计16位乘法器的两…

原文地址:关于FPGA设计16位乘法器的两种算法 作者:ChrisChan 部分原代码如下: 用特权的右移算法虽复杂点,但节省不少LEs,如下图: 用左移算法尽管浅显易懂,但因每次都会从最右端移位,会占用更大面积,速度暂不说,如下图:

FPGA通过移位相加实现无符号乘法器(参数化,封装成IP可直接调用)

目录 1.前言2.原理3.移位无符号乘法器实现,并参数化 微信公众号获取更多FPGA相关源码: 1.前言 在硬件设计中,乘法器是非常重要的一个器件,乘法器的种类繁多,常见的有并行乘法器、移位相加乘法器和查找表乘法器。 并行乘法器的实现非常简单,在Verilog中只需要通过 * 实现,若要进行有符号的乘法,需使用 系统函数$signed。 查找表乘法器实际上是先将乘法的计算

第七篇 乘法器

实验七 乘法器 7.1 实验目的 回顾实验五中讲解的加法器的实现,掌握使用全加器实现任意乘数的乘法器的基本原理; 掌握使用串行进位加法器实现任意乘数的乘法器的基本原理; 掌握使用树形加法器实现任意乘数的乘法器的基本原理。 7.2 原理介绍 乘法器(multiplier)是一种完成两个互不相关的模拟信号相乘作用的电子器件,它可以将两个二进制数相乘。乘法器的模型是基于"移位和相加"的算

使用FPGA实现串-并型乘法器

介绍 其实我们知道,用FPGA实现乘法器并不是一件很简单的事,而且在FPGA中也有乘法器的IP核可以直接调用,我这里完全就是为了熟悉一些FPGA的语法然后写了这样一个电路。 串-并型乘法器模块 从字面上看,串-并乘法器就是其中一个乘数是串行的,另一位乘数是并行的。我在这里只描述一下模块的输入输出端口,相比于并行乘法器,串-并型乘法器占用的资源更少。 在这里,a是串行的数据,b是并行

华为ENSP模拟实验 第6天作业1多点双向重发布

-----本文是实验学习,仅供参考-------------- 进入R4环回接口 ospf network-type broadcast 作业要求如下:   效果图如下:   做题思路: 1、IP规划配置 2、启动RIP、OSPF协议 3、重发布 4、选路 一、IP规划配置 [r1]int loopback 0 [r1-LoopBack0]ip add 1.1.

华为模拟实验 多点双向重发布实验第6天作业2 HICP

作业图如下:   实验图如下:   一、IP配置 [r1]int loopback 0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [r1-GigabitEthernet0/0/0]int g0/0/01 [r1-

CY2300相位对齐时钟乘法器

这份文件是关于Cypress Semiconductor Corporation生产的CY2300型号的Phase-Aligned Clock Multiplier(相位对齐时钟乘法器)的技术手册。以下是该文件的核心内容概述: 产品特性: 4倍频输出配置。单一锁相环(PLL)架构。相位对齐功能。低抖动、高准确度输出。输出使能引脚。支持3.3V操作电压。5V容忍度输入。内部环路滤波器。8引脚15

数字IC前端学习笔记:数字乘法器的优化设计(基4布斯编码华莱士树乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482         使用基2布斯乘法器虽然能减少乘数中0的数量,但最终还是无法减少部分积的数量,因此一种更合理的编码方式产生了——基4布斯编码。它可以将部分积的数量减少一半,本文中还会使用华莱士树结构对部

ensp模拟实验

实验背景:办公室网络实验 基本组成:1台Ftp-server,1台Web-server,一台HR部门的终端pc-1,一台SALES部门的终端pc-2,一台IT部门的终端pc-3,一台路由器R1和一台交换机LSW3。为了满足公司的安全需求,要求在R1上使用ACL对部门之间的互访,以及用户对服务器的访问控制。另外,只允许LSW3的Vlanif 1接口的ip地址作为源地址远程登陆到R1,以实现R1的远

verilog编程之乘法器的实现

知识储备 首先来回顾一下乘法是如何在计算机中实现的。 假设现在有两个32位带符号定点整数x和y,我们现在要让x和y相乘,然后把乘积存放在z中,大家知道,两个32位数相乘,结果不会超过64位,因此z的长度应该为64位。 z = x * y中,x是被乘数,在Verilog代码中 multiplicand表示,y是乘数,在代码中用multiplier表示。因为x和y都是带符号数,所以应该是用补码乘法