掌握VHDL Signed与Unsigned类型实战指南
在VHDL中,signed和unsigned是专用位向量,让你能在数据总线上执行算术运算。与适合路由信号但不适合计算的std_logic_vector不同,编译器将这些类型解释为数值。
尝试添加std_logic_vector触发编译错误:No feasible entries for infix operator "+",因工具无法确定如何将原始位模式视为数字。
基础VHDL教程系列之一。
为启用算术,将向量声明为signed或unsigned:
signal <name> : signed(<N-1> downto 0) := <initial_value>; signal <name> : unsigned(<N-1> downto 0) := <initial_value>;
范围可用to或downto,但downto 0最常用。初始值可选;省略则所有位默认'U'。
为何偏好signed/unsigned而非传统integer?数字设计师常需精确控制位宽。这些向量类型溢出回绕,而integer超限制会引发运行时错误。此外向量可含'U'和'X'等元值,有助尽早暴露设计bug。
视频演示
配套视频探讨signed和unsigned信号的相似与差异。
示例代码
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T12_SignedUnsignedTb is end entity; architecture sim of T12_SignedUnsignedTb is signal UnsCnt : unsigned(7 downto 0) := (others => '0'); signal SigCnt : signed(7 downto 0) := (others => '0'); signal Uns4 : unsigned(3 downto 0) := "1000"; signal Sig4 : signed(3 downto 0) := "1000"; signal Uns8 : unsigned(7 downto 0) := (others => '0'); signal Sig8 : signed(7 downto 0) := (others => '0'); begin process is begin wait for 10 ns; -- Wrapping counter UnsCnt <= UnsCnt + 1; SigCnt <= SigCnt + 1; -- Adding signals Uns8 <= Uns8 + Uns4; Sig8 <= Sig8 + Sig4; end process; end architecture;
波形分析
ModelSim波形聚焦关键事件,为清晰以十六进制显示所有值:

计数器示例中,UnsCnt和SigCnt均从0开始,增至FF(十进制255),回绕到0——演示相同回绕行为。
4位信号Uns4和Sig4均持二进制1000,无符号为十进制8,有符号为-8(二补数)。
将这些4位数加到8位累加器时,符号扩展起作用。无符号数补零,有符号数补符号位。结果Uns8增8,Sig8减8。
可视化符号扩展过程阐明差异:

关键要点
signed和unsigned均为支持算术运算的向量类型。- 溢出静默;值按位宽回绕。
- 加不同长度操作数时符号扩展可能产生不同结果。
进入下一教程深入了解。
VHDL