SPI implementiren

OP #2656595
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.
Gast #2657376
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' ?
Gast #2658316
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
Moderator (Firma: Titel) Persönliche Seite #2659603
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?
Gast #2660563
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!!
Moderator (Firma: Titel) Persönliche Seite #2660892
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...  ;-)
#2667841
Lesenswert?

Hallo Siyabend,

vielleicht diese Bsp. kann dir helfen.

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

1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4

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

8
Port (   
9
    clock  : in     std_logic;
10
    Reset  : in     std_logic;
11
    Datain : in     std_logic_vector( leange-1 downto 0);
12
    SCLK   : out    std_logic;
13
    MOSI   : out    std_logic;
14
    MISO   : in     std_logic;
15
    SS     : out    std_logic);    
16
end Master;
17

18
architecture Behavioral of Master is
19

20
signal tx_reg : std_logic_vector(leange-1 downto 0);
21
   
22
type   States is (Idle, Data_transfer, Stop);
23
signal State: States := Idle;
24
  
25
shared variable Count: integer range 0 to leange;
26
begin
27

28
  MOSI <= tx_reg(tx_reg'left);
29
  SCLK <= clock   -- Master clock send to SCLK 
30
  when State = Data_Transfer                 
31
  else '0';                       
32
  
33
process( clock)
34
begin
35
  if rising_edge( clock) then
36
    case State is
37
      when Idle =>
38
        SS <= '1';
39
        if   Reset='1' then
40
          Count := 0;        -- Init Data bit counter
41
          tx_reg <= Datain;      -- Load parallel data
42
          SS  <= '0';        -- Select Slave aktive
43
          State <= Data_Transfer; -- Change state
44
        end if;
45
      when Data_transfer =>
46
        if   Count < (leange-1) then 
47
          Count := Count+1;
48
          tx_reg <= tx_reg( tx_reg'left-1 downto 0)& MISO;
49
        else
50
          State <= Stop;  -- Change state
51
        end if;
52
      when Stop =>
53
        SS <= '1';     -- Deselect slave
54
        if   Reset='0' then
55
          State <= Idle;    
56
        end if;
57
    end case;
58
  end if;
59
end process;
60
end Behavioral;

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