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 altijd blokkeren

Een always blok is een van de procedurele blokken in Verilog. Statements binnen een always-blok worden opeenvolgend uitgevoerd.

Syntaxis

  
  
always @ (event)
	[statement]
	
always @ (event) begin
	[multiple statements]
end

  

De always blok wordt uitgevoerd bij een bepaalde gebeurtenis. De gebeurtenis wordt gedefinieerd door een gevoeligheidslijst.

Wat is de gevoeligheidslijst?

Een gevoeligheid list is de uitdrukking die definieert wanneer het always-blok moet worden uitgevoerd en wordt gespecificeerd na de @ operator tussen haakjes ( ) . Deze lijst kan één of een groep signalen bevatten waarvan de waardeverandering het altijd-blok zal uitvoeren.

In de onderstaande code zijn alle instructies binnen de always blok wordt uitgevoerd wanneer de waarde van signalen a of b verandert.

  
  
// Execute always block whenever value of "a" or "b" change
always @ (a or b) begin
	[statements]
end

  

Waarvoor wordt het altijd-blok gebruikt?

Een always blok kan worden gebruikt om combinatorische of opeenvolgende elementen te realiseren. Een sequentieel element zoals flip-flop wordt actief wanneer het is voorzien van een klok en reset. Evenzo wordt een combinatorisch blok actief wanneer een van zijn invoerwaarden verandert. Deze hardwareblokken werken allemaal gelijktijdig onafhankelijk van elkaar. De verbinding tussen elk bepaalt de gegevensstroom. Om dit gedrag te modelleren, een always blok wordt gemaakt als een continu proces dat wordt geactiveerd en een actie uitvoert wanneer een signaal in de gevoeligheidslijst actief wordt.

In het volgende voorbeeld worden alle instructies binnen het always-blok uitgevoerd bij elke positieve flank van de signaal-clk.

  
  
// Execute always block at positive edge of signal "clk"
always @ (posedge clk) begin
	[statements]
end

  

Wat gebeurt er als er geen gevoeligheidslijst is?

De always blok wordt continu herhaald tijdens de duur van een simulatie. De gevoeligheidslijst brengt een bepaald gevoel voor timing met zich mee, d.w.z. wanneer een signaal in de gevoeligheidslijst verandert, wordt het altijd-blok geactiveerd. Als er binnen een altijd-blok geen timingcontrole-uitspraken zijn, loopt de simulatie vast vanwege een oneindige lus met nulvertraging!

Voorbeeld

Het onderstaande voorbeeld is een always-blok dat probeert de waarde van het signaal clk om te keren. De instructie wordt uitgevoerd na elke 0 tijdseenheden. Daarom wordt het voor altijd uitgevoerd vanwege de afwezigheid van een vertraging in de verklaring.

  
  
// always block is started at time 0 units
// But when is it supposed to be repeated ?
// There is no time control, and hence it will stay and
// be repeated at 0 time units only. This continues
// in a loop and simulation will hang !
always clk = ~clk;

  

Zelfs als de gevoeligheidslijst leeg is, moet er een andere vorm van tijdvertraging zijn. Simulatietijd wordt vervroegd door een vertragingsverklaring binnen de always bouwen zoals hieronder weergegeven. Nu wordt de klokomkering gedaan na elke 10 tijdseenheden.

  
  
	always #10 clk = ~clk;

  

Opmerking: Expliciete vertragingen kunnen niet worden gesynthetiseerd in logische poorten!

Vandaar dat echte Verilog-ontwerpcode altijd een gevoeligheidslijst vereist.

Voorbeeld van sequentieel elementontwerp

De onderstaande code definieert een module genaamd tff die een data-invoer, klok en active-low reset accepteert. De uitvoer wordt geïnverteerd wanneer wordt gevonden dat d 1 is aan de positieve rand van de klok. Hier, de always blok wordt geactiveerd aan de positieve kant van clk of de negatieve kant van rstn.

Wat gebeurt er op de positieve rand van de klok?

De volgende gebeurtenissen vinden plaats aan de positieve rand van de klok en worden herhaald voor alle positieve rand van de klok.

  1. Eerste if blok controleert waarde van active-low reset rstn
    1. Als rstn nul is, moet uitgang q worden teruggezet naar de standaardwaarde 0
    2. Als rstn er een is, betekent dit dat reset niet is toegepast en standaardgedrag zou moeten volgen
  2. Als de vorige stap onwaar is:
    1. Controleer de waarde van d en als het één blijkt te zijn, keer dan de waarde van q om
    2. Als d 0 is, behoud dan de waarde van q

  
  
module tff (input  		d,
						clk,
						rstn,
			output reg 	q);
			
	always @ (posedge clk or negedge rstn) begin
		if (!rstn)
			q <= 0;
		else
			if (d)
				q <= ~q;
			else
				q <= q;
	end
endmodule

  

Wat gebeurt er aan de negatieve kant van reset?

De volgende gebeurtenissen vinden plaats aan de negatieve rand van rstn en gebeuren bij al dergelijke gebeurtenissen.

  1. Eerste if blok controleert de waarde van active-low reset rstn. Bij de negatieve flank van het signaal is de waarde 0.
    1. Als de waarde van rstn 0 is, betekent dit dat reset is toegepast en dat de uitvoer moet worden teruggezet naar de standaardwaarde 0
    2. Het geval waarin de waarde van rstn 1 is, wordt niet in aanmerking genomen omdat de huidige gebeurtenis negatieve rand is van de eerste

Voorbeeld van gecombineerd elementontwerp

Een always blok kan ook worden gebruikt bij het ontwerpen van combinatieblokken. Het volgende digitale circuit vertegenwoordigt bijvoorbeeld een combinatie van drie verschillende logische poorten die een bepaald uitgangssignaal leveren bij signaal o.

De onderstaande code is een module met vier invoerpoorten en een enkele uitvoerpoort genaamd o. De always blok wordt geactiveerd wanneer een van de signalen in de gevoeligheidslijst in waarde verandert. Uitgangssignaal is gedeclareerd als type reg in de modulepoortlijst omdat deze wordt gebruikt in een procedureel blok. Alle signalen die in een procedureblok worden gebruikt, moeten worden gedeclareerd als type reg .

  
  
module combo (	input 	a,
      			input	b,
              	input	c,
              	input	d,
  	            output reg o);
  
  always @ (a or b or c or d) begin
    o <= ~((a & b) | (c^d));
  end
  
endmodule

  

Zie dat het signaal o 1 wordt wanneer de combinatorische uitdrukking op de RHS waar wordt. Op dezelfde manier wordt o 0 wanneer RHS onwaar is.

Simulatie-uitvoer

Klik hier voor een slideshow met simulatievoorbeeld !


Verilog

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