www.mikrocontroller.net

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


Autor: Sven L. (slorg)
Datum:

Bewertung
0 lesenswert
nicht 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:
-- SPI-Slave for SPI Mode 0 --

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity SPI_Slave is
  Generic (width: natural := 32);
  Port(
    SCLK  :  in    STD_LOGIC;
    SS    :  in    STD_LOGIC;
    MISO  :  out  STD_LOGIC;
    Din  :  in    STD_LOGIC_VECTOR (width-1 downto 0)
  );
end SPI_Slave;

architecture Behavioral of SPI_Slave is
  signal dinshr  :    STD_LOGIC_VECTOR (width-1 downto 0);
  
  begin
    -- MISO - Master In Slave Out --
    
    process (SS, Din, SCLK)
    begin
      if(SS='1') then
        dinshr <= Din;
      elsif falling_edge(SCLK) then
        dinshr <= dinshr(dinshr'left-1 downto 0) & '0';
      end if;
    end process;
    
    MISO <= dinshr(dinshr'left) when SS='0' else 'Z';
end Behavioral;

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

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

Bewertung
0 lesenswert
nicht 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
;-)

Autor: Sven L. (slorg)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Sven L. (slorg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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.

Autor: Sven L. (slorg)
Datum:

Bewertung
0 lesenswert
nicht 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

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.