Komisches Verhalten Xilinx CoolRunner2.

Gast #2580822
Lesenswert?

Moin,

ich verwende den CRII, um eine 3-Draht SSC (BiDi Datenleitung) mit einer 
4-Draht SPI zu verheiraten. Funktioniert soweit prima, nur bin ich da 
ueber etwas seltsames gestolpert:

Funktionierende Beschreibung:
1
   proc_io : process (clk)
2
   begin
3
      if rising_edge (clk) then
4
         ssc_ncs <= pld43;
5
         ssc_sck <= pld44;
6
         ssc_data <= pld40;
7
         if ssc_dir = '1' then
8
            pld40 <= spi_somi;
9
         else
10
            pld40 <= 'Z';
11
         end if;
12
         
13
         pld38 <= ssc_ncs;
14
         pld37 <= ssc_sck;
15
         pld32 <= ssc_data;
16
         spi_somi <= pld41;
17
         
18
         pld30 <= ssc_dir;
19
      end if;
20
   end process;
Oben werden die SSC-Signale eingelesen sowie der BiDi gebastelt, 
'ssc_dir' kommt aus einem geclockten Prozess (50MHz). Drunter werden die 
Signale an die SPI weitergegeben/eingelesen.
Die 'pldXX' sind alle als 'inout' definiert (LVCMOS33), die SSC ist der 
Master.

Soweit so gut.

Wenn ich den o.g. Prozess aber concurrent (ohne Clock) machen will, also 
so:
1
   ssc_ncs <= pld43;
2
   ssc_sck <= pld44;
3
   ssc_data <= pld40;
4
   pld40 <= spi_somi when ssc_dir = '1' else
5
            'Z';
6

7
   pld38 <= ssc_ncs;
8
   pld37 <= ssc_sck;
9
   pld32 <= ssc_data;
10
   spi_somi <= pld41;
11

12
   pld30 <= ssc_dir;
dann feuert 'pld40' permanent gegen das externe ssc_data Signal. High-Z 
scheint da nicht zu funktionieren...

Kennt jemand dieses komische Verhalten? Oder ist meine concurrent 
Beschreibung Murks?
Gast #2581059
Lesenswert?

RTL hab' ich mir nicht angesehen...

Die Simulation funktioniert mit beiden Varianten (halt unterschiedliches 
Delay in->out und wieder zurueck).
An der echten HW konnte man am Oszi klar sehen, dass der CPLD permanent 
die Leitung treibt.
Gast #2581929
Lesenswert?

so, ich hatte heut' nachmittag nochmal beide Varianten probiert und an 
der HW getestet...

Im RTL war in beiden Faellen an PLD40 ein Tristate Treiber instantiert. 
Der Enable hing an 'ssc_dir', also richtig. Natuerlich fehlten bei der 
concurrent Variante die FFs zum rein-/raustakten. Die concurrent 
Variante funktioniert in echter HW nicht. Beide Varianten funktionieren 
allerdings in der Simulation (mit RANDOM pattern, read/write, variable 
Laenge, ASSERT statements zum checken, ...).

Ist nicht wirklich tragisch, die ge-clockte Variante kommt ins Produkt. 
Aber verstehen wuerde ich es doch gerne... Toolchain ist uebrigens ISE 
13, sollte also fuer CRII nix besonderes sein. Vlt. doch mal Xilinx 
anmailen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren