Datum:
Angehängte Dateien: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; |
Datum:
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 :-)
Datum:
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.
Datum:
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 . . .
Datum:
hallo, ist es so schwer, dass jemand die Frage beantworten can? gruß Ftec
Datum:
Wenn du deinen vollständigen Code zeigst ... könnte man dir vielleicht auch helfen.
Datum:
Angehängte Dateien:Hi Stachele, danke, hier ist meine Code. ich habe spi_clock component in spimaster auskommentiert, da ich immer fehler bekommen habe.
Datum:
Folgende Zuweisung ist falsch, weil CLK ein Eingang von "Master.vhd" ist: CLK <= clk_signal;
Datum:
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
Datum:
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.
Datum:
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.
Datum:
Angehängte Dateien:ich habe jetzt dafür eine mster_top.vhd datei geschrieben. aber in der simulation ändert sich nicht. :((

