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

Реализация комбинационной логики с помощью always блоков Verilog

Блок always в Verilog можно использовать и для последовательной, и для комбинационной логики. В предыдущей статье показаны примеры с assign. Те же дизайны рассмотрим с always.

Пример #1: Простая комбинационная логика

Код ниже реализует простую цифровую комбинационную логику с выходным сигналом z типа reg, обновляемым при изменении любого сигнала в списке чувствительности. Список задаётся в скобках после @.

module combo ( input a, b, c, d, e, output reg z);
always @ ( a or b or c or d or e) begin
    z = ((a & b) | (c ^ d) & ~e);
end
endmodule

Модуль combo элаборируется в ту же аппаратную схему с цифровыми гейтами.

Используйте блокирующие присваивания (=) при моделировании комбинационной логики с always блоком.

Тестбенч

module tb; reg a, b, c, d, e; wire z; integer i;
combo u0 ( .a(a), .b(b), .c(c), .d(d), .e(e), .z(z));
initial begin
    a <= 0; b <= 0; c <= 0; d <= 0; e <= 0;
    $monitor ("a=%0b b=%0b c=%0b d=%0b e=%0b z=%0b", a, b, c, d, e, z);
    for (i = 0; i < 32; i = i + 1) begin {a, b, c, d, e} = i; #10; end
end endmodule

Simulation Log показывает все 32 комбинации.

Оба метода, assign и always, реализуются в ту же аппаратную логику.

Пример #2: Половинный сумматор

module ha ( input a, b, output sum, cout);
always @ (a or b) begin {cout, sum} = a + b; end
endmodule

Тестбенч

module tb; reg a, b; wire sum, cout; integer i;
ha u0 ( .a(a), .b(b), .sum(sum), .cout(cout));
initial begin a <= 0; b <= 0; $monitor("a=%0b b=%0b sum=%0b cout=%0b", a, b, sum, cout);
for (i = 0; i < 4; i = i + 1) begin {a, b} = i; #10; end end endmodule

Пример #3: Полный сумматор

module fa ( input a, b, cin, output reg sum, cout);
always @ (a or b or cin) begin {cout, sum} = a + b + cin; end
endmodule

Тестбенч

module tb; reg a, b, cin; wire sum, cout; integer i;
fa u0 ( .a(a), .b(b), .cin(cin), .sum(sum), .cout(cout));
initial begin a <= 0; b <= 0; $monitor("a=%0b b=%0b cin=%0b cout=%0b sum=%0b", a, b, cin, cout, sum);
for (i = 0; i < 8; i = i + 1) begin {a, b, cin} = i; #10; end end endmodule

Пример #4: Мультиплексор 2×1

module mux_2x1 (input a, b, sel, output reg c);
always @ ( a or b or sel) begin c = sel ? a : b; end
endmodule

Тестбенч

module tb; reg a, b, sel; wire c; integer i;
mux_2x1 u0 ( .a(a), .b(b), .sel(sel), .c(c));
initial begin a <= 0; b <= 0; sel <= 0; $monitor("a=%0b b=%0b sel=%0b c=%0b", a, b, sel, c);
for (i = 0; i < 3; i = i + 1) begin {a, b, sel} = i; #10; end end endmodule

Пример #5: Демультиплексор 1×4

module demux_1x4 ( input f, input [1:0] sel, output reg a, b, c, d);
always @ ( f or sel) begin
    a = f & ~sel[1] & ~sel[0];
    b = f & sel[1] & ~sel[0];
    c = f & ~sel[1] & sel[0];
    d = f & sel[1] & sel[0];
end
endmodule

Тестбенч

module tb; reg f; reg [1:0] sel; wire a, b, c, d; integer i;
demux_1x4 u0 ( .f(f), .sel(sel), .a(a), .b(b), .c(c), .d(d));
initial begin f <= 0; sel <= 0; $monitor("f=%0b sel=%0b a=%0b b=%0b c=%0b d=%0b", f, sel, a, b, c, d);
for (i = 0; i < 8; i = i + 1) begin {f, sel} = i; #10; end end endmodule

Пример #6: Декодер 4×16

module dec_3x8 ( input en, input [3:0] in, output reg [15:0] out);
always @ (en or in) begin out = en ? 1 << in: 0; end
endmodule

Тестбенч

module tb; reg en; reg [3:0] in; wire [15:0] out; integer i;
dec_3x8 u0 ( .en(en), .in(in), .out(out));
initial begin en <= 0; in <= 0; $monitor("en=%0b in=0x%0h out=0x%0h", en, in, out);
for (i = 0; i < 32; i = i + 1) begin {en, in} = i; #10; end end endmodule

Simulation Log показывает работу декодера.

Verilog

  1. Мастерство VHDL и Verilog: написание чистой комбинационной и последовательной логики
  2. Цепь с переключателем: практическое руководство по базовым электрическим цепям
  3. Интегральные схемы: основы цифровых логических элементов
  4. Понимание булевой алгебры: от логических основ к цифровым схемам
  5. Умножение и деление в научной нотации: правила и примеры
  6. Индустрия 4.0: Интервью с Вереной Майюктке из Bosch.IO об IoT, автоматизации и фабрике будущего
  7. Точный мониторинг температуры в серверной на Raspberry Pi
  8. Практическое гейтовое дизайнирование в Verilog: AND, OR, NOT гейты и 2x1 мультиплексор
  9. Мастерство $timeformat в Verilog: точность и контроль отображения времени
  10. Достигайте идеальных финишей с точными шлифовальными станками Okamoto