Sök…


Syntax

  • alltid @ (posedge clk) börja / * uttalanden * / slut
  • alltid @ (negedge clk) börja / * uttalanden * / slut
  • alltid @ (posedge clk eller posedge reset) // kan syntetisera mindre effektivt än synkron återställning

Enkel räknare

En räknare som använder en flip-flop-initialisering av FPGA-stil:

module counter(
    input clk,
    output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
    count <= count + 1'b1;
end

En räknare implementerad med asynkrona återställningar lämpliga för ASIC-syntes:

module counter(
  input            clk,  
  input            rst_n, // Active-low reset
  output reg [7:0] count
)
always @ (posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    count <= 'b0;
  end
  else begin
    count <= count + 1'b1;
  end
end

Procedurblocken i dessa exempel ökar count varje stigande klockkant.

Icke-blockerande uppdrag

En icke-blockerande tilldelning ( <= ) används för tilldelning inuti kantkänsliga blockerar always . Inom ett block är de nya värdena inte synliga förrän hela blocket har bearbetats. Till exempel:

module flip(
    input clk,
    input reset
)
reg f1;
reg f2;

always @ (posedge clk) begin
  if (reset) begin // synchronous reset
    f1 <= 0;
    f2 <= 1;
  end
  else begin
    f1 <= f2;
    f2 <= f1;
  end
end
endmodule

Lägg märke till användningen av icke-blockerande ( <= ) uppdrag här. Eftersom den första tilldelningen faktiskt inte träder i kraft förrän efter procedurblocket, gör den andra uppgiften vad som är avsett och byter faktiskt de två variablerna - till skillnad från i en blockeringsuppgift ( = ) eller tilldelningar på andra språk; f1 fortfarande sitt ursprungliga värde till höger om den andra tilldelningen i blocket.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow