VHDL 中的“std_logic”枚举类型的目的是啥?

Posted

技术标签:

【中文标题】VHDL 中的“std_logic”枚举类型的目的是啥?【英文标题】:What is the purpose of the `std_logic` enumerated type in VHDL?VHDL 中的“std_logic”枚举类型的目的是什么? 【发布时间】:2012-09-12 08:41:56 【问题描述】:

std_logic 枚举类型的用途是什么?

'U': uninitialized. This signal hasn't been set yet.
'X': unknown. Impossible to determine this value/result.
'0': logic 0
'1': logic 1
'Z': High Impedance
'W': Weak signal, can't tell if it should be 0 or 1.
'L': Weak signal that should probably go to 0
'H': Weak signal that should probably go to 1
'-': Don't care. 

【问题讨论】:

【参考方案1】: 'X' 通常是由两个语句以相反的方向驱动相同的信号引起的,即'0'和'1' 'Z' 用于构建三态输出/输入 “L”和“H”分别用于对下拉或上拉建模 '-' 用于当您不关心向量中的某些位时进行比较

【讨论】:

谢谢,我一直在寻找类似的东西。不过,您能否指出一些(稍微)详细说明的资源? 我确定您不是在寻找 VHDL 初学者课程,它肯定会涵盖 std_logic。那么你到底在寻找什么;-)【参考方案2】:

std_logic 基本上是单线或位。您可以对它们使用逻辑运算符(and、or、xor 等)。在模拟设计时,我相信我只看到了“X”、“0”或“1”。显然你想要'0'或'1'。 “X”表示该值未知(可能未连接到任何东西或信号中存在故障)。此外,std_logic_vector 可用于需要超过 1 位宽的信号。我不确定这是否能回答您的问题...

【讨论】:

【参考方案3】:

std_logic 类型由 IEEE-1164 标准引入,作为单根导线或位的准确代表。 VHDL 语言本身不提供足以表示“真实”逻辑的单比特类型。也就是说,表示现代可编程逻辑器件中可建模和可合成逻辑的所有可能状态。

在 VHDL 历史的早期,不同的开发人员基本上都在编写自己的 std_logic 版本,以满足表示真实世界信号的需要。 IEEE-1164 引入了这种标准化逻辑类型,旨在增强不同开发人员为不同架构编写的代码的互操作性。

该标准的***文章提供了简洁的描述:

http://en.wikipedia.org/wiki/IEEE_1164

【讨论】:

【参考方案4】:

除了已经给出的答案,我觉得值得一提的是STD_LOGIC就是所谓的resolved type,也就是说有信号的优先级。例如,1 和 0 对 H 或 L 具有更高的优先级,因此如果同时使用 L 和 1 驱动信号,则输出将为高电平(逻辑 1),因为 1 的优先级高于 L。

碰巧您列出值的顺序,在您的问题中是优先级的顺序,需要注意的是某些值具有相同的优先级,因此如果您使用这两个信号驱动它们,则没有明确的“赢家”,因此结果是层次结构中的下一个“未知”状态(“X”或“W”),一个简单的例子是,如果信号由“H”和“L”驱动,则结果将是“W”。

STD_LOGIC 的解析表如下所示:

--      ---------------------------------------------------------
--      |  U    X    0    1    Z    W    L    H    -        |   |  
--      ---------------------------------------------------------
        ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
        ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
        ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
        ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
        ( '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' )  -- | - |  

【讨论】:

【参考方案5】:

std_logic有解析功能

std_logic除了10之外,不仅有更多有用的状态,还定义了解析函数。

解析函数是一个 VHDL 语言概念。它是一个与类型相关联的函数,它确定当该类型的多个值应用于单个信号时会发生什么。语法是:

SUBTYPE std_logic IS resolved std_ulogic;

其中std_ulogicstd_logic 的未解决(因此用处不大)版本。

特别是,这意味着像01 这样的好东西会导致X

library ieee;
use ieee.std_logic_1164.all;

entity std_logic_tb is
end std_logic_tb;

architecture behav of std_logic_tb is
    signal s0 : std_logic;
begin
    s0 <= '0';
    s0 <= '1';
    process
    begin
        wait for 1 ns;
        assert s0 = 'X';
        wait;
    end process;
end behav;

这很直观,因为我们将X 理解为将多个不兼容的值应用于单个线路的状态。

std_logic 还知道如何根据 LRM 上的表格解析每对其他可能的输入信号。

另一方面,bit 没有解析功能,如果我们在上面的示例中使用它,会导致 GHDL 0.34 上的模拟错误。

std_logic 的可能值是一个不错的选择,因为它们由IEEE 1164 标准化并处理许多常见用例。

相关:https://electronics.stackexchange.com/questions/51848/when-to-use-std-logic-over-bit-in-vhdl

【讨论】:

【参考方案6】:

我在 Xilinx 的模拟器 ISim 中观察到了这种行为:

'U' - 是所有未明确设置默认值的信号的默认状态。我建议为每个信号设置一个默认值。 'X' - 当信号由具有不同值的两个或多个驱动程序驱动时分配 'Z' - 是明确的高 Z 状态。请记住,这只能在具有支持三态的元素的硬件中实现。我建议仅将其用于 IO 引脚,因为这些资源在结构中很少见。 “0”和“1”是正常状态。 我从未见过任何其他状态,我不希望它们适用于 FPGA。

不可能在 ISim 中检查变量,但我假设适用相同的规则。

【讨论】:

“我建议忽略它们” - 这是不合理的建议。特别是“H”和“L”在实际硬件中是非常有用的状态,在任何有弱上拉/下拉的情况下(例如,上拉/下拉电阻,可用于开漏输出)。 'H' 和 '0' 解析为 '0',同样适用于 'L' 和 '1'。 @Laogeodritt 好点,我的经验仅适用于无法以有意义的方式合成的 Xilinx FPGA。

以上是关于VHDL 中的“std_logic”枚举类型的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

VHDL入门学习-程序组成

vhdl语言有哪几种类操作符?

VHDL操作符

VHDL中std_logic_vector(4095 dow nto 0)怎么赋0初值

用VHDL语言编写时序电路

请问用if写出四选一多路选择器的vhdl的设计,怎么写?