4-к-1 мультиплексор на Verilog: assign и case реализации
Что такое мультиплексор?
Мультиплексор (mux) передаёт данные с одного из N входов на выход по управляющему сигналу sel. Для N=4 входов селектор 2-битный.
Значения sel и соответствующие выходы:
sel a b c d out 0 3 7 1 9 3 1 3 7 1 9 7 2 3 7 1 9 1 3 3 7 1 9 9
Две распространённые реализации:
- Через оператор
assign(непрерывное присваивание) - Через оператор
caseв процедурном блоке
Реализация через assign
module mux_4to1_assign (
input [3:0] a, b, c, d,
input [1:0] sel,
output [3:0] out
);
assign out = sel[1] ? (sel[0] ? d : c) : (sel[0] ? b : a);
endmodule
Вложенный тернарный оператор выбирает выход. Схема синтезируется в стандартный мультиплексор.
Реализация через case
Выход out объявлен как reg, так как используется в always.
module mux_4to1_case (
input [3:0] a, b, c, d,
input [1:0] sel,
output reg [3:0] out
);
always @(a or b or c or d or sel) begin
case (sel)
2'b00: out <= a;
2'b01: out <= b;
2'b10: out <= c;
2'b11: out <= d;
endcase
end
endmodule
Аппаратная схема
Обе модели синтезируются в идентичную схему.
Тестбенч
module tb_4to1_mux;
reg [3:0] a, b, c, d;
wire [3:0] out;
reg [1:0] sel;
integer i;
mux_4to1_case mux0 (.a(a), .b(b), .c(c), .d(d), .sel(sel), .out(out));
initial begin
$monitor("[%0t] sel=0x%0h a=0x%0h b=0x%0h c=0x%0h d=0x%0h out=0x%0h", $time, sel, a, b, c, d, out);
sel <= 0; a <= $random; b <= $random; c <= $random; d <= $random;
for (i = 1; i < 4; i = i+1) begin #5 sel <= i; end
#5 $finish;
end
endmodule
Результат симуляции
[0] sel=0x0 a=0x4 b=0x1 c=0x9 d=0x3 out=0x4 [5] sel=0x1 a=0x4 b=0x1 c=0x9 d=0x3 out=0x1 [10] sel=0x2 a=0x4 b=0x1 c=0x9 d=0x3 out=0x9 [15] sel=0x3 a=0x4 b=0x1 c=0x9 d=0x3 out=0x3 Simulation complete via $finish(1) at time 20 NS
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна
- Мастерство $timeformat в Verilog: точность и контроль отображения времени
- Понимание и печать timescale в Verilog в любой области видимости