Когда использовать STD_LOGIC вместо BIT в VHDL

9

Какая разница между использованием:

ENTITY MyDemo is 
    PORT(X: IN STD_LOGIC; F: OUT STD_LOGIC );
END MyDemo; 

а также

ENTITY MyDemo is 
    PORT(X: IN BIT; F: OUT BIT );
END MyDemo; 

Каковы ограничения использования BIT по сравнению с STD_LOGIC и наоборот? Они полностью взаимозаменяемы? Я понимаю, что если я определю STD_LOGIC, я не смогу использовать его с BIT_Vector для доступа к элементам в массиве. Но я не могу видеть разницу.

декан
источник
stackoverflow.com/questions/12504884/std-logic-in-vhdl
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

Ответы:

9

Bitявляется предопределенным типом и может иметь только значение 0или 1. BitТип представляет собой идеализированное значение.

type Bit is ('0', '1');

std_logicявляется частью std_logic_1164пакета и обеспечивает более реалистичное моделирование сигналов в цифровой системе. Он способен иметь девять разных значений. Как правило , в пределах вашего кода вы будете использовать только 0, 1и Z(High-Z). Но U(Uninitialized) и X(Unknown) также очень полезны при моделировании системы в тестовом стенде.

    -------------------------------------------------------------------    
    -- logic state system  (unresolved)
    -------------------------------------------------------------------    
    TYPE std_ulogic IS ( 'U',  -- Uninitialized
                         'X',  -- Forcing  Unknown
                         '0',  -- Forcing  0
                         '1',  -- Forcing  1
                         'Z',  -- High Impedance   
                         'W',  -- Weak     Unknown
                         'L',  -- Weak     0       
                         'H',  -- Weak     1       
                         '-'   -- Don't care
                       );

--    attribute ENUM_ENCODING of std_ulogic : type is "U D 0 1 Z D 0 1 D";

    -------------------------------------------------------------------    
    -- *** industry standard logic type ***
    -------------------------------------------------------------------    
    SUBTYPE std_logic IS resolved std_ulogic;

std_logic_1164Пакет также предоставляет функцию преобразования для преобразования std_logicв Bit.

embedded.kyle
источник
5

Большинство людей используют std_logic. Это допускает u(неопределенный), x(неизвестный) и z(высокий импеданс), который бит не делает. Несмотря на то, что вы никогда не сможете использовать чип и не нуждаетесь z, uон полезен для поиска пропущенных перезагрузок. xполезно для поиска нескольких драйверов.

Брайан Карлтон
источник
7
Я думаю, это забавно, что вы упоминаете полезность Xдля поиска нескольких драйверов. std_logicдействительно является типом отраслевого стандарта для VHDL, но он также является одной из наиболее часто используемых функций VHDL. std_logicявляется разрешенным сигналом, что означает, что функция используется для разрешения значения сигнала в случае нескольких драйверов. Но в подавляющем большинстве случаев несколько драйверов является ошибкой. Использование такого неразрешенного типа, как std_ulogicэтот, будет помечено компилятором как ошибка.
Трондд
@trondd: Хороший вопрос о std_ulogic. Но имейте в виду, что многие ядра будут написаны, std_logicтак что вы, вероятно, увидите некоторые из них.
Брайан Карлтон
1
std_logicдействительно самый распространенный тип вокруг; Я просто утверждаю, что его использование не соответствует первоначальному замыслу: моделированию сигналов с несколькими состояниями. Для внутренних конструкций мы обычно рассматриваем только 1или 0и один водитель. См. Electronics.stackexchange.com/questions/17524/… для подробного обсуждения этой темы.
Трондд
5

std_logic имеет функцию разрешения

Мало того, что std_logicесть более полезные состояния , кроме 1и 0, он также имеет функцию разрешения определена.

Функция разрешения - это концепция языка 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;

Это имеет интуитивный смысл, так как мы понимаем, Xчто это состояние, когда несколько несовместимых значений применяются к одному проводу.

std_logic также знает, как разрешить каждую другую возможную пару входных сигналов в соответствии с таблицей, присутствующей в LRM.

bit с другой стороны, не имеет функции разрешения, и если бы мы использовали ее в приведенном выше примере, это привело бы к ошибке симуляции на GHDL 0.34.

Возможные значения std_logicявляются хорошим выбором, потому что они стандартизированы IEEE 1164 и имеют дело со многими распространенными случаями использования.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
источник
0

std_logic больше, чем бит , и в основном должен использоваться большую часть времени.

Существует также логический тип, который, как и бит , имеет два значения. Это тип сравнения результатов, ожидаемый после IF [bool] или WHEN [bool] , часто используемый для констант выбора:constant ENABLE_DEBUG_INTERFACE : boolean := true;

Единственное место, где бит может быть предпочтительнее std_logic, это большие массивы, воспоминания. При оптимизации симуляторов бит занимает меньше места в памяти симулятора, чем std_logic . И может иметь значение, если ваш проект создает один ГБ ОЗУ.

Это может также быть быстрее для очень больших проектов, например, что-то автоматически генерируемое из списка соединений уровня пост-синтеза.

Конечно, этот аспект производительности не является частью языка и зависит от реализации симулятора VHDL.

TEMLIB
источник