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 Case-statements begrijpen: efficiënte multiplexer-implementatie

De case-statement controleert of de gegeven expressie overeenkomt met een van de andere expressies in de lijst en vertakt daarvoor. Het wordt typisch gebruikt om een multiplexer te implementeren. De if-else-constructie is mogelijk niet geschikt als er veel condities gecontroleerd moeten worden en zou synthetiseren in een prioriteitsencoder in plaats van een multiplexer.

Syntax

Een Verilog case-statement begint met het case-trefwoord en eindigt met het endcase-trefwoord. De expressie tussen haakjes wordt precies één keer geëvalueerd en vergeleken met de lijst van alternatieven in de volgorde waarin ze geschreven zijn. De statements waarvoor het alternatief overeenkomt met de gegeven expressie worden uitgevoerd. Een blok van meerdere statements moet gegroepeerd worden en tussen begin en end staan.

// Hier moet 'expressie' overeenkomen met een van de items (item 1,2,3 of 4)
case (<expressie>)
  case_item1 : <enkel statement>
  case_item2, case_item3 : <enkel statement>
  case_item4 : begin
    <meerdere statements>
  end
  default : <statement>
endcase

Als geen van de case-items overeenkomt met de gegeven expressie, worden de statements binnen het default-item uitgevoerd. De default-statement is optioneel, en er kan maar één default-statement in een case-statement staan. Case-statements kunnen genest worden.

De uitvoering verlaat het case-blok zonder iets te doen als geen van de items overeenkomt met de expressie en er geen default-statement is gegeven.

Voorbeeld

Het ontwerpmodule hieronder heeft een 2-bit selectiesignaal om een van de drie andere 3-bit inputs naar het uitgangssignaal out te routeren. Een case-statement wordt gebruikt om de juiste input toe te wijzen aan de output op basis van de waarde van sel. Omdat sel een 2-bit signaal is, kan het 22 combinaties hebben, 0 tot 3. De default-statement helpt om de output op 0 te zetten als sel 3 is.

module my_mux (
  input [2:0] a, b, c,
  input [1:0] sel,
  output reg [2:0] out
);
  always @ (a, b, c, sel) begin
    case(sel)
      2'b00 : out = a;
      2'b01 : out = b;
      2'b10 : out = c;
      default : out = 0;
    endcase
  end
endmodule

Hardware-schema

De RTL-code wordt geëlaboreerd om een hardware-schema te krijgen dat een 4-naar-1 multiplexer vertegenwoordigt.

Zie dat de output nul is wanneer sel 3 is en overeenkomt met de toegewezen inputs voor andere waarden.

Simulatie-log

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0
[10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5
[20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5
[30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1
[40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

In een case-statement slaagt de vergelijking alleen wanneer elk bit van de expressie overeenkomt met een van de alternatieven inclusief 0, 1, x en z. In het bovenstaande voorbeeld, als een van de bits in sel x of z is, wordt de default-statement uitgevoerd omdat geen van de andere alternatieven matchte. In zo'n geval wordt de output alle nullen.

Simulatie-log

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

Als de case-statement in het ontwerp x en z in de case-item alternatieven heeft, zouden de resultaten heel anders zijn.

module my_mux (
  input [2:0] a, b, c,
  input [1:0] sel,
  output reg [2:0] out
);
  always @ (a, b, c, sel) begin
    case(sel)
      2'bxz : out = a;
      2'bzx : out = b;
      2'bxx : out = c;
      default : out = 0;
    endcase
  end
endmodule

Simulatie-log

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5
ncsim: *W,RNQUIE: Simulation is complete.

Hoe verschilt een case van if-else?

De case-statement verschilt van if-else-if op twee manieren:

  • Expressies in een if-else-blok zijn algemener, terwijl in een case-blok een enkele expressie gematcht wordt met meerdere items
  • case levert een definitief resultaat op wanneer er X en Z waarden in een expressie zitten

Verilog

  1. De C# Switch Statement: Syntaxis, Voorbeelden & Best Practices
  2. C# Break Statement: Hoe en Wanneer Te Gebruiken
  3. C# Continue Statement: Effectief Lusiteraties Overslaan
  4. C++ Switch‑Case Onder de Knie: Syntaxis, Gebruik en Praktische Voorbeelden
  5. Verilog Basics: Uw Eerste AND-poort Ontwerpen
  6. Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
  7. Verilog concatenatie beheersen: Een praktische gids
  8. Verilog-toewijzingen begrijpen: types, syntax en best practices
  9. Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
  10. Verilog-functies beheersen voor efficiënt RTL-ontwerp
  11. Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik