構建有符號加法器和有符號乘法器的經驗

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章