Forum: FPGA, VHDL & Co. Tristate Bus


von Sebastian (Gast)


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?

von Falk (Gast)


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

von Sebastian (Gast)


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

von velasco (Gast)


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?

von tiem (Gast)


Lesenswert?

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

ramon, erst lesen dann posten!

von Matthias (Gast)


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.

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.