Forum: FPGA, VHDL & Co. SPI-Modul(VHDL).bitte um Rat


von Philipp (Gast)


Lesenswert?

Hallo, ich habe mal ein kleines SPI- Modul im Internet gefunden und 
leider funktioniert dieses nicht so wie es sollte. Könnte bitte jemand 
drüberschauen und mir sagen wo da der Fehler ? :) -Danke
Wenn möglich würde ich es super finden wenn ihr mir den Code auch näher 
erläutert denn zu 100% verstehe ich ihn nicht.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.all;
4
5
entity spi is
6
    Generic (Width : integer := 8);
7
    Port ( Clk_i      : in  STD_LOGIC;
8
           Reset_n_i  : in  STD_LOGIC;
9
           Data_i     : in  STD_LOGIC_vector(Width-1 downto 0);
10
           SClk_o     : out STD_LOGIC;
11
           MOSI_o     : out STD_LOGIC;
12
           MISO_i     : in  STD_LOGIC;
13
           SS_o       : out STD_LOGIC;
14
           Ready_i    : in  STD_LOGIC);
15
end spi;
16
17
architecture rtl of spi is
18
19
type   States is (Idle, Data_transfer, Stop);
20
signal State: States := Idle;
21
signal Tx_reg : unsigned(Width-1 downto 0); 
22
signal Count: unsigned(Width-1 downto 0);
23
24
begin
25
26
  MOSI_o <= Tx_reg(Tx_reg'left);  -- Data from Master to Slave
27
  SCLK_o <= Clk_i;                 -- Master Clk_i send to SCLK 
28
  
29
spi : process(Clk_i,Reset_n_i)
30
begin
31
  if Reset_n_i = '0' then
32
    Count <= (others => '0');         -- Init Data bit counter
33
    State <= Idle;
34
    Tx_reg <= unsigned(Data_i);   -- Load parallel data
35
    SS_o <= '1';          -- Deselect Slave
36
  elsif rising_edge(Clk_i) then
37
    case State is
38
      when Idle =>
39
          if Ready_i = '1' then         
40
            SS_o  <= '0';        -- Select Slave aktive
41
            State <= Data_Transfer; -- Change state
42
          else
43
            State <= Idle;
44
          end if;
45
      when Data_transfer =>
46
        if  Count < (Width-1) then 
47
          Count <= Count+1;
48
          Tx_reg <= Tx_reg(Tx_reg'left-1 downto 0)& MISO_i;
49
        else
50
          State <= Stop;  -- Change state
51
        end if;
52
      when Stop =>
53
        SS_o <= '1';     -- Deselect slave   
54
    end case;
55
  end if;
56
end process;
57
end rtl;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Philipp schrieb:
> leider funktioniert dieses nicht so wie es sollte.
Was funktioniert nicht? Und wie stellst du das fest? Hast du eine 
Testbench für das Modul?

> Wenn möglich würde ich es super finden wenn ihr mir den Code auch
> näher erläutert denn zu 100% verstehe ich ihn nicht.
Was verstehst du nicht?

BTW:
VHDL-Code bitte in die Token [ vhdl ] und [ /vhdl ] (ohne Leerzeichen) 
einschliessen.

von Dr. Schnaggels (Gast)


Lesenswert?

Wo sind denn die parallelen Ausgangsdaten "Data_o"?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
   if Reset_n_i = '0' then 
2
      Tx_reg <= unsigned(Data_i);   -- Load parallel data
Hoppala, da werden mit dem Reset-Signal die Sendedaten geladen. Sieht 
nach Murks aus...  :-o


Ich bevorzuge meinen eigenen VHDL-Master: 
http://www.lothar-miller.de/s9y/archives/50-Einfacher-SPI-Master-Mode-0.html

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
Noch kein Account? Hier anmelden.