Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

Операторы Verilog: основная арифметика и управление для синтеза

Данные, которые нельзя обработать, бесполезны — в цифровых схемах и компьютерных системах всегда нужны вычисления. Разберём операторы Verilog, позволяющие инструментам синтеза реализовывать соответствующие аппаратные элементы.

Арифметические операторы

Если второй операнд деления или модуля равен нулю — результат X. Если любой операнд возведения в степень — real, результат тоже real. Результат 1, если второй операнд степени равен 0 (a0).

ОператорОписание
a + ba плюс b
a - ba минус b
a * ba умножить на b
a / ba разделить на b
a % ba по модулю b
a ** ba в степени b
module des; reg [7:0] data1, data2;
initial begin
    data1 = 45; data2 = 9;
    $display ("Add + = %d", data1 + data2);
    $display ("Sub - = %d", data1 - data2);
    $display ("Mul * = %d", data1 * data2);
    $display ("Div / = %d", data1 / data2);
    $display ("Mod %% = %d", data1 % data2);
    $display ("Pow ** = %d", data2 ** 2);
end endmodule

Simulation Log: Add=54, Sub=36, Mul=149, Div=5, Mod=0, Pow=81.

Операторы отношения (Relational)

Выражение с оператором отношения даёт 1, если истинно, 0 — если ложно. Если операнд X или Z — результат X. Приоритет ниже арифметических, все операторы отношения имеют одинаковый приоритет.

ОператорОписание
a < ba меньше b
a > ba больше b
a <= ba меньше или равно b
a >= ba больше или равно b
module des; reg [7:0] data1, data2;
initial begin
    data1 = 45; data2 = 9;  $display ("data1 >= data2 : %0d", data1 >= data2);
    data1 = 45; data2 = 45; $display ("data1 <= data2 : %0d", data1 <= data2);
    data1 = 9;  data2 = 8;  $display ("data1 > data2  : %0d", data1 > data2);
    data1 = 22; data2 = 22; $display ("data1 < data2  : %0d", data1 < data2);
end endmodule

Simulation Log: 1, 1, 1, 0.

Операторы равенства (Equality)

Приоритет одинаков, ниже реляционных. Результат 1 — истина, 0 — ложь. Если операнд логического равенства (==) или неравенства (!=) — X или Z, результат X. Операторы case-equality (===) и case-inequality (!==) учитывают X и Z и всегда дают известное значение.

ОператорОписание
a === ba равно b, включая x и z
a !== ba не равно b, включая x и z
a == ba равно b, результат может быть неизвестным
a != ba не равно b, результат может быть неизвестным
module des; reg [7:0] data1, data2;
initial begin
    data1 = 45; data2 = 9;  $display ("45 === 9 : %0d", data1 === data2);
    data1 = 'b101x; data2 = 'b1011; $display ("101x === 1011 : %0d", data1 === data2);
    data1 = 'b101x; data2 = 'b101x; $display ("101x === 101x : %0d", data1 === data2);
    data1 = 'b101z; data2 = 'b1z00; $display ("101z !== 1z00 : %0d", data1 !== data2);
    data1 = 39; data2 = 39; $display ("39 == 39 : %0d", data1 == data2);
    data1 = 14; data2 = 14; $display ("14 != 14 : %0d", data1 != data2);
end endmodule

Simulation Log: 0, 0, 1, 1, 1, 0.

Логические операторы (Logical)

Результат && — 1, если оба операнда истинны/ненулевые. || — 1, если хотя бы один истинный/ненулевой. Если операнд X — результат X. Логическое отрицание ! превращает ненулевое в 0, нулевое в 1, X остаётся X.

ОператорОписание
a && bистина, если a И b истинны
a || bистина, если a ИЛИ b истинны
!aпреобразует ненулевое в 0 и наоборот
module des; reg [7:0] data1, data2;
initial begin
    data1 = 45; data2 = 9;  $display ("45 && 9 : %0d", data1 && data2);
    data1 = 0;  data2 = 4;  $display ("0 && 4  : %0d", data1 && data2);
    data1 = 'dx; data2 = 3;  $display ("x && 3  : %0d", data1 && data2);
    data1 = 'b101z; data2 = 5; $display ("Z && 5  : %0d", data1 && data2);
    data1 = 45; data2 = 9;  $display ("45 || 9 : %0d", data1 || data2);
    data1 = 0;  data2 = 4;  $display ("0 || 4  : %0d", data1 || data2);
    data1 = 'dx; data2 = 3;  $display ("x || 3  : %0d", data1 || data2);
    data1 = 'b101z; data2 = 5; $display ("Z || 5  : %0d", data1 || data2);
    data1 = 4; $display ("!4 : %0d", !data1);
    data1 = 0; $display ("!0 : %0d", !data1);
end endmodule

Simulation Log: 1,0,x,1, 1,1,1,1, 0,1.

Побитовые операторы (Bitwise)

Комбинируют бит одного операнда с соответствующим битом другого для вычисления бита результата. Таблицы истинности для & и | с учетом 0,1,x,z приведены в таблицах.

module des; reg data1[4]; reg data2[4]; int i,j;
initial begin
    data1[0]=0; data2[0]=0; data1[1]=1; data2[1]=1;
    data1[2]='x; data2[2]='x; data1[3]='z; data2[3]='z;
    for(i=0;i<4;i+=1) for(j=0;j<4;j+=1)
        $display ("data1(%0d) & data2(%0d) = %0d", data1[i], data2[j], data1[i] & data2[j]);
end endmodule

Simulation Log показывает все 16 комбинаций для &.

Операторы сдвига (Shift)

Два вида: логические (<<, >>) и арифметические (<<<, >>).

module des; reg [7:0] data; int i;
initial begin
    data = 8'h1; $display ("Original = %d (%b)", data, data);
    for(i=0;i<8;i+=1) $display ("data << %0d = %b", i, data << i);
    data = 8'h80; $display ("Original = %d (%b)", data, data);
    for(i=0;i<8;i+=1) $display ("data >> %0d = %b", i, data >> i);
    data = 8'h1; $display ("data >> 1 = %b", data >> 1);
end endmodule

Simulation Log: сдвиги влево 1→128, вправо 128→1, последний сдвиг 1>>1 = 0.

Verilog

  1. Операторы C# — исчерпывающее руководство по операторам в C#
  2. Освоение Verilog: полное руководство по проектированию цифровых схем
  3. Освоение конкатенации в Verilog: практическое руководство
  4. Понимание назначений в Verilog: типы, синтаксис и лучшие практики
  5. Блокирующие и неблокирующие назначения в Verilog: ключевые различия
  6. Мастерство функций в Verilog для эффективного RTL дизайна
  7. Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
  8. Генератор тактового сигнала в Verilog: проектирование и реализация
  9. Мастерство математических функций Verilog для эффективного аппаратного дизайна
  10. Мастерство $timeformat в Verilog: точность и контроль отображения времени