1. 程式人生 > 其它 >verilog 中signed資料處理,負數

verilog 中signed資料處理,負數

verilog中支援signed 資料型別,即支援負數的處理。此時參與運算的各個數均應是signed型別,且資料位寬相同(若位寬不相同,則應手動將其擴充套件為位寬相同,具體做法就是將最高位的符號位進行擴充套件),且運算結果要比運算數的位數大以防止溢位。以下用兩個小例子進行說明。細節可參考此篇文章:http://www.cnblogs.com/oomusou/archive/2009/10/31/verilog_signed_overflow.html

Examp 1.

  1. module top(clk,a,b,c);
  2. input clk;
  3. input signed [7:0] a;
  4. input signed [7:0] b;
  5. output reg signed [8:0] c;
  6. always@(posedge clk)
  7. begin
  8. if((a-b)< 0)
  9. c <= b - a;
  10. else if ((b-a)==0)
  11. c <= 0;
  12. else
  13. c <= a - b;
  14. end
  15. endmodule


testbench:

  1. module sim_top ;
  2. reg clk;
  3. reg signed [7:0] a;
  4. reg signed [7:0] b;
  5. wire signed [8:0] c;
  6. initial begin
  7. clk= 0;
  8. a=0;
  9. b=8;
  10. forever clk=#5 ~clk ;
  11. end
  12. always@(posedge clk)
  13. begin
  14. a<=a+2;
  15. b<=b+1;
  16. end
  17. top my_top(
  18. .clk(clk),
  19. .a(a),
  20. .b(b),
  21. .c(c));
  22. endmodule


模擬結果圖:

Examp 2:

  1. module top(clk,a,b,c);
  2. input clk;
  3. input signed [7:0] a;
  4. input signed [7:0] b;
  5. output reg signed [8:0] c;
  6. always@(posedge clk)
  7. begin
  8. /* if((a-b)< 0)
  9. c <= b - a;
  10. else if ((b-a)==0)
  11. c <= 0;
  12. else*/
  13. c <= a - b;
  14. end
  15. endmodule


testbench同上。

模擬結果: