Verilog求相反数

条件:数据data为signed  

目的操作:将数据取相反数。即8变-8,-7变7。 

误区:仅仅是“取反加1”  

误区操作的后果: 若data=1000,表示为-8,取反加一后仍为1000,仍为-8


module minusdata;  
  reg clk; 
  reg [3:0]cnt; 
  wire [3:0]minuscnt; 
  wire [3:0]notadd1cnt; 
  wire [4:0]extcnt; 
 
  initial begin
    cnt = 4'd0;   
    clk = 0;     
    forever #10 clk = !clk;  
  end  
  
  always @(posedge clk) begin    
    cnt <= cnt + 1'b1;  
  end
  
  
  assign minuscnt = -cnt; 
  assign notadd1cnt= ~cnt + 1'b1; 
  assign extcnt = -{cnt[3],cnt};      //求相反数,符号位扩展必须
 
 endmodule

ModelSim仿真图如下:



所以,从该实验得出的结论如下,  

1,    verilog中直接加“负号”,等效于讲数据取反加一。  

2,    位宽为N的signed data的范围为,-2^( N - 1)  ~ 2^( N - 1) – 1,  比如说4bit signed data范围为-8 到7。若想取相反数,必须符号位扩展1bit,然后取反加1。

          另外一种途径,不扩展,对-8做特殊处理,讲其近似为7。


你可能感兴趣的:(Verilog)