Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

Verilog 4-naar-1 Multiplexer: Ontwerp en Implementatie

Wat is een mux of multiplexer?

Een multiplexer of mux is een digitaal element dat data van één van de N inputs naar de output overdraagt op basis van het selectsignaal. Het geval hieronder toont N=4. Een 4-bit multiplexer zou N inputs van elk 4 bits hebben, waar elke input naar de output gestuurd kan worden via het selectsignaal.

4x1 Mux diagram

sel is een 2-bit input met vier mogelijke waarden. Elke waarde op de select lijn laat één van de inputs door naar output out.

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

Een 4x1 multiplexer kan op meerdere manieren geïmplementeerd worden. Hier zijn de twee meest voorkomende:

  • Met een assign statement
  • Met een case statement

Met assign statement

module mux_4to1_assign (
  input [3:0] a, b, c, d,
  input [1:0] sel,
  output [3:0] out
);
  // Wanneer sel[1] 0 is, kies (sel[0]? b:a), anders (sel[0]? d:c)
  assign out = sel[1] ? (sel[0] ? d : c) : (sel[0] ? b : a);
endmodule

De module mux_4x1_assign heeft vier 4-bit data inputs, één 2-bit select input en één 4-bit data output. De multiplexer selecteert a, b, c of d op basis van sel met de assign statement.

Golfformaat van 4-naar-1 multiplexer

Met case statement

Let op dat out gedeclareerd is als reg omdat het in een procedural blok als always gebruikt wordt.

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

De module mux_4x1_case heeft dezelfde interface maar gebruikt een case statement voor selectie.

Hardware Schema

Beide modellen synthetiseren naar dezelfde hardware:

Gesynthetiseerd multiplexer schema

Testbench

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

Simulatie Log:

ncsim> run
[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 + 0

Golfformaat multiplexer

Verilog

  1. Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
  2. Verilog concatenatie beheersen: Een praktische gids
  3. Verilog-toewijzingen begrijpen: types, syntax en best practices
  4. Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
  5. Verilog-functies beheersen voor efficiënt RTL-ontwerp
  6. Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
  7. Verilog Clock Generator: Ontwerp & Implementatie Gids
  8. Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
  9. Verilog $timeformat beheersen: Precisie en Weergave-controle
  10. Verilog Timescales begrijpen en printen in elke Scope
  11. Verilog File I/O onder de knie: Openen, Lezen, Schrijven en Sluiten