Forum: FPGA, VHDL & Co. Slice vom Literal?


von Markus F. (mfro)


Lesenswert?

Ein kleines "Schönheitsproblem".

Ich möchte Register anlegen, die vom angeschlossenen Microprozessor aus 
zugreifbar sein sollen, das funzt auch soweit.

Dazu gibt es für jedes Register ein Chip-Select, das folgendermaßen 
angesprochen wird:
1
    reg_1_cs <= '1' WHEN adr = 20X"FF200" ELSE '0';
2
    reg_2_cs <= '1' WHEN adr = 20X"FF204" ELSE '0';
3
    ...
Das tut auch soweit. Bloß will ich die Adressen nicht vollständig 
ausdekodieren, sondern auch Byte- und Word-Zugriffe "mittenrein" 
zulassen (also die unteren zwei Bit ignorieren).

Das man in VHDL 2008 "hübsche" Literale definieren kann, die die 
Vektorlänge vorgeben, hab' ich schon rausgefunden:
1
    reg_1_cs <= '1' WHEN adr(19 DOWNTO 2) = 18X"3FC80" ELSE '0';
2
    reg_2_cs <= '1' WHEN adr(19 DOWNTO 2) = 18X"3FC81" ELSE '0';
3
    ...

Funktioniert auch. Dummerweise ist aber jetzt die "Selbstdokumentierung" 
von oben weg: um die "echte" Adresse aus dem VHDL rauszufinden, muß man 
erst das Rechnen anfangen. Was ich dazu eigentlich bräuchte, wär' so 
was:
1
    reg_1_cs <= '1' WHEN adr(19 DOWNTO 2) = 20X"FF200"(19 DOWNTO 2) ELSE '0';
2
    reg_2_cs <= '1' WHEN adr(19 DOWNTO 2) = 20X"FF204"(19 DOWNTO 2) ELSE '0';
3
    ...
, also ein Slice von einem Literal. Das geht aber so nicht.

Gibt's einen Trick, wie man das "schöner" machen kann?

von Fpgakuechle K. (Gast)


Lesenswert?

Markus F. schrieb:
> Ein kleines "Schönheitsproblem".
>
> Ich möchte Register anlegen, die vom angeschlossenen Microprozessor aus
> zugreifbar sein sollen, das funzt auch soweit.

> Das man in VHDL 2008 "hübsche" Literale definieren kann, die die
> Vektorlänge vorgeben, hab' ich schon rausgefunden:
>
>
1
>     reg_1_cs <= '1' WHEN adr(19 DOWNTO 2) = 18X"3FC80" ELSE '0';
2
>     reg_2_cs <= '1' WHEN adr(19 DOWNTO 2) = 18X"3FC81" ELSE '0';
3
>     ...
4
>


So etwa:
adr(19 DOWNTO 2) = std_logic_vector(to_unsigned(16#FF200#/4),18)??

Du kannst die auch deine eigene Vergleichsfunktionschreiben:
WHEN f_addr_cmp(adr(19 DOWNTO 2),20X"FF204")

und dort nach Belieben literals verschieben und beim Aufruf "lesbare" 
addresse verwenden. Als sahnehäubchen könntest du auch deinen eigen 
subtype für adr definieren und '=' überladen. VHDL lässt das auch für 
die synthese zu.

MfG,

von Georg A. (georga)


Lesenswert?

Warum maskierst du die unteren Bits per AND nicht aus? Braucht nur ein 
zweites Signal ;)

von Markus F. (mfro)


Lesenswert?

Fpga Kuechle schrieb:
1
adr(19 DOWNTO 2) = std_logic_vector(to_unsigned(16#FF200#/4),18);

So hab' ich's jetzt gemacht. Ist zwar nicht unbedingt "schön" aber 
tut's.

Danke!

von berndl (Gast)


Lesenswert?

Hast du Georgs Vorschlag ausprobiert?

Also:
1
addr_x <= addr and x"FFFFC";
2
...
3
hugo <= '1' when addr_x = x"FF200" else ...
Die Synthese klopft dir das sowieso platt, kostet also keine extra 
Logik. Und ist viel weniger Tipperei.
Kann man auch prima zum "erweitern" nutzen, wenn sich der Wert nicht so 
einfach in hex darstellen laesst (einfach ein paar fuehrende Nullen 
drankleben).

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.