(原创)如何进行有符号小数乘法运算?(Verilog)
2010-07-25 13:03
357 查看
本例程实现的是,从外部输入两个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
仿真结果如下:
相关文章推荐
- python中如何的快速进行除法、乘法运算
- FPGA基于Verilog的有符号加法及有符号乘法运算
- 脑弄大开之——如何抛弃数字和运算符号只用计算机和函数进行运算
- sql server 中进行除法运算时,如何得到结果是小数形式呢?
- verilog中的有符号数运算
- wndows下如何用Iverilog+GTKWave进行verilog的编译和查看仿真波形
- TENDA TEI402M如何进行端口映射(For amule)[00原创]
- 在几何画板中如何打出乘法符号
- js中数字转为整数,可以进行运算,保存两位小数
- verilog中有符号数运算
- [原创](三)教你如何如何进行域内时间同步及时间常用命令总结
- (原创)采用加法器数乘法器实现17位有符号数相乘(Verilog)
- FPGA学习(第5节)-看电路图写出Verilog代码(乘法运算+自加一+模块实例化等)
- 计算机IP地址与子网掩码如何进行AND运算
- 计算机IP地址与子网掩码如何进行AND运算
- 在Oracle中如何将varchar2与nvarchar2进行互相转换?[原创]
- (原创)如何更高效的进行数据库压力测试
- 使用比较运算符号进行比较查询
- 混合运算中,隐式转换是如何进行的?
- verilog 流水线计算乘法运算? (转)