搜索
bottom↓
回复: 0

如何进行有符号小数乘法运算?(Verilog)

[复制链接]

出0入0汤圆

发表于 2010-7-25 20:12:31 | 显示全部楼层 |阅读模式
本例程实现的是,从外部输入两个32位有符号小数,进行乘运算,输出的乘积为32位有符号小数。
这样虽然是可以实现,但自己感觉这样好像麻烦了些,有谁有更好的办法解决吗?谢谢高手来指点

module fix_mult ( clk,rst_n,in_a,in_b,x1,x2,x3,x4,x5,x6,x7,y_out );

input clk,rst_n; //时钟和复位信号
input  [31:0]   in_a,in_b; //输入的被乘数和乘数
output [31:0]   y_out; //输出的乘积
/*寄存器类型变量 为了能更清楚的了解全处理过程,
  特地设计为输出的,不然仿真可能会被综合掉*/
output [15:0]   x1,x2,x3,x4;
output [0:0]    x5;
output [29:0]   x6;
output [31:0]   x7;

/////////////////////////////////////////////////////
reg [31:0]   y_out;
reg [15:0]   x1,x2,x3,x4;
reg [0:0]    x5;
reg [29:0]   x6;
reg [31:0]   x7;


always @ ( posedge clk )
begin
   if ( !rst_n ) //复位时,全部寄存器变量清零
      begin
         x1    <= 16'b0;
         x2    <= 16'b0;
         x3    <= 16'b0;
         x4    <= 16'b0;
         x5    <=  1'b0;
         x6    <= 30'b0;
         x7    <= 32'b0;
         y_out <= 32'b0;
      end
   else              //全过程可以看成:把32位的小数截取高16位—》左移16位,变为16位整数—》
                     //相乘得到32位整数乘积后,右移32位—》调整无关位的位置—》得到32位小数
      begin
         x1    <= in_a[31:16]; //截取16位被乘数,
         x2    <= in_b[31:16]; //截取16位乘数
         x3    <= (x1[15]==0)? x1:{x1[15],~x1[14:0]+1'b1};  //据最高位判断是否为负数,
                                                            //若负数则把补码转成原码
         x4    <= (x2[15]==0)? x2:{x2[15],~x2[14:0]+1'b1};
         x5    <= x3[15] ^ x4[15]; //两数符号位相异或,得到乘积的符号位
         x6    <= x3[14:0]*x4[14:0]; //两数的数据位相乘
         x7    <= {x5,x6,1'b0};  //乘积由1位符号位和30位数据位及1位无关组成;
                                 //因为是小数,往低位生长,所以无关位放置最低位
         y_out <= (x7[31]==0)? x7:{x7[31],~x7[30:0]+1'b1};  
      end  
end

endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 17:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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