linreceiver-vhdl/InterfaceMicroprocesseur_lib/InterfaceMicroprocesseur.vhd
2023-09-25 11:12:54 +02:00

152 lines
3.8 KiB
VHDL

--
-- VHDL Architecture RecepteurLIN_lib.InterfaceMicroprocesseur.arch
--
-- Created:
-- by - lenours-s.UNKNOWN (IREENA-SLN-B)
-- at - 11:25:52 13/05/2014
--
-- using Mentor Graphics HDL Designer(TM) 2013.1 (Build 6)
--
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY InterfaceMicroprocesseur IS
PORT(
CnD : IN std_logic;
OctetLu : IN std_logic_vector (7 DOWNTO 0);
EtatLu : IN std_logic_vector (7 DOWNTO 0);
H : IN std_logic;
RnW : IN std_logic;
nCS : IN std_logic;
nRST : IN std_logic;
DecNbOctet : OUT std_logic;
SelAdr : OUT std_logic_vector (7 DOWNTO 0);
M_Received : OUT std_logic;
EtatLu_RST : OUT std_logic;
OctetLu_RD : OUT std_logic;
D07 : INOUT std_logic_vector (7 DOWNTO 0)
);
-- Declarations
END InterfaceMicroprocesseur ;
--
ARCHITECTURE arch OF InterfaceMicroprocesseur IS
--Architecture declarations
TYPE DefEtat IS (Attente, LectureData, LectureEtat, EcritureFiltre);
SIGNAL EtatCourant, EtatSuivant : DefEtat;
SIGNAL nCS_Synchro, RnW_Synchro, CnD_Synchro : STD_LOGIC;
SIGNAL D07_Synchro : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
ClockedProc : PROCESS(H, nRST)
BEGIN
IF (nRST='0') THEN
EtatCourant <= Attente;
ELSIF (H'EVENT AND H='1') THEN
EtatCourant <= EtatSuivant;
END IF;
END PROCESS ClockedProc;
InputProc_Synchro : PROCESS(H, nRST)
BEGIN
IF (nRST='0') THEN
nCS_Synchro <= '1';
RnW_Synchro <= '1';
CnD_Synchro <= '1';
D07_Synchro <= (others => '0');
ELSIF (H'EVENT AND H='1') THEN
nCS_Synchro <= nCS;
RnW_Synchro <= RnW;
CnD_Synchro <= CnD;
D07_Synchro <= D07;
END IF;
END PROCESS InputProc_Synchro;
NextStateProc : PROCESS(nCS_Synchro, CnD_Synchro, RnW_Synchro, EtatCourant)
BEGIN
EtatSuivant <= EtatCourant;
CASE EtatCourant IS
WHEN Attente =>
IF (nCS_Synchro='0' AND CnD_Synchro='0' AND RnW_Synchro='1') THEN
EtatSuivant <= LectureData;
ELSIF (nCS_Synchro='0' AND CnD_Synchro='1' AND RnW_Synchro='1') THEN
EtatSuivant <= LectureEtat;
ELSIF (nCS_Synchro='0' AND CnD_Synchro='0' AND RnW_Synchro='0') THEN
EtatSuivant <= EcritureFiltre;
ELSE
EtatSuivant <= Attente;
END IF;
WHEN LectureData =>
IF (nCS_Synchro='1') THEN
EtatSuivant <= Attente;
ELSE
EtatSuivant <= LectureData;
END IF;
WHEN LectureEtat =>
IF (nCS_Synchro='1') THEN
EtatSuivant <= Attente;
ELSE
EtatSuivant <= LectureEtat;
END IF;
WHEN EcritureFiltre =>
IF (nCS_Synchro='1') THEN
EtatSuivant <= Attente;
ELSE
EtatSuivant <= EcritureFiltre;
END IF;
END CASE;
END PROCESS NextStateProc;
OutputProc_Comb : PROCESS(nCS_Synchro, CnD_Synchro, RnW_Synchro, EtatCourant, OctetLu, EtatLu)
BEGIN
D07 <= (others => 'Z');
OctetLu_RD <= '0';
EtatLu_RST <= '0';
DecNbOctet <= '0';
CASE EtatCourant IS
WHEN Attente =>
IF (nCS_Synchro='0' AND CnD_Synchro='0' AND RnW_Synchro='1') THEN
OctetLu_RD <= '1';
END IF;
WHEN LectureData =>
D07 <= OctetLu;
IF (nCS_Synchro='1') THEN
DecNbOctet <= '1';
END IF;
WHEN LectureEtat =>
D07 <= EtatLu;
IF (nCS_Synchro='1') THEN
EtatLu_RST <= '1';
END IF;
WHEN EcritureFiltre =>
END CASE;
END PROCESS OutputProc_Comb;
OutputProc_Synchro : PROCESS(H, nRST)
BEGIN
IF (nRST='0') THEN
SelAdr <= (others => '0');
ELSIF (H'EVENT AND H='1') THEN
CASE EtatCourant IS
WHEN EcritureFiltre =>
IF (nCS_Synchro='1') THEN
SelAdr <= D07_Synchro;
END IF;
WHEN OTHERS =>
END CASE;
END IF;
END PROCESS OutputProc_Synchro;
M_Received <= EtatLu(4);
END ARCHITECTURE arch;