VHDL补码向量左移及8位转9位扩展的实现疑问
嘿,这个问题的核心是补码的符号扩展规则,咱们把它讲透:
首先明确:补码要保持数值不变地扩展位宽时,必须**复制原数的符号位(最高位)**来填充新增的高位,而不是固定用'1'或'0'。
回到你的场景:
compA是-A的8位补码,它的最高位(compA(7))就是符号位:- 如果
A是正数,那么-A是负数,compA(7)为'1',此时扩展到9位就需要用'1' & compA; - 如果
A是负数,那么-A是正数,compA(7)为'0',此时扩展到9位就需要用'0' & compA;
- 如果
所以通用的正确写法是直接用符号位拼接:compA(7) & compA,这样不管A是正还是负,扩展后的9位向量数值都和原来的8位compA完全一致。
另外顺便提一句:你要实现-2A,其实可以直接对compA做算术左移(保持符号位的左移),9位的结果就是compA(7) & compA & '0'——这和你之前实现2A的思路是对应的,本质都是补码的算术左移(乘2)。
最后再确认下你的补码实现:用a nand "11111111"得到not a,再加1,这个逻辑是对的,标准的补码计算方式(取反加1)没问题。
内容的提问来源于stack exchange,提问作者DarkPassenger
相关产品推荐
相关产品推荐

