Subido por Edgar Israel

SPI

Anuncio
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity practica_3 is
Port(
Clk: in Std_Logic; --Activacion de Clock
Dato: in Std_Logic; --PIN DE ENTRADA
SS: out Std_Logic;
sclk: out Std_Logic
);
end practica_3;
architecture Behavioral of practica_3 is
type tipo_mem is array( 0 to 9) of std_logic_vector(7 downto 0);
signal memoria : tipo_mem;
type FSM is (bi4,bi3,bi2,bi1,bi0,bit0,bit1,bit2,bit3,bit4,bit5,bit6,bit7,guardar); --Maquina de estado
signal Estado: FSM;
signal contador: integer range 0 to 3;
signal col: integer range 0 to 9;
signal DATA: std_logic_vector(7 downto 0);
signal DATA1: std_logic;
begin
process(clk)
begin
If Rising_Edge(clk) Then
Case Estado is
when bi4 =>
SS<='0';
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA1 <='1' ;
end if;
if contador = 2 then
sclk<='0';
Estado <= bi3;
contador<= 0;
end if;
when bi3 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA1 <='1' ;
end if;
if contador = 2 then
sclk<='0';
Estado <= bi2;
contador<= 0;
end if;
when bi2 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA1 <='1' ;
end if;
if contador = 2 then
sclk<='0';
Estado <= bi1;
contador<= 0;
end if;
when bi1 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA1 <='1' ;
end if;
if contador = 2 then
sclk<='0';
Estado <= bi0;
contador<= 0;
end if;
when bi0 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA1 <='0' ;
end if;
if contador = 2 then
sclk<='0';
Estado <= bit0;
contador<= 0;
end if;
when bit0 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA(0) <= Dato;
end if;
if contador = 2 then
sclk<='0';
Estado <= bit1;
contador<= 0;
end if;
when bit1 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA(1) <= Dato;
end if;
if contador = 2 then
sclk<='0';
Estado <= bit2;
contador<= 0;
end if;
when bit2 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA(2) <= Dato;
end if;
if contador = 2 then
sclk<='0';
Estado <= bit3;
contador<= 0;
end if;
when bit3 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA(3) <= Dato;
end if;
if contador = 2 then
sclk<='0';
Estado <= bit4;
contador<= 0;
end if;
when bit4 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA(4) <= Dato;
end if;
if contador = 2 then
sclk<='0';
Estado <= bit5;
contador<= 0;
end if;
when bit5 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA(5) <= Dato;
end if;
if contador = 2 then
sclk<='0';
Estado <= bit6;
contador<= 0;
end if;
when bit6 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA(6) <= Dato;
end if;
if contador = 2 then
sclk<='0';
Estado <= bit7;
contador<= 0;
end if;
when bit7 =>
sclk<='1';
contador <= contador+1;
if contador = 1 then
DATA(7) <= Dato;
end if;
if contador = 2 then
sclk<='0';
Estado <= guardar;
contador<= 0;
end if;
when guardar => memoria(col)<=DATA;
col<=col+1;
sclk<='0';
Estado<=bi4;
if col=9 then
col<=0;
end if;
end case;
end if;
End Process;
end Behavioral;
Descargar