關於fpga實現有符號的加減乘


摘要:測試環境:quartus 13.0,在多數情況下,我們需要通過擴展符號位來實現有符號數的+ - *,但是verilog 的語法中有關於有符號的修飾符:signed,對比,筆者做了簡單的測試,現將過程記錄如下:歡迎大家一起交流,Q群:912014800。

這里我測試了乘法,代碼如下:

 

module mul_test(
input                clk    ,
input                sw0    ,
output reg  signed [2:0]        a  ,
output reg  signed [2:0]        b    ,
output reg signed [5:0]       c
);



reg    sw0_ff0;
reg    sw0_ff1;
reg    sw0_ff2;
reg  [1:0]    cnt;

wire    sw0_l2h ;

always @(posedge clk)begin

    sw0_ff0 <= sw0;
    sw0_ff1 <= sw0_ff0;
    sw0_ff2 <= sw0_ff1;

end

assign sw0_l2h = sw0_ff2==0 && sw0_ff1==1;

always @(posedge clk)begin
    if(sw0_l2h)begin
        cnt <= cnt+1;
    end
end

always@(*)begin
if(cnt==0)begin
    a = -1;
    b =  2;
end
else if(cnt==1)begin
    a = -4;
    b = -4;
end
else if(cnt==2)begin
    a =  2;
    b = -1;
end
else begin
    a = -3;
    b = -2;
end
end

always @(posedge clk)begin

    c <= a * b;

end

endmodule

 

代碼解釋:sw0是外部觸發條件,可以是按鍵或者撥碼開關,當觸發的時候,cnt+1,而cnt的值又會影響reg a 和 b的值,這里直接寫即可(verilog如果表示字符的話,可以這樣子寫:dat  = "a"),最后c 等於a * b ,接下來上板用signal驗證,如下所示:

如上所示,當a = -1, b = 2時,c = -2;當a = -4  b=-4,c=16。

分析:和實際預想的一樣,也就是說在計算的時候自動擴展了符號位。

當去掉signed后,代碼改為(其他不變):

去掉signed后,頂層如上所示:

signal tap 抓的波形如下:

 

如上所示:分析如下:

 

左邊是-1  * 2 如果不擴展符號位 ,算出來的結果是8+4+2 = 14,右邊算出來是16。(這里輸出6bit)

結論:如果計算有符號數的+ - * /,筆者認為可以加上signed修飾即可,這樣子就不用考慮要擴展幾個符號位的問題了,以上測試的fpga是altera c4系列的,其他廠家或情況未知。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM