Menu
Coddy logo textTech

Вентили XOR, XNOR

Часть раздела Основы путешествия по Verilog на Coddy — урок 41 из 90.

В этом уроке рассматриваются два дополнительных логических вентиля: XOR (исключающее ИЛИ) и XNOR (исключающее ИЛИ-НЕ). Эти вентили полезны для сравнения битов и проверки чётности.

Логический элемент XOR

Логический элемент XOR выдаёт 1, когда значения на входах различаются.

Таблица истинности (для 2 входов):

about
000
011
101
110

Вентильный примитив Verilog:

xor(out, a, b);

Эквивалент непрерывного присваивания (continuous assignment):

assign out = a ^ b;

Элемент XNOR

Элемент XNOR выдаёт 1, когда входы the same (одинаковы). Он противоположен XOR.

Таблица истинности (2 входа):

about
001
010
100
111

Примитив вентиля Verilog:

xnor(out, a, b);

Эквивалент непрерывного присваивания:

assign out = a ~^ b;   // или ~(a ^ b)

Несколько входов

Гейты `XOR` и `XNOR` могут иметь более 2 входов. На выходе получается:

  • XOR: 1, если нечётное количество входов равны 1
  • XNOR: 1, если чётное количество входов равны 1
xor(out, a, b, c);      // 3-входовый XOR
xnor(out, p, q, r, s);  // 4-входовый XNOR

Пример (3-входовый XOR):

abcout
0000
0011
0101
0110
1001
1010
1100
1111

Распространенные варианты использования

ПрименениеПример
Проверить, отличаются ли два битаxor(diff, a, b)
Проверить, совпадают ли два битаxnor(same, a, b)
Генерация четности (нечетное количество единиц)xor(parity, data[0], data[1], data[2], data[3])
Проверка четности (четное количество единиц)xnor(parity, data[0], data[1], data[2], data[3])

Пример кода

module xor_xnor_demo (
  input a, b,
  output xor_out,
  output xnor_out
);
  xor(xor_out, a, b);
  xnor(xnor_out, a, b);
endmodule

Сводная таблица

ВентильВыход равен 1, когдаПримитивОператор
XORВходы различныxor(out, a, b)^
XNORВходы одинаковыxnor(out, a, b)~^
challenge icon

Задание

Добавьте недостающие вентильные примитивы в соответствии с заданиями.

Что нужно сделать:

  1. Создайте вентиль XOR с выходом xor_result и входами x и y
  2. Создайте вентиль XNOR с выходом xnor_result и входами x и y

Попробуйте сами

module xor_xnor_challenge (
  input x,
  input y,
  output xor_result,
  output xnor_result
);
  
  // TODO: Добавить вентиль XOR (xor_result = x ^ y)
  
  // TODO: Добавить вентиль XNOR (xnor_result = x ~^ y)

endmodule
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы