【发布时间】:2017-10-10 12:22:48
【问题描述】:
使用ieee.numeric_std 的shift_left 函数,我想将信号左移并从右侧插入1 或0。
signal qo: signed (3 downto 0) := (others=>'0');
qo <= shift_left(qo,1);
这只会从右侧插入0。我想在某些条件下插入1。
【问题讨论】:
标签: vhdl
使用ieee.numeric_std 的shift_left 函数,我想将信号左移并从右侧插入1 或0。
signal qo: signed (3 downto 0) := (others=>'0');
qo <= shift_left(qo,1);
这只会从右侧插入0。我想在某些条件下插入1。
【问题讨论】:
标签: vhdl
不使用shift_left函数,不如使用slicing和concatenation:
qo <= qo(2 downto 0) & '1';
或
qo <= qo(2 downto 0) & '0';
就个人而言,我建议使用切片和连接来进行移位和旋转。运算符(sra 等)存在问题,如您所见,使用切片和连接可以让您完全控制。
【讨论】:
在signed 类型信号的最右边插入'1' 意味着将其值增加1。同样,不插入'1' 意味着将其值增加0。
这最好用+ 运算符表示,即overloaded by the numeric_std package:
-- Id: A.8 function "+" (L: SIGNED; R: INTEGER) return SIGNED; -- Result subtype: SIGNED(L'LENGTH-1 downto 0). -- Result: Adds a SIGNED vector, L, to an INTEGER, R.
所以简单地使用:
shift_left(qo, 1) + 1
分别
shift_left(qo, 1) + 0
无论qo 是如何定义的,这都有效,因此如果您稍后更改qo 的长度,则无需调整任何切片操作。
【讨论】: