2016-07-30 48 views
1

Sagen Sie bitte den folgenden Code haben,VHDL/Verilog - Wird eine mathematische Operation in einer Bereichsanweisung synthesiert?

signal a : std_logic_vector(N - 1 downto 0); 

Oder

for i in 0 to N - 1 
    ... 

Hat der N-1 Teil in tatsächliche Logik synthetisiert bekommen, oder ist die FPGA-Software (zB Quartus) die Mathematik, bevor die Schaffung Logik?

Beispiel Anwendungsfall, sagen generische N stellt die Anzahl der gewünschten Bits. Ist es besser, einen generischen Nm1 zu haben, der die Subtraktion hält, oder kann ich mit N-1 wie oben erhalten, ohne dass es zusätzliche Logik schafft?

Antwort

2

Da N ein generischer Parameter ist, wird er bei der Synthese als Konstante betrachtet. Ihr Logiksynthesizer wird, wie alle bekannten Logiksynthesizer, Konstanten propagieren, bevor irgendein Hardwareteil abgeleitet wird. Der Synthesizer wird den Ausdruck N-1 vor der Synthese berechnen, und dieser Vorgang wird keinen Transistor kosten. Es wäre dasselbe mit einer viel komplexeren Operation für Konstanten wie zum Beispiel das Aufrufen einer Funktion. Beispiel:

function log2_up(x: positive) return natural is 
begin 
    if x = 1 then 
     return 0; 
    else 
     return log2_up((x+1)/2) + 1; 
    end if; 
end function log2_up; 
... 
constant word_width: positive := 64; 
constant write_byte_enable_width: positive := log2_up(64/8); 

ist synthetisierbaren von allen Logik-Synthesizer Ich weiß und Rechen write_byte_enable_width nicht einen einzigen Transistor kosten; es wird vorher von dem Synthesizer während der konstanten Ausbreitungsphase berechnet.

1

In beiden Fällen müsste der Wert von N zur Kompilierzeit berechnet werden. Es ist nicht - und kann nicht sein! - in Logik generiert.

Denken Sie daran, dass jeder HDL-Code letztlich in der Lage sein muss, physische Hardware zu synthetisieren. Das Ändern der Anzahl von Bits in einem Signal oder das Ändern der Häufigkeit, mit der eine Logik instanziiert wird, kann nicht elektronisch durchgeführt werden.

+0

Um klarzustellen, wenn ich zu einer RTL-Ansicht gehen sollte, sollte ich nicht sehen, dass zusätzliche Addierer im Entwurf verwendet wurden, um die "N-1" -Berechnung durchzuführen? –

+0

N muss zur Kompilierzeit ein konstanter Wert sein (wie @duskwuff bereits gesagt hat). _N-1_ wird von Ihrem Synthese-Tool berechnet! ** Der FPGA berechnet diesen Wert nicht in einem Addierer! ** Es ist nur eine Beschreibung (im Fall eines Logikvektors), wie viele Hardwarekomponenten für Ihren FPGA benötigt werden, um diesen Schaltungsentwurf zu erstellen. –

+0

Ich sehe, danke! –