构建有符号加法器和有符号乘法器的经验

由于本人在一个项目中对AD采样得到的数据采用累加去噪时犯下低级错误,
特意总结了一下verilog中如何使用有符号乘法和加法,希望对大家有所帮助,
避免与我犯一样的错误。. n6 r( N3 V  h9 `
我犯得低级错误对项目影响挺大的,因为项目做得是多通道数据采集,对每个
通道都做累加去噪,由于没有注意到有符号乘法与加法的补码问题,多通道一' x% C1 q# K* }; _7 m. L3 }
直打不到理想的要求,导致项目一度陷入困局,找不出原因,最后才发现是这$ l" X* Z$ a) n3 A# V* o
么低级的错误,感叹基础不好啊


一、有符号加法器设计范例: 

①代码: 
module ADD_func(CLK,nRST,IN1,IN2,OUT1); 
  
 input CLK,nRST; 
 input [7:0] IN1,IN2; 
 output [8:0] OUT1; 
  
 reg [8:0] rOUT; 
  
  always@(posedge CLK or negedge nRST) 
    if (!nRST) 
                   rOUT<=9'd0; 
    else  
                   rOUT<={IN1[7],IN1}+{IN2[7],IN2}; 
                    
 assign OUT1=rOUT; 
  

 endmodule 

②功能:实现一个 8+8的有符号加法器。其有效数据位宽为输入信号位宽加 1,总位宽 L=9
位 
③仿真结果:最终得到的数值,均为易于处理的补码形式。即,负数为符号位不变,其余按
位取反加1。如-216=1_1101_1000,其补码为1_0010_0111+1=1_0010_1000, 216=0_1101_1000,
其补码形式 0_1101_1000为(正数保持不变),如下图所示 
有符号表示方式: 
 二、有符号乘法器设计范例: 
①代码: 
module MUL_func(CLK,nRST,IN1,IN2,OUT1); 
  
 input CLK,nRST; 
 input [7:0] IN1,IN2; 
  output [13:0] OUT1; 
  
 reg [13:0] rOUT; 
  
  always@(posedge CLK or negedge nRST) 
    if (!nRST) 
                   rOUT<=9'd0; 
    else                   
rOUT<={IN1[7],IN1[7],IN1[7],IN1[7],IN1[7],IN1[7],IN1}*{IN2[7],IN2[7],IN2[7],IN2[7],IN2
,IN2[7],IN2}; 
                    
 assign OUT1=rOUT; 

 endmodule 
②功能:实现一个有符号的 8*8 乘法器,其输出信号位数为两输入信号位宽之和减 1,即
L=2*7-1+1=14。(所有位数,需要补符号位) 
③仿真结果:最终得到的数值,均为易于处理的补码形式。即,负数为符号位不变,其余按
位取反加 1。 
如 -2000=111_111_1101_0000, 其补码为 111_000_0010_1111+1=111_000_0011_0000 ,
216=000_111_1101_0000,其补码形式 000_111_1101_0000 为(正数保持不变),如下图所示 
有符号形式: 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值