www.mikrocontroller.net

Forum: FPGA, VHDL & Co. SPI Master_Simulation


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: cetec Ftec (ftec)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

zuert möchte ich sagen" bin VHDL anfänger" .
Ich habe eine SPI master simuliert und ich bin mir nicht sicher ob er 
richtig funktioniert, ich kriege in der simulation immer bei SCLK am 
letzten Takt immer einen Pic ( vermute mit Reset und clock zeiten 
zutun).
nächsten Schritt möchte gerne 8 Slave mit diesem Master ansteuern und 
weiß ehrlich nicht wie das geht.

bin auf eure Hilfe angewiesen.
Danke
Ftec


-----------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

entity Spi_Master is
generic (data_width: integer := 16);
    Port ( CLK    : in   std_logic;
  RESET   : in   std_logic;
  Datain  : in   std_logic_vector( data_width-1 downto 0);
  SCLK   : out  std_logic;
  MOSI   : out  std_logic;
  MISO   : in   std_logic;
  CS1  : out  std_logic);  -- Slave Chip Select#1 
  -- SS : out std_logic_vector (7 downto 0);
end Spi_Master;

architecture behave of Spi_Master is
  signal shreg: std_logic_vector( data_width-1 downto 0);
  type   states is (  Idle, Data_transfer, Stop);
  signal State: states := Idle;
begin
  MOSI <= shreg(shreg'left);
  SCLK <= CLK 
  when State = Data_Transfer -- Master clock send to SCLK 
  else '0';                       
  
  process( CLK)
    variable Count: integer range 0 to data_width;
  begin
  if rising_edge( CLK) then
  case State is
  when Idle =>
    CS1 <= '1';
    if RESET='1' then
    Count := 0;    -- Init Data bit counter
    shreg <= Datain;    -- Load parallel data
    CS1  <= '0';  -- Select Slave aktive
    State <= Data_Transfer; -- Change state
    end if;
  when Data_transfer =>
    if Count < (data_width-1) then 
    Count := Count+1;
    shreg <= shreg( shreg'left-1 downto 0)& MISO; -- Shift
    else
    State <= Stop;  -- Change state
    end if;
  when Stop =>
    CS1 <= '1';       -- Deselect slave
    if RESET ='0' then
    State <= Idle;    
    end if;
  end case;
end if; end process;
end behave;
----------------------Simulation--------------------
library IEEE;
use IEEE.std_logic_1164.ALL;
use IEEE.std_logic_arith.ALL;
use IEEE.std_logic_unsigned.ALL;

entity tb_Spi_Master is
end tb_Spi_Master;

architecture RTL of tb_Spi_Master is
component Spi_Master
    Port (   CLK    : in   std_logic;
      RESET   : in   std_logic;
      Datain  : in   std_logic_vector( 15 downto 0);
      SCLK   : out  std_logic;
      MOSI   : out  std_logic;
      MISO   : in   std_logic;
      CS1    : out  std_logic); -- Slave Chip Select#1 
end component;
-----------------------------------------------------
signal  CLK    :  std_logic:= '0';
signal  RESET   :  std_logic;
signal  Datain  :  std_logic_vector( 15 downto 0);
signal  SCLK   :  std_logic := '0';
signal  MOSI   :  std_logic;
signal  MISO   :  std_logic;
signal  CS1    :  std_logic;           
----------------------------------------------------
signal data_serial   : std_logic;
constant T  : time:= 10 ns;
----------------------------------------------------
begin
-- *******************    Port Map   ***************
DUT : Spi_Master 
port map (CLK    => CLK,    
    RESET  => RESET ,  
        Datain  => Datain,  
        SCLK  => SCLK,
        MOSI  => MOSI,   
    MISO  => MISO,   
        CS1    => CS1);            
-- *********** clk and reset definition ***********
 clk <= not clk after T; -- 50 MHz
process 
  begin
  reset <= '0'; wait for T + 10 ns;
  reset <= '1'; wait for T + 10 ns;
  end process;
-- *********** Generating serial data ************
Datain <= "1010101010101010"; -- 16 Bit
process
begin
  for i in 15 downto 0 loop
  wait until SCLK = '1' and SCLK'event;
  data_serial <= Datain(i); 
  end loop;
end process;      
end RTL;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
cetec Ftec schrieb:
> kriege in der simulation immer bei SCLK am letzten Takt immer einen Pic
Das ist unschön. Wenns wenigstens ein AVR wäre...  ;-)

cetec Ftec schrieb:
> kriege in der simulation immer bei SCLK am letzten Takt immer einen Pic
Das nennt sich in der Realität "Glitch" und kommt von der 
kombinatorischen Umschaltung des Taktes:
> SCLK <= CLK  when State = Data_Transfer -- Master clock send to SCLK
>              else '0';
In der Praxis kann es sein, dass du da gar nichts siehst...
Es kann aber auch sein, dass du tatsächlich so einen Glitch hast, und 
das Verhalten zudem von der Temperatur abhängt...

Das Hauptproblem hier ist, dass du den CLK als SPI Takt und als 
Sytemtakt hast. Wenn du z.B. CLK mit 50MHz hättest und daraus einen SCLK 
von 1MHz ableiten könntest, dann würdest du dieses Problem 1. nicht 
bekommen, oder 2. leicht umgehen können.
(Aaaah, ich liebe den Konjunktiv :-)

Autor: cetec Ftec (ftec)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Lothar,

Lothar Miller schrieb:

> Das Hauptproblem hier ist, dass du den CLK als SPI Takt und als
> Sytemtakt hast. Wenn du z.B. CLK mit 50MHz hättest und daraus einen SCLK
> von 1MHz ableiten könntest, dann würdest du dieses Problem 1. nicht
> bekommen, oder 2. leicht umgehen können.

also ehrlich zu sagen habe versucht, aber nicht hingekriegt wie das 
geht.

Autor: cetec Ftec (ftec)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
hi,

ich habe jetzt eine Lösung nämlich durch Debounce gefunden, aber beim 
compilieren kriege ich immer eine Fehler : Cannot drive signal 'CLK' of 
mode IN.
ich habe dafür eine signal  (clk_signal ) geschrieben und dann diese zur 
clk zugewiesen.
wie kann ich diese Fehler beseitigen?

Gruß
Ftec

.
.
.
  -------- spi_Debounce  --------
signal clk_signal   : std_logic;

begin
------------------------------------------------------
dut1 : spi_clock
port map (
  CLK_50  => CLK_50,
  x   =>  x,
  DBx  =>  clk_signal  -- DBx  : out  std_logic
   );

CLK <= clk_signal;      -- CLK  : in   std_logic
.
.
.

Autor: cetec Ftec (ftec)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
hallo,

ist es so schwer, dass jemand die Frage beantworten can?

gruß
Ftec

Autor: Stachele (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wenn du deinen vollständigen Code zeigst ... könnte man dir vielleicht 
auch helfen.

Autor: cetec Ftec (ftec)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi Stachele,

danke, hier ist meine Code.
ich habe spi_clock component in spimaster auskommentiert, da ich immer 
fehler bekommen habe.

Autor: Stachele (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Folgende Zuweisung ist falsch, weil CLK ein Eingang von "Master.vhd" 
ist:

CLK <= clk_signal;

Autor: cetec Ftec (ftec)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Stachele schrieb:
> Folgende Zuweisung ist falsch, weil CLK ein Eingang von "Master.vhd"
> ist:
>
> CLK <= clk_signal;

ich will ja den Ausgang vom spi_clock mit dem Eingang vom Master.vhd 
verbinden.
ich habe ja versucht so zu lösen, habe aber wieder error gekriegt

DBx  =>  clk_signal  -- DBx  : out  std_logic, spi_clock
CLK <= clk_signal;      -- CLK  : in   std_logic , master

Autor: Stachele (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
1. CLK_50  => CLK_50

Wo kommt das Signal CLK_50 (auf der rechten Seite des Port Map) her?

2. CLK <= clk_signal;

Wie gesagt: CLK ist in dem Modul "Master.vhd" ein Eingangsport. Da 
kannst du nicht einfach hergehen und ein Signal aus einem Untermodul 
anschliessen.


3. Es gibt doch sicherlich VHDL-Bücher in Deiner Nähe, die dir die 
Verschaltung von Testbenches und Untermodulen erläutern können.

Autor: Stachele (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Du müsstest dir ein lokales Signal generieren, z.B. l_clk und diesem 
Signal das "clk_signal" zuweisen. Dann bleibt aber immer noch die Frage 
bestehen, wo dein "CLK_50" und dein "x" herkommen.

Autor: cetec Ftec (ftec)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ich habe jetzt dafür eine mster_top.vhd datei geschrieben.
aber in der simulation ändert sich nicht.
:((

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net