www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Parametrierbarer Zähler in Abhängigkeit von Zielwert


Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte einer Komponente über eine generic-Anweisung einen 
integer-Wert (z.B. 40) übergeben. In Abhängigkeit von diesem Wert sollen 
Signale und ein Zähler mit entsprechenden Bitbreiten generiert werden 
(in o. Beispiel 6bit).

Ist soetwas in VHDL möglich und wenn ja, wie???

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja klar, einfach die Konstante, die du unter generic deklarierst in der 
Angabe der Breite verwenden.


Vorsicht mit komplizierteren Berechnungen / Funktionsaufrufen: Da 
stolpert ISE bei der Simulation manchmal drüber.

Autor: Gabriel Wegscheider (gagosoft)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
entity XY is
generic(
  width : natural := 16 -- mit defaultWert
)
port(
  aVect : std_ulogic_vector(width-1 downto 0)
)
auch nachher in der architecture kannst Du in diesem Bsp width einfach 
als Konstante verwenden. Wenn Du bei der instatieerung kein generic map 
verwendets wird der deafultwert hergenommen.

Autor: Gabriel Wegscheider (gagosoft)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oops hab die Schnittstelle beschrieben, kannst aber auch in der 
architecture dann
signal counter : std_ulogic_vector(width-1 downto 0)
anlegen

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay, ich glaube ich habe mich unklar ausgedrückt. ich möchte in der 
generic-anweisung nicht die breite angeben, sondern einen zählerstand, 
zum beispiel 100. und in abhängigkeit von diesem integer-wert sollen 
signale und zähler erzeugt werden, also mit 7bit breite.

umgesetzt werden müsste eine log2() anweisung. ist das möglich?

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Gabriel Wegscheider (gagosoft)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
entity DataRAM is generic(RAMSize : positive := 128);
port(
  Reset_n : in  std_ulogic;
  Clk     : in  std_ulogic;
  address : in  std_ulogic_vector (LOG2(RAMSize)-1 downto 0);
  ramwe   : in  std_ulogic;
  din     : in  std_ulogic_vector (7 downto 0);
  dout    : out  std_ulogic_vector (7 downto 0)
);
end DataRAM;
wobei LOG2 in einem Projektspezifischen Package so auf gebaut ist:
function LOG2(Number : positive) return natural is
variable Temp : positive := 1;
begin
  if Number=1 then 
    return 0;
  else 
    for i in 1 to integer'high loop
      Temp := 2*Temp; 
      if Temp>=Number then 
        return i;
      end if;
    end loop;
  end if;  
end function;  

Ich denke jetzt hab ich's - hab gestern etwas unaufmerksam gelesen.

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau, hab ich mittlerweile auch mit einem package gelöst. das schöne 
daran ist, dass man auch die ports selbst variabel gestalten kann :-)))

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.