LAOXU 发表于 2024-5-15 04:52:57

32位加减乘除,STC8位机上的MDU32C 实测!库函数,STC8H2K32U-45MHz

STC8新增32位加减乘除,MDU32C 硬件运算单元

STC 寄来的 STC8H2K32U-45MHz-LQFP32 芯片收到,谢谢!
找了一块板,焊上 STC8H2K32U , 引出串囗, 上机仿真,
经简单实测,STC8新增32位加减乘除,MDU32C模块 功能基本正常,很好。

重要说明:
STC8H2K32U 系列 A 版芯片,开始量产中,
MDU32C 模块的逻辑左移运算有问题,暂时不要使用。
后续版本会修改正确   

逻辑左移:
有点好玩,左移偶次正确,左移奇次不正确(最高 10Bit 清0),
我打了一个补丁,能用了,速度比 Keil C51自带的软件算法要快 N倍。

深圳国芯人工智能有限公司-产品_STC8H系列 (stcai.com)
STC8H2K32U-45MHz-LQFP32, TSSOP28, TSSOP20









LAOXU 发表于 2024-5-15 08:36:42

关于 MDU32C 逻辑左移,有点小问题,打个补丁,照样能用,速度比 Keil C51自带的软件算法要快 N倍。
MDU32C 不改也没问题。
如修改,下列建议,供参考。
1、32位乘法,乘积能否升级到 64位?
   如不能,建议 增加一个 32位小数乘法,或者 16位x16位 = 32位乘法。
   2选1 的话,优先选 16位 乘法。
2、MDU32SR 寄存器能否取消? 其数据改放到 ACC寄存器中, 可省去每次操作的中断保护。
3、如果以上第 2条不改, 并且运算进位溢出标志不并入 PSW中, 建设去掉 32位加/减法的 带进位/借位操作, 否则请保留。
4、增加 32位 循环右移 指令。
5、增加 32位 比较指令。
6、增加 32位 加1/减1 指令。
7、增加 32位 交换指令(R0R1R2R3<-->R4R5R6R7)。
8、增加 32位 取补指令。
9、增加 32位 取反指令。
10、增加 32位 清0 指令。
综上所说:
C51 上使用优选考虑:
1、增加一个 16位x16位 = 32位乘法,或者 32位小数乘法。
2、取消 MDU32SR 寄存器, 其数据改放到 ACC寄存器中(省去中断保护)。
3、增加 32位 循环右移 指令。
4、增加 32位 比较指令。
5、增加 32位 加1/减1 指令。
6、增加 32位 交换指令(R0R1R2R3<-->R4R5R6R7)。
7、增加 32位 取补指令。
8、增加 32位 取反指令
9、增加 32位 清0 指令。
C251 上使用优选考虑:
1、增加一个 32位x32位 = 64位乘法(双数度浮点数乘除法要用)。
2、取消 MDU32SR 寄存器, 其数据改放到 ACC寄存器中(省去中断保护)。
至于 运算进位溢出标志是否并入 PSW, 在这里并不重要, 因为放在 ACC中, 和放在 PSW中, 实际使用差别并不是很大(仅指令长度增大 1字节)。



LAOXU 发表于 2024-5-15 16:59:50

最新 STC8_MDU32C_V1.lib 库来了~~~~~

STC8H_MDU32C_V1 LIB 库使用说明:
STC8H系列单片机 C51定点库 自动调用专用运算库函数,
插入使用了 STC8H系列的特色----MDU32C硬件乘除移位指令。
并且针对 STC8H系列集成了 32位x32位硬件乘法器,32位/32位硬件除法器,32位硬件移位单元作了特别优化。
增加了对所有关联到的无符号、有符号int型,无符号、有符号long型 和 float型变量的算术运算,移位操作,
均作了运算速度大幅度提升,为方便使用,以外挂库形式加入,实行对C51内库自动替换,无缝嵌入,
其中最具有特色的是
单精度浮点数加/减/乘/除四则运算,用 STC8H系列的 MDU32C硬件 乘除移位指令,
代替原Keil C51的加减法模拟除法程序,
大幅度地提升了原 51单精度浮点数加/减/乘/除 四则运算特慢的通病。


单独 LIB 文件:


LIB源代码:


LAOXU 发表于 2024-5-30 06:00:47

本帖最后由 LAOXU 于 2024-11-29 08:17 编辑

2024/5/30
更新版 STC8_MDU32C_V2.lib 库来了~~~~~
STC8H_MDU32C_V2 LIB 库使用说明:
      STC8H系列单片机 C51定点库 自动调用专用运算库函数,插入使用了 STC8H2K32U系列的特色
    ----MDU32C硬件乘除移位指令。
    并且针对 STC8H系列集成了32位x32位硬件乘法器,32位/32位硬件除法器,32位硬件移位单元作了特别优化。
      增加了对所有关联到的无符号、有符号int型,无符号、有符号long型 和 float型变量的算术运算,移位操作,
    均作了运算速度大幅度提升,为方便使用,以外挂库形式加入,实行对C51内库自动替换,无缝嵌入。
    其中最具有特色的是使用了 STC8H系列的 MDU32C硬件 乘除移位指令,代替原Keil C51的浮点加减乘除法程序,
    大幅度地提升了浮点数运算速度,解决了原51 浮点数运算特慢的通病。
   
    STC8H_MDU32C_V2版 和 STC8H_MDU32C_V1版 区别:
    1. 全面改写单精度浮点数内部数据存储格式, 使之完全无缝匹配 STC MDU32C标准,
      为核心内核 移植到 SDCC, IAR 开绿灯。
    2. 全面优化内部变量, 进一步减少指令提升运算速度。
特别提醒:仿真时一定要连接硬件实时仿真, 否则死机!!!
单独 LIB 文件:


LIB源代码:






LAOXU 发表于 2024-5-31 08:42:10

本帖最后由 LAOXU 于 2024-6-1 07:45 编辑

2024/6/1:
对 MDU32/DPU32 类运算模块之构架, 从发展的眼光, 提点建议。

首先,51和 251相比,可用资源缺乏,专用寄存器非常紧张,整个可重入函数(程序),只有 R0-R7、ACC、B、PSW、DPTR 可使用。

因此,MDU32/DPU32 类运算模块之构架, 从实用的角度来看,这两者的侧重点不同。
在 51上应用,侧重点:
1、尽可能的帮助减轻对专用寄存器的占用。
2、加快各种运算速度的辅助类简单指令。
3、不同编译器(Keil,SDCC,IAR)之间的数据格式转换。

在 251上应用,侧重点:
1、扩展(级连)类指令,能轻松将 32位指令,扩展到 64位或更多位。

=======================================================================
具体实施方案:

一、结构(构架)类:
1、MDU32内增加 2级 32位堆栈寄存器(通用方案,今后 DPU32 上也能用上)。
2、增加 R0_R3,R4_R7 压栈、出栈 指令(对 MDU32 模块内堆栈操作)。

或 临时方案(51 MDU32专用):
1、MDU32内增加一个 32位寄存器 DD。
2、增加 R0_R3,R4_R7 到 寄存器 DD 的读、写 指令。

用途:可快速对 R0_R3,R4_R7 寄存器保存和恢复。

=======================================================================
二、指令类:
1、交换指令 SWAP    R4_R7,R0_R3             用途:快速交换 R0_R3,R4_R7 寄存器值。
2、比较指令 CMP    R4_R7,R0_R3               用途:快速比较 R0_R3,R4_R7 寄存器值。
3、循环指令 RR   R4_R7(右移 或 左移均可)用途:浮点数格式转换,循环指令扩展级联。
4、加1 指令 INC    R4_R7                  用途:浮点数四舍五入。
5、减1 指令 INC    R4_R7
6、取补指令 NEG    R4_R7                  用途:求负数。
7、取反指令 CPL    R4_R7
8、清0 指令 CLR    R4_R7                  用途:快速清除 R4_R7寄存器。
            CLR    R0_R3                  用途:快速清除 R0_R3寄存器。
9、移位指令 最后一位移出 放 Cy(最好),如做不到放 MDU32SR 寄存器内也可。
10、加/减/比较类指令 结果为 0,置位 MDU32SR 寄存器内 Z标志(新增)。
建议增加 四字节 和 单字节 非标运算指令
11、加法指令 ADD   R4_R7,A               用途:非标格式浮点数 四舍五入。
12、减法指令 SUB   R4_R7,A

13、乘法指令 MUL   R4_R7,A               用途:数制转换,BCD-->HEX。

14、除法指令 DIV   R4_R7,A               用途:数制转换,HEX-->BCD


以上均是 32位指令。

=======================================================================
三、其他类:
作为 51,我认为最理想的升级模式,是使用 251(BINARY模式)指令集,这样,在 51下能使用 所有 251硬件资源,包括移值 251库函数,
让 MDU32/DPU32 类运算模块 做到 51/251下真正通用。

注:记得我曾经说错,51运行 251(SOURCE模式)指令集,现更正,以本次为准。
51模式下,只能使用(运行) 251(BINARY模式)指令集。

我学的太杂,样样都了解一点,优点,每样都能短时间内拿起,综合能力强。
缺点,慢热,进入状态时间太长,一般要 10天半个月,才能真正进入有效思考。
比如讨论这 MDU32/DPU32 类运算模块之构架指令,没有前导预热,进入不了顶峰状态。
这和整天在这行混的吃这口饭的不同(他们很短时间能进入有效思考)。

上次争论 MDU32/DPU32 类运算模块,运行时是否应该关系统时钟,我后来总结了一下,
结论:我是把 MDU32/DPU32指令,当成 真正 51指令使用,充分考虑如何搭配,才能更有效执行速度更快。
而其他人,仅仅把 MDU32/DPU32指令,当成一个功能指令使用,只考虑完成单一的功能,而并没有考虑更深层次的扩展(级连)等情况下使用。


神农鼎 发表于 2024-5-15 07:42:39





















神农鼎 发表于 2024-5-15 07:46:45


MDU32C库函数


深圳国芯人工智能有限公司-工具软件 (stcai.com)



神农鼎 发表于 2024-5-15 07:48:25


神农鼎 发表于 2024-5-15 07:49:07


串口接收超时中断;
串口硬件奇偶校验;









LAOXU 发表于 2024-5-15 08:46:28

对 C51来说, 如果增加上述指令, 能大幅度提升 浮点运算库的 运算速度。

xxkj2010 发表于 2024-5-15 09:40:06

是不是直接赋值给MDU32C寄存器,就可以直接从MDU32C寄存器中读取结果?

_奶咖君_ 发表于 2024-5-15 09:51:53

LAOXU 弄这个还是手拿把掐啊{:4_197:}

jmg 发表于 2024-5-15 10:34:21

本帖最后由 jmg 于 2024-5-15 10:37 编辑

LAOXU published on 2024-5-15 08:36
Regarding the left shift of MDU32C logic, there is a small problem. With a patch, it can still be used. The speed is N times faster than the software algorithm that comes with Keil C51.



> "6. Add 32-bit exchange instructions (R0R1R2R3<-->R4R5R6R7). "


Yes, the present MDU32C opcodes seem backwards.

I tried a simple DDS using this, where you add a increment to a 32b value, to give an table index pointer. That shows a problem :


R4..R7 = R4..R7 + R0..R3 is not much use.

Better would have been swapped operands, so

R0..R3 = R4..R7 + R0..R3 is better.

With this swap, you can set R4..R7 as fixed adder, and
   Add32b
   MOX A,@R0
   MOV DAC_SFR,A
for upper 8 bits index, already in R0, into XDATA page, or

Add32b
MOX A,@R0
MOV XDATA_Page,A
MOX A,@R1
MOV DAC_SFR,A


for using all XRAM as table, upper 13b index is R0,R1 for a 29b adder

页: [1] 2 3 4 5
查看完整版本: 32位加减乘除,STC8位机上的MDU32C 实测!库函数,STC8H2K32U-45MHz