微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求助$signed的用法

求助$signed的用法

时间:10-02 整理:3721RD 点击:
想计算5-2,第一次手动计算,第二次加$signed来计算,如下:
第一次:
wire[3:0] a,b,c;
assign a = 4'd5;
assign b = 4'b1110; //-2的补码
assign c = a + b;
仿真结果为4'b0011;
第二次:
wire [3:0] a1,b1;
wire signed [3:0] c1;
assign a1 = 4'd5;
assign b1 = 4'b1010; //-2的原码
assign c1 = $signed(a1) + $signed(b1);
仿真结果为4'1111;

目的是想弄清楚$signed的用法,理解$signed就是自动计算补码,不明白为什么用$signed来计算结果却不正确,求解,谢谢!

$signed表示强制转换成有符号数,你上面的两个数转换前后是不变的,因为位宽都是4bit。

谢谢回复,还是没明白,不知道是不是c1的位宽不够,我将它的位宽改为5之后结果是5'h1f

$signed(4'b1010)是-6

4楼正解 1010的补码是 0101+1 = 0110 = 6

明白了,顶LS



    什么意思啊。我在IEEE std 1364-2005看的
regS=$signed(4'b1100);//regS=-4

想计算5-2,第一次手动计算,第二次加$signed来计算,如下:
第一次:
wire[3:0] a,b,c;
assign a = 4'd5;
assign b = 4'b1110; //-2的补码
assign c = a + b;
仿真结果为4'b0011;
a=5,b=14  c=a+b=19,因为c只有4bit,数据溢出,因此c=3
第二次:
wire [3:0] a1,b1;
wire signed [3:0] c1;
assign a1 = 4'd5;
assign b1 = 4'b1010; //-2的原码
assign c1 = $signed(a1) + $signed(b1);
仿真结果为4'1111;
$signed(a1)=5, $signed(b1) =-6 ,c1=-1,因此c1=4'b1111

   -4,符号位作为最高位为1, 4的补码为100,因此-4的补码为4'b1100。

有需要关于有符号数的计算,应当利用Verilog 2001所提供的signed及$signed()机制
Verilog会自动进行符号的扩展。有号数与无号数的混合计算:不要在同一个verilog叙述中进行有号数与无号数的计算。应该要分成个别独立的叙述。在一个verilog叙述中只要有一个无号数的操作数,整个算式将被当成无号数进行计算

貌似有点懂了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top