Servus zusammen,
ich hatte letztens einige Schwierigkeiten meine SPI Schnittstelle zum
Laufen zu bekommen. Inzwischen werden die Daten im FPGA zwar übernommen,
meine Auswertung klappt jedoch nicht sauber.
Ich möchte aus "Symmetriegründen" die Daten stufenweise auswerden.
Bedeutet:
Im ersten Schritt werte ich die untersten 2 Bit aus und entscheide
daran, in welches Modul (insg. 4 Module) meine Daten gehören. Ich werde
also wie folgt aus und leite den "Rest" des Eingangs weiter:
1 | entity Modulwahl is
|
2 | Port ( Takteingang : in std_logic;
|
3 | Eingang : in std_logic_vector(15 downto 0);
|
4 | Modul1 : out std_logic_vector(13 downto 0);
|
5 | Modul2 : out std_logic_vector(13 downto 0);
|
6 | Modul3 : out std_logic_vector(13 downto 0);
|
7 | Modul4 : out std_logic_vector(13 downto 0)
|
8 | );
|
9 | end Modulwahl;
|
10 | --
|
11 | Verteil1 : process(Takteingang)
|
12 | begin
|
13 | if rising_edge(Takteingang) then
|
14 | case Eingang(1 downto 0) is
|
15 | when "00" => Modul1 <= Eingang(15 downto 2);
|
16 | when "01" => Modul2 <= Eingang(15 downto 2);
|
17 | when "10" => Modul3 <= Eingang(15 downto 2);
|
18 | when "11" => Modul4 <= Eingang(15 downto 2);
|
19 | when others =>
|
20 | end case;
|
21 | end if;
|
22 | end process;
|
Nach diesem Schritt möchte ich in jedem Modul gleichermaßen die Signale
(insgesamt 8 Signale) zuweisen.
Das beideutet in diesem Fall, dass "Modul1" der Eingang der Signalwahl
ist.
Dazu werte ich wiederum die untersten 3 Bit aus und schiebe den "Rest"
an Daten weiter:
1 | entity Signalwahl is
|
2 | Port ( Takteingang : in std_logic;
|
3 | Eingang : in std_logic_vector(13 downto 0);
|
4 | Signal1 : out std_logic_vector(10 downto 0);
|
5 | Signal2 : out std_logic_vector(10 downto 0);
|
6 | Signal3 : out std_logic_vector(10 downto 0);
|
7 | Signal4 : out std_logic_vector(10 downto 0);
|
8 | Signal5 : out std_logic_vector(10 downto 0);
|
9 | Signal6 : out std_logic_vector(10 downto 0);
|
10 | Signal7 : out std_logic_vector(10 downto 0);
|
11 | Signal8 : out std_logic_vector(10 downto 0)
|
12 | );
|
13 | end Signalwahl;
|
14 | --
|
15 | Verteil2 : process(Takteingang)
|
16 | begin
|
17 | if rising_edge(Takteingang) then
|
18 | case Eingang(2 downto 0) is
|
19 | when "000" => Signal1 <= Eingang(13 downto 3);
|
20 | when "001" => Signal2 <= Eingang(13 downto 3);
|
21 | when "010" => Signal3 <= Eingang(13 downto 3);
|
22 | when "011" => Signal4 <= Eingang(13 downto 3);
|
23 | when "100" => Signal5 <= Eingang(13 downto 3);
|
24 | when "101" => Signal6 <= Eingang(13 downto 3);
|
25 | when "110" => Signal7 <= Eingang(13 downto 3);
|
26 | when "111" => Signal8 <= Eingang(13 downto 3);
|
27 | when others =>
|
28 | end case;
|
29 | end if;
|
30 | end process;
|
Nun sollten nach meinem Empfinden die benötigten Daten-Bit auf die
entsprechende Leitung verteilt sein und ich sollte damit weiter arbeiten
können.
Leider ist dem nicht so, sondern es werden "alte" (also im Schritt zuvor
gesendete) Daten auf die Signale übergeben (schwer zu beschreiben, als
würden die Daten immer verzägert eintreffen).
Habt ihr Vorschläge, was an dieser Auswertung des SPI Probleme machen
kann?
Wenn ich den SPI komplett auf einmal auswerte, habe ich diese Probleme
nicht - die kommen erst mit meiner schrittweisen Auswertung.
Danke euch schonmal!