Forum: FPGA, VHDL & Co. Probleme mit Portzuweisung in der Entity


von Manuel (Gast)


Lesenswert?

Hallo ihr Lieben,

ich habe ein Problem bei dem ich einfach nicht mehr weiter weiß.

Es soll ein Muxer gebaut werden, der abhängig von einem Steuersignal die 
entsprechenden Eingangsports auf die Ausgangsports schaltet. Ein rein 
kombinatorischer Prozess also. Er schaltet alle Ports die NICHT 
std_logic sind tadellos, so wie es sein soll. In der Simulation bleiben 
die std_logic Out-Ports immer im Zustand 'U', egal welches Steuersignal 
kommt.

Ich habe folgendes versucht:

- neue Projekte erstellt
- die VHDL für den Muxer aus den Projekten in denen ALLES funktioniert 
in  diesem Projekt integriert
- Ports außerhalb des Prozesses auf Dauerhigh gesetzt
- Ports in der entity selbst Werte zugewiesen
- Muxer in eine andere Entity integriert (Verhalten wandert mit)
- verschiedene Modelsim-Versionen, verschiedene ISE-WebPackversionen 
probiert

Es führt einfach kein Weg rein, die std_logic outs in einen anderen 
Zustand als 'U' zu bekommen.
Dann habe ich noch probiert aus dem einen Outport einen Vector zu machen 
(siehe WEn) und siehe da, mit dem funktioniert es. Hä? Ich verstehe die 
VHDL-Welt nicht mehr.

Weiß jermand von euch Rat? ichbin für alles Ideen offen.
Vielen Dank und Gute Nacht

Gruß,
Manuel
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
5
6
7
entity Flash_Multiplexer is
8
  port (  
9
      Flash_Multiplexer_ctrl : in std_logic_vector (3 downto 0);
10
      Data_UART : in std_logic_vector (7 downto 0);
11
      Flash_Addr : in std_logic_vector (20 downto 0);
12
      WEn_FAg   : in std_logic;      
13
      CEn_FAg   : in std_logic;
14
      OEn_FAg   : in std_logic;  
15
      
16
      Data_ESPM : in std_logic_vector (15 downto 0);
17
      Addr_ESPM : in std_logic_vector (20 downto 0);
18
      WEn_ESPM : in std_logic;
19
      CEn_ESPM : in std_logic;
20
      OEn_ESPM : in std_logic;
21
      
22
      Data_Chip_Erase : in std_logic_vector (15 downto 0);
23
      Addr_Chip_Erase : in std_logic_vector (20 downto 0);
24
      WEn_Chip_Erase : in std_logic;
25
      CEn_Chip_Erase : in std_logic;
26
      OEn_Chip_Erase : in std_logic;
27
28
      WEn : out std_logic_vector(1 downto 0);
29
--    WEn : out std_logic := '1';
30
      CEn : out std_logic := '1';
31
      OEn : out std_logic := '1';
32
      Data_io : inout std_logic_vector (15 downto 0);
33
      Addr : out std_logic_vector (20 downto 0);
34
      Data : out std_logic_vector (15 downto 0)
35
       
36
      );
37
end Flash_Multiplexer;
38
39
architecture Behavioral of Flash_Multiplexer is
40
41
begin
42
43
    --WEn <= "11";
44
    --WEn <=  '1';
45
      CEn <=  '1';
46
      OEn <=  '1';
47
48
49
process( Flash_Multiplexer_ctrl, Data_io,Data_Chip_Erase,
50
Addr_Chip_Erase, WEn_Chip_Erase,CEn_Chip_Erase,OEn_Chip_Erase,Data_UART,
51
Flash_Addr,WEn_FAg,CEn_FAg,OEn_FAg,Data_ESPM,Addr_ESPM,WEn_ESPM,CEn_ESPM,
52
OEn_ESPM)
53
54
  
55
  begin
56
    
57
      case Flash_Multiplexer_ctrl is
58
                              
59
          when "0001" => --ESPM
60
                  Data_io <= Data_ESPM;
61
                  Data <= (others => 'Z');
62
                  Addr <= Addr_ESPM;
63
                  WEn(0) <= WEn_ESPM;
64
--                WEn <= WEn_ESPM;
65
--                CEn <= CEn_ESPM;
66
--                OEn <= OEn_ESPM;
67
68
          
69
          when "0010" => --Write (Flash_Addr_gen + UART)
70
                  Data_io(15 downto 8) <= (others => '0'); 
71
                  Data_io(7 downto 0) <= Data_UART;
72
                  Data <= (others => 'Z');
73
                  Addr <= Flash_Addr;
74
                  WEn(0) <= WEn_FAg;
75
--                WEn <= WEn_FAg;
76
--                CEn <= CEn_FAg;
77
--                OEn <= OEn_FAg;
78
          
79
          when "0011" => --Read
80
                  Data_io <= (others => 'Z');
81
                  Data <= Data_io; 
82
                  Addr <= Flash_Addr;
83
                  WEn(0) <= WEn_FAg;
84
--                WEn <= WEn_FAg;
85
--                CEn <= CEn_FAg;
86
--                OEn <= OEn_FAg;
87
                  
88
          when "0100" => --Chip_Erase
89
                  Data_io <= Data_Chip_Erase;
90
                  Data <= (others => 'Z');
91
                  Addr <= Addr_Chip_Erase;
92
                  WEn(0) <= WEn_Chip_Erase;
93
--                WEn <= WEn_Chip_Erase;
94
--                CEn <= CEn_Chip_Erase;
95
--                OEn <= OEn_Chip_Erase;
96
          
97
          when others =>  
98
                  Data_io <= (others => 'Z');
99
                  Data <= (others => 'Z'); 
100
                  Addr <= (others => '0'); 
101
                  WEn(0) <=  '1';
102
--                WEn <=  '1';
103
--                CEn <=  '1';
104
--                OEn <=  '1';
105
            
106
          
107
      end case;    
108
109
110
 end process;
111
end Behavioral;

von frank (Gast)


Lesenswert?

Das Problem liegt nicht am Std_logic sondern an deinen zuweisunge. 
außerhalb des Prozesses weist Du
      CEn <=  '1';
      OEn <=  '1';
zu. Das bedeutet, dass die Ausgänge immer den Wert haben.
Anschließend weist innerhalb des Prozesses nochmals CEn und OEn zu. 
Selbiges geht natürlich nicht. das ist genau das gleich als wenn du zwei 
Prozesse hast und dort jeweils die Signale zuweist.

Frank

von Manuel (Gast)


Lesenswert?

Hallo Frank,

ich habe doch nur zu Testzwecken die Zuweisung außerhalb des Process 
eingefügt, damit überhaupt etwas zugewiesen werden kann und die 
Zuweisungen innerhalb des Process für diesen Testzweck auskommentiert. 
Aber das funktioniert nicht - Ports bleiben immer 'U'.
Schade das es nicht so einfach ist, aber danke trotzdem.

Gruß Manuel

von johann w (Gast)


Lesenswert?

Da stellt sich mir die Frage, ob die outputs vielleicht doch korrekt 
funktionieren und einfach nur U durch die inputs zugewiesen bekommen? 
Was schreibst du denn auf die ports, also was legst du an, z.B. an 
WEn_ESPM?

von Manuel (Gast)


Lesenswert?

Hi Leutz,

an den Eingängen liegt keinerlei 'U' an. Alle Inputs haben einen 
bestimmten Zustand. Daran liegt es also nicht. Zumal es einen bestimmten 
Zustand der Outputs im Case "when others" gibt, der nicht von den Inputs 
abhänging ist (außer vom Steuersignal natürlich).

Der Fehler ist an einer anderen Stelle zu suchen und ist fast nicht zu 
finden, weil es zu keinerlei Fehlermeldung kommt, sondern nur zu den 
unbestimmten Zuständen 'U' von WEn, CEn und OEn.

Ich habe einen äquivalenten Ausgangsport Testpin erschaffen, den ich bis 
in die höchste Hierarchie gezogen habe (genau wie die WEn, CEn, und 
OEn). Mit diesem Testpin trat der Fehler nicht auf.
Dann habe ich verglichen was ist an dem Testpin anders, als bei den Pins 
WEn, CEn, OEn. In der obersten Hierachie wurden die Outputs WEn, CEn und 
OEn auf andere Ports gemappt mit den Namen (FLASH_WEn, FLASH_OEn, usw). 
Im Gegensatz dazu wurde der Testpin auf ein Signal gemappt. Sollte ja 
erstmal kein Problem sein, ob ich den Pin auf ein Signal lege und dieses 
nicht weiter benutze oder auf einen Ausgangsport meiner höchsten 
Hierarchie.
ABER
Es hatten sich in der höchsten Hierarchie weitere Zuweisungen versteht, 
die auf die gleichen Ports gingen wie WEn, CEn und OEn. Die haben mir 
mein Signal kaputt gemacht. Das heißt also das in der obersten 
Hierarchie (ist ein ziemlich komplexes Projekt) einmal in der Portmap 
drin stand WEn => FLASH_WEn, usw. und ebenfalls die Zuweisung FLASH_WEn 
<= sig1; , die ich wahrscheinlich mal für irgendwelche Messungen, Tests 
oder was weiß ich vorgenommen habe. Das Böse ist dabei die Situation, 
dass der Port der obersten Hierarchie mit zwei Treibern versorgt wird 
keine Fehlermeldung hervor ruft.

Ich habs gefunden - hurra! Immerhin nach bestimmt 11 Stunden intensiver 
Suche.

Ich danke euch für eure Hilfe und wünsche noch einen schönen Freitag.

Gruß,
Manuel

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.