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/Mux

Wat is een mux of multiplexer?

Een multiplexer of mux kortom, is een digitaal element dat gegevens overdraagt ​​van een van de N-ingangen naar de uitgang op basis van het geselecteerde signaal. Het onderstaande geval is wanneer N gelijk is aan 4. Een 4-bit multiplexer zou bijvoorbeeld N ingangen van elk 4 bits hebben, waarbij elke ingang kan worden overgedragen naar de uitgang met behulp van een selectiesignaal.

sel is een 2-bits invoer en kan vier waarden hebben. Met elke waarde op de selectieregel kan een van de ingangen naar de uitgangspin worden gestuurd.

	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 worden geïmplementeerd en hier ziet u twee van de meest voorkomende manieren:

  • Een assign gebruiken verklaring
  • Een case gebruiken verklaring

Gebruik assign verklaring

  
  
module mux_4to1_assign ( input [3:0] a,                 // 4-bit input called a
                         input [3:0] b,                 // 4-bit input called b
                         input [3:0] c,                 // 4-bit input called c
                         input [3:0] d,                 // 4-bit input called d
                         input [1:0] sel,               // input sel used to select between a,b,c,d
                         output [3:0] out);             // 4-bit output based on input sel

   // When sel[1] is 0, (sel[0]? b:a) is selected and when sel[1] is 1, (sel[0] ? d:c) is taken
   // When sel[0] is 0, a is sent to output, else b and when sel[0] is 0, c is sent to output, else d
   assign out = sel[1] ? (sel[0] ? d : c) : (sel[0] ? b : a); 
   
endmodule

  

De module genaamd mux_4x1_assign heeft vier 4-bit data-ingangen, een 2-bit select-ingang en een 4-bit data-uitgang. De multiplexer zal ofwel a , b, c of d selecteren op basis van het geselecteerde signaal sel met behulp van de assign verklaring.

Gebruik case verklaring

Merk op dat het signaal uit wordt gedeclareerd als een reg type omdat het wordt gebruikt in een procedurele blokkeren zoals always .

  
  
module mux_4to1_case ( input [3:0] a,                 // 4-bit input called a
                       input [3:0] b,                 // 4-bit input called b
                       input [3:0] c,                 // 4-bit input called c
                       input [3:0] d,                 // 4-bit input called d
                       input [1:0] sel,               // input sel used to select between a,b,c,d
                       output reg [3:0] out);         // 4-bit output based on input sel
                  
   // This always block gets executed whenever a/b/c/d/sel changes value
   // When that happens, based on value in sel, output is assigned to either a/b/c/d
   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 genaamd mux_4x1_case heeft vier 4-bit data-ingangen, een 2-bit select-ingang en een 4-bit data-uitgang. De multiplexer selecteert a , b, c of d op basis van het geselecteerde signaal met behulp van de case verklaring.

Hardwareschema

Beide typen multiplexermodellen worden gesynthetiseerd in dezelfde hardware, zoals weergegeven in de onderstaande afbeelding.

Testbank

  
  
module tb_4to1_mux;

   // Declare internal reg variables to drive design inputs
   // Declare wire signals to collect design output
   // Declare other internal variables used in testbench
   reg [3:0] a;
   reg [3:0] b;
   reg [3:0] c;
   reg [3:0] d;
   wire [3:0] out;
   reg [1:0] sel;
   integer i;
   
   // Instantiate one of the designs, in this case, we have used the design with case statement
   // Connect testbench variables declared above with those in the design
   mux_4to1_case  mux0 (   .a (a),
                           .b (b),
                           .c (c),
                           .d (d),
                           .sel (sel),
                           .out (out));

   // This initial block is the stimulus
   initial begin
      // Launch a monitor in background to display values to log whenever a/b/c/d/sel/out changes
      $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);
   
   	  // 1. At time 0, drive random values to a/b/c/d and keep sel = 0
      sel <= 0;
      a <= $random;
      b <= $random;
      c <= $random;
      d <= $random;
      
      // 2. Change the value of sel after every 5ns
      for (i = 1; i < 4; i=i+1) begin
         #5 sel <= i;
      end
      
      // 3. After Step2 is over, wait for 5ns and finish simulation
      #5 $finish;
   end
endmodule

  
Simulatielogboek
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


Verilog

  1. Verilog-zelfstudie
  2. Verilog-aaneenschakeling
  3. Verilog-opdrachten
  4. Verilog blokkeren en niet-blokkeren
  5. Verilog-functies
  6. Verilog-taak
  7. Verilog-klokgenerator
  8. Verilog wiskundige functies
  9. Verilog Tijdnotatie
  10. Verilog Tijdschaalbereik
  11. Verilog File IO-bewerkingen