mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL-Frage: this signal is connected to multiple drivers?


Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich versuche gerade mich in VHDL einzudenken.
Im folgenden Beispiel will ich einen Zähler bauen, der Rücksetzen, 
Zählen und das Ergebnis seriell an einem Ausgang raustakten kann.

Es gibt eine Fehlermeldung, wenn ich versuche den Ausgang zu setzen.
(Die auskommentierte Zeile relativ weit unten.)

Ich sehe in meinen Prozessen eigentlich keine Doppeldeutigkeiten.
Ich habe schon jede Menge ausprobiert. Das Einführen von Variablen,...
Ich verwende ISE Webpack.

Gruß Dirk Schlage


entity count is
    Port ( CLK : in  STD_LOGIC;
           MES : in  STD_LOGIC;
           CS : in  STD_LOGIC;
           CNT : in  STD_LOGIC;
           SCK : in  STD_LOGIC;
           DO : out  STD_LOGIC;
           D : out  STD_LOGIC_VECTOR (7 downto 0));
end count;

architecture Behavioral of count is
signal COUNTER: std_logic_vector (23 downto 0) := "000000000000000000000000";
--signal TOPBIT: std_logic;

begin

--Rücksetzen des internen Zählers erfolgt mit der steigenden Flanke von MES
process (MES)
begin
  if (rising_edge(MES) and CS='1')
  then
    COUNTER <= "000000000000000000000000";
  end if;
end process;

--der Zähler wird mit der steigenden Flanke von CNT inkrementiert
process (CNT)
begin
  if (MES='1' and rising_edge(CNT) and CS='1')
  then
    COUNTER <= COUNTER + 1;
  end if;
end process;

--Wenn CS low ist, wird bei jeder fallenden Flanke von SCK ein bit in DO rausgetaktet.
process (SCK)
begin
  if (rising_edge(SCK) and CS='0' and MES='0')
  then    
    --!!!!!!!!!!!!!!!!!!!!!!!!!
    --DO <= COUNTER(23); 
    -- wenn ich diese Zeile aktiviere gibt es eine Fehlermeldung
    --Ich sehe aber eigentlich keine multiple Drivers
    COUNTER(23 downto 0) <= COUNTER(22 downto 0)&'0';
  end if;
end process;

end Behavioral;


Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich sehe in meinen Prozessen eigentlich keine Doppeldeutigkeiten.
Ein Klassiker:
Du kannst 1 Signal (COUNTER) nicht aus 3 Prozessen (und zudem mit 3 
unterschiedlichen Takten) verändern.
Diese Gechichte mit DO ist dabei nur Makulatur. Ohne diese Zuweisung 
wird der Counter vermutlich einfach komplett wegoptimiert :-o

Das
>  if (MES='1' and rising_edge(CNT) and CS='1')
und das
>  if (rising_edge(SCK) and CS='0' and MES='0')
sind sehr üble Schreibweisen für ein Clock-Enable.
Besser und portabler wäre die klassische Form:
  if rising_edge(CNT) then
     if (MES='1' and CS='1') then
        :
        :
     end if;
  end if;

Insgesamt solltest du nicht 3 Takte in 3 Prozessen verwenden, falls das 
auf ein FPGA kommt. Wenn die Zielplattform "nur" ein CPLD ist, und zudem 
die zeitlichen Beziehungen zwischen den Signalen genau definiert wurde, 
kann man sowas (in wohldurchdachten Ausnahmefaällen) schon mal machen.

Ein Tipp:
Nimm dir ein Synthese-nahes Buch zur Hand und arbeite das mal durch. Ich 
empfehle hier (immer noch, und gerade für den Anfang) Reichardt und 
Schwarz, VHDL-Synthese.

EDIT:
Soll das ein SPI-Slave sein?
Dann such doch mal hier im Forum nach SPI-Slave und du findest was im 
Beitrag "Re: SPI im CPLD mit State Machine - geht das so?"
oder auf meiner HP: 
http://www.lothar-miller.de/s9y/categories/26-SPI-Slave

Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Hilfe.
Wenn mir bis Montag nichts anderes einfällt, werde ich das Buch wohl 
kaufen.
Ich habe mich schon damit arangiert, daß ich erstmal ein bisschen Lernen 
muss.

In meinem Fall wäre es wohl das Sauberste, wenn es zwei getrennte 
24-bit-Register gäbe. Ein Zählregister und ein Ausgangsdatenregister. 
Und beim Beenden des Zählens würden die Ausgangsdaten aus dem 
Zählerstand gewonnen. Aber 2*24 ist mehr als ich Makrozellen habe.

Ich könnte auch meine zwei Takte, die auf den Zähler wirken SCK und CNT 
in einem anderen Prozess in ein weiteres internes Register übernehmen. 
Je nach Stellung der anderen Inputs mal das eine und mal das andere. 
Dann hätte ich einen Prozess, der auf meinen Zähler wirkt und je nach 
Stellung dieser Inputs würde ich inkrementieren oder shiften.

Irgendwie fällt der Groschen noch nicht. In dem erwähnten Thread ist nur 
ein externer Takt vorhanden. Bei mir sind prinzipbedingt zwei, die 
völlig getrennte Herkunft haben.

Gruß
    Dirk Schlage

Autor: Patrick Sulimma (abaddon1979)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Buch kann ich nur empfehlen, sehr Genial.

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.