摘要:測試環境: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系列的,其他廠家或情況未知。