VHDL中“std_逻辑”枚举类型的用途是什么?

VHDL中“std_逻辑”枚举类型的用途是什么?,vhdl,digital,Vhdl,Digital,std_逻辑枚举类型的用途是什么 '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 sh

std_逻辑
枚举类型的用途是什么

'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. 

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

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

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

在VHDL的早期历史中,不同的开发人员基本上都在编写自己版本的
std_逻辑
,以表示真实世界的信号。IEEE-1164引入了这种标准化逻辑类型,以增强不同开发人员针对不同体系结构编写的代码的互操作性

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


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

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

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

除了已经提供的答案之外,我认为值得一提的是,STD_逻辑是所谓的解析类型,这意味着信号具有优先级。例如,1和0对H或L具有更高的优先级,因此如果同时使用L和1驱动信号,则输出将为高(逻辑1),因为1的优先级高于L

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

STD_逻辑的分辨率表如下所示:

--      ---------------------------------------------------------
--      |  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' )  -- | - |  

std_逻辑
具有解析功能

除了
1
0
之外,
std_逻辑
不仅有更多有用的状态,它还定义了一个解析函数

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

SUBTYPE std_logic IS resolved std_ulogic;
其中,
std_-ulogic
std_-logic
的未解析版本(因此不太有用)

特别是,这意味着像
0
1
这样的好东西会导致
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;
ieee库;
使用ieee.std_logic_1164.all;
实体std_逻辑_tb为
结束std_逻辑_tb;
std_逻辑_tb的体系结构行为是
信号s0:std_逻辑;
开始

s0“我建议忽略他们”-这是不合理的建议。特别是“H”和“L”在实际硬件中是非常有用的状态,在任何上/下拉较弱的情况下(例如,上/下拉电阻器,可用于开漏输出)。“H”和“0”解析为“0”,类似于“L”和“1”。@Laogeodritt很好的一点,我的经验仅限于Xilinx FPGA,它们无法以有意义的方式合成。谢谢,我一直在寻找类似的东西。。尽管如此,你能不能给我指一些(稍微)更详细的资源?我相信你不是在寻找VHDL的初学者课程,它肯定应该涵盖std_逻辑。那么你到底在寻找什么;-)