SPI-Modul(VHDL).bitte um Rat

Gast #3200892
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;
Moderator (Firma: Titel) Persönliche Seite #3200910
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.

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