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.
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' ?
Hallo PittyJ, danke für die Infos. ich meine mit dem Bearbeiten eher ausarbeiten, ausführen bzw. weiterleiten. Gruß Siyabend
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
Hallo, danke sehr nett von dir. ich habe eine bsp gefunden und weiß nicht genau, ob das die richtige Methode ist.
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...
> 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?
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?
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!!
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
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... ;-)
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; |
cetec Ftec schrieb: > Aber erst muss Lothar es kontrollieren... Neineinein, macht das mal selber. Der dadurch entstehende Prozess heißt Lernen...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.