2017-03-07 3 views
1

Ich weiß, es ist möglich, einen Subtyp eines definierten Bereichs zu erstellen, z:parametrierbare VHDL-Subtypen

subtype ADDRESS is UNSIGNED range (32 downto 0); 

Ist es möglich, einen parametrierbaren Typ/Subtyp zu schaffen? Im Wesentlichen belassen Sie den Wert von "32", der vom Benutzer definiert werden soll, wenn eine Variable vom Typ ADDRESS erstellt wird. Zum Beispiel:

subtype ADDRESS is UNSIGNED range (f(x)) downto 0; 

wobei f() eine Funktion in einem anderen Paket vordefiniert ist, und X ist eine natürliche ganze Zahl von dem Benutzer geliefert auf eine Instanz von ADDRESS zu schaffen.

Grunde möchte ich verkürzen ...

y : UNSIGNED(f(X) downto 0); 

zu

y : ADDRESS(X); 

wobei X eine natürliche ist.

Antwort

1

Nun, ja. Aber du kannst nicht schreiben:

subtype ADDRESS is UNSIGNED range (f(x)) downto 0; 

weil das VHDL nicht korrekt ist. Sie müssen schreiben:

subtype ADDRESS is UNSIGNED (f(x) downto 0); 

wo x muss statische sein. dh x muss ein Literal, konstant oder generisch sein.

Sie können Funktionen auf diese Weise verwenden, um den Wert von Konstanten und anderen statischen Werten zu definieren. Alle Eingaben für eine solche Funktion müssen statisch sein. Interessanterweise wird eine solche Funktion während der Ausarbeitung ausgeführt, was das Debugging erschweren kann. Wenn Sie beim Debuggen einer solchen Funktion Probleme haben, können Sie das Ziel des Rückgabewerts der Funktion vorübergehend auf etwas nicht statisches ändern (z. B. eine Variable); dann wird die Funktion nach der Zeit 0 ausgeführt, was das Debuggen erleichtert. Hier ist ein echtes Beispiel:

package P is 
    function F(I : integer) return integer; 
end package P; 

package body P is 
    function F(I : integer) return integer is 
    begin 
    if I > 16 then 
     return I - 1; 
    else 
     return (I * 2) - 1; 
    end if; 
    end function F; 

end package body P; 

library IEEE; 
use IEEE.numeric_std.all; 
use work.P.all; 

entity E is 
    constant X : integer := 16; 
end entity E; 

architecture E of E is 
    subtype ADDRESS is UNSIGNED (f(x) downto 0); 
begin 

    process 
    begin 
    report "ADDRESS'left= " & integer'image(ADDRESS'left); 
    wait; 
    end process; 

end architecture E; 

Und hier ist es auf EDA Playground.

1

Matthew Taylor Antwort ist schon richtig, aber ich möchte auf Ihre letzte Frage

y : ADDRESS(X); 

In C antworten Sie ein Makro verwenden, aber in VHDL ist dies nicht möglich. Es würde die Funktion ADDRESS erfordern, einen Subtyp-Typ zurückzugeben. IEEE1076-2008 definiert:

function_specification ::= 
    [ pure | impure ] function designator 
     subprogram_header 
     [ [ parameter ] (formal_parameter_list) ] return type_mark 

Wo:

type_mark ::= 
    type_name 
    | subtype_name 

D.h. Der Rückgabetyp muss vom Typ sein, der bereits definiert ist. Es kann kein neuer [sub] -Typ sein. Sie könnten etwas mit einer Subtypdefinition tun, wie Matthew erklärt: