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
Moin, Koennte ram_1_wea ein STD_LOGIC_VECTOR sein? Dann sollte also when "000" => ram_1_wea <= "0"; funktioniern. Gruss WK
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.