找回密码
 立即注册
查看: 800|回复: 14

老姚, MDU32C 定型流片了吗?

[复制链接]
  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    37

    主题

    869

    回帖

    3946

    积分

    荣誉版主

    积分
    3946
    发表于 2024-1-25 19:42:59 | 显示全部楼层 |阅读模式
    模拟小数乘法程序(浮点乘除用):



    // 模拟小数乘法
                   MOV      A,R7
                   PUSH     ACC
                   MOV      A,R6
                   PUSH     ACC
                   MOV      A,R3
                   PUSH     ACC
                   MOV      A,R2
                   PUSH     ACC
                   MOV      A,R5
                   PUSH     ACC
                   MOV      A,R4
                   PUSH     ACC
                   MOV      A,R1
                   PUSH     ACC
                   MOV      A,R0
                   PUSH     ACC

                       CLR                A
                       MOV      R0,A
                       MOV      R1,A
                       MOV      R4,A
                       MOV      R5,A
    //                   LCALL        MUL32     // R2R3 * R6R7 --> R4R5R6R7
    //                   LCALL        ADD32     // R4R5 --> DPH1,DPL1
                       MOV      R0,SP
                       MOV      A,@R0
                       MOV      R2,A
                       DEC                R0
                       MOV      A,@R0
                       MOV      R3,A
                       DEC                R0
                       DEC                R0
                       DEC                R0
                       DEC                R0
                       MOV      A,@R0
                       MOV      R6,A
                       DEC                R0
                       MOV      A,@R0
                       MOV      R7,A
                       CLR                A
                       MOV      R0,A
                       MOV      R1,A
                       MOV      R4,A
                       MOV      R5,A
    //                   LCALL        MUL32     // R0R1 * R6R7 --> R4R5R6R7
    //                   LCALL        ADD32     // R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1

                       DEC                R0
                       DEC                R0
                       MOV      A,@R0
                       MOV      R2,A
                       DEC                R0
                       MOV      A,@R0
                       MOV      R3,A
                       DEC                R0
                       MOV      A,@R0
                       MOV      R6,A
                       DEC                R0
                       MOV      A,@R0
                       MOV      R7,A
                       CLR                A
                       MOV      R0,A
                       MOV      R1,A
                       MOV      R4,A
                       MOV      R5,A
    //                   LCALL        MUL32     // R2R3 * R4R5 --> R4R5R6R7
    //                   LCALL        ADD32     // R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1

                       POP                ACC
                       MOV      R2,A
                       POP                ACC
                       MOV      R3,A
                       POP                ACC
                       MOV      R6,A
                       POP                ACC
                       MOV      R7,A
                       MOV      A,SP
                       ADD                A,#-4
                       MOV      SP,A
                       CLR                A
                       MOV      R0,A
                       MOV      R1,A
                       MOV      R4,A
                       MOV      R5,A
    //                   LCALL        MUL32     // R0R1 * R4R5 --> R4R5R6R7
    //                   LCALL        ADD32     // R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7




    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    37

    主题

    869

    回帖

    3946

    积分

    荣誉版主

    积分
    3946
     楼主| 发表于 2024-1-25 19:59:31 | 显示全部楼层
    其中 数次 16位 * 16位 = 32位 相乘, 再叠加 --> 寄存器 暂存,  程序片段 还没加入.

    程序超长, 效率低下, 分析原因:

    1. 模拟小数运算, 只能用 整数 16位 * 16位 = 32位 相乘(取高 16位)

    2. 32位 运算占用 整个 R0-R7寄存器, 重入函数的临时变量, 只能放在 SP堆栈中, 51不支持堆栈变量, 故执行效率低.

    3. 如有可能, 请考虑增加一条 小数 32位 * 32位 = 32位 乘法指令, 代替以上一大堆 模拟小数运算程序.

    4. 算术左移右移, 最末移出位, 如有可能, 请放在 Cy中, 便于级联, 四舍五入等操作.
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13946
    发表于 2024-1-25 20:15:40 | 显示全部楼层
    STC8H2K32U-45MHz-LQFP32 + MDU32C 已启动流片流程,不想改了
    否则又要等 2个月
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    37

    主题

    869

    回帖

    3946

    积分

    荣誉版主

    积分
    3946
     楼主| 发表于 2024-1-26 02:56:01 | 显示全部楼层
    以后有机会改吧,  搞个 增强型 MDU32C+  版本.
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    37

    主题

    869

    回帖

    3946

    积分

    荣誉版主

    积分
    3946
     楼主| 发表于 2024-1-26 08:03:00 | 显示全部楼层
    优化了一下 模拟小数乘法, 感觉还行, 可重入函数, 占用 4级堆栈, 到时 样片到手, 测试对比一下与标准浮点库的速度之比.


    // 模拟小数乘法        R0R1R2R3 * R4R5R6R7 --> R4R5R6R7
    /*                    R2R3 * R6R7 -->         R4R5R6R7 , R4R5 --> DPH1,DPL1
                          R2R3 * R4R5 -->     R4R5R6R7_0_0 , R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1
                          R0R1 * R6R7 -->     R4R5R6R7_0_0 , R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1
                          R0R1 * R4R5 --> R4R5R6R7_0_0_0_0 , R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7

                            R4R5R6R7 规格化 --> R5R6R7,DPL1 , 指数DPL --> R4
    */
                   MOV      B,R1
                   MOV      DPH,R0
                   MOV      A,R7
                   PUSH     ACC
                   MOV      A,R6
                   PUSH     ACC
                   MOV      A,R5
                   PUSH     ACC
                   MOV      A,R4
                   PUSH     ACC

                       CLR                A
                       MOV      R0,A
                       MOV      R1,A
                       MOV      R4,A
                       MOV      R5,A
    //                   LCALL        MUL32     // R2R3 * R6R7 --> R4R5R6R7
                       MOV      DPH1,R4          // R4R5 --> DPH1,DPL1
                       MOV      DPL1,R5

                       MOV                R0,SP
                       MOV      A,@R0
                       MOV      R6,A
                       DEC                R0
                       MOV      A,@R0
                       MOV      R7,A
                       CLR                A
                       MOV      R0,A
    ;                   MOV      R1,A
                       MOV      R4,A
                       MOV      R5,A
    //                   LCALL        MUL32     // R2R3 * R4R5 --> R4R5R6R7
                       MOV      R2,DPH1          // DPH1,DPL1 --> R0R1R2R3
                       MOV      R3,DPL1
    //                   LCALL        ADD32     // R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1
                   MOV      R2,DPH
                   MOV      R3,B
                       MOV      DPH,R4
                       MOV      B,R5
                       MOV      DPH1,R6
                       MOV      DPL1,R7

                       MOV                R0,SP
                       DEC                R0
                       DEC                R0
                       MOV      A,@R0
                       MOV      R6,A
                       DEC                R0
                       MOV      A,@R0
                       MOV      R7,A
                       CLR                A
                       MOV      R0,A
    ;                   MOV      R1,A
                       MOV      R4,A
                       MOV      R5,A
    //                   LCALL        MUL32     // R0R1 * R6R7 --> R4R5R6R7
                       MOV      R0,DPH
                       MOV      R1,B
                       XCH      R2,DPH1   // 原 R2R3 --> DPH1,DPL1
                       XCH      R3,DPL1
    //                   LCALL        ADD32     // R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1
                       XCH      R6,DPH1   // DPH1,DPL1 --> R6R7(原R2R3)
                       XCH      R7,DPL1          

                       POP                ACC
                       MOV      R2,A
                       POP                ACC
                       MOV      R3,A
                       POP                ACC
                       POP                ACC
    //                   LCALL        MUL32     // R0R1 * R4R5 --> R4R5R6R7
    //                   LCALL        ADD32     // R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7

    //                   LCALL        RSLA32          // R4R5R6R7 规格化 --> R5R6R7,DPL1 , 指数DPL --> R4

                       MOV      C,F0        // 标准浮点数返回, 加入符号
               MOV      A,DPL         
                   RRC      A
                   XCH      A,R4
                   MOV      ACC.7,C
                   XCH      A,R5
                   XCH      A,R6
                   XCH      A,R7
                   MOV      DPL,A
                       RET

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13946
    发表于 2024-1-26 12:10:55 | 显示全部楼层
    猜测,老许要的, 就是一個
    32bX32b=64b的完整乘法器, 如果沒有这种乘法器,
    他就必须拆解成 4 个 16bX16b=32b 的乘法,
    要命的是还要到处找地方暂存结果、并且做移位累加。


    我们目前MDU32C的乘法器功能是 32bX32b=32b, 结果"高"的ˇ32b 被丢弃了 !
    料想, 应该也不合其使用。


    截图202401261211396139.jpg

    点评

    当时也提过, 32bX32b=64b, 结果"高"的ˇ32b 不能丢弃, 小数乘法(浮点数)要用 !!!  详情 回复 发表于 2024-1-26 14:18
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13946
    发表于 2024-1-26 12:13:15 | 显示全部楼层
    事实上, 在 MDU32C 中,
    我们原本有做完整的, 只因为要配合 Keil-C51 ,
    所以我们把它又拿掉了 !

    点评

    要配合 C51, 更应该要加 32bX32b=64b 乘法. R0R1R2R3, R4R5R6R7 = R0R1R2R3 * R4R5R6R7; 多好啊~~~  详情 回复 发表于 2024-1-26 14:21
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    37

    主题

    869

    回帖

    3946

    积分

    荣誉版主

    积分
    3946
     楼主| 发表于 2024-1-26 14:18:00 | 显示全部楼层
    神农鼎 发表于 2024-1-26 12:10
    猜测,老许要的, 就是一個
    32bX32b=64b的完整乘法器, 如果沒有这种乘法器,
    他就必须拆解成 4 個 16bX16b=3 ...

    当时也提过, 32bX32b=64b, 结果"高"的ˇ32b 不能丢弃, 小数乘法(浮点数)要用 !!!
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13946
    发表于 2024-1-26 14:20:56 | 显示全部楼层
    要放到 【R0/R1/R2/R3】, 但 KEIL C51 经常会优化这优化那,可能会冲突;
    只能再增加条指令 放【R0/R1/R2/R3】

    点评

    除法指令 不是 余数 放在 R0/R1/R2/R3 KEIL C51 优化不到这 一块  详情 回复 发表于 2024-1-26 14:54
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    37

    主题

    869

    回帖

    3946

    积分

    荣誉版主

    积分
    3946
     楼主| 发表于 2024-1-26 14:21:22 | 显示全部楼层
    神农鼎 发表于 2024-1-26 12:13
    事实上, 在 MDU32C 中,
    我们原本有做完整的, 只因为要配合 Keil-C51 ,
    所以我们把它又拿掉了 !

    要配合 C51, 更应该要加 32bX32b=64b 乘法.


    R0R1R2R3, R4R5R6R7 = R0R1R2R3 * R4R5R6R7; 多好啊~~~
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-29 23:55 , Processed in 0.071369 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表