Forum: FPGA, VHDL & Co. 32 Input <-> SPI in CPLD (VHDL)?


von Sven L. (slorg)


Lesenswert?

Hallo,

Ich wollte fragen, ob es so möglich ist ein >=32 Input <-> SPI
"Bridge" in VDHL zu realisieren.

Mein Anwendungsgebiet in dem Fall ist:
 - 32 Tasten (nicht Matrix-Schaltung) an I/O Pins des Xilinx CPLD (95xx)
 - SPI im Mode 0
 - Atmel ATMega als SPI-Master mit SPI-Interrupts

 Das ganze soll für ein Live-MIDI-Interface genutzt werden.
 Da ich gerne die Ressourcen vom ATMega sparen wollte, habe
 ich mir gedacht, dass ein CPLD als SPI-Slave vielleicht
 eine Idee wert wäre. Nebenbei seih gesagt, dass ich noch
 ein CPLD-Evaluationsboard rumliegen hätte, womit ich den
 Testaufbau realisieren könnte.


spi32in.vhd:
1
-- SPI-Slave for SPI Mode 0 --
2
3
library IEEE;
4
5
use IEEE.STD_LOGIC_1164.ALL;
6
use IEEE.NUMERIC_STD.ALL;
7
8
entity SPI_Slave is
9
  Generic (width: natural := 32);
10
  Port(
11
    SCLK  :  in    STD_LOGIC;
12
    SS    :  in    STD_LOGIC;
13
    MISO  :  out  STD_LOGIC;
14
    Din  :  in    STD_LOGIC_VECTOR (width-1 downto 0)
15
  );
16
end SPI_Slave;
17
18
architecture Behavioral of SPI_Slave is
19
  signal dinshr  :    STD_LOGIC_VECTOR (width-1 downto 0);
20
  
21
  begin
22
    -- MISO - Master In Slave Out --
23
    
24
    process (SS, Din, SCLK)
25
    begin
26
      if(SS='1') then
27
        dinshr <= Din;
28
      elsif falling_edge(SCLK) then
29
        dinshr <= dinshr(dinshr'left-1 downto 0) & '0';
30
      end if;
31
    end process;
32
    
33
    MISO <= dinshr(dinshr'left) when SS='0' else 'Z';
34
end Behavioral;

spi32in.ucf für XL95144 TQFP100:
1
NET "Din<0>"  LOC = "P78"  ;
2
NET "Din<10>"  LOC = "P67"  ;
3
NET "Din<11>"  LOC = "P64"  ;
4
NET "Din<12>"  LOC = "P65"  ;
5
NET "Din<13>"  LOC = "P61"  ;
6
NET "Din<14>"  LOC = "P63"  ;
7
NET "Din<15>"  LOC = "P59"  ;
8
NET "Din<16>"  LOC = "P60"  ;
9
NET "Din<17>"  LOC = "P56"  ;
10
NET "Din<18>"  LOC = "P58"  ;
11
NET "Din<19>"  LOC = "P54"  ;
12
NET "Din<1>"  LOC = "P79"  ;
13
NET "Din<20>"  LOC = "P55"  ;
14
NET "Din<21>"  LOC = "P52"  ;
15
NET "Din<22>"  LOC = "P28"  ;
16
NET "Din<23>"  LOC = "P86"  ;
17
NET "Din<24>"  LOC = "P50"  ;
18
NET "Din<25>"  LOC = "P49"  ;
19
NET "Din<26>"  LOC = "P46"  ;
20
NET "Din<27>"  LOC = "P43"  ;
21
NET "Din<28>"  LOC = "P99"  ;
22
NET "Din<29>"  LOC = "P1"  ;
23
NET "Din<2>"  LOC = "P76"  ;
24
NET "Din<30>"  LOC = "P27"  ;
25
NET "Din<31>"  LOC = "P3"  ;
26
NET "Din<3>"  LOC = "P77"  ;
27
NET "Din<4>"  LOC = "P73"  ;
28
NET "Din<5>"  LOC = "P71"  ;
29
NET "Din<6>"  LOC = "P72"  ;
30
NET "Din<7>"  LOC = "P68"  ;
31
NET "Din<8>"  LOC = "P70"  ;
32
NET "Din<9>"  LOC = "P66"  ;
33
NET "MISO"  LOC = "P81"  ;
34
NET "SCLK"  LOC = "P82"  ;
35
NET "SS"  LOC = "P85"  ;

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


Lesenswert?

> Ich wollte fragen, ob es so möglich ist ein >=32 Input <-> SPI
> "Bridge" in VDHL zu realisieren.
Ja.
Deine Implementierung ist recht nahe an meinem kampferprobten SPI-Slave
http://www.lothar-miller.de/s9y/categories/26-SPI-Slave
;-)

von Sven L. (slorg)


Lesenswert?

Lothar Miller schrieb:
>> Ich wollte fragen, ob es so möglich ist ein >=32 Input <-> SPI
>> "Bridge" in VDHL zu realisieren.
> Ja.
> Deine Implementierung ist recht nahe an meinem kampferprobten SPI-Slave
> http://www.lothar-miller.de/s9y/categories/26-SPI-Slave
> ;-)

Danke für die schnelle Antwort!
Ich werde das Ganze dann demnächst in der Praxis ausprobieren.

Ja, ich gebe zu, dass ich mir dein Beispiel angeguckt hab ;-)

von Sven L. (slorg)


Lesenswert?

Hallo,

Noch eine Frage um sicherzugehen:
Verstehe ich die Timing-Reports richtig?

Wenn beim Constraint AUTO_TS_F2F (MAXDELAY:FROM:FFS(*):TO:FFS(*):0.000 
nS) z.B. die Information

Path Requirement (ns), Delay (ns), Slack (ns)
"dinshr<0>.Q to dinshr<1>.D 0.000 4.800 -4.800"

heisst das, dass die Verzögerung beim "reinschieben" von dinshr<0>.Q zu
dinshr<1>.D 4.8ns beträgt, sodass beim reinshiften von 32 Input-States
es zu einer Verzögerung von 154nS kommt?

Gruß,
slorg

von Falk B. (falk)


Lesenswert?

@  Sven L. (slorg)

> Das ganze soll für ein Live-MIDI-Interface genutzt werden.
> Da ich gerne die Ressourcen vom ATMega sparen wollte, habe
> ich mir gedacht, dass ein CPLD als SPI-Slave vielleicht
> eine Idee wert wäre.

Um ei paar Tasten einzulesen? Soll der CPLD aus Langeweile zu Staub 
zerfallen? Ein paar 74HC165 reichen locker.

MfG
Falk

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


Lesenswert?

Nein, das bedeutet, dass von einem (x-beliebigen) Schieberegisterausgang 
zum nächsten Schieberegistereingang eine Zeit von 4,8ns vergeht. Und du 
hast das parallel 32 mal. Denn während etwas von dinshr0 ins dinshr1 
geschoben wird, wird gleichzeitig etwas vom dinshr15 ins dinshr16 
(allgemein dinshrX-1 ins dinshrX mit X=1..31) geschoben.

Anhand dieser Zahl könntest du das Design mit knapp 200MHz takten.

von Sven L. (slorg)


Lesenswert?

Falk Brunner schrieb:
> @  Sven L. (slorg)
>
>> Das ganze soll für ein Live-MIDI-Interface genutzt werden.
>> Da ich gerne die Ressourcen vom ATMega sparen wollte, habe
>> ich mir gedacht, dass ein CPLD als SPI-Slave vielleicht
>> eine Idee wert wäre.
>
> Um ei paar Tasten einzulesen? Soll der CPLD aus Langeweile zu Staub
> zerfallen? Ein paar 74HC165 reichen locker.
>
> MfG
> Falk

Hallo Falk,

Es geht mir dabei auch, Platz auf der Platine zu sparen (und damit
auch die PCB-Herstellungskosten zu minimieren). Klar könnte man das
Ganze auch mit 4 x 74HC165 (für 32 Inputs) bzw. 8 x 74HC165 realisieren,
aber wenn ich mich nicht täusche, gibt's diese nur in DIP16/SO16/SSOP16 
und QFN16-Packages. Dazu kommt dann noch das Routen, zusätzlich z.B. 
100nF an jeden 74HC165 etc. Durch den CPLD wäre das ganze vielleicht 
auch etwas modularer, weil später dadurch auch weitere I/O-Ports für 
andere Komponenten (z.B. Drehencoder) o.ä. realisiert werden könnten.

Viele Grüße

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.