MPY与MAC的区别

2019-08-08 18:14发布

请教各位达人MSP430f5系列MPY32中
MPY与MAC这两个的用法区别
这两个在手册中的介绍真心没看懂
谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
zhaoxqi
1楼-- · 2019-08-08 19:52
 精彩回答 2  元偷偷看……
wuhany
2楼-- · 2019-08-08 22:36
zhaoxqi 发表于 2013-10-13 19:57
可以参考数据手册中的解释如下:
16位乘法寄存器: MPY
16位有符号乘法寄存器:MPYS


恩,我就是想问乘法和乘法累加 两者是怎么运作的,以及二者的区别,谢谢
zhenykun
3楼-- · 2019-08-09 01:57
·16位乘法器使用方法:
1.无符号数相乘 result="n1"*n2。第一操作数n1(16位无符号)赋给MPY寄存器,第二操作数n2(16位无符号)赋给OP2寄存器,赋值完成后,结果result(32位无符号)就可以在RESLO(低16位)和RESHI(高165位)中读取。
代码如下:
   MPY = n1;                            // Load first operand -unsigned mult
   OP2 = n2;                                // Load second operand
   result = RESHI;                           // Load RESHI word result
   result = (result<<16)|RESLO;              // Shift RESHI left and concat with
2.无符号数乘加操作 result="n1"*n2+n3*n4。第一操作数n1(16位无符号)赋给MPY寄存器,第二操作数n2(16位无符号)赋给OP2寄存器,第三操作数n3(16位无符号)赋给MAC寄存器,第四操作数n4(16位无符号)赋给OP2寄存器,结果result(32位无符号)就可以在RESLO(低16位)和RESHI(高165位)中读取。SUMEXT寄存器中保存进位标志。
代码如下:
   MPY = n1;                             // Load first operand -unsigned mult
   OP2 = n2;                             // Load second operand
   MAC = n3;    // Load 3rd operand -unsigned mult
   OP2 = n4;    // Load 4rd operand
   result = RESHI;                           // Load RESHI word result
   result = (result<<16)|RESLO;              // Shift RESHI left and concat with
3.有符号数相乘 result="n1"*n2。第一操作数n1(16位有符号)赋给MPYS寄存器,第二操作数n2(16位有符号)赋给OP2寄存器,赋值完成后,结果result(32位有符号)就可以在RESLO(低16位)、RESHI(高165位)和SUMEXT(符号)中读取。SUMEXT=0xffff则结果为负,SUMEXT=0则结果为正。
代码如下:
   MPYS = n1;                            // Load first operand -signed mult
   OP2 = n2;                                // Load second operand
   result = RESHI;                           // Load RESHI word result
   result = (result<<16)|RESLO;              // Shift RESHI left and concat with
4.有符号乘加操作 result="n1"*n2+n3*n4。第一操作数n1(16位无符号)赋给MPY寄存器,第二操作数n2(16位无符号)赋给OP2寄存器,第三操作数n3(16位有符号)赋给MAC寄存器,第四操作数n4(16位有符号)赋给OP2寄存器,结果result(32位有符号)就可以在RESLO(低16位)和RESHI(高165位)中读取。SUMEXT寄存器中保存进位和正负标志。
代码如下:
   MPY = n1;                             // Load first operand -unsigned mult
   OP2 = n2;                             // Load second operand
   MACS = n3;
   OP2 = n4;
   result = RESHI;                           // Load RESHI word result
   result = (result<<16)|RESLO;              // Shift RESHI left and concat with
·32位乘法器使用方法:
1.无符号相乘 result="n1"*n2。n1(32位无符号)低16位赋给MPY32L寄存器,n1高16位赋给MPY32H寄存器,n2(32位无符号)低16位赋给OP2L寄存器,n2高16位赋给OP2H寄存器,赋值完成后,结果result(64位无符号)就可以在RES0(低位), RES1, RES2 和 RES3(高位)中读取。
代码如下:
   MPY32L = 0x1234;                          // Load lower 16 bits of operand 1
   MPY32H = 0x1234;                          // Load upper 16 bits of operand 1
   OP2L = 0x5678;                            // Load lower 16 bits of operand 2
   OP2H = 0x5678;                            // Load upper 16 bits of operand 2
   result_L = RES1;
  result_L = (result_L<<16)|RES0;
  result_H = RES3;
  result_H = (result_H<<16)|RES2;
其他情况依次类推,与16位情况类似。
shimx
4楼-- · 2019-08-09 07:27
其实简单说,MPY和MAC是两种不同的操作,
MPY是简单的做乘法,即c = a x b
MAC是做乘加,即 c = a x b + c
yszong
5楼-- · 2019-08-09 11:28
楼上正解
wuhany
6楼-- · 2019-08-09 13:32
 精彩回答 2  元偷偷看……

一周热门 更多>