直接在声明时候去定义signed是不是都是在书里看的这种方法啊。。个人感觉,问题可能一是由于你乘法乘的是3,FPGA怎么算啊,如果是2的幂次,它还知道只是移位就可以了,不是的话它会综合成什么?二是加法运算肯定是按最高位数进行求和的,那之前有个乘法到底按多少位你可以自己查查书了。
个人觉得加法还是在赋值的时候使用$signed去做强制有符号数加法。所以你的程序可以这样:
wire [11:0] a,b;
wire [14:0] c;
wire [12:0] temp;
assign temp = {b,1'b0};
assign c = $signed(a) + $signed(b) + $signed(temp);
试一下吧,顺便告诉我结果哈
你的写法太混乱了,乘法器最少也得1个时钟周期才能得到结果。补码运算的话要注意位扩展,是扩展符号位的意思,不是在高位补零。
你把两个logic类型转换成为integer类型 用强制转换就可以转换成integer,算出来你还可以转换回去,具体的用法查语法书!
用simulink仿真一下,要什么原件自己往里拖,自己去试试就清楚啦