2017-10-18 3 views
-1

In meinem FPGA/Verilog-Kurs ging mein Professor einfach über Funktionen.Wie werden Funktionen in Verilog verwendet?

Er sagte, dass innerhalb von Funktionen, Sie den Code prozedural schreiben. Wenn Sie die Funktion dann aufrufen möchten, können Sie sie entweder in einem always-Block (dh prozedural) aufrufen oder mit einer assign-Anweisung aufrufen.

Es macht für mich keinen Sinn wie eine Funktion mit prozeduralem Code geschrieben werden kann, dann aber fortlaufend aufgerufen wird.

Wenn jemand einen Einblick in diese (wahrscheinlich) grundlegende Frage hat, wird es sehr geschätzt.

Grüße

+0

Fragen Sie Ihren Professor, es zu erklären. Holen Sie sich Ihr Geld. – toolic

Antwort

0

Es gibt so etwas wie kontinuierliche in Verilog oder jede andere ereignisgesteuerte Simulation nicht. Jedes Verhalten wird durch diskrete Ereignisse gesteuert, dh ein Signal, das seinen Wert ändert, oder ein Warten, bis eine bestimmte Zeit verstrichen ist.

Eine fortlaufende Zuweisung in Verilog ist nur eine Möglichkeit, einen Ausdruck so zu definieren, dass bei der Änderung eines Operanden des RHS-Ausdrucks der Ausdruck ausgewertet und sein Ergebnis an das LHS-Ziel weitergegeben wird. Jeder logische oder arithmetische Ausdruck kann Funktionsaufrufe enthalten.

0

Eine Funktion, die einen Wert (nicht-void-Funktion) zurückgibt, wird in Verilog als Operand eines Ausdrucks verwendet. Es kapselt einen Verilog-Ausdruck, der aus mehreren Anweisungen in der Funktion bestehen kann. Als solches könnte es überall dort verwendet werden, wo Ausdrücke verwendet werden könnten. Verfahrensblöcke und kontinuierliche Zuweisungen sind solche Orte.

Kontinuierliche Zuweisung Begriff ist ein historischer und sein Zweck ist es, Werte in Netze (kontinuierlich ändern Sie den Wert des Netzes, wenn der Eingang Ausdruck Wert ändert). Wenn also eine Funktion in rhs verwendet wird, liefert sie nur die Wertberechnung basierend auf ihren Eingaben.

so, hier ist ein Beispiel:

function automatic reg[3:0] sum (reg[3:0] a, reg[3:0] b); 
    sum = a + b; 
endfunction // b 

reg [3:0] r; 
wire [3:0] w; 

// use function in the procedural block 
always @* 
    r = sum(a, b); 

// use function in the continuous assignment 
assign w = sum(a,b); 
0

Es ist so ziemlich genau das gleiche wie kombinatorische Logikblöcke. Du schreibst es so, aber es wird zu etwas völlig anderem synthetisiert. Beachten Sie Folgendes:

always @* begin 
    a = b + c; 
    d = b + a; 
end 

always @(posedge clk) begin 
    out <= d + in; 
end 

Das ist genau das gleiche wie:

function integer calc_d(integer b, integer c) begin 
    integer a; 
    a = b + c; 
    d = b + a; 
    calc_d = d; 
end 
endfunction 

always @(posedge clk) begin 
    out <= calc_c(b, c) + in; 
end 
Verwandte Themen