掌握std_logic_vector:在VHDL中创建信号向量
std_logic_vector类型是VHDL定义信号总线的标准。std_logic建模单根线状态,std_logic_vector将其扩展为线阵列,实现多位总线表示。
与单比特std_logic不同,std_logic_vector是复合类型——std_logic元素的索引集合。可容纳任意位数,适合连接交换多位数据的组件。
本文属基础VHDL教程系列。
声明std_logic_vector信号语法:signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;
或signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>;
其中<name>为用户标识符,<initial_value>可选。<lsb>和<msb>分别为最低和最高有效位索引。
to或downto指定范围方向(即大小端)。两者均可,但多数设计师偏好downto清晰明了。我建议声明位向量时始终用downto避免混淆。
字节大小向量VHDL代码:
signal MySlv : std_logic_vector(7 downto 0);
一位向量VHDL代码:
signal MySlv : std_logic_vector(0 downto 0);
空范围(零位)VHDL代码:
signal MySlv : std_logic_vector(-1 downto 0);
练习
本视频教程学习声明std_logic_vector信号并给初始值。也学用For循环遍历向量位创建移位寄存器:
本教程创建的最终代码:
library ieee; use ieee.std_logic_1164.all; entity T11_StdLogicVectorTb is end entity; architecture sim of T11_StdLogicVectorTb is signal Slv1 : std_logic_vector(7 downto 0); signal Slv2 : std_logic_vector(7 downto 0) := (others => '0'); signal Slv3 : std_logic_vector(7 downto 0) := (others => '1'); signal Slv4 : std_logic_vector(7 downto 0) := x"AA"; signal Slv5 : std_logic_vector(0 to 7) := "10101010"; signal Slv6 : std_logic_vector(7 downto 0) := "00000001"; begin -- Shift register process is begin wait for 10 ns; for i in Slv6'left downto Slv6'right + 1 loop Slv6(i) <= Slv6(i-1); end loop; Slv6(Slv6'right) <= Slv6(Slv6'left); end process; end architecture;
ModelSim按运行并放大时间线后的波形窗口:
分析
本练习声明六个std_logic_vector总线,每个八位长(一字节)。
信号Slv1未给初始值。波形截图中总线显示XX,因十六进制显示无法表示未知值。仔细看各位实际为U。
信号Slv2用聚合赋值(others => '0')置所有位零。此简洁语法确保无论向量宽度每个元素获指定值。
信号Slv3用相同聚合技术初始化所有位为一,波形显示FF(八个1的十六进制)。
信号Slv4演示十六进制初始化:AA。每个十六进制数字映射四位,两数字覆盖8位向量。
信号Slv5含相同值但用二进制10101010表达。Slv4和Slv5波形均渲染为AA。
信号Slv6起始全零除最低有效位为1。进程实现左移寄存器,每10ns将1在向量中循环。
进程利用left和right属性保持代码通用;调整向量大小无需改代码。
存在其他属性但超出入门教程范围。
要点
- N位向量应用
std_logic_vector(N-1 downto 0)声明。 - 向量可整体赋值,也可访问单个位。
- 聚合赋值
(others => '0')可将所有位清零。 - 用
'left和'right等属性使代码通用且可维护。
参加基础VHDL测验–第2部分 »
或
进入下一教程 »
VHDL