www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL: aufrunden log2(n)


Autor: Jenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

brauche mal ein wenig VHDL Hilfe :-)

Also ich habe zurzeit (etwas vereinfacht ;-) sowas hier:


  port (
    instruction_mem_d     : in  std_logic_vector(7 downto 0); -- 8 Bit
                                                              -- Vektor
    instruction_mem_a     : in  std_logic_vector(2 downto 0)  -- Adresse
                                                              -- 2^3
    );


Jetzt würde das ganze generisch natürlich schöner sein, aber wie mache 
ich das am besten, dass
am Ende sowas dabei rumkommt ;-)

  port (
    instruction_mem_d     : in  std_logic_vector( (n - 1)  downto 0);
    instruction_mem_a     : in  std_logic_vector( aufrunden log2(n)  - 1
                                                  downto 0)
    );


Jenny

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habs so gelöst:
entity ram is
  generic(a : integer := 9; w: integer:= 32);
  port
  (
    clk      : in std_logic;
    wr       : in std_logic;
    addr     : in std_logic_vector (a-1 downto 0);
    din      : in  std_logic_vector(w-1 downto 0);
    dout1    : out std_logic_vector(w-1 downto 0)
  );

end ram;
-----------------------------------------------------------------------------
architecture ram_arch of ram is

  type ram_t is array ((2**a)-1 downto 0) of std_logic_vector(w-1 downto 0);
.
.
.
Dabei ist "a" die Adressbreite in Bits und "w" die Datenbreite in bits. 
(Hier also 32 bit daten und 9 bit Addressen)

Autor: Jenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist zu einfach ;-)

Ich habe mein Beispiel ist ein wenig missverständlich formuliert.

Also nochmal ein bisschen geschickter:

Ich habe einen cache controller, der sich merken muss wieviele 
Instruktionen er geladen hat.


Könnte im einfachsten Fall so aussehen

cache_vector       : in 32bit_array ( 7 downto 0);
cache_instr_count  : out std_logic_vector(2 downto 0 );


Und jetzt wäre es natürlich schon, wenn man aus einem generic, dass 
angibt wie breit der cache controller ist, errechnen könnte welche Länge 
der Instruktionszähler hat.

Hoffe jetzt ist es ein wenig klarer :-)

Jenny

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... nicht so wirklich... Gib doch einfach die die tiefe vor und leg 
somit die Breite fest...

Vieleicht kann man auf ein Generic auch ne Funktion --> 
Beitrag "log2 in VHDL auf integer?" anwenden, das weis ich aber 
nicht.

Autor: gonzo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas?
    function required_bits (value: natural) return positive is
    begin

        if value <= 1 then
            return 1;
        else
            return integer(ceil(log2(real(value))));
        end if;

    end function;

Autor: gonzo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, das liefert ein Bit zu wenig bei Zweierpotenzen. Besser:

real(value) + 0.5

Autor: Jenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
return integer(ceil(log2(real(value) + 0.5)));

sieht gut aus.

Vielen Dank

Jenny

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.