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