Menu
Coddy logo textTech

Assign с операторами

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

Как только вы разберетесь с непрерывным присваиванием, вы сможете комбинировать его с операторами для создания полезной логики. Инструкция assign может использовать любой оператор для управления сигналом (wire).

Базовый синтаксис

assign wire_name = expression;

Выражение может включать:

  • Арифметические операторы (+, -, *, /)
  • Побитовые операторы (&, |, ^, ~)
  • Логические операторы (&&, ||, !)
  • Операторы сравнения (>, <, ==, !=)
  • Операторы сдвига (<<, >>)
  • Условный оператор (? :)

Примеры с различными операторами

Побитовое И (AND):

assign out = a & b;

Сложение:

assign sum = a + b;

Сравнение:

assign is_greater = (a > b);

Условный оператор (мультиплексор):

assign out = sel ? a : b;

Сдвиг:

assign shifted = data << 2;

Конкатенация:

assign bus = {high_byte, low_byte};

Пример кода

module assign_operators (
  input [3:0] a, b,
  input sel,
  output [3:0] and_out,
  output [4:0] sum_out,
  output is_equal,
  output mux_out
);
  
  assign and_out = a & b;           // Побитовое И
  assign sum_out = a + b;           // Сложение
  assign is_equal = (a == b);       // Сравнение
  assign mux_out = sel ? a : b;     // Условный оператор (мультиплексор)
  
endmodule

Несколько операторов в одном присваивании

Вы можете комбинировать операторы в одном выражении:

assign result = (a & b) | (c ^ d);
assign final = (a + b) > (c - d);
assign parity = ^data;   // Редукционное XOR (нечетное количество единиц)

Приоритет операторов

Verilog следует стандартному приоритету операторов. Используйте скобки ( ), чтобы сделать ваше намерение понятным:

// Неясно
assign out = a & b | c;

// Ясно
assign out = (a & b) | c;
challenge icon

Задание

Добавьте недостающие инструкции assign на основе заданий.

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

  1. Сделайте and_result равным input_a AND input_b (побитовое)
  2. Сделайте or_result равным input_a OR input_b (побитовое)
  3. Сделайте xor_result равным input_a XOR input_b (побитовое)
  4. Сделайте not_result равным NOT input_a (побитовое)

Шпаргалка

Оператор assign поддерживает различные операторы для комбинационной логики:

assign wire_name = expression;

Типы операторов:

  • Побитовые: &, |, ^, ~
  • Арифметические: +, -, *, /
  • Логические: &&, ||, !
  • Сравнения: >, <, ==, !=
  • Сдвига: <<, >>
  • Условные: ? :
  • Конкатенации: { }
assign and_out  = a & b;          // Побитовое И (AND)
assign sum_out  = a + b;          // Сложение
assign is_equal = (a == b);       // Сравнение
assign mux_out  = sel ? a : b;    // Мультиплексор
assign bus      = {high, low};    // Конкатенация
assign parity   = ^data;          // Редукция XOR

Используйте скобки для уточнения приоритета:

assign out = (a & b) | c;

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

module assign_challenge (
  input input_a,
  input input_b,
  output and_result,
  output or_result,
  output xor_result,
  output not_result
);
  
  // TODO: Добавьте операторы назначения (assign) для:
  // and_result = input_a & input_b
  // or_result  = input_a | input_b
  // xor_result = input_a ^ input_b
  // not_result = ~input_a

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

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

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