VHDL中`std_logic`枚举类型的目的是什么?

时间:2012-09-20 01:06:16

标签: vhdl digital

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. 

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

  • 'X'通常是由两个相反方向驱动相同信号的语句引起的,即'0'和'1'
  • 'Z'用于构建三态输出/输入
  • 'L'和'H'分别用于模拟下拉或上拉
  • 当你不关心向量中的某些位时,
  • ' - '用于比较

答案 2 :(得分:5)

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

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

该标准的维基百科文章提供了简洁的描述:

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

答案 3 :(得分:2)

除了已经提供的答案之外,我认为值得一提的是STD_LOGIC是所谓的已解决类型,这意味着信号具有优先权。例如,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' )  -- | - |  

答案 4 :(得分:0)

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

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

我无法检查ISim中的变量,但我认为适用相同的规则。

答案 5 :(得分:0)

std_logic具有解析功能

除了std_logic1之外,0不仅有更多有用的状态,而且还定义了解析函数。

分辨率函数是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标准化并处理许多常见用例。