Forum: FPGA, VHDL & Co. Probleme mit CASE Syntax


von Rolf S. (audiorolf)


Lesenswert?

Heute scheint nicht mein Tag. Ich bekomme einen CASE Konstrukt in 
ModelSIM nicht compiliert und erkenne nicht, wo der Fehler sein könnte.

Code:

mux: process (bram_adr)
begin
  case bram_adr is

    when "000" =>  ram_1_wea <= '0';



Auch laut WIKI sollte das gehen:

case din is
  when "00"   => wert <= '1';
  when others => null;
end case;


ModelSIM meldet aber:

Enumeration literal '0' is not of type 
ieee.std_logic_1164.STD_LOGIC_VECTOR.


die Deklaration lautet:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

library UNISIM;
use UNISIM.VComponents.all;

   signal bram_adr  : std_logic_vector ( 2 downto 0) := (others => '0');


Habe es auch schon mit einer Dekodierung in unsigend und HEX probiert. 
Immer derselbe Fehler.

Idee?

: Bearbeitet durch User
von derguteweka (Gast)


Lesenswert?

Moin,

Koennte  ram_1_wea ein STD_LOGIC_VECTOR sein? Dann sollte also

  when "000" =>  ram_1_wea <= "0";

funktioniern.

Gruss
WK

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rolf S. schrieb:
> Immer derselbe Fehler.
> Idee?
Das Problem ist nicht im geposteten Code...

von Rolf S. (audiorolf)


Lesenswert?

derguteweka   hat Recht: es ist das Anführungszeichen im ram enable. 
Immer wieder gern genommene Falle. Warum hat man sowas überhaupt 
zugelassen bzw warum schnallt der Compiler das nicht, dass das dasselbe 
ist?


Keine Ahnung, warum das so ist: JEDESMAL wenn ich ein ram_ena irgendwo 
einbaue, habe ich Probleme wegen des Ein-Bit-breiten logic vektors. VHDL 
ist irgendwo doch ein Mist! Gott-Sei-Dank muss ich mich beruflich nicht 
ständig damit auseinander setzen.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rolf S. schrieb:
> AL wenn ich ein ram_ena irgendwo einbaue, habe ich Probleme wegen des
> Ein-Bit-breiten logic vektors.
Warum nimmst du dann nicht einfach einen std_logic, ganz ohne vector?

Und wie gesagt: das Problem war nicht im geposteten Code, sondern in 
der Definition des ram_ena...

: Bearbeitet durch Moderator
von Fpgakuechle K. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Rolf S. schrieb:
>> AL wenn ich ein ram_ena irgendwo einbaue, habe ich Probleme wegen des
>> Ein-Bit-breiten logic vektors.
> Warum nimmst du dann nicht einfach einen std_logic, ganz ohne vector?


Mglw. liegt das ja am CoreGen der auch schon mal einen Port als 
std_logic_vector(0 downto 0) definiert.


--
Man kann sich da mit others behelfen:
1
  ram_1_wea <= ( others => '0');

klappt aber nur wenn alle Bits gleich gesetzt werden sollen, was aber 
bei byte-write-enables fast schon der Regelfall ist.

Übrigens ist das ein Tipp aus dem VHDL-coding style guide im 
Zusammenhang mit DO-254 (Standard für FPGA's im Flieger):
VHDL Code Style und DO-254 Punkt CP4

--
Oder man definiert sich einen Nullvector als Constante auf den man bei 
Bedarf referenziert:
1
CONSTANT C_ALL_ZERO std_logic_vector(63 downto 0) := (others => '0');
2
3
--...
4
ram_data  <= C_ALL_ZERO(15 downto 0);
5
ram_1_wea <= C_ALL_ZERO(ram_1_wea'range);

Muss jetzt nicht jedem gefallen, erspart aber einem das Abzählen von 
'0'.

MfG

von Rolf S. (audiorolf)


Lesenswert?

Lothar Miller schrieb:
> Und wie gesagt: das Problem war nicht im geposteten Code, sondern in
> der Definition des ram_ena...

Doch, schon :-) - "der gute wea" hat es ja gesehen und gut antizipiert.

Aus irgendeinem Grund, stolpere ich JEDESMAL über diesen Zwiespalt in 
VHDL. Immer bei den RAM_ENAs.


Fpga Kuechle schrieb:
> Mglw. liegt das ja am CoreGen der auch schon mal einen Port als
> std_logic_vector(0 downto 0) definiert.
Ganz genau so ist es. Leider sehe ich keine Möglichkeit, das zu ändern.

Im Grunde ist es ja in Ordnung, wenn man einen Vector der Grösse 1 hat. 
Es gibt sogar Gründe, einen mit der Grösse Null zuzulassen. Aber warum 
verträgt VHDL dann nicht die Zuweisung in '' und will "". Hätte man sich 
nicht auf ein Symbol einigen können?

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.