由於本人在一個項目中對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 爲(正數保持不變),如下圖所示
有符號形式: