Коли використовувати STD_LOGIC над BIT у VHDL


10

Яка різниця між використанням:

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 для доступу до елементів масиву. Але я, здається, не бачу різниці.


Відповіді:


10

Bitє заздалегідь визначеним типом і може мати лише значення 0або 1. BitТип являє собою ідеалізований значення.

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

std_logicє частиною std_logic_1164пакету і забезпечує більш реалістичне моделювання сигналів в цифровій системі. Він здатний мати дев’ять різних значень. Як правило , в межах вашого коду ви будете використовувати тільки 0, 1і Z(High-Z). Але U(неініціалізовані) та X(невідомі) також дуже корисні при моделюванні системи на тестовому стенді.

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


6

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


7
Я думаю, що смішно, що ви згадуєте про корисність Xпошуку кількох драйверів. std_logicце справді галузевий стандарт типу VHDL, але він також є найбільш часто використовуваною функцією VHDL. std_logic- це розв'язаний сигнал, який означає, що функція використовується для вирішення значення сигналу у випадку декількох драйверів. Але в переважній більшості випадків кілька драйверів - це помилка. Використання невирішеного типу, такого як std_ulogicкомпілятор, позначив би компілятором як помилку.
trondd

@trondd: Добрий момент про std_ulogic. Але майте на увазі, що багато ядер будуть написані, std_logicтак що ви, ймовірно, побачите деякі з них.
Брайан Карлтон

1
std_logicдійсно є найбільш поширеним типом навколо; Я просто стверджую, що його використання не відповідає первинному наміру: Моделювання сигналів багатодержавного стану. Для внутрішніх конструкцій ми зазвичай розглядаємо тільки 1або 0й один водій. Дивіться електроніку.stackexchange.com/ questions/ 17524/…, щоб детально обговорити цю тему.
trondd

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 і стосуються багатьох випадків поширеного використання.


0

std_logic багатший за біт , і в основному його слід використовувати більшу частину часу.

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

Одне місце, де біт може віддавати перевагу std_logic - це великі масиви, пам'яті. Оптимізуючи тренажери, біт займає меншу площу в пам'яті симулятора, ніж std_logic . І це може мати значення, якщо ваш дизайн примірник одного ГБ ОЗУ.

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

Звичайно, цей аспект продуктивності не є частиною мови, і залежить від реалізації симулятора VHDL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.