掌握VHDL std_logic:状态、分辨函数与波形分析
在VHDL中,std_logic类型是表示物理线上单比特的基石。不同于早期教程用的简单integer类型,std_logic提供更丰富的值集,更准确建模真实数字信号行为。
数字引脚通常只有逻辑高('1')或逻辑低('0'),但物理信号也可能呈高阻态、弱态或未定义状态。std_logic类型捕获所有这些可能性,使其成为VHDL设计中最常用类型。
本文属基础VHDL教程系列。
std_logic信号可取的完整值列表:
| '1' | 逻辑1 |
| '0' | 逻辑0 |
| 'Z' | 高阻抗 |
| 'W' | 弱信号;不定0或1 |
| 'L' | 弱0(下拉) |
| 'H' | 弱1(上拉) |
| '-' | 不关心 |
| 'U' | 未初始化 |
| 'X' | 未知(多驱动器) |
多数教程聚焦主要值'1'和'0',偶尔用'U'和'X'突显设计错误。其余状态为高级特性,用于建模I2C等协议或创建三态总线。
当多个进程驱动同一std_logic信号时,语言用分辨函数决定结果值。此机制防止仿真编译期或运行时错误,由分辨表定义,如下所示。
| U | X | 0 | 1 | Z | W | L | H | - | |
|---|---|---|---|---|---|---|---|---|---|
| U | X | X | 1 | 1 | 1 | 1 | 1 | X | 1 |
| U | X | 0 | X | 0 | 0 | 0 | 0 | X | 0 |
| U | U | U | U | U | U | U | U | U | U |
| U | X | X | X | X | X | X | X | X | X |
| U | X | 0 | 1 | Z | W | L | H | X | Z |
| U | X | 0 | 1 | W | W | W | W | X | W |
| U | X | 0 | 1 | L | W | L | W | X | L |
| U | X | 0 | 1 | H | W | W | H | X | H |
| U | X | X | X | X | X | X | X | X | - |
练习
本视频教程演示声明std_logic信号并在波形仿真中可视化。
本练习产生的最终VHDL代码如下:
library ieee; use ieee.std_logic_1164.all; entity T10_StdLogicTb is end entity; architecture sim of T10_StdLogicTb is signal Signal1 : std_logic := '0'; signal Signal2 : std_logic; signal Signal3 : std_logic; begin process is begin wait for 10 ns; Signal1 <= not Signal1; end process; -- Driver A process is begin Signal2 <= 'Z'; Signal3 <= '0'; wait; end process; -- Driver B process(Signal1) is begin if Signal1 = '0' then Signal2 <= 'Z'; Signal3 <= 'Z'; else Signal2 <= '1'; Signal3 <= '1'; end if; end process; end architecture;
ModelSim按运行并放大时间线后的波形窗口:

光标放在重复信号周期另一部分的波形:

分析
本练习演示VHDL分辨函数实际作用。通过检查波形而非仅靠文本输出,更清晰地看到多驱动器如何在std_logic信号上交互。
Signal1由单进程切换,值在'0'和'1'间干净交替。由驱动器A和B驱动的信号按前述表分辨。
| 信号 | 驱动器A | 驱动器B | 结果 |
|---|---|---|---|
| Signal2 | 'Z' | 'Z' | 'Z' |
| Signal2 | 'Z' | '1' | '1' |
| Signal3 | '0' | 'Z' | '0' |
| Signal3 | '0' | '1' | 'X' |

要点
std_logic是VHDL单比特信号最广泛使用的类型。- 将
std_logic信号视为承载数字值的物理导线。 - 多进程驱动同一
std_logic信号时,分辨函数决定最终值。
进入下一教程 »
VHDL