Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial Internet of Things >> Ingebed

Hoe Combinatorische Schakelingen in Verilog te Beschrijven: Conditionele Operatoren & Always Blokken

Dit artikel legt uit hoe combinatorische logica in Verilog te modelleren, met de conditionele operator voor truth-table implementatie en het krachtige "always" blok voor beknopt ontwerp.

In deze gids lopen we door de sleuteltechnieken voor het beschrijven van combinatorische schakelingen in Verilog. Eerst herzien we de continue toewijzingssyntaxis met het assign keyword, introduceren we de conditionele operator (?:) als een beknopte manier om multiplexerlogica uit te drukkten. Tenslotte tonen we hoe het always blok een nog duidelijke, procedurele beschrijving kan bieden.

Eerder behandelden we het assign keyword voor continue toewijzingen. Deze statements blijven actief en laten ons een gate-level beschrijving van een schakeling verkrijgen. Bijvoorbeeld, de volgende code modelleert een AND-poort:

assign out1 = a & b; 

Verilog's conditionele operator stelt een enkele toewijzing in staat zijn waarde te wijzigen op basis van een voorwaarde. De syntaxis is:

assign [signaal_naam] = [conditionele_expressie] ? [waarde_als_true] : [waarde_als_false]; 

De conditionele_expressie wordt eerst geëvalueerd. Als het true is, wordt waarde_als_true toegekend aan signaal_naam; anders wordt waarde_als_false gebruikt. Bijvoorbeeld:

assign out1 = (sel) ? (a & b) : (a | b); 

Wanneer sel true is, drijft de AND van a en b out1; anders wordt de OR van a en b geselecteerd. Deze enkele regel implementeert een 2-naar-1 multiplexer.

Omdat de conditionele operator zich gedraagt als een if statement in traditionele programmering, stelt het een meer abstracte representatie van combinatorische logica toe. Door de operator te nesten, kun je complexe structuren bouwen, geïllustreerd in Voorbeeld 1.

Voorbeeld 1: Geneste Conditionele Operatoren

Hieronder is een 4-naar-2 prioriteitsencoder geïmplementeerd met geneste conditionele operatoren. De waarheidstabel is getoond in Figuur 1.

Hoe Combinatorische Schakelingen in Verilog te Beschrijven: Conditionele Operatoren & Always Blokken

De Verilog code is:

module Prio_4_to_2 ( input wire [3:0] x, output wire [1:0] y, output wire v ); assign y = x[3] ? 2'b11 : x[2] ? 2'b10 : x[1] ? 2'b01 : 2'b00; assign v = ( x[3] | x[2] | x[1] | x[0] ) ? 1'b1 : 1'b0; endmodule 

Regels 7-10 tonen de geneste conditionele operator. Elke voorwaarde wordt sequentieel geëvalueerd, wat hogere prioriteit geeft aan eerdere termen – perfect voor prioriteitslogica. De finale assign voor v gebruikt een bitwise OR om aan te geven of een willekeurige input hoog is.

Simulatieresultaten uit Xilinx ISE bevestigen het gedrag (Figuur 2).

Hoe Combinatorische Schakelingen in Verilog te Beschrijven: Conditionele Operatoren & Always Blokken

Figuur 2. Xilinx ISE simulatie van de prioriteitsencoder.

Het is essentieel om te noteren dat de conditionele expressie in volgorde wordt geëvalueerd tot een true voorwaarde gevonden wordt; de corresponderende waarde wordt dan toegewezen. Gevolgd is dit construct het beste geschikt voor prioriteitsnetwerken (Figuur 3) in plaats van gebalanceerde multiplexers (Figuur 4).

Hoe Combinatorische Schakelingen in Verilog te Beschrijven: Conditionele Operatoren & Always Blokken

Figuur 3. Een prioriteitsnetwerk.

Hoe Combinatorische Schakelingen in Verilog te Beschrijven: Conditionele Operatoren & Always Blokken

Figuur 4. Een n-naar-1 multiplexer zonder input prioriteit.

In een eerdere artikel bespraken we VHDL concurrente toewijzingen; de concepten vertalen vergelijkbaar naar Verilog.

Verilog Procedurele Statements

Terwijl assign en conditionele operatoren volstaan voor veel ontwerpen, biedt het always blok een meer expressieve, procedurele benadering. Binnen een always blok voeren statements sequentieel uit en kunnen high-level constructen zoals if en case bevatten, wat de natuurlijke stroom van menselijke redenering spiegelt.

Voorbeeld 2 demonstreert een basis always blok gebruikt om een simpele AND-poort te implementeren.

Voorbeeld 2: "Always" Blok Statements

De vereenvoudigde syntaxis van een always blok is:

always @(gevoeligheidslijst) begin sequentiele_statements; end 

De gevoeligheidslijst specificeert wanneer het blok hergeëvalueerd moet worden. Voor een puur combinatorische schakeling moeten alle invoersignalen in deze lijst voorkomen.

Overweeg de schakeling in Figuur 5, waar de uitgang verandert wanneer a of b toggelt.

Hoe Combinatorische Schakelingen in Verilog te Beschrijven: Conditionele Operatoren & Always Blokken

Figuur 5. Circuit_1

Het volgende always blok implementeert de AND-operatie met een blokkerende toewijzing:

always @(a, b) begin out1 = a & b; end 

Blokkerende toewijzingen (=) werken de linkerkant direct bij, terwijl niet-blokkerende toewijzingen (<=) de update uitstellen tot het einde van het blok. Voor combinatorische logica is het veiligst om blokkerende toewijzingen te gebruiken om ongewilde race conditions te vermijden.

Omdat een procedureel blok geen wire kan aansturen, moet de uitgang gedeclareerd worden als reg, wat al dan niet een opslagelement kan infereren. De complete module wordt hieronder getoond:

module Circuit_1 ( input wire a, input wire b, output reg out1 ); always @(a, b) begin out1 = a & b; end endmodule 

Samenvattend behandelde dit artikel de conditionele operator voor compacte truth-table logica, geneste operatoren voor prioriteitsencoding, en het procedurele always blok voor duidelijke combinatorische beschrijvingen. Toekomstige posts zullen always voor sequentiële logica verkennen.

Ingebed

  1. Grondslagen van DC-circuits: Direct Current en kern elektriciteitsconcepten begrijpen
  2. AC‑Circuits Begrijpen: Een Beginnersgids
  3. Een Vier-Cijferig 7-Segment Display Ontwerpen met een Enkele Binaire Encoder
  4. Gelijkrichterschakelingen: van halfgolf tot polyfasige volgolf ontwerpen
  5. Regelschakelingen: Fundamenten, Toepassingen en Best Practices
  6. C# Operators – Uitgebreide gids voor operators in C#
  7. De C# Ternaire Operator: Beknopte Gids voor Conditionele Expressies
  8. Verilog Basics: Uw Eerste AND-poort Ontwerpen
  9. Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
  10. Verilog concatenatie beheersen: Een praktische gids
  11. Verilog \`ifdef: Conditionele compilatie uitgelegd