www.mikrocontroller.net

Forum: FPGA, VHDL & Co. SPI implementiren


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Siyabend S. (siyabend)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

Ich bin ein Anfänger und ich möchte gerne im FPGA für die parallele 
Datenübertragung SPI (in VHDL) realisieren.
Die Daten werden vom ADW (16 Bit) über SPI parallel im FPGA bearbeitet.
Hat jemand eine Idee, wie man es am leichtesten ermöglicht?


Gruß
Siyabend.

Autor: PittyJ (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich dachte immer, SPI wäre mehr seriell. Eine Leitung für Daten und eine 
für den Takt. Na gut, das kann man auch als parallel bezeichnen.

Bei Wikipedia gibt es ein Übersicht zu SPI. Die englische Seite hat 
dabei noch mehr Informationen.
Es gibt bei opencores.org einige Beispiele, wie andere Leute das gemacht 
haben.

Ach ja, was bedeutet eigentlich 'bearbeitet' ?

Autor: Siyabend S. (siyabend)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo PittyJ,

danke für die Infos. ich meine mit dem Bearbeiten eher ausarbeiten, 
ausführen bzw. weiterleiten.
Gruß
Siyabend

Autor: SPIler (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
PittyJ hats ja schon angerissen;

Du legst zu jeder Datenleitung ein Clock Signal an. Darauf triggerst Du. 
Natürlich muss der Sync beachtet werden, damit Du die Daten der 
einzelnen Bits nicht zeitlich falsch ausliest. Damit hättest Du eine 
parallele SPI.

Andernfalls kannst Du Schieberegister benutzen, um Leitungen zu sparen. 
Dann hättest Du nur zwei Leitungen. Ist aber eher ungewöhnlich. </;-)>

RTFM.

http://www.lothar-miller.de/s9y/archives/15-SPI.html

Autor: Siyabend S. (siyabend)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,
danke sehr nett von dir.

ich habe eine bsp gefunden und weiß nicht genau, ob das die richtige 
Methode ist.

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Siyabend S. schrieb:
> ich habe eine bsp gefunden und weiß nicht genau, ob das die richtige
> Methode ist.
Hast du das mal simuliert? Was kommt da raus? Nichts sinnvolles?

Ein Tipp:
Sieh dir mal den Link vom SPIler nochmal an und auch den Index auf der 
linken Seite meiner HP...

Autor: Siyabend S. (siyabend)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
> Hast du das mal simuliert?
nein ich habe es nicht simuliert.
Für die Simulation muss ich testbench schreiben?
Möchte gerne wissen, was ist sinnvoll: SPI ohne oder mit Slave?

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Siyabend S. schrieb:
>> Hast du das mal simuliert?
> nein ich habe es nicht simuliert.
> Für die Simulation muss ich testbench schreiben?
Ja, das musst du.

> Möchte gerne wissen, was ist sinnvoll: SPI ohne oder mit Slave?
Du bist dir nicht ganz im Klaren, was SPI ist?
Es gibt auf einem SPI-Bus immer genau einen (in Zahlen 1) SPI-Master, an 
den einer oder mehrere SPI-Slaves angeschlossen sind. Und wenn du einen 
SPI-AD-Wandler hast, dann ist das auf jeden Fall ein Slave. Was brauchst 
du logischerweise in deinem FPGA, um diesen Slave anzusteuern?

Autor: SPIler (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Siyabend S. schrieb:
> Möchte gerne wissen, was ist sinnvoll: SPI ohne oder mit Slave?

Na der SPI ohne Slave macht Dir weniger Arbeit. Da kannst Du ruhig die 
Daten ins /dev/null schreiben, da passt ne Menge rein. Ohne Slave 
erwartest Du ja eh keine Antworten.

Wahrscheinlich war der Lothar-Miller-Link schon zu spezifisch: Eventuell 
wäre hier die richtige Anlaufstation:

http://de.wikipedia.org/wiki/Serial_Peripheral_Interface

@LM: Respekt für Deine Engelsgeduld!!

Autor: Siyabend S. (siyabend)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Danke euch beiden, es hat mit bis jetzt sehr viel geholfen.
bin grade dabei ein master und ein slave zu schreiben, wenn ich fertig 
bin werde es hier hochladen.
gruß
Siyabend

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Siyabend S. schrieb:
> bin grade dabei ein master und ein slave zu schreiben
Warum einen Slave? Ich denke, du hast einen ADC als Slave?
> wenn ich fertig bin werde es hier hochladen.
Aber bitte mit Testbench. Denn gerade ein SPI Interface lässt sich schön 
einfach simulieren, und für so einen AD-Wandler ist im Handumdrehen ein 
Simulationsmodell/Verhaltensmodell/BFM beschrieben...

SPIler schrieb:
> @LM: Respekt für Deine Engelsgeduld!!
Danke dir...  ;-)

Autor: cetec Ftec (ftec)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Siyabend,

vielleicht diese Bsp. kann dir helfen.

Aber erst muss Lothar es kontrollieren, vielleicht kann noch einiges 
eingefügt werden.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Master is
  generic (leange: integer := 16);

Port (   
    clock  : in     std_logic;
    Reset  : in     std_logic;
    Datain : in     std_logic_vector( leange-1 downto 0);
    SCLK   : out    std_logic;
    MOSI   : out    std_logic;
    MISO   : in     std_logic;
    SS     : out    std_logic);    
end Master;

architecture Behavioral of Master is

signal tx_reg : std_logic_vector(leange-1 downto 0);
   
type   States is (Idle, Data_transfer, Stop);
signal State: States := Idle;
  
shared variable Count: integer range 0 to leange;
begin

  MOSI <= tx_reg(tx_reg'left);
  SCLK <= clock   -- Master clock send to SCLK 
  when State = Data_Transfer                 
  else '0';                       
  
process( clock)
begin
  if rising_edge( clock) then
    case State is
      when Idle =>
        SS <= '1';
        if   Reset='1' then
          Count := 0;        -- Init Data bit counter
          tx_reg <= Datain;      -- Load parallel data
          SS  <= '0';        -- Select Slave aktive
          State <= Data_Transfer; -- Change state
        end if;
      when Data_transfer =>
        if   Count < (leange-1) then 
          Count := Count+1;
          tx_reg <= tx_reg( tx_reg'left-1 downto 0)& MISO;
        else
          State <= Stop;  -- Change state
        end if;
      when Stop =>
        SS <= '1';     -- Deselect slave
        if   Reset='0' then
          State <= Idle;    
        end if;
    end case;
  end if;
end process;
end Behavioral;

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
cetec Ftec schrieb:
> Aber erst muss Lothar es kontrollieren...
Neineinein, macht das mal selber.
Der dadurch entstehende Prozess heißt Lernen...

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net