2017-01-17 3 views
1

В VHDL, почему:VHDL: почему НЕ 'Z' = 'X'

NOT 'Z' = 'X' 

, где Z представляет высокоимпедансное состояние, а Х неизвестна (см std_logic типы сигналов ниже).

Контекст: Это применимо только к VHDL. Мне был задан вопрос об экзамене, когда через инвертор был отправлен сигнал «Z», и это дало «X». Я не понимаю, почему это происходит и почему ответ просто не «Z».

'U': uninitialized. (signal hasn't been set yet) 
'X': unknown (impossible to determine this value/result) 
'0': logic 0 
'1': logic 1 
'Z': High Impedance (signal source when that source makes no effective contribution to the resolved value of the signal) 
'W': Weak unknown 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 
+0

Хорошо, как насчет того, чтобы сделать ваш вопрос менее неясным. 'NOT 'Z' = 'X'' является выражением, возвращающим значение BOOLEAN TRUE. Что ты спрашиваешь? Почему это ИСТИНА? Потому что литералы перечисления не совпадают. (5.2.2.1 * Каждый литерал перечисления дает другое значение перечисления. *, 9.2.3 Реляционные операторы * Оператор равенства возвращает значение TRUE, если оба операнда равны и в противном случае возвращает значение FALSE. *). Добавьте контекст для тех, кто мог ответить. – user1155120

+0

Вы, кажется, не понимаете. Это применимо только к VHDL. Мне был задан вопрос об экзамене, когда сигнал «Z» был отправлен на инвертор и дал «X», который я не понимаю, почему. Я добавил это разъяснение в свой вопрос - спасибо за ваш совет. – Psi

+0

Вы правы, я не понял, ваш вопрос непонятен. Если вы добавите контекст из своего последнего комментария в вопрос и посмотрите в not_table в вышеупомянутом файле std_logic_1164-body.vhdl, вы увидите, что не «Z» действительно «X». Обратите внимание, что только «0», «1», «L» и «H», которые представляют двоичные значения, не преобразуются в «X» при инвертировании. Что такое унарный логический оператор, не имеющий * эффективного вклада * или * форсирующего * или * слабого * металогического значения? Вы можете предположить, что выход инвертора принудительно, «X» *, для которого модель не может различать логические уровни * (16.8.2.2). – user1155120

ответ

3

(я бы сделал это замечание, но я не могу) В контексте того, что вы сказали, если вход инвертора (или любой компонент по этому вопросу) является «Z» (вождение высокое сопротивление), что бы вы ожидали от выхода? Результат должен попадать в набор определенных значений для сигнала std_logic.

Если на вход инвертора не введено значение (т. Е. На вход подается только один сигнал, а это «Z»), симулятор не сможет разрешить входное значение, что приводит к в неизвестном выходе ('X').

EDIT:

Как user1155120 указал в документах, связанных, поведение происходит из-за объявленной "not_table" в std_logic_1164-теле, в котором говорится следующее отображение:

-- truth table for "not" function 
    constant not_table : stdlogic_1d := 
    -- ------------------------------------------------- 
    -- | U X 0 1 Z W L H - | 
    -- ------------------------------------------------- 
      ('U', 'X', '1', '0', 'X', 'X', '1', '0', 'X'); 
+0

Резолюция работает для одного драйвера (IEEE Std 1076-2008 14.7.2), таблица разрешений для std_logic вернет одно значение (см. Std_logic_1164-body.vhdl, как указано выше, функция разрешена - если мы говорим о std_logic и контексте поскольку в вопросе этого вопроса не было). Что происходит в объявлении функции "not" [std_logic return std_logic] и not_table. Вы можете предположить, что выход инвертора принудительно, «X» *, для которого модель не может различать логические уровни * (16.8.2.2). – user1155120

+0

Я ожидаю, что выход останется высоким импедансом «Z» ... Если вы можете объяснить, почему это не «Z», как мой вопрос полностью отвечает. Благодаря! – Psi

+0

Да, я прочитал ваш комментарий после публикации; Я просто просматриваю документы, которые вы сейчас связываете. – gsm

Смежные вопросы