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?
Gast
#4094126
Moin, Koennte ram_1_wea ein STD_LOGIC_VECTOR sein? Dann sollte also when "000" => ram_1_wea <= "0"; funktioniern. Gruss WK
Rolf S. schrieb: > Immer derselbe Fehler. > Idee? Das Problem ist nicht im geposteten Code...
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.
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...
Gast
#4094763
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 | |
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 | |
2 | |
3 | |
4 | |
5 | |
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?
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.