Forum: FPGA, VHDL & Co. Aufrufen von library


von Doung W. (honeyleabe)


Lesenswert?

ich habe eine library definieren.

package lib is
   type fu_type is (ADD_SUB, MULT_16);
      type vector_width is record
               input_width : integer;
               output_width : integer;
   end record;
   function get_vector_width(fu : fu_type) return vector_width;
   end package lib;

package body lib is

   function get_vector_width(fu : fu_type) return vector_width is

       begin
               if  fu =MULT_16 then
                       return vector_width'(32,32);
               elsif fu = ADD_SUB then
                       return vector_width'(65,33);
                          end if;
        end function get_vector_width;
     end package body lib;

und ich mache andere vhdl file.Brauche ich zu library aufrufen.


library IEEE;
use IEEE.std_logic_1164.all;
use work.lib.all;

entity test is
generic ( fu_in : integer := get_vector_width("add_sub").input_width ;
          fu_out: integer := get_vector_width("add_sub").output_width
        );
port
(
  input: in std_logic_vector(fu_in -1 downto 0);
  output: out std_logic_vector(fu_out -1 downto 0)
);
end tset;

Aber wo ist die fehler?

MFG
Dong

von Duke Scarring (Gast)


Lesenswert?

>Aber wo ist die fehler?

Wie lautet denn die Fehlermeldung?
Was willst Du machen?
Simulieren?
Synthetisieren?
Hast Du eine VHDL Testbench?

Duke

von Doung W. (honeyleabe)


Lesenswert?

Duke Scarring schrieb:
>>Aber wo ist die fehler?
>
> Wie lautet denn die Fehlermeldung?
> Was willst Du machen?
> Simulieren?
> Synthetisieren?
> Hast Du eine VHDL Testbench?
>
> Duke

Fehler melden :Type error in selected expression.
ich moechte simulieren

von Klaus F. (kfalser)


Lesenswert?

1) Du rufst die Funktion get_vector_width() mit einem String als 
Parameter auf, nicht mit fu_type, also wennschon 
get_vector_width(add_sub) nicht get_vector_width("add_sub").
2) Ich wäre mir nicht so sicher, ob Funktionsaufrufe bei der definition 
von Default-Werten zulässig sind.

von Doung W. (honeyleabe)


Lesenswert?

Klaus Falser schrieb:

> get_vector_width(add_sub) nicht get_vector_width("add_sub").
das punkt.
Ich wäre mir nicht so sicher, ob Funktionsaufrufe bei der definition
von Default-Werten zulässig sind.
das auch geht.

aber wie kann ich funktion von fuer egal fu_type aufrufen?
d,h, ohne Default-Werten

von Doung W. (honeyleabe)


Lesenswert?

ich habe schon es probieren.aber funktioniert nichts.

use work.bisr_lib.all;

entity test is
generic (
            fu_nummer : integer;
            fu_nummer1 : integer
         );
port
(
  reset : in std_logic;
  fulogik : in fu_type;
  input00,input01,input02: in std_logic_vector(fu_nummer-1 downto 0);
  sel : in std_logic_vector(1 downto 0);
  output00,output01,output02: out std_logic_vector(fu_nummer1-1 downto 
0)
);
end test;

architecture behav of test is

 begin
   if fulogik = mul16 then
      fu_nummer<= get_vector_width(mul16).input_width;
      fu_nummer1<= get_vector_width(mul16).output_width;
end behav;

Kann jemand mir vorschlaege?

MFG
Dong

von Klaus Falser (Gast)


Lesenswert?

Habe dein erstes Beispiel mit ModelSim compiliert, und es funktioniert.
Man muß es nur auf:

generic ( fu_in : integer := get_vector_width(add_sub).input_width ;
          fu_out: integer := get_vector_width(add_sub).output_width
        );
ändern, außerdem stimmt "end tset" nicht --> end test

Ansonsten konnte ich es problemlos compilieren.

Beim 2. Beispiel stimmt halt der type nicht. Der definierte Namen lautet 
mult_16, du schreibst aber mul16.

Auf Tippfehler achten !!

von Doung W. (honeyleabe)


Lesenswert?

Klaus Falser schrieb:
> Habe dein erstes Beispiel mit ModelSim compiliert, und es funktioniert.
> Man muß es nur auf:
>
> generic ( fu_in : integer := get_vector_width(add_sub).input_width ;
>           fu_out: integer := get_vector_width(add_sub).output_width
>         );
> ändern, außerdem stimmt "end tset" nicht --> end test
>
> Ansonsten konnte ich es problemlos compilieren.
>
> Beim 2. Beispiel stimmt halt der type nicht. Der definierte Namen lautet
> mult_16, du schreibst aber mul16.
>
> Auf Tippfehler achten !!

Danke fuer deine Tipp.ABer wie geht's los mit meine Frage?

von Klaus F. (kfalser)


Lesenswert?

Was ist noch deine offene Frage?
Es funktioniert ja wenn Du es richtig schreibst.
Was funktioniert nicht, welche Fehlermeldung, wann, welcher Compiler?
Ansonsten poste noch mal den ganzen Code, als Anhang, nicht im Text.

von Doung W. (honeyleabe)


Angehängte Dateien:

Lesenswert?

Klaus Falser schrieb:
> Was ist noch deine offene Frage?
> Es funktioniert ja wenn Du es richtig schreibst.
> Was funktioniert nicht, welche Fehlermeldung, wann, welcher Compiler?
> Ansonsten poste noch mal den ganzen Code, als Anhang, nicht im Text.

ich moechte fuer egal basislogik funktion verwenden . abhangig von 
fulogik.

von Klaus Falser (Gast)


Angehängte Dateien:

Lesenswert?

Ich glaube, das angehängte Beispiel macht was Du möchtest.
ModelSim akzeptiert es, ob es synthetisierbar ist, weiss ich nicht.

Was das Ganze allerdings bringen soll, ist mir nicht ganz klar.
Ich würde Dir aber eher raten, zuerst die Grundlagen von VHDL zu 
studieren, anstatt solche ausgefallenen und wahrscheinlich unsinnigen 
Konstruktionen zu verwenden, die versuchen die Abstraktheiten der SW 
Welt in die HW Welt zu übertragen.

von Doung W. (honeyleabe)


Lesenswert?

Klaus Falser schrieb:
> Ich glaube, das angehängte Beispiel macht was Du möchtest.
> ModelSim akzeptiert es, ob es synthetisierbar ist, weiss ich nicht.

Danke fuer deine arbeit.
wenn ich deine rlb.vhd file auf ModelSim simuliert, kommt fehlemeldung
 "Fatal: (vsim-3350) Generic 'fulogik' has not been given a value."Das 
ist auch meine Fehler.

von Doung W. (honeyleabe)


Lesenswert?

oder das Frage ist:
   entity rlb is
     generic (fu : integer);
     port( input : in std_logic_vector(fu downto 0));
   end rlb;
architecture behav of rlb is

  begin
        fu := input +1;         --KANN MAN SO MACHEN????
end behav;

von Duke Scarring (Gast)


Lesenswert?

@Doung W.:

> fu := input +1;         --KANN MAN SO MACHEN????
Nein. Ein generic ist innerhalb der architecture wie eine Konstante zu 
verwenden, also read only.

Duke

von Klaus Falser (Gast)


Lesenswert?

@Doung
> wenn ich deine rlb.vhd file auf ModelSim simuliert, kommt fehlemeldung
> "Fatal: (vsim-3350) Generic 'fulogik' has not been given a value."

Du mußt irgendetwas beim Kompilieren falsch machen, bei mir klappt's.
- Du kannst aber rlb nicht direkt simulieren, Du mußt rlb_tb als 
top-level
  aufrufen.
- Du mußt das package zuerst compilieren

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.