不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

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.  
     
  7.  
    always@(posedge clk)
  8.  
    begin
  9.  
    if((a-b)< 0)
  10.  
    c <= b - a;
  11.  
    else if ((b-a)==0)
  12.  
    c <= 0;
  13.  
    else
  14.  
    c <= a - b;
  15.  
    end
  16.  
     
  17.  
    endmodule


testbench:

  1.  
    module sim_top ;
  2.  
     
  3.  
    reg clk;
  4.  
    reg signed [7:0] a;
  5.  
    reg signed [7:0] b;
  6.  
    wire signed [8:0] c;
  7.  
     
  8.  
    initial begin
  9.  
    clk= 0;
  10.  
    a=0;
  11.  
    b=8;
  12.  
    forever clk=#5 ~clk ;
  13.  
    end
  14.  
     
  15.  
    always@(posedge clk)
  16.  
    begin
  17.  
    a<=a+2;
  18.  
    b<=b+1;
  19.  
    end
  20.  
     
  21.  
    top my_top(
  22.  
    .clk(clk),
  23.  
    .a(a),
  24.  
    .b(b),
  25.  
    .c(c));
  26.  
     
  27.  
    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.  
     
  7.  
    always@(posedge clk)
  8.  
    begin
  9.  
    /* if((a-b)< 0)
  10.  
    c <= b - a;
  11.  
    else if ((b-a)==0)
  12.  
    c <= 0;
  13.  
    else*/
  14.  
    c <= a - b;
  15.  
    end
  16.  
     
  17.  
    endmodule


testbench同上。

仿真结果:

 

 

posted on 2021-10-22 17:59  皮皮祥  阅读(694)  评论(0编辑  收藏  举报