Forum: FPGA, VHDL & Co. Multisource


von frager (Gast)


Lesenswert?

Hallo,

leider habe ich ein Problem mit der CPLD Programmierung. Ständig bekomme 
ich die Fehlermeldung
"ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<17>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<16>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<15>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<14>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<13>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<12>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<11>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<10>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<9>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<8>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<7>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<6>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<5>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<4>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<3>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<2>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<1>>
ERROR:Xst:528 - Multi-source in Unit <shift> on signal <PO<0>>"



wie kann ich diese verhindern? Manchmal half die after Syntax, leider 
klappt das nicht. Ich hoffe ihr könnt mir helfen!
1
entity shift is 
2
  port(C, SI, inc : in  std_logic;
3
        PO : out std_logic_vector(17 downto 0));
4
end shift;
5
6
architecture archi of shift is
7
  signal tmp: std_logic_vector(17 downto 0);
8
  signal ct: std_logic_vector(4 downto 0):="00000";
9
  begin
10
  process (C)
11
  begin 
12
    if (C'event and C='1') then 
13
    ct<=ct+1;
14
    if(ct<18 AND ct>0) then
15
      tmp <= tmp(16 downto 0)& SI; --Das verursacht die Fehlermeldung
16
    else
17
       ct<="00000";
18
     end if;
19
   end if;
20
  end process;
21
  ------------------------
22
  process (inc)
23
  begin
24
    if (inc'event and inc='1') then
25
       if(ct=0) then
26
         tmp<=tmp+5 after 100 ms;
27
      end if;
28
    end if;
29
  end process;
30
   PO <= tmp;
31
  
32
end archi;

von Klaus Falser (Gast)


Lesenswert?

Du darfst das Signal tmp (= P0) nur in EINEM Prozess zuweisen, nicht 
aber in zwei.
Du mußt die Increntierung um 5 in den ersten Prozess hineinziehen.
Ist C das Taktsignal?

Klaus

von frager (Gast)


Lesenswert?

hi,

ja wie könnte ich das denn reinziehen?
c ist clk... und ist das Tacktsignal, das hast du richtig erkannt...

Grüße

von Klaus Falser (Gast)


Lesenswert?

Vielleicht so ähnlich:
1
process (C)
2
  begin 
3
    if rising_edge(C) then 
4
       ct<=ct+1;
5
       if ct = 0 then 
6
          if inc = '1' then 
7
             tmp <= tmp + 5;
8
          end if; 
9
       elsif ct<18 then
10
          tmp <= tmp(16 downto 0)& SI; --Das verursacht die Fehlermeldung
11
       else
12
          ct<="00000";
13
       end if;
14
    end if;
15
end process;

  

von frager (Gast)


Lesenswert?

Hallo,

vielen dank für Deine Hilfe.

Jedoch soll inc unabhängig von C laufen. Und so bräuchte man den Tackt 
von C.

Hat jemand ein Wunderheilmittel gegen Multisource? Das ist immer mein 
Kälberstrick.

Viele Grüße

von Jörn K. (joern)


Lesenswert?

Multisource läßt sich mit Tristatetreiber bzw. Multiplexern erschlagen. 
Wobei die Tristatevariante vom Synthesewerkzeug durch Multiplexer 
ersetzt wird.

von Klaus Falser (Gast)


Lesenswert?

> Hat jemand ein Wunderheilmittel gegen Multisource? Das ist immer mein
> Kälberstrick.

Ein paar Hardware-Kenntnisse wirken da Wunder.
Vielleicht solltest ein bischen lernen was da im FPGA/CPLD passiert und 
wie es aufgebaut ist.
Dann verstehst Du vielleicht auch warum bei synthetisierbaren Designs 
ein Signal nur von einem Prozess getrieben werden kann (naja, sollte).

Klaus

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.