无符号数每位都是有效数字,那么问题来了。两数相减,应该是把减数当成负数然后加上其补码。补码是有效位取反加一,符号位不变,那么无符号数没有符号位,怎么实现两数相减呢?
为此用Verilog写出以下测试代码
module test(
input rst,
input clk,
input [7:0]a,
input [7:0]b,
output reg [7:0]c
);
always@(posedge clk or negedge rst )begin
if(!rst ) c <= 8'd0;
else c <= a - b;
end
endmodule
综合后:
图中可以看出,自动为无符号数补充了一位,猜测为符号位
那么两数相加是不是也是这样呢?同样,将上述代码改成a + b,综合结果如下图。两数相加不会补充
又有一个问题,补充符号位,是怎么做的呢?按理来说a最左边填0、b最左边填1,可综合的结果好像都是接高电平。为此还得查看内部结构。
由内部结构可以看出,逻辑功能由基本查找表实现,好像并不能说明什么,还是得把计算过程抽象出来,为此,做了以下测试:
首先,将a、b、c都设成8位,分别进行4-6、14-8、172-92、8-127的仿真,结果如图
由结果初步推断:再计算减法时,会先补充符号位,然后进行补码运算,运算过程就有9位数字(8位有效数字,1位补充的符号位),计算得出的最后结果也是9补码,因为c只有8位,所以结果为省略了符号位的补码。
仿真中小数减大数结果不对的取反加一(负数的原码),刚好为正确结果的有效位。
然后作为对比,将a、b设为8位,c设为9位,其他操作不变,结果如图。可以看出,相对于前一个测试,c[8]第九位多了一个补码符号位。
推断正确!
Yes!好耶!
然而
在看映射时候,又发现一个问题,logic_cell_comb是啥????查找资料,说是基本的查找表结构,692b是内部的16位二进制数。16位?4输入刚好对应16位地址,那怎么有两个输出呢?(COMBOUT是位加减输出,cout是进位)太难了,FPGA从入门到放弃!