mikrocontroller.net

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


Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


entity Flash_Multiplexer is
  port (  
      Flash_Multiplexer_ctrl : in std_logic_vector (3 downto 0);
      Data_UART : in std_logic_vector (7 downto 0);
      Flash_Addr : in std_logic_vector (20 downto 0);
      WEn_FAg   : in std_logic;      
      CEn_FAg   : in std_logic;
      OEn_FAg   : in std_logic;  
      
      Data_ESPM : in std_logic_vector (15 downto 0);
      Addr_ESPM : in std_logic_vector (20 downto 0);
      WEn_ESPM : in std_logic;
      CEn_ESPM : in std_logic;
      OEn_ESPM : in std_logic;
      
      Data_Chip_Erase : in std_logic_vector (15 downto 0);
      Addr_Chip_Erase : in std_logic_vector (20 downto 0);
      WEn_Chip_Erase : in std_logic;
      CEn_Chip_Erase : in std_logic;
      OEn_Chip_Erase : in std_logic;

      WEn : out std_logic_vector(1 downto 0);
--    WEn : out std_logic := '1';
      CEn : out std_logic := '1';
      OEn : out std_logic := '1';
      Data_io : inout std_logic_vector (15 downto 0);
      Addr : out std_logic_vector (20 downto 0);
      Data : out std_logic_vector (15 downto 0)
       
      );
end Flash_Multiplexer;

architecture Behavioral of Flash_Multiplexer is

begin

    --WEn <= "11";
    --WEn <=  '1';
      CEn <=  '1';
      OEn <=  '1';


process( Flash_Multiplexer_ctrl, Data_io,Data_Chip_Erase,
Addr_Chip_Erase, WEn_Chip_Erase,CEn_Chip_Erase,OEn_Chip_Erase,Data_UART,
Flash_Addr,WEn_FAg,CEn_FAg,OEn_FAg,Data_ESPM,Addr_ESPM,WEn_ESPM,CEn_ESPM,
OEn_ESPM)

  
  begin
    
      case Flash_Multiplexer_ctrl is
                              
          when "0001" => --ESPM
                  Data_io <= Data_ESPM;
                  Data <= (others => 'Z');
                  Addr <= Addr_ESPM;
                  WEn(0) <= WEn_ESPM;
--                WEn <= WEn_ESPM;
--                CEn <= CEn_ESPM;
--                OEn <= OEn_ESPM;

          
          when "0010" => --Write (Flash_Addr_gen + UART)
                  Data_io(15 downto 8) <= (others => '0'); 
                  Data_io(7 downto 0) <= Data_UART;
                  Data <= (others => 'Z');
                  Addr <= Flash_Addr;
                  WEn(0) <= WEn_FAg;
--                WEn <= WEn_FAg;
--                CEn <= CEn_FAg;
--                OEn <= OEn_FAg;
          
          when "0011" => --Read
                  Data_io <= (others => 'Z');
                  Data <= Data_io; 
                  Addr <= Flash_Addr;
                  WEn(0) <= WEn_FAg;
--                WEn <= WEn_FAg;
--                CEn <= CEn_FAg;
--                OEn <= OEn_FAg;
                  
          when "0100" => --Chip_Erase
                  Data_io <= Data_Chip_Erase;
                  Data <= (others => 'Z');
                  Addr <= Addr_Chip_Erase;
                  WEn(0) <= WEn_Chip_Erase;
--                WEn <= WEn_Chip_Erase;
--                CEn <= CEn_Chip_Erase;
--                OEn <= OEn_Chip_Erase;
          
          when others =>  
                  Data_io <= (others => 'Z');
                  Data <= (others => 'Z'); 
                  Addr <= (others => '0'); 
                  WEn(0) <=  '1';
--                WEn <=  '1';
--                CEn <=  '1';
--                OEn <=  '1';
            
          
      end case;    


 end process;
end Behavioral;


Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johann w (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.