verilog实现32位有符号流水乘法器

星球的眼睛  论坛元老 | 2025-3-28 22:58:47 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1315|帖子 1315|积分 3945

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
verilog实现32位有符号流水乘法器

1.4bit乘法流程

1.无符号X无符号二进制乘法器

以下为4bit乘法器流程(2X6)
  1.         0 0 0 0 0 0 1 0     (2)
  2. X        0 0 0 0 0 1 1 0     (6)
  3.     ---------------------
  4.         0 0 0 0 0 0 0 0     (0)
  5.         0 0 0 0 0 1 0 0     (4)
  6.         0 0 0 0 1 0 0 0     (8)
  7.         0 0 0 0 0 0 0 0     (0)
  8.         0 0 0 0 0 0 0 0     (0)
  9.         0 0 0 0 0 0 0 0     (0)
  10.         0 0 0 0 0 0 0 0     (0)
  11.         0 0 0 0 0 0 0 0     (0)
  12.     ---------------------       
  13.         0 0 0 0 1 1 0 0     (12)
复制代码
注:4bit乘4bit的乘法器,其最大效果位宽为8,即4+4,所用在计算的时间,需要将乘数和被乘数通过符号位扩展到8bit,当然,对于无符号乘法来说,扩展的没有作用,但是对于有符号来说,是必须的,设计的模块为有符号和无符号通用的寄存器,所用建议无符号也进行位宽扩展。2.有符号X有符号二进制乘法器

以下为4bit乘法器流程(-2 X -6)
  1.         1 1 1 1 1 1 1 0     (-2)
  2. X        1 1 1 1 1 0 1 0     (-6)
  3.     ---------------------
  4.         0 0 0 0 0 0 0 0               
  5.         1 1 1 1 1 1 0 0               
  6.         0 0 0 0 0 0 0 0               
  7.         1 1 1 1 0 0 0 0               
  8.         1 1 1 0 0 0 0 0     
  9.         1 1 0 0 0 0 0 0     
  10.         1 0 0 0 0 0 0 0     
  11.         0 0 0 0 0 0 0 0     
  12.     ---------------------       
  13.         0 0 0 0 1 1 0 0     (12)
复制代码
3.有符号X无符号二进制乘法器
  1.         1 1 1 1 1 1 1 0     (-2)
  2. X        0 0 0 0 0 1 1 0     (6)
  3.     ---------------------
  4.         0 0 0 0 0 0 0 0               
  5.         1 1 1 1 1 1 0 0               
  6.         1 1 1 1 1 0 0 0               
  7.         0 0 0 0 0 0 0 0               
  8.         0 0 0 0 0 0 0 0     
  9.         0 0 0 0 0 0 0 0     
  10.         0 0 0 0 0 0 0 0     
  11.         0 0 0 0 0 0 0 0     
  12.     ---------------------       
  13.         1 1 1 1 0 1 0 0     (-12)
复制代码
4.无符号X有符号二进制乘法器
  1.         0 0 0 0 0 0 1 0     (2)
  2. X        1 1 1 1 1 0 1 0     (-6)
  3.     ---------------------
  4.         0 0 0 0 0 0 0 0               
  5.         0 0 0 0 0 1 0 0               
  6.         0 0 0 0 0 0 0 0               
  7.         0 0 0 1 0 0 0 0               
  8.         0 0 1 0 0 0 0 0     
  9.         0 1 0 0 0 0 0 0     
  10.         1 0 0 0 0 0 0 0     
  11.         0 0 0 0 0 0 0 0     
  12.     ---------------------       
  13.         1 1 1 1 0 1 0 0     (-12)
复制代码
2.流程简化

由上面4种环境可以总结出一个规律,符号不影响计算流程,只影响截位位置。
​        例如无符号X有符号二进制乘法器为例:bin(00000010) = dec(2),但是对于bin(11111010)将其看成有符号数来说为dec(-6),看成无符号来说为dec(250),即dec(2)*dec(250)的效果只取低8位的话,看成有符号数即为bin(11110100) = dec(-12)。那么以为着计算有符号数乘法的时间,只需要将其看成无符号数进行计算,最后控制截位位置就可以计算有符号计算器。
那么以下将对16bit乘法进行简化,以-1000 X -1200
1.位宽扩展
  1. dec(-1000) = bin(11111111111111111111110000011000) = dec(4294966296)
  2. dec(-1200) = bin(11111111111111111111101101010000) = dec(4294966096)
复制代码
2.乘数指数分解
  1. dec(4294966096) = 1*2^31 + 1*2^30 + 1*2^29 + 1*2^28 +
  2. 1*2^27 + 1*2^26 + 1*2^25 + 1*2^24 + 1*2^23 + 1*2^22 +
  3. 1*2^21 + 1*2^20 + 1*2^19 + 1*2^18 + 1*2^17 + 1*2^16 +
  4. 1*2^15 + 1*2^14 + 1*2^13 + 1*2^12 + 1*2^11 + 0*2^10 +
  5. 1*2^9 + 1*2^8 + 0*2^7 + 1*2^6 + 0*2^5 + 1*2^4 + 0*2^3 +
  6. 0*2^2 + 0*2^1 + 0*2^0
  7. 则:
  8. dec(4294966296) * dec(4294966096) = dec(4294966296)*2^31 + dec(4294966296)*2^30 +
  9. dec(4294966296)*2^29 + dec(4294966296)*2^28 + dec(4294966296)*2^27 +
  10. dec(4294966296)*2^26 + dec(4294966296)*2^25 + dec(4294966296)*2^24 +
  11. dec(4294966296)*2^23 + dec(4294966296)*2^22 + dec(4294966296)*2^21 +
  12. dec(4294966296)*2^20 + dec(4294966296)*2^19 + dec(4294966296)*2^18 +
  13. dec(4294966296)*2^17 + dec(4294966296)*2^16 + dec(4294966296)*2^15 +
  14. dec(4294966296)*2^14 + dec(4294966296)*2^13 + dec(4294966296)*2^12 +
  15. dec(4294966296)*2^11 + 0*2^10 + dec(4294966296)*2^9 + dec(4294966296)*2^8 +
  16. 0*2^7 + dec(4294966296)*2^6 + 0*2^5 + dec(4294966296)*2^4 + 0*2^3 +
  17. 0*2^2 + 0*2^1 + 0*2^0
复制代码
这公式看着复杂一大堆,但是如果把指数看作左移运算符,那么,乘法就转化为左移和加法了。
3.流水线加法

假设num = a + b + c + d + e + f + g + h,将其转化为流水线加法
aabbccddeeffgghhdig0dig0dig1dig1dig2dig2dig3dig3dig4dig4dig5dig5dig6dig6numnumText is not SVG - cannot display4.按需截位
  1. dec(4294966296) * dec(4294966096) = hex(FFFFF76800124F80)
  2. 其中16bit乘16bit的乘法器,最大位宽为32bit,取后32bit,即
  3. hex(00124F80) = dec(1200000)
复制代码
一个完整的乘法流程就算完成了。
3.verilog实现

16位有符号乘法器代码 [code]`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date: 2025/03/28 22:54:41// Design Name: // Module Name: multiplier_16// Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: 16位有符号乘法器// // Revision:// Revision 0.01 - File Created// Additional Comments:// //////////////////////////////////////////////////////////////////////////////////module multiplier_16#(      parameter A_WIDTH  = 16 ,//数据A的位宽    parameter A_SIGNED = 1  ,//数据A是否有符号    parameter B_WIDTH  = 16 ,//数据B的位宽    parameter B_SIGNED = 1  //数据B是否有符号)(    input       clk ,    input       rst ,    input   [A_WIDTH-1:0]   A,    input   [B_WIDTH-1:0]   B,    output  [A_WIDTH + B_WIDTH - 1:0]   P    );    wire [32-1:0]    C;    wire [32-1:0]    D;    assign C = A_SIGNED?{{32-A_WIDTH{A[A_WIDTH-1]}},A}:{{32-A_WIDTH{1'b0}},A};    assign D = B_SIGNED?{{32-B_WIDTH{B[B_WIDTH-1]}},B}:{{32-B_WIDTH{1'b0}},B};//*************************************************    genvar  i0;    reg [31:0]  sum0 [15:0];    generate        for (i0 = 0;i0
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

星球的眼睛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表