Zoeken…


Syntaxis

  • altijd @ (posedge clk) begin / * statements * / end
  • always @ (negedge clk) begin / * statements * / end
  • altijd @ (posedge clk of posedge reset) // kan minder efficiënt synthetiseren dan synchrone reset

Eenvoudige teller

Een teller die een FPGA-stijl flip-flop-initialisatie gebruikt:

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

Een teller geïmplementeerd met behulp van asynchrone resets geschikt voor ASIC-synthese:

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

De procedurele blokken in deze voorbeelden count op bij elke stijgende klokflank.

Niet-blokkerende opdrachten

Een niet-blokkerende toewijzing ( <= ) wordt gebruikt voor toewijzing binnen always randgevoelige blokken. Binnen een blok zijn de nieuwe waarden niet zichtbaar totdat het hele blok is verwerkt. Bijvoorbeeld:

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

Let hier op het gebruik van niet-blokkerende ( <= ) toewijzingen. Aangezien de eerste toewijzing pas effectief wordt na het procedurele blok, doet de tweede toewijzing wat de bedoeling is en verwisselt de twee variabelen feitelijk - in tegenstelling tot een blokkerende toewijzing ( = ) of toewijzingen in andere talen; f1 nog steeds zijn oorspronkelijke waarde aan de rechterkant van de tweede toewijzing in het blok.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow