www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Tristate Bus


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe 3 VHDL-Module, die auf einen Block-RAM zugreifen. Der Block-Ram 
besitzt einen Anschluss für die Adresse (7 downto 0).  Die 3 VHDL-Module 
greifen auf diesen Adressbus zu (jedoch nicht gelichtzeitig) Nachdem ein 
Modul auf den Bus zugegriffen hat, wird der Ausgang des Moduls auf 
Tristate geschaltet, dadurch kann ein anderes VHDL-Modul auf den Bus 
zugreifen.

Ich habe die Ausgangsports der VHDL-Module auf "inout" gestellt, 
trotzdem zeit der compiler folgenden Fehler an:

    Calculate_Variance_Modul : Calculate_Variance
      Port Map
      (
        ADDR_RAM_A4(7) => ,
        ADDR_RAM_A4(6) => ,
        ADDR_RAM_A4(5) => ,
        ADDR_RAM_A4(4) => ,
        ADDR_RAM_A4(3) => ,
        ADDR_RAM_A4(2) => ,
        ADDR_RAM_A4(1) => ,
        ADDR_RAM_A4(0) => ,
        AV_DICKE       => NamedSignal_B_AV_DICKE,
        AV_VARIANCE    => 
PinSignal_Calculate_Variance_Modul_AV_VARIANCE,


Wie man erkennt wird "ADDR_RAM_A4" nichtzugewiesen



Hier ein auszug aus meinem Quellcode:


entity Calculate_Thickness is port
   (

     ADDR_RAM_A4            : inout std_logic_vector(7 downto 0);
     EN_RAM_A4              : inout std_logic;
     WE_RAM_A4              : inout std_logic
   );
end Calculate_Thickness;



architecture Structure of Calculate_Thickness is

-- Signal Declarations


signal S_REG_H                : std_logic_vector(7 downto 0);
signal S_ADDR_RAM_A4_1        : std_logic_vector(7 downto 0);


begin




-- Adresse an den RAM (FIFO) anlegen
process (USB_CLK)

begin
   if(USB_CLK'event and USB_CLK = '0')then
      if(CLR = '1' or GATE = '1')then
         ADDR_RAM_A4 <= (others => 'Z');
      elsif(S_REG_H(3) = '1')then
         ADDR_RAM_A4 <= S_ADDR_RAM_A4_1;
      else
         ADDR_RAM_A4 <= (others => 'Z');
      end if;
   end if;
end process;


process (USB_CLK)

begin
   if(USB_CLK'event and USB_CLK = '1') then
      if(CLR = '1' or GATE = '1' or S_UPDATED_RAM_FIFO = '1') then
         S_REG_H <= "00000001";
      elsif(SECOND_PEAK_DONE = '1')then
         S_REG_H <=  S_REG_H(6 downto 0) & S_REG_H(7); -- schieben
      end if;
   end if;
end process;


Weiß einer an was es liegt?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian

>Ich habe 3 VHDL-Module, die auf einen Block-RAM zugreifen. Der Block-Ram
>besitzt einen Anschluss für die Adresse (7 downto 0).  Die 3 VHDL-Module
>greifen auf diesen Adressbus zu (jedoch nicht gelichtzeitig) Nachdem ein
>Modul auf den Bus zugegriffen hat, wird der Ausgang des Moduls auf
>Tristate geschaltet, dadurch kann ein anderes VHDL-Modul auf den Bus
>zugreifen.

Vergiss die Tristates, nimm einen 3:1 MUX. Moderne FPGAs haben intern 
keine Tristates.

>Ich habe die Ausgangsports der VHDL-Module auf "inout" gestellt,

Das macht man auch nicht. ionout wird nur an den FPGA-Pins verwendet, 
nicht innerhalb des FPGAs zwischen Modulen.

MfG
Falk

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha.

Ich habe aber bereits VHDL-Module geschrieben, indem mehrere Prozesse 
auf einen Modulausgang zugegriffen haben. Dort habe ich den 
Tristate-Zustand benutzt. Dort hat der Compiler keinen Fehler angezeigt 
und es hat zudem funktioniert. Nur wenn mehrere Module auf diesen Bus 
zugreifen geht es auf einmal nicht mehr. Das ist für mich unlogisch.

Das mit dem Multiplexer ist in meinem Fall umständlich. Wenn ich alles 
in eine Datei schreibe, dann geht es  auch mit dem Tristate nur der 
Quellcode wird unübersichtlich.

Grüsse

Sebastian

Autor: velasco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so im allgemeinen dürfte das mit dem multiplexer aber hinhauen, es 
seiden er beachtet nich die tristatischen rückkopplungswiderstände die 
eine kapazitive last im elektrolyt mitsich führen und am messpunkt bx² 
mit einer niederohmigen amplitude rekombinieren.
allet klar?

Autor: tiem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weißt du überhaupt was du da geschrieben hast?
heißt du vielleicht ramon velasco san-martin?

ramon, erst lesen dann posten!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann intern soviele buss bauen wie man will - die Synthese nimmt das 
alles wieder weg. Das ist aber auch logisch so. Damit kann man nähmlich 
designs, die vorher top level waren und auch Ports gehen, auch intern 
wieder benutzen und kapseln. Umständlich kann der Muxer nicht sein, denn 
auch eine Tristate-Steuerlogig muss ja alternativ schalten, dass 
physikalisch kein Unsinn passiert. Wenn sie das tut, IST sie ein 
Multiplexer.

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.