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


von Jenny (Gast)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also ich habs so gelöst:
1
entity ram is
2
  generic(a : integer := 9; w: integer:= 32);
3
  port
4
  (
5
    clk      : in std_logic;
6
    wr       : in std_logic;
7
    addr     : in std_logic_vector (a-1 downto 0);
8
    din      : in  std_logic_vector(w-1 downto 0);
9
    dout1    : out std_logic_vector(w-1 downto 0)
10
  );
11
12
end ram;
13
-----------------------------------------------------------------------------
14
architecture ram_arch of ram is
15
16
  type ram_t is array ((2**a)-1 downto 0) of std_logic_vector(w-1 downto 0);
17
.
18
.
19
.
Dabei ist "a" die Adressbreite in Bits und "w" die Datenbreite in bits. 
(Hier also 32 bit daten und 9 bit Addressen)

von Jenny (Gast)


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
1
cache_vector       : in 32bit_array ( 7 downto 0);
2
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

von Läubi .. (laeubi) Benutzerseite


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.

von gonzo (Gast)


Lesenswert?

Sowas?
1
    function required_bits (value: natural) return positive is
2
    begin
3
4
        if value <= 1 then
5
            return 1;
6
        else
7
            return integer(ceil(log2(real(value))));
8
        end if;
9
10
    end function;

von gonzo (Gast)


Lesenswert?

Sorry, das liefert ein Bit zu wenig bei Zweierpotenzen. Besser:

real(value) + 0.5

von Jenny (Gast)


Lesenswert?

return integer(ceil(log2(real(value) + 0.5)));

sieht gut aus.

Vielen Dank

Jenny

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.