芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 6760|回复: 2

乘法器,加法器原理?

[复制链接]
  • TA的每日心情
    开心
    2021-1-16 22:44
  • 1

    主题

    3

    帖子

    119

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    119
    发表于 2018-6-10 21:54:01 | 显示全部楼层 |阅读模式
    最近想尝试一下做有符号的乘法器跟加法器,但是只是想做而已,没有思路。
    各位大大有没有什么思路可以建议一下的?我回头试一下

    比如我之前做了一个加法器,是16位的,低15位放数据,第16位放符号,然后判断++/+-/-+/--四种情况分别算,感觉就是一种思路吧其实。
    但是乘法器毫无思路啊。。。。


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-16 22:44
  • 1

    主题

    3

    帖子

    119

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    119
     楼主| 发表于 2018-6-12 21:47:59 | 显示全部楼层
    自己回帖,已经搞定啦,哈哈哈哈
    /********************************
    Multiplier
    31位定点乘法器
    0-15位为小数,16-30位为整数,第31位为符号位
    输出范围[-32768,32767],精度1.525e-5
    ********************************/
    module Multiplier(
                    m_in_a,
                    m_in_b,
                    m_out
            );
           
            input [31:0]m_in_a;
            input [31:0]m_in_b;
           
            output [31:0]m_out;
           
            reg a;
            wire [47:0]b;
           
            always@(*)
            if(m_in_a[31] == m_in_b[31])
                    a = 1'b0;
            else
                    a = 1'b1;
                   
            assign b = (m_in_a[30:0] * m_in_b[30:0]);
            assign m_out = {a, b[46:16]};
           
    endmodule





    /********************************
    Adder
    31位有符号加法器
    0-15位为小数,16-30位为整数,第31位为符号位
    输出范围[-32768,32767],精度1.525e-5
    ********************************/
    module Adder(
            p_in_a,
            p_in_b,
            p_out
            );
           
            input [31:0]p_in_a;
            input [31:0]p_in_b;
            output reg[31:0]p_out;
           
            reg [31:0]mid;
           
            always@(*)
            begin
                    if(!p_in_a[31])begin
                            // + +
                            if(!p_in_b[31])begin
                                    mid = p_in_a + p_in_b;
                                    if(!mid[31])
                                            p_out = {1'b0, mid[30:0]};
                                    else
                                            p_out = 32'hefff_ffff;
                            end
                            // + -
                            else begin
                                    if(p_in_a[30:0] >= p_in_b[30:0])begin
                                            mid = (p_in_a + 32'h8000_0000) - p_in_b;
                                            p_out = {1'b0, mid[30:0]};
                                    end
                                    else begin
                                            mid = (p_in_b - 32'h8000_0000) - p_in_a;
                                            p_out = {1'b1, mid[30:0]};
                                    end
                            end
                    end
                    else begin
                            // - +
                            if(!p_in_b[31])begin
                                    if(p_in_b[30:0] >= p_in_a[30:0])begin
                                            mid = (p_in_b + 32'h8000_0000) - p_in_a;
                                            p_out = {1'b0, mid[30:0]};
                                    end
                                    else begin
                                            mid = (p_in_a - 32'h8000_0000) - p_in_b;
                                            p_out = {1'b1, mid[30:0]};
                                    end
                            end
                            // - -
                            else begin
                                    mid = (p_in_a - 32'h8000_0000) + (p_in_b - 32'h8000_0000);
                                    if(!mid[31])
                                            p_out = {1'b1, mid[30:0]};
                                    else
                                            p_out = 32'hffff_ffff;
                                    end
                    end
            end
           
    endmodule

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    可爱
    2019-1-19 21:41
  • 4

    主题

    20

    帖子

    50

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    50
    发表于 2018-12-21 21:22:00 | 显示全部楼层

    先保存,谢谢分享,很好的一份资料,
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-12-4 01:20 , Processed in 0.069740 second(s), 32 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

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