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


von Dirk Schlage (Gast)


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


1
entity count is
2
    Port ( CLK : in  STD_LOGIC;
3
           MES : in  STD_LOGIC;
4
           CS : in  STD_LOGIC;
5
           CNT : in  STD_LOGIC;
6
           SCK : in  STD_LOGIC;
7
           DO : out  STD_LOGIC;
8
           D : out  STD_LOGIC_VECTOR (7 downto 0));
9
end count;
10
11
architecture Behavioral of count is
12
signal COUNTER: std_logic_vector (23 downto 0) := "000000000000000000000000";
13
--signal TOPBIT: std_logic;
14
15
begin
16
17
--Rücksetzen des internen Zählers erfolgt mit der steigenden Flanke von MES
18
process (MES)
19
begin
20
  if (rising_edge(MES) and CS='1')
21
  then
22
    COUNTER <= "000000000000000000000000";
23
  end if;
24
end process;
25
26
--der Zähler wird mit der steigenden Flanke von CNT inkrementiert
27
process (CNT)
28
begin
29
  if (MES='1' and rising_edge(CNT) and CS='1')
30
  then
31
    COUNTER <= COUNTER + 1;
32
  end if;
33
end process;
34
35
--Wenn CS low ist, wird bei jeder fallenden Flanke von SCK ein bit in DO rausgetaktet.
36
process (SCK)
37
begin
38
  if (rising_edge(SCK) and CS='0' and MES='0')
39
  then    
40
    --!!!!!!!!!!!!!!!!!!!!!!!!!
41
    --DO <= COUNTER(23); 
42
    -- wenn ich diese Zeile aktiviere gibt es eine Fehlermeldung
43
    --Ich sehe aber eigentlich keine multiple Drivers
44
    COUNTER(23 downto 0) <= COUNTER(22 downto 0)&'0';
45
  end if;
46
end process;
47
48
end Behavioral;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
  if rising_edge(CNT) then
2
     if (MES='1' and CS='1') then
3
        :
4
        :
5
     end if;
6
  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

von Dirk Schlage (Gast)


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

von Patrick S. (abaddon1979)


Lesenswert?

Das Buch kann ich nur empfehlen, sehr Genial.

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.