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
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)
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
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.
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; |
Sorry, das liefert ein Bit zu wenig bei Zweierpotenzen. Besser: real(value) + 0.5
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.