VHDL 2008中能否获取shift_left/right丢弃位 还是需手动实现移位?
VHDL 2008移位函数获取溢出位问题解答
首先明确:VHDL 2008内置的shift_left、shift_right逻辑移位函数仅返回移位后的运算结果,没有对外暴露被丢弃的溢出位的接口,你无法直接从这两个函数的返回值中读取到被丢弃的MSB/LSB。
但你也不需要完全手动重写移位逻辑,根据移位位数的不同可以选择更简便的实现方式:
- 若移位位数固定为1位:直接提前读取原向量的对应位即可,无需修改移位实现逻辑
逻辑左移1位场景:进位位取原向量最高位,示例代码如下:
逻辑右移1位场景:进位位取原向量最低位,示例代码如下:signal input : std_logic_vector(7 downto 0); signal result : std_logic_vector(7 downto 0); signal carry : std_logic; carry <= input(7); -- 左移1位时被丢弃的MSB result <= shift_left(input, 1);carry <= input(0); -- 右移1位时被丢弃的LSB result <= shift_right(input, 1); - 若移位位数为动态值(由ALU操作数控制的可变N位):只需要额外计算被丢弃的最后一位的位置即可,移位操作仍可调用内置函数:
逻辑左移N位场景:最后被移出的进位位为原向量第input'high - N + 1位(需提前判断N不大于向量位宽,避免数组越界)
逻辑右移N位场景:最后被移出的进位位为原向量第N-1位
如果你不想手动计算位索引,也可以通过拼接临时向量的方式捕获溢出位,不需要修改移位逻辑。
如果你的ALU设计需要记录所有移出位的运算结果(比如所有移出位的或、异或等),则需要手动实现移位逻辑完成对应统计。
内容的提问来源于stack exchange,提问作者Kevin KZ
相关产品推荐
相关产品推荐

