Verilog求相反数

来源:互联网 发布:agv调度系统算法 编辑:程序博客网 时间:2024/06/08 10:24

条件:数据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。


0 0