📄 libreria_i2c.vhd
字号:
load_bit <= '0';
OESDA <= '0';
if (fin_espera128 = '1') then
siguiente <= carga_nuevo_bit;
else
siguiente <= esp_sig_dato;
end if;
when carga_nuevo_bit =>
-- Generamos aqui la carga del biestable
-- de salida con el nuevo bit porque
-- debemos hacerlo mientras SDA aun este
-- en alta impedancia. Esto es para no
-- apreciar en SDA conmutaciones entre el
-- ultimo bit cargado en el biestable y
-- el que cargamos ahora.
load_new <= '0';
inc_punt <= '0';
inc_sel_byte <= '0';
reset_sel_byte <= '0';
ENespera64 <= '0';
ENespera128 <= '1';
ready <= '0';
-- CONTROL SCL.
preset_div <= '0';
reset_div <= '1';
OESCL <= '1';
-- CONTROL SDA.
reset_bit <= '0';
load_bit <= '1';
OESDA <= '0';
siguiente <= esp_SCL1;
when set_punt_byte =>
-- Hemos detectado el ACK del ultimo
-- byte con exito y ya no quedan mas
-- bytes por enviar.
-- Ponemos el puntero de bytes a "11"
-- indicando que la transferencia ha
-- sido realizada con exito y nos
-- preparamos para generar la condicion
-- de STOP.
load_new <= '0';
inc_punt <= '0';
inc_sel_byte <= '1';
reset_sel_byte <= '0';
ENespera64 <= '0';
ENespera128 <= '0';
ready <= '0';
-- CONTROL SCL.
preset_div <= '0';
reset_div <= '0';
OESCL <= '1';
-- CONTROL SDA.
reset_bit <= '0';
load_bit <= '0';
OESDA <= '0';
siguiente <= STOP1;
when STOP1 =>
-- Se ha detectado el ACK del byte
-- del dato a escribir con exito o
-- bien ha ocurrido un fallo en la
-- recepcion del ACK de algun byte.
-- Hemos de esperar con SDA en alta
-- impedancia hasta que SCL sea '0'
-- para poder cambiar SDA a '0' y
-- comenzar asi a generar la condicion
-- de STOP.
-- Ahora reseteamos el biestable de
-- salida para que almacene el '0'
-- que nos hara falta a continuacion.
load_new <= '0';
inc_punt <= '0';
inc_sel_byte <= '0';
reset_sel_byte <= '0';
ENespera64 <= '0';
ENespera128 <= '0';
ready <= '0';
-- CONTROL SCL.
preset_div <= '0';
reset_div <= '0';
OESCL <= '1';
-- CONTROL SDA.
reset_bit <= '1';
load_bit <= '0';
OESDA <= '0';
if (SCL = '0') then
siguiente <= STOP2;
else
siguiente <= STOP1;
end if;
when STOP2 =>
-- Esperamos 64 Tclk reseteando el
-- divisor para mantener SCL a '0'.
load_new <= '0';
inc_punt <= '0';
inc_sel_byte <= '0';
reset_sel_byte <= '0';
ENespera64 <= '1';
ENespera128 <= '0';
ready <= '0';
-- CONTROL SCL.
preset_div <= '0';
reset_div <= '1';
OESCL <= '1';
-- CONTROL SDA.
reset_bit <= '0';
load_bit <= '0';
OESDA <= '0';
if (fin_Espera64 = '1') then
siguiente <= STOP3;
else
siguiente <= STOP2;
end if;
when STOP3 =>
-- Damos salida a SDA = '0' y esperamos
-- 1 Tclk antes de usar de nuevo el
-- contador de espera de 64 Tclk.
-- Ya no hace falta que mantengamos
-- reset_div a '1'.
load_new <= '0';
inc_punt <= '0';
inc_sel_byte <= '0';
reset_sel_byte <= '0';
ENespera64 <= '0';
ENespera128 <= '0';
ready <= '0';
-- CONTROL SCL.
preset_div <= '0';
reset_div <= '0';
OESCL <= '1';
-- CONTROL SDA.
reset_bit <= '0';
load_bit <= '0';
OESDA <= '1';
siguiente <= STOP4;
when STOP4 =>
-- Esperamos 64 Tclk y luego ponemos
-- a '1' SCL.
load_new <= '0';
inc_punt <= '0';
inc_sel_byte <= '0';
reset_sel_byte <= '0';
ENespera64 <= '1';
ENespera128 <= '0';
ready <= '0';
-- CONTROL SCL.
preset_div <= '0';
reset_div <= '0';
OESCL <= '1';
-- CONTROL SDA.
reset_bit <= '0';
load_bit <= '0';
OESDA <= '1';
if (fin_espera64 = '1') then
siguiente <= STOP5;
else
siguiente <= STOP4;
end if;
when STOP5 =>
-- Esperamos 1 Tclk para dar tiempo a
-- resetear el contador de 64 Tclk
-- pues ahora volveremos a usarlo.
load_new <= '0';
inc_punt <= '0';
inc_sel_byte <= '0';
reset_sel_byte <= '0';
ENespera64 <= '0';
ENespera128 <= '0';
ready <= '0';
-- CONTROL SCL.
preset_div <= '0';
reset_div <= '0';
OESCL <= '1';
-- CONTROL SDA.
reset_bit <= '0';
load_bit <= '0';
OESDA <= '1';
siguiente <= STOP6;
when STOP6 =>
-- Ponemos SCL en alta impedancia y
-- esperamos 64 Tclk antes de volver
-- al reposo (lo cual supondria la
-- generacion de la condicion de STOP
-- pues, en reposo, SDA tambien se pone
-- en alta impedancia).
load_new <= '0';
inc_punt <= '0';
inc_sel_byte <= '0';
reset_sel_byte <= '0';
ENespera64 <= '1';
ENespera128 <= '0';
ready <= '0';
-- CONTROL SCL.
preset_div <= '0';
reset_div <= '0';
OESCL <= '0';
-- CONTROL SDA.
reset_bit <= '0';
load_bit <= '0';
OESDA <= '1';
if (fin_espera64 = '1') then
siguiente <= reposo;
else
siguiente <= STOP6;
end if;
when others =>
siguiente <= reposo;
end case;
end process transiciones;
sincro:process(reloj,reset)
begin
if (reset = '1') then
actual <= reposo;
elsif (reloj'event and reloj = '1') then
actual <= siguiente;
end if;
end process sincro;
end FSM_I2C_arch;
library IEEE;
use IEEE.std_logic_1164.all;
entity tx_bit is
port (
reset: in STD_LOGIC;
reloj: in STD_LOGIC;
clear: in STD_LOGIC;
D: in STD_LOGIC;
LE: in STD_LOGIC;
Q: out STD_LOGIC
);
end tx_bit;
architecture tx_bit_arch of tx_bit is
begin
process(reset,reloj,clear,LE)
begin
if (reset = '1') then
Q <= '0';
elsif (reloj'event and reloj = '1') then
if (clear = '1') then
Q <= '0';
elsif (LE = '1') then
Q <= D;
end if;
end if;
end process;
end tx_bit_arch;
library IEEE;
use IEEE.std_logic_1164.all;
entity IOpad is
port (
OE: in STD_LOGIC;
SAL: in STD_LOGIC;
ENT: out STD_LOGIC;
PAD: inout STD_LOGIC
);
end IOpad;
architecture IOpad_arch of IOpad is
begin
PAD <= SAL when (OE = '1') else 'Z';
ENT <= PAD;
end IOpad_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity cont_espera64 is
port (
reset: in STD_LOGIC;
reloj: in STD_LOGIC;
enable: in STD_LOGIC;
fin: out STD_LOGIC
);
end cont_espera64;
architecture cont_espera64_arch of cont_espera64 is
signal cuenta: std_logic_vector(6 downto 0);
begin
process (reset,reloj,enable)
begin
if (reset = '1') then
cuenta <= (others => '0');
elsif (reloj'event and reloj = '1') then
if(enable = '0') then
cuenta <= (others=>'0');
else
cuenta <= cuenta + '1';
end if;
end if;
end process;
fin <= cuenta(6);
end cont_espera64_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity cont_espera128 is
port (
reset: in STD_LOGIC;
reloj: in STD_LOGIC;
enable: in STD_LOGIC;
fin: out STD_LOGIC
);
end cont_espera128;
architecture cont_espera128_arch of cont_espera128 is
signal cuenta: std_logic_vector(7 downto 0);
begin
process (reset,reloj,enable)
begin
if (reset = '1') then
cuenta <= (others => '0');
elsif (reloj'event and reloj = '1') then
if(enable = '0') then
cuenta<=(others=>'0');
else
cuenta <= cuenta + '1';
end if;
end if;
end process;
fin <= cuenta(7);
end cont_espera128_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity FSM_gen_datos is
port (
reloj: in STD_LOGIC;
reset: in STD_LOGIC;
inicio: in STD_LOGIC;
ready: in STD_LOGIC;
punt_byte: in STD_LOGIC_VECTOR (1 downto 0);
fin_espera128: in STD_LOGIC;
punt_mem: in STD_LOGIC_VECTOR (6 downto 0);
trans: out STD_LOGIC;
dir: out STD_LOGIC_VECTOR (7 downto 0);
dato: out STD_LOGIC_VECTOR (7 downto 0);
ENespera128: out STD_LOGIC;
reset_punt_mem: out STD_LOGIC;
inc_punt_mem: out STD_LOGIC;
resultado: out STD_LOGIC_VECTOR (3 downto 0);
conf_valida: out STD_LOGIC
);
end FSM_gen_datos;
architecture FSM_gen_datos_arch of FSM_gen_datos is
type TipoEstado is (reposo,inicio_transf,espera_128,espera_ready,
mira_puntero,avanza_puntero,espera_sig_transf,
correcto
);
type MEM is array (0 to 93) of STD_LOGIC_VECTOR (15 downto 0);
signal actual,siguiente: TipoEstado;
signal memdatos: MEM;
begin
-- Comenzamos inicializando con los datos de configuracion, cada uno de
-- los registros que componen a la memoria.
-- En el byte superior estara la subdireccion del registro que vamos a
-- escribir. En el inferior estara el dato que deseamos escribir en la
-- correspondiente subdireccion.
memdatos (0) <= X"0108";
memdatos (1) <= X"02C3";
memdatos (2) <= X"0333";
memdatos (3) <= X"0400";
memdatos (4) <= X"0500";
memdatos (5) <= X"066C";--06E9
memdatos (6) <= X"076C";--070D
memdatos (7) <= X"0898";
memdatos (8) <= X"0901";
memdatos (9) <= X"0A80";
memdatos (10) <= X"0B47";
memdatos (11) <= X"0C40";
memdatos (12) <= X"0D00";
memdatos (13) <= X"0E01";
memdatos (14) <= X"0F2A";
memdatos (15) <= X"1000";
memdatos (16) <= X"110C";
memdatos (17) <= X"12A7"; --Anteriormente era 12E7, para q RTS1 sea ODD y RTS0 HREF
memdatos (18) <= X"1300";
memdatos (19) <= X"1400";
memdatos (20) <= X"1500";
memdatos (21) <= X"1600";
memdatos (22) <= X"1700";
memdatos (23) <= X"1800";
memdatos (24) <= X"1900";
memdatos (25) <= X"1A00";
memdatos (26) <= X"1B00";
memdatos (27) <= X"1C00";
memdatos (28) <= X"1D00";
memdatos (29) <= X"1E00";
memdatos (30) <= X"2000";
memdatos (31) <= X"2100";
memdatos (32) <= X"2200";
memdatos (33) <= X"2300";
memdatos (34) <= X"2400";
memdatos (35) <= X"2500";
memdatos (36) <= X"2600";
memdatos (37) <= X"2700";
memdatos (38) <= X"2800";
memdatos (39) <= X"2900";
memdatos (40) <= X"2A00";
memdatos (41) <= X"2B00";
memdatos (42) <= X"2C00";
memdatos (43) <= X"2D00";
memdatos (44) <= X"2E00";
memdatos (45) <= X"2F00";
memdatos (46) <= X"3000";
memdatos (47) <= X"3100";
memdatos (48) <= X"3200";
memdatos (49) <= X"3300";
memdatos (50) <= X"3400";
memdatos (51) <= X"3500";
memdatos (52) <= X"3600";
memdatos (53) <= X"3700";
memdatos (54) <= X"3800";
memdatos (55) <= X"3900";
memdatos (56) <= X"3A00";
memdatos (57) <= X"3B00";
memdatos (58) <= X"3C00";
memdatos (59) <= X"3D00";
memdatos (60) <= X"3E00";
memdatos (61) <= X"3F00";
memdatos (62) <= X"4002";
memdatos (63) <= X"41FF";--4177 pa ponerlo en b/n
memdatos (64) <= X"42FF";-- ...
memdatos (65) <= X"43FF";
memdatos (66) <= X"44FF";
memdatos (67) <= X"45FF";
memdatos (68) <= X"46FF";
memdatos (69) <= X"47FF";
memdatos (70) <= X"48FF";
memdatos (71) <= X"49FF";
memdatos (72) <= X"4AFF";
memdatos (73) <= X"4BFF";
memdatos (74) <= X"4CFF";
memdatos (75) <= X"4DFF";
memdatos (76) <= X"4EFF";
memdatos (77) <= X"4FFF";
memdatos (78) <= X"50FF";
memdatos (79) <= X"51FF";
memdatos (80) <= X"52FF";
memdatos (81) <= X"53FF";
memdatos (82) <= X"54FF";
memdatos (83) <= X"55FF";
memdatos (84) <= X"56FF";
memdatos (85) <= X"57FF";-- hasta aqu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -