2013-09-25 5 views
8

In der Simulation funktioniert das perfekt. Ist dies der beste Weg, Nullen für einen synthetisierbaren Code zu überprüfen. Wie würden die Ressourcen generiert?Vergleicht man einen langen std_logic_vector mit Nullen

signal vector_slv : std_logic_vector(2048 downto 0); 
... 
if (vector_slv = (vector_slv'range => '0')) then 
    -- do something... 

Gibt es eine andere optimale Möglichkeit, diese Lösung unter Berücksichtigung von h/w-Mapping (mit optimaler Ressourcennutzung) zu implementieren.

Ich wäre mehr daran interessiert, die verwendeten Ressourcen zu verstehen.

Antwort

5

Es gibt keinen Weg, der für die Synthese mehr oder weniger sinnvoll ist. Schreibe den Code, der deine Absicht am besten zum Ausdruck bringt.

Wenn Sie einen Vektor für alle Nullen vergleichen, sollten die folgenden alle die gleichen Ergebnisse liefern, oder Sie sollten einen schwerwiegenden Fehler gegen das Tool einreichen!

signal vector_slv : std_logic_vector(2048 downto 0); 
constant zeros : std_logic_vector(vector_slv'range) := (others => '0'); 
... 
if vector_slv = (vector_slv'range => '0') then 
    -- do something... 
if vector_slv = zeros then 
    -- do something... 
if unsigned(vector_slv) = to_unsigned(0, vector_slv'length) then 
    -- do something... 

und in der Tat für kürzere Vektoren, die in einer ganzen Zahl passen:

if intvar = 0 then 

wird das gleiche wie bei jedem 32-Bit-Vektorvergleich genau.

(BTW, beachten Sie, dass für Klammern um den if Zustand keine Notwendigkeit besteht, - VHDL ist nicht C :)

1

Was die Synthese betrifft, ja, solche einfachen Konstrukte werden normalerweise ziemlich gut vom Tool optimiert. Das genaue Hardware-Layout hängt natürlich davon ab, was Ihr Ziel ist (FPGA, ASIC, ...).

Mein Vorschlag ist es, das Syntheseergebnis zu betrachten (z. B. Technology Map Viewer für Altera FPGAs). Wenn die Synthese es durchkreuzt, können Sie es manuell in einen binären Vergleichsbaum mit Null umwandeln, wobei Sie die verfügbaren Technologiegrundelemente berücksichtigen. Dies kann jedoch viel komplizierter sein, als es sich anhört, besonders für FPGAs (es gibt mehr als LUTs, mit denen man spielen kann), und sollte nicht mit einem anständigen Werkzeug notwendig sein.

6

Wenn der Bereich verfügbar ist, wie in Ihrem Beispielcode, dann sieht der Vorschlag Lösung gut aus, und ich würde erwarten, dass Synthese-Tools gemacht werden, um Konstruktionen wie diese zu behandeln.

Wenn der Bereich nicht verfügbar ist, dann mit Null vergleichen kann wie gemacht werden:

library ieee; 
use ieee.numeric_std.all; 
... 
    if unsigned({std_logic_vector expression of any length}) = 0 then 
    -- do something... 

würde ich erwarten, dass die Synthese-Tools verarbeiten dies das gleiche wie war für vergleichen mit (vector_slv'range => '0').