Hallo Leute,
habe folgende Frage an Euch: Ich möchte in einer Case-Abfrage einzelne
Adress-Werte abfragen, möchte aber gleichzeitig einen Adress-Bereich
abfragen. Ist eine der drei folgenden Varianten zu bevorzugen ? Bin mir
nicht sicher, ob die dritte Variante so überhaupt funktioniert ...
Oder gibt es gar eine elegantere Methode ? Vorab vielen Dank für Eure
Meinungen und Vorschläge.
Grüsse,
Stefan123
Hi, also das ist eigendlich die eleganteste Methode:
process(clk)
begin
if rising_edge(clk) then
case addr is
when x"01" => ...
when x"02" => ...
when x"03" => ...
when x"07" | x"0F" => ...
when others => null;
end case;
end if;
end process;
Ich denke Vaiante 3 funktioniert so nicht. Und das schon vom Syntax her.
Der Compiler wird nicht verstehen was du ihn damit sagen willst. Vom
Gefühl her würde ich Variante 2 bevorzugen.
> Funktioniert Variante 3 ?
Nein.
Siehe Beitrag "Re: Bereichsabfrage in Case">Welche der Varianten 1-3 würdest du verwenden?
Am lesbarsten dürfte Variante 2 sein.
Ich würde einfachh alle ausprobieren und dann die Laufzeiten und den
Ressourcenbedarf ansehen... ;-)
Sowas ginge evtl. auch:
1
-- Variante 5
2
process(clk)
3
begin
4
waituntilrising_edge(clk);-- wozu hier der Takt? Das gibt einen Takt Latency!
5
6
caseto_integer(unsigned(addr))is
7
whento_integer(unsigned(x"01"))=>...
8
whento_integer(unsigned(x"02"))=>...
9
whento_integer(unsigned(x"03"))=>...
10
whento_integer(unsigned(x"08"))to
11
to_integer(unsigned(x"0E"))=>...
12
whenothers=>null;
13
14
endcase;
15
16
endprocess;
Variante 6 wäre, gleich alles mit if abzufragen...
BTW:
Wozu eigentlich der Takt im Prozess?
Error: Type conversion (to unsigned) can not have string literal
operand.
Der Takt wird verwendet um aus der Adress-Dekodierung registrierte
Signale (...) zu erzeugen.
Grüsse,
Stefan123
>Verwende to_unsigned(Wert, Breite)
Moment mal, x"01" ist doch kein Integer, sondern ein std_logic_vector.
Also kommt man mit "to_unsigned" nicht weiter.
Grüsse,
Stefan123
Stefan123 schrieb:
> Frage mich nur, wieso der Compiler mit>
1
>whento_integer(unsigned(x"01"))=>...
2
>
> nicht klar kommt. Ist doch eindeutig beschrieben.
Die Funktion unsigned() weiß nicht, welcher Typ x"01" denn genau ist.
Es kann ja ein signed, ein unsigned, ein std_ulogic_vector oder was auch
immer sein. 6 Typen stehen zur Auswahl.
Ein Qualifier hilft ein Stück weiter: to_integer( unsigned'(x"01") )
Hier wird der Funktion to_integer() explizit gesagt, dass x"01" ein
unsigned-Vektor ist. Diese Umrechnung ginge also klar.
Aber case-when hat prinzipiell ein Problem mit der nicht statischen
Funktion to_integer(), denn im case-when darf nur ein explizit
statischer Wert stehen.
Naja, eine Sache ist ja nun doch noch etwas krückig:
Wenn man Adressen über Konstanten dekodieren möchte, dann wird das
folgende Beispiel nicht funktionieren. Was kann man da machen ?
z.B.:
Ok, also Lothars Variante mit "unsigned' " lässt sich kompilieren,
Modelsim beklagt sich "Case choice must be a locally static expression."
Aber das kann man ja in den Compile-Optionen ausschalten und stört auch
nicht weiter für die Synthese.
Funktioniert:
1
caseto_integer(unsigned(addr))is
2
whento_integer(unsigned'(x"01"))=>...
Ein weiterer Vorteil, die Adress-Bereichs-Abfrage nicht in den
others-Zweig zu packen ist, dass Adress-Überlagerungen bemängelt werden.
Beispiel: wird von Modelsim bemängelt
> Beispiel: wird von Modelsim bemängelt
Klar, denn es gibt zwei Pfade für addr=x"01".
> Beispiel: wird nicht von Modelsim bemängelt
Nur wird für addr=x"01" der others-Fall nicht ausgeführt... :-o
>Nur wird für addr=x"01" der others-Fall nicht ausgeführt... :-o
Genau das zeigt die Simulation. Ist also u.U. nicht eindeutig, wenn man
Variante 2 verwendet.
Grüsse,
Stefan123
Hallo Lothar,
>Aber case-when hat prinzipiell ein Problem mit der nicht statischen>Funktion to_integer(), denn im case-when darf nur ein explizit>statischer Wert stehen.
eine Frage hätte ich da noch:
1
process(clk)
2
begin
3
ifrising_edge(clk)then
4
caseto_integer(addr)is
5
whento_integer(cAdd_x)toto_integer(cAdd_z)=>...
6
...
7
endcase;
8
endif;
9
endprocess;
Mit Modelsim erhalte ich folgende Warnung:
"Case choice must be a locally static expression"
Wenn ich jedoch versuche, einen integerierten Logic-Analyzer einzubauen
(Altera Signaltap), so erhalte ich folgende Fehlermeldung:
ERROR: case choice must be a locally static expression (VHDL-1438)
Wie passt das zusammen? Wieso gibt Modelsim (mit aktiviertem "Check for
Synthesis") eine Warnung aus, während es beim Einbau des Signaltap-Cores
zu einem Abbruch kommt ?
Gibt es einen Ausweg aus dem Schlamassel, um dennoch die Bereichsabfrage
hinzubekommen ?
Grüsse,
Stefan123