maqingbiao 发表于 2010-7-25 20:12:31

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

本例程实现的是,从外部输入两个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   in_a,in_b; //输入的被乘数和乘数
output    y_out; //输出的乘积
/*寄存器类型变量 为了能更清楚的了解全处理过程,
特地设计为输出的,不然仿真可能会被综合掉*/
output    x1,x2,x3,x4;
output     x5;
output    x6;
output    x7;

/////////////////////////////////////////////////////
reg    y_out;
reg    x1,x2,x3,x4;
reg     x5;
reg    x6;
reg    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; //截取16位被乘数,
         x2    <= in_b; //截取16位乘数
         x3    <= (x1==0)? x1:{x1,~x1+1'b1};//据最高位判断是否为负数,
                                                            //若负数则把补码转成原码
         x4    <= (x2==0)? x2:{x2,~x2+1'b1};
         x5    <= x3 ^ x4; //两数符号位相异或,得到乘积的符号位
         x6    <= x3*x4; //两数的数据位相乘
         x7    <= {x5,x6,1'b0};//乘积由1位符号位和30位数据位及1位无关组成;
                                 //因为是小数,往低位生长,所以无关位放置最低位
         y_out <= (x7==0)? x7:{x7,~x7+1'b1};
      end
end

endmodule
页: [1]
查看完整版本: 如何进行有符号小数乘法运算?(Verilog)