diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -27,4 +27,6 @@ syntax: glob *.bin *~ LPP_drivers/libsrc/AMBA/apb_devices_list.h +apb_devices_list.h lib/lpp/lpp_amba/apb_devices_list.vhd +apb_devices_list.vhd diff --git a/APB_DEVICES/apb_devices_list.txt b/APB_DEVICES/apb_devices_list.txt --- a/APB_DEVICES/apb_devices_list.txt +++ b/APB_DEVICES/apb_devices_list.txt @@ -10,3 +10,4 @@ device LPP_CNA 7 device LPP_APB_ADC 8 device LPP_CHENILLARD 9 device LPP_IIR_CEL_FILTER 10 +device LPP_FIFO 11 diff --git a/LPP_drivers/exemples/ScanAPB/bin/ScanAPB.bin b/LPP_drivers/exemples/ScanAPB/bin/ScanAPB.bin index 3ce34c86e9a55cc59b4d32a2094e9cf4e73ea4de..78b30bf10ea92840929ca9185b51ee72bc1a7981 GIT binary patch literal 318099 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 diff --git a/LPP_drivers/libsrc/DAC/apb_dac_Driver.c b/LPP_drivers/libsrc/DAC/apb_dac_Driver.c --- a/LPP_drivers/libsrc/DAC/apb_dac_Driver.c +++ b/LPP_drivers/libsrc/DAC/apb_dac_Driver.c @@ -14,8 +14,11 @@ -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +-----------------------------------------------------------------------------*/ #include "apb_dac_Driver.h" #include "lpp_apb_functions.h" #include diff --git a/LPP_drivers/libsrc/DAC/apb_dac_Driver.h b/LPP_drivers/libsrc/DAC/apb_dac_Driver.h --- a/LPP_drivers/libsrc/DAC/apb_dac_Driver.h +++ b/LPP_drivers/libsrc/DAC/apb_dac_Driver.h @@ -14,8 +14,11 @@ -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +-----------------------------------------------------------------------------*/ #ifndef APB_CNA_DRIVER_H #define APB_CNA_DRIVER_H @@ -28,10 +31,11 @@ T Y P E S D E F ====================================================*/ +/** Structure représentant le registre du CNA */ struct DAC_Driver { - int configReg; - int dataReg; + int configReg; /**< Registre de configuration: Flag Ready [1] ; Flag Enable [0] */ + int dataReg; /**< Registre de donnée sur 16 bits */ }; typedef struct DAC_Driver DAC_Device; @@ -40,12 +44,15 @@ typedef struct DAC_Driver DAC_Device; F U N C T I O N S ====================================================*/ +/** Ouvre l'accé au CNA */ DAC_Device* DacOpen(int count); //DAC_Device* DacClose(int count); +/** Les données sont lus a partir d'un tableau pour obtenir le signal de CAL (10Khz + 625hz) */ int DacTable(); +/** Les données sont entrée par l'utilisateur, la conversion se fait a chaque nouvelle donnée */ int DacConst(); diff --git a/lib/lpp/dsp/iir_filter/vhdlsyn.txt b/lib/lpp/dsp/iir_filter/vhdlsyn.txt --- a/lib/lpp/dsp/iir_filter/vhdlsyn.txt +++ b/lib/lpp/dsp/iir_filter/vhdlsyn.txt @@ -1,12 +1,12 @@ APB_IIR_CEL.vhd +FILTER.vhd +FILTER_RAM_CTRLR.vhd FILTERcfg.vhd FilterCTRLR.vhd -FILTER_RAM_CTRLR.vhd -FILTER.vhd IIR_CEL_CTRLR.vhd IIR_CEL_FILTER.vhd -iir_filter.vhd +RAM.vhd RAM_CEL.vhd RAM_CTRLR2.vhd -RAM.vhd Top_Filtre_IIR.vhd +iir_filter.vhd diff --git a/lib/lpp/general_purpose/vhdlsyn.txt b/lib/lpp/general_purpose/vhdlsyn.txt --- a/lib/lpp/general_purpose/vhdlsyn.txt +++ b/lib/lpp/general_purpose/vhdlsyn.txt @@ -1,14 +1,14 @@ -Adder.vhd ADDRcntr.vhd ALU.vhd +Adder.vhd Clk_divider.vhd -general_purpose.vhd +MAC.vhd MAC_CONTROLER.vhd -MAC_MUX2.vhd MAC_MUX.vhd +MAC_MUX2.vhd MAC_REG.vhd -MAC.vhd +MUX2.vhd Multiplier.vhd -MUX2.vhd REG.vhd Shifter.vhd +general_purpose.vhd diff --git a/lib/lpp/lpp_amba/APB_MULTI_DIODE.vhd b/lib/lpp/lpp_amba/APB_MULTI_DIODE.vhd --- a/lib/lpp/lpp_amba/APB_MULTI_DIODE.vhd +++ b/lib/lpp/lpp_amba/APB_MULTI_DIODE.vhd @@ -15,7 +15,10 @@ -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ library ieee; use ieee.std_logic_1164.all; --use ieee.numeric_std.all; @@ -24,6 +27,7 @@ use grlib.amba.all; use grlib.stdlib.all; use grlib.devices.all; library lpp; +use lpp.apb_devices_list.all; use lpp.lpp_amba.all; diff --git a/lib/lpp/lpp_amba/APB_SIMPLE_DIODE.vhd b/lib/lpp/lpp_amba/APB_SIMPLE_DIODE.vhd --- a/lib/lpp/lpp_amba/APB_SIMPLE_DIODE.vhd +++ b/lib/lpp/lpp_amba/APB_SIMPLE_DIODE.vhd @@ -27,6 +27,7 @@ use grlib.amba.all; use grlib.stdlib.all; use grlib.devices.all; library lpp; +use lpp.apb_devices_list.all; use lpp.lpp_amba.all; diff --git a/lib/lpp/lpp_cna/APB_CNA.vhd b/lib/lpp/lpp_cna/APB_CNA.vhd --- a/lib/lpp/lpp_cna/APB_CNA.vhd +++ b/lib/lpp/lpp_cna/APB_CNA.vhd @@ -1,23 +1,24 @@ ------------------------------------------------------------------------------- --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- --- APB_CNA.vhd - +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ library ieee; use ieee.std_logic_1164.all; library grlib; @@ -29,6 +30,7 @@ use lpp.lpp_amba.all; use lpp.apb_devices_list.all; use lpp.lpp_cna.all; +--! Driver APB, va faire le lien entre l'IP VHDL du convertisseur et le bus Amba entity APB_CNA is generic ( @@ -38,16 +40,18 @@ entity APB_CNA is pirq : integer := 0; abits : integer := 8); port ( - clk : in std_logic; - rst : in std_logic; - apbi : in apb_slv_in_type; - apbo : out apb_slv_out_type; - SYNC : out std_logic; - SCLK : out std_logic; - DATA : out std_logic + clk : in std_logic; --! Horloge du composant + rst : in std_logic; --! Reset general du composant + apbi : in apb_slv_in_type; --! Registre de gestion des entrées du bus + apbo : out apb_slv_out_type; --! Registre de gestion des sorties du bus + SYNC : out std_logic; --! Signal de synchronisation du convertisseur + SCLK : out std_logic; --! Horloge systeme du convertisseur + DATA : out std_logic --! Donnée numérique sérialisé ); end APB_CNA; +--! @details Les deux registres (apbi,apbo) permettent de gérer la communication sur le bus +--! et les sorties seront cablées vers le convertisseur. architecture ar_APB_CNA of APB_CNA is diff --git a/lib/lpp/lpp_cna/CNA_TabloC.vhd b/lib/lpp/lpp_cna/CNA_TabloC.vhd --- a/lib/lpp/lpp_cna/CNA_TabloC.vhd +++ b/lib/lpp/lpp_cna/CNA_TabloC.vhd @@ -1,42 +1,46 @@ ------------------------------------------------------------------------------- --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- --- CNA_TabloC.vhd +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.Convertisseur_config.all; +--! Programme du Convertisseur Numérique/Analogique + entity CNA_TabloC is - port( - clock : in std_logic; - rst : in std_logic; - enable : in std_logic; - --bp : in std_logic; - Data_C : in std_logic_vector(15 downto 0); - SYNC : out std_logic; - SCLK : out std_logic; - --Rz : out std_logic; - flag_sd : out std_logic; - Data : out std_logic - ); + port( + clock : in std_logic; --! Horloge du composant + rst : in std_logic; --! Reset general du composant + enable : in std_logic; --! Autorise ou non l'utilisation du composant + Data_C : in std_logic_vector(15 downto 0); --! Donnée Numérique d'entrée sur 16 bits + SYNC : out std_logic; --! Signal de synchronisation du convertisseur + SCLK : out std_logic; --! Horloge systeme du convertisseur + flag_sd : out std_logic; --! Flag, signale la fin de la sérialisation d'une donnée + Data : out std_logic --! Donnée numérique sérialisé + ); end CNA_TabloC; +--! @details Un driver C va permettre de génerer un tableau de données sur 16 bits, +--! qui seront sérialisé pour étre ensuite dirigées vers le convertisseur. architecture ar_CNA_TabloC of CNA_TabloC is @@ -50,11 +54,9 @@ signal clk : std_logic; signal raz : std_logic; signal s_SCLK : std_logic; signal OKAI_send : std_logic; ---signal Data_int : std_logic_vector(15 downto 0); begin - CLKINT_0 : CLKINT port map(A => clock, Y => clk); @@ -75,11 +77,6 @@ Serial : entity work.serialize port map (clk,raz,s_SCLK,Data_C,OKAI_send,flag_sd,Data); ---Rz <= raz; SCLK <= s_SCLK; ---with bp select --- Data_int <= X"9555" when '1', --- Data_C when others; - end ar_CNA_TabloC; \ No newline at end of file diff --git a/lib/lpp/lpp_cna/Convertisseur_config.vhd b/lib/lpp/lpp_cna/Convertisseur_config.vhd --- a/lib/lpp/lpp_cna/Convertisseur_config.vhd +++ b/lib/lpp/lpp_cna/Convertisseur_config.vhd @@ -1,38 +1,30 @@ ------------------------------------------------------------------------------- --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- --- Convertisseur_config.vhd +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; Package Convertisseur_config is - ---===========================================================| ---================= Valeurs Sinus 1Khz ======================| ---===========================================================| -type Tbl is array(natural range <>) of std_logic_vector(11 downto 0); -constant Tablo : Tbl (0 to 49):= (X"800",X"901",X"9FD",X"AF2",X"BDB",X"CB4",X"D7A",X"E2A",X"EC1",X"F3D",X"F9C",X"FDC",X"FFC",X"FFC",X"FDC",X"F9C",X"F3D",X"EC1",X"E2A",X"D7A",X"CB4",X"BDB",X"AF2",X"9FD",X"901",X"800",X"6FF",X"603",X"50E",X"425",X"34C",X"286",X"1D6",X"13F",X"0C3",X"064",X"024",X"004",X"004",X"024",X"064",X"0C3",X"13F",X"1D6",X"286",X"34C",X"425",X"50E",X"603",X"6FF"); - ---constant Tablo : Tbl (0 to 49):= (X"C00",X"C80",X"CFF",X"D79",X"DED",X"E5A",X"EBD",X"F15",X"F61",X"F9F",X"FCE",X"FEE",X"FFE",X"FFE",X"FEE",X"FCE",X"F9F",X"F61",X"F15",X"EBD",X"E5A",X"DED",X"D79",X"CFF",X"C80",X"C00",X"B80",X"B01",X"A87",X"A13",X"9A6",X"943",X"8EB",X"89F",X"861",X"832",X"812",X"802",X"802",X"812",X"832",X"861",X"89F",X"8EB",X"943",X"9A6",X"A13",X"A87",X"B01",X"B80"); - - --===========================================================| --============= Fréquence de sérialisation ==================| --===========================================================| diff --git a/lib/lpp/lpp_cna/Gene_SYNC.vhd b/lib/lpp/lpp_cna/Gene_SYNC.vhd --- a/lib/lpp/lpp_cna/Gene_SYNC.vhd +++ b/lib/lpp/lpp_cna/Gene_SYNC.vhd @@ -1,58 +1,56 @@ ------------------------------------------------------------------------------- --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- --- Gene_SYNC.vhd +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; -entity Gene_SYNC is +--! Programme qui va permettre de générer le signal SYNC -port( - SCLK,raz : in std_logic; - enable : in std_logic; --- Sysclk : in std_logic; - OKAI_send : out std_logic; - SYNC : out std_logic -); - +entity Gene_SYNC is + port( + SCLK,raz : in std_logic; --! Horloge systeme et Reset du composant + enable : in std_logic; --! Autorise ou non l'utilisation du composant + OKAI_send : out std_logic; --! Flag, Autorise l'envoi (sérialisation) d'une nouvelle donnée + SYNC : out std_logic --! Signal de synchronisation du convertisseur généré + ); end Gene_SYNC; +--! @details NB: Ce programme est uniquement synchronisé sur l'horloge Systeme (sclk) architecture ar_Gene_SYNC of Gene_SYNC is ---signal Sysclk_reg : std_logic; signal count : integer; - begin process (SCLK,raz) begin if(raz='0')then SYNC <= '0'; --- Sysclk_reg <= '0'; count <= 14; OKAI_send <= '0'; elsif(SCLK' event and SCLK='1')then if(enable='1')then - --- Sysclk_reg <= Sysclk; + if(count=15)then SYNC <= '1'; count <= count+1; @@ -64,8 +62,8 @@ begin count <= count+1; OKAI_send <= '0'; end if; + end if; end if; - end process; - + end process; end ar_Gene_SYNC; \ No newline at end of file diff --git a/lib/lpp/lpp_cna/Serialize.vhd b/lib/lpp/lpp_cna/Serialize.vhd --- a/lib/lpp/lpp_cna/Serialize.vhd +++ b/lib/lpp/lpp_cna/Serialize.vhd @@ -1,104 +1,107 @@ ------------------------------------------------------------------------------- --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- --- Serialize.vhd -library IEEE; -use IEEE.numeric_std.all; -use IEEE.std_logic_1164.all; - -entity Serialize is - -port( - clk,raz : in std_logic; - sclk : in std_logic; - vectin : in std_logic_vector(15 downto 0); - send : in std_logic; - sended : out std_logic; - Data : out std_logic); - -end Serialize; - - -architecture ar_Serialize of Serialize is - -type etat is (attente,serialize); -signal ect : etat; - +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ +library IEEE; +use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; + +--! Programme qui permet de sérialiser un vecteur + +entity Serialize is + port( + clk,raz : in std_logic; --! Horloge et Reset du composant + sclk : in std_logic; --! Horloge Systeme + vectin : in std_logic_vector(15 downto 0); --! Vecteur d'entrée + send : in std_logic; --! Flag, Une nouvelle donnée est présente + sended : out std_logic; --! Flag, La donnée a été sérialisée + Data : out std_logic --! Donnée numérique sérialisé + ); +end Serialize; + + +architecture ar_Serialize of Serialize is + +type etat is (attente,serialize); +signal ect : etat; + signal vector_int : std_logic_vector(16 downto 0); -signal vectin_reg : std_logic_vector(15 downto 0); -signal load : std_logic; -signal N : integer range 0 to 16; +signal vectin_reg : std_logic_vector(15 downto 0); +signal load : std_logic; +signal N : integer range 0 to 16; signal CPT_ended : std_logic:='0'; - -begin - process(clk,raz) - begin - if(raz='0')then + +begin + process(clk,raz) + begin + if(raz='0')then ect <= attente; - vectin_reg <= (others=> '0'); + vectin_reg <= (others=> '0'); load <= '0'; - sended <= '1'; - + sended <= '1'; + elsif(clk'event and clk='1')then - vectin_reg <= vectin; - - case ect is - when attente => + vectin_reg <= vectin; + + case ect is + when attente => if (send='1') then sended <= '0'; load <= '1'; ect <= serialize; else - ect <= attente; - end if; - + ect <= attente; + end if; + when serialize => - load <= '0'; - if(CPT_ended='1')then + load <= '0'; + if(CPT_ended='1')then ect <= attente; - sended <= '1'; + sended <= '1'; end if; - - end case; - end if; - end process; - - process(sclk,load,raz) - begin - if (raz='0')then - vector_int <= (others=> '0'); - N <= 16; - elsif(load='1')then - vector_int <= vectin & '0'; - N <= 0; - elsif(sclk'event and sclk='1')then - if (CPT_ended='0') then - vector_int <= vector_int(15 downto 0) & '0'; - N <= N+1; - end if; - end if; - end process; - + + end case; + end if; + end process; + + process(sclk,load,raz) + begin + if (raz='0')then + vector_int <= (others=> '0'); + N <= 16; + elsif(load='1')then + vector_int <= vectin & '0'; + N <= 0; + elsif(sclk'event and sclk='1')then + if (CPT_ended='0') then + vector_int <= vector_int(15 downto 0) & '0'; + N <= N+1; + end if; + end if; + end process; + CPT_ended <= '1' when N = 16 else '0'; - -with ect select - Data <= vector_int(16) when serialize, - '0' when others; - -end ar_Serialize; - + +with ect select + Data <= vector_int(16) when serialize, + '0' when others; + +end ar_Serialize; + diff --git a/lib/lpp/lpp_cna/Systeme_Clock.vhd b/lib/lpp/lpp_cna/Systeme_Clock.vhd --- a/lib/lpp/lpp_cna/Systeme_Clock.vhd +++ b/lib/lpp/lpp_cna/Systeme_Clock.vhd @@ -1,22 +1,24 @@ ------------------------------------------------------------------------------- --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- --- Systeme_Clock.vhd +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; @@ -24,14 +26,15 @@ use IEEE.numeric_std.all; --! Programme qui va permetre de générer l'horloge systeme (sclk) entity Systeme_Clock is -generic(N :integer := 695); --! Générique contenant le résultat de la division clk/sclk -port( - clk, raz : in std_logic; --! Horloge et Reset globale + generic(N :integer := 695); --! Générique contenant le résultat de la division clk/sclk + port( + clk, raz : in std_logic; --! Horloge et Reset globale du composant sclk : out std_logic --! Horloge Systeme générée -); + ); end Systeme_Clock; --! @details Fonctionne a base d'un compteur (countint) qui va permetre de diviser l'horloge N fois + architecture ar_Systeme_Clock of Systeme_Clock is signal clockint : std_logic; diff --git a/lib/lpp/lpp_cna/lpp_cna.vhd b/lib/lpp/lpp_cna/lpp_cna.vhd --- a/lib/lpp/lpp_cna/lpp_cna.vhd +++ b/lib/lpp/lpp_cna/lpp_cna.vhd @@ -15,17 +15,19 @@ -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ library ieee; use ieee.std_logic_1164.all; library grlib; use grlib.amba.all; --- pragma translate_off use std.textio.all; --- pragma translate_on library lpp; use lpp.lpp_amba.all; +--! Package contenant tous les programmes qui forment le composant intégré dans le léon package lpp_cna is diff --git a/lib/lpp/lpp_fifo/APB_FIFO.vhd b/lib/lpp/lpp_fifo/APB_FIFO.vhd new file mode 100644 --- /dev/null +++ b/lib/lpp/lpp_fifo/APB_FIFO.vhd @@ -0,0 +1,129 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ +library ieee; +use ieee.std_logic_1164.all; +library grlib; +use grlib.amba.all; +use grlib.stdlib.all; +use grlib.devices.all; +library lpp; +use lpp.lpp_amba.all; +use lpp.apb_devices_list.all; +use lpp.lpp_fifo.all; + +--! Driver APB, va faire le lien entre l'IP VHDL de la FIFO et le bus Amba + +entity APB_FIFO is + generic ( + pindex : integer := 0; + paddr : integer := 0; + pmask : integer := 16#fff#; + pirq : integer := 0; + abits : integer := 8); + port ( + clk : in std_logic; --! Horloge du composant + rst : in std_logic; --! Reset general du composant + apbi : in apb_slv_in_type; --! Registre de gestion des entrées du bus + apbo : out apb_slv_out_type --! Registre de gestion des sorties du bus + ); +end APB_FIFO; + + +architecture ar_APB_FIFO of APB_FIFO is + +constant REVISION : integer := 1; + +constant pconfig : apb_config_type := ( + 0 => ahb_device_reg (VENDOR_LPP, LPP_FIFO, 0, REVISION, 0), + 1 => apb_iobar(paddr, pmask)); + +type FIFO_ctrlr_Reg is record + FIFO_Cfg : std_logic_vector(3 downto 0); + FIFO_DataW : std_logic_vector(15 downto 0); + FIFO_DataR : std_logic_vector(15 downto 0); +end record; + +signal Rec : FIFO_ctrlr_Reg; +signal Rdata : std_logic_vector(31 downto 0); + +signal flag_RE : std_logic; +signal flag_WR : std_logic; +signal full : std_logic; +signal empty : std_logic; +begin + +flag_RE <= Rec.FIFO_Cfg(0); +flag_WR <= Rec.FIFO_Cfg(1); +Rec.FIFO_Cfg(2) <= empty; +Rec.FIFO_Cfg(3) <= full; + + CONVERTER : entity Work.Top_FIFO + port map(clk,rst,flag_RE,flag_WR,Rec.FIFO_DataW,full,empty,Rec.FIFO_DataR); + + + process(rst,clk) + begin + if(rst='0')then + Rec.FIFO_DataW <= (others => '0'); + + elsif(clk'event and clk='1')then + + + --APB Write OP + if (apbi.psel(pindex) and apbi.penable and apbi.pwrite) = '1' then + case apbi.paddr(abits-1 downto 2) is + when "000000" => + Rec.FIFO_Cfg(0) <= apbi.pwdata(0); + Rec.FIFO_Cfg(1) <= apbi.pwdata(4); + when "000001" => + Rec.FIFO_DataW <= apbi.pwdata(15 downto 0); + when others => + null; + end case; + end if; + + --APB READ OP + if (apbi.psel(pindex) and (not apbi.pwrite)) = '1' then + case apbi.paddr(abits-1 downto 2) is + when "000000" => + Rdata(3 downto 0) <= "000" & Rec.FIFO_Cfg(0); + Rdata(7 downto 4) <= "000" & Rec.FIFO_Cfg(1); + Rdata(11 downto 8) <= "000" & Rec.FIFO_Cfg(2); + Rdata(15 downto 12) <= "000" & Rec.FIFO_Cfg(3); + Rdata(31 downto 16) <= X"AAAA"; + when "000001" => + Rdata(31 downto 16) <= X"AAAA"; + Rdata(15 downto 0) <= Rec.FIFO_DataW; + when "000010" => + Rdata(31 downto 16) <= X"AAAA"; + Rdata(15 downto 0) <= Rec.FIFO_DataR; + when others => + Rdata <= (others => '0'); + end case; + end if; + + end if; + apbo.pconfig <= pconfig; + end process; + +apbo.prdata <= Rdata when apbi.penable = '1'; +end ar_APB_FIFO; diff --git a/lib/lpp/lpp_fifo/FIFO_Config.vhd b/lib/lpp/lpp_fifo/FIFO_Config.vhd new file mode 100644 --- /dev/null +++ b/lib/lpp/lpp_fifo/FIFO_Config.vhd @@ -0,0 +1,36 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +Package FIFO_Config is + +--===========================================================| +--================= Generic de Config =======================| +--===========================================================| +constant Data_sz : integer := 16; +constant addr_sz : integer := 8; +constant addr_max_int : integer := 256; + + +end; \ No newline at end of file diff --git a/lib/lpp/lpp_fifo/Fifo_Read.vhd b/lib/lpp/lpp_fifo/Fifo_Read.vhd new file mode 100644 --- /dev/null +++ b/lib/lpp/lpp_fifo/Fifo_Read.vhd @@ -0,0 +1,71 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.FIFO_Config.all; + +--! Programme de la FIFO de lecture + +entity Fifo_Read is +port( + clk,raz : in std_logic; --! Horloge et reset general du composant + flag_RE : in std_logic; --! Flag, Demande la lecture de la mémoire + WAD : in integer range 0 to addr_max_int; --! Adresse du registre d'écriture dans la mémoire (forme entière) + empty : out std_logic; --! Flag, Mémoire vide + RAD : out integer range 0 to addr_max_int; --! Adresse du registre de lecture de la mémoire (forme entière) + Raddr : out std_logic_vector(addr_sz-1 downto 0) --! Adresse du registre de lecture de la mémoire (forme vectorielle) + ); +end Fifo_Read; + +--! @details En aval de la SRAM Gaisler + +architecture ar_Fifo_Read of Fifo_Read is + +signal Rad_int : integer range 0 to addr_max_int; + +begin + process (clk,raz) + begin + if(raz='0')then + Rad_int <= 0; + empty <= '1'; + + elsif(clk' event and clk='1')then + if(flag_RE='1')then + if(Rad_int=addr_max_int)then + Rad_int <= 0; + else + Rad_int <= Rad_int+1; + end if; + end if; + if(Rad_int=WAD)then + empty <= '1'; + else + empty <= '0'; + end if; + end if; + end process; + +RAD <= Rad_int; +Raddr <= std_logic_vector(to_unsigned(Rad_int,addr_sz)); +end ar_Fifo_Read; \ No newline at end of file diff --git a/lib/lpp/lpp_fifo/Fifo_Write.vhd b/lib/lpp/lpp_fifo/Fifo_Write.vhd new file mode 100644 --- /dev/null +++ b/lib/lpp/lpp_fifo/Fifo_Write.vhd @@ -0,0 +1,75 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use work.FIFO_Config.all; + +--! Programme de la FIFO d'écriture + +entity Fifo_Write is +port( + clk,raz : in std_logic; --! Horloge et reset general du composant + flag_WR : in std_logic; --! Flag, Demande l'écriture dans la mémoire + RAD : in integer range 0 to addr_max_int; --! Adresse du registre de lecture de la mémoire (forme entière) + full : out std_logic; --! Flag, Mémoire pleine + WAD : out integer range 0 to addr_max_int; --! Adresse du registre d'écriture dans la mémoire (forme entière) + Waddr : out std_logic_vector(addr_sz-1 downto 0) --! Adresse du registre d'écriture dans la mémoire (forme vectorielle) + ); +end Fifo_Write; + +--! @details En amont de la SRAM Gaisler + +architecture ar_Fifo_Write of Fifo_Write is + +signal Wad_int : integer range 0 to addr_max_int; +signal full_int : std_logic; + +begin + process (clk,raz) + begin + if(raz='0')then + Wad_int <= 0; + full_int <= '0'; + + elsif(clk' event and clk='1')then + if(flag_WR='1')then + if(Wad_int=addr_max_int)then + Wad_int <= 0; + elsif(full_int='1')then + Wad_int <= Wad_int; + else + Wad_int <= Wad_int+1; + end if; + end if; + if(Wad_int=RAD-1 or (Wad_int=addr_max_int and RAD=0))then + full_int <= '1'; + else + full_int <= '0'; + end if; + end if; + end process; + +full <= full_int; +WAD <= Wad_int; +Waddr <= std_logic_vector(to_unsigned(Wad_int,addr_sz)); +end ar_Fifo_Write; \ No newline at end of file diff --git a/lib/lpp/lpp_fifo/Top_FIFO.vhd b/lib/lpp/lpp_fifo/Top_FIFO.vhd new file mode 100644 --- /dev/null +++ b/lib/lpp/lpp_fifo/Top_FIFO.vhd @@ -0,0 +1,83 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +library techmap; +use techmap.gencomp.all; +use work.FIFO_Config.all; +use work.config.all; + +--! Programme de la FIFO + +entity Top_FIFO is + port( + clk,raz : in std_logic; --! Horloge et reset general du composant + flag_RE : in std_logic; --! Flag, Demande la lecture de la mémoire + flag_WR : in std_logic; --! Flag, Demande l'écriture dans la mémoire + Data_in : in std_logic_vector(Data_sz-1 downto 0); --! Data en entrée du composant + full : out std_logic; --! Flag, Mémoire pleine + empty : out std_logic; --! Flag, Mémoire vide + Data_out : out std_logic_vector(Data_sz-1 downto 0) --! Data en sortie du composant + ); +end Top_FIFO; + +--! @details Une mémoire SRAM de chez Gaisler est utilisée, +--! associée a deux fifos, une pour écrire l'autre pour lire cette mémoire + +architecture ar_Top_FIFO of Top_FIFO is + +component syncram_2p + generic (tech : integer := 0; abits : integer := 6; dbits : integer := 8; sepclk : integer + := 0); + port ( + rclk : in std_ulogic; + renable : in std_ulogic; + raddress : in std_logic_vector((abits -1) downto 0); + dataout : out std_logic_vector((dbits -1) downto 0); + wclk : in std_ulogic; + write : in std_ulogic; + waddress : in std_logic_vector((abits -1) downto 0); + datain : in std_logic_vector((dbits -1) downto 0)); +end component; + +signal RAD : integer range 0 to addr_max_int; +signal WAD : integer range 0 to addr_max_int; +signal Raddr : std_logic_vector(addr_sz-1 downto 0); +signal Waddr : std_logic_vector(addr_sz-1 downto 0); + +begin + + SRAM : syncram_2p + generic map(CFG_MEMTECH,addr_sz,Data_sz) + port map(clk,flag_RE,Raddr,Data_out,clk,flag_WR,Waddr,Data_in); + + + WR : entity work.Fifo_Write + port map(clk,raz,flag_WR,RAD,full,WAD,Waddr); + + + RE : entity work.Fifo_Read + port map(clk,raz,flag_RE,WAD,empty,RAD,Raddr); + + +end ar_Top_FIFO; \ No newline at end of file diff --git a/lib/lpp/lpp_fifo/lpp_fifo.vhd b/lib/lpp/lpp_fifo/lpp_fifo.vhd new file mode 100644 --- /dev/null +++ b/lib/lpp/lpp_fifo/lpp_fifo.vhd @@ -0,0 +1,90 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ +library ieee; +use ieee.std_logic_1164.all; +library grlib; +use grlib.amba.all; +use std.textio.all; +library lpp; +use lpp.lpp_amba.all; +use work.FIFO_Config.all; + +--! Package contenant tous les programmes qui forment le composant intégré dans le léon + +package lpp_fifo is + +component APB_FIFO is + generic ( + pindex : integer := 0; + paddr : integer := 0; + pmask : integer := 16#fff#; + pirq : integer := 0; + abits : integer := 8); + port ( + clk : in std_logic; + rst : in std_logic; + apbi : in apb_slv_in_type; + apbo : out apb_slv_out_type + ); +end component; + + +component Top_FIFO is + port( + clk : in std_logic; + raz : in std_logic; + flag_RE : in std_logic; + flag_WR : in std_logic; + Data_in : in std_logic_vector(Data_sz-1 downto 0); + full : out std_logic; + empty : out std_logic; + Data_out : out std_logic_vector(Data_sz-1 downto 0) + ); +end component; + + +component Fifo_Read is + port( + clk : in std_logic; + raz : in std_logic; + flag_RE : in std_logic; + WAD : in integer range 0 to addr_max_int; + empty : out std_logic; + RAD : out integer range 0 to addr_max_int; + Raddr : out std_logic_vector(addr_sz-1 downto 0) + ); +end component; + + +component Fifo_Write is + port( + clk : in std_logic; + raz : in std_logic; + flag_WR : in std_logic; + RAD : in integer range 0 to addr_max_int; + full : out std_logic; + WAD : out integer range 0 to addr_max_int; + Waddr : out std_logic_vector(addr_sz-1 downto 0) + ); +end component; + +end; diff --git a/lib/lpp/lpp_uart/APB_UART.vhd b/lib/lpp/lpp_uart/APB_UART.vhd --- a/lib/lpp/lpp_uart/APB_UART.vhd +++ b/lib/lpp/lpp_uart/APB_UART.vhd @@ -15,7 +15,10 @@ -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- +------------------------------------------------------------------------------ +-- Author : Martin Morlot +-- Mail : martin.morlot@lpp.polytechnique.fr +------------------------------------------------------------------------------ library ieee; use ieee.std_logic_1164.all; library grlib; @@ -27,6 +30,8 @@ use lpp.lpp_amba.all; use lpp.apb_devices_list.all; use lpp.lpp_uart.all; +--! Driver APB, va faire le lien entre l'IP VHDL de l'UART et le bus Amba + entity APB_UART is generic ( pindex : integer := 0; @@ -36,12 +41,12 @@ entity APB_UART is abits : integer := 8; Data_sz : integer := 8); port ( - clk : in std_logic; - rst : in std_logic; - apbi : in apb_slv_in_type; - apbo : out apb_slv_out_type; - TXD : out std_logic; - RXD : in std_logic + clk : in std_logic; --! Horloge du composant + rst : in std_logic; --! Reset general du composant + apbi : in apb_slv_in_type; --! Registre de gestion des entrées du bus + apbo : out apb_slv_out_type; --! Registre de gestion des sorties du bus + TXD : out std_logic; --! Transmission série, côté composant + RXD : in std_logic --! Reception série, côté composant ); end APB_UART; @@ -61,7 +66,7 @@ signal Send : std_logic; signal Sended : std_logic; type UART_ctrlr_Reg is record - UART_Cfg : std_logic_vector(4 downto 0); + UART_Cfg : std_logic_vector(2 downto 0); UART_Wdata : std_logic_vector(7 downto 0); UART_Rdata : std_logic_vector(7 downto 0); UART_BTrig : std_logic_vector(11 downto 0); @@ -69,14 +74,13 @@ end record; signal Rec : UART_ctrlr_Reg; signal Rdata : std_logic_vector(31 downto 0); +signal temp_ND : std_logic; begin Capture <= Rec.UART_Cfg(0); ---ACK <= Rec.UART_Cfg(1); ---Send <= Rec.UART_Cfg(2); -Rec.UART_Cfg(3) <= Sended; -Rec.UART_Cfg(4) <= NwData; +Rec.UART_Cfg(1) <= Sended; +Rec.UART_Cfg(2) <= NwData; COM0 : entity work.UART @@ -90,41 +94,47 @@ Rec.UART_Cfg(4) <= NwData; Rec.UART_Wdata <= (others => '0'); - elsif(clk'event and clk='1')then - + elsif(clk'event and clk='1')then + temp_ND <= NwData; + if(NwData='1' and temp_ND='1')then + ACK <= '1'; + else + ACK <= '0'; + end if; --APB Write OP if (apbi.psel(pindex) and apbi.penable and apbi.pwrite) = '1' then case apbi.paddr(7 downto 2) is when "000000" => - Rec.UART_Cfg(2 downto 0) <= apbi.pwdata(2 downto 0); + Rec.UART_Cfg(0) <= apbi.pwdata(0); when "000001" => - Rec.UART_Wdata <= apbi.pwdata(7 downto 0); - Send <= '1'; + Rec.UART_Wdata(7 downto 0) <= apbi.pwdata(7 downto 0); + Send <= '1'; when others => null; end case; - else - Send <= '0'; + else + Send <= '0'; end if; --APB READ OP if (apbi.psel(pindex) and (not apbi.pwrite)) = '1' then case apbi.paddr(7 downto 2) is when "000000" => - Rdata(4 downto 0) <= Rec.UART_Cfg; - Rdata(26 downto 12) <= (others => '0'); - Rdata(27 downto 16) <= Rec.UART_BTrig; + Rdata(3 downto 0) <= "000" & Rec.UART_Cfg(0); + Rdata(7 downto 4) <= "000" & Rec.UART_Cfg(1); + Rdata(11 downto 8) <= "000" & Rec.UART_Cfg(2); + Rdata(19 downto 12) <= X"EE"; + Rdata(31 downto 20) <= Rec.UART_BTrig; when "000001" => + Rdata(31 downto 8) <= X"EEEEEE"; Rdata(7 downto 0) <= Rec.UART_Wdata; when "000010" => + Rdata(31 downto 8) <= X"EEEEEE"; Rdata(7 downto 0) <= Rec.UART_Rdata; - Ack <= '1'; when others => Rdata <= (others => '0'); end case; - else - Ack <= '0'; end if; end if; diff --git a/lib/lpp/lpp_uart/Shift_REG.vhd b/lib/lpp/lpp_uart/Shift_REG.vhd --- a/lib/lpp/lpp_uart/Shift_REG.vhd +++ b/lib/lpp/lpp_uart/Shift_REG.vhd @@ -46,6 +46,7 @@ architecture ar_Shift_REG of Shift_REG i signal REG : std_logic_vector(Data_sz-1 downto 0); signal Serialized_int : std_logic; signal Serialize_reg : std_logic; +signal Serial_reg : std_logic; signal CptBits : std_logic_vector(Data_sz-1 downto 0); constant CptBits_trig : std_logic_vector(Data_sz-1 downto 0) := (others => '1'); signal CptBits_flag : std_logic; @@ -61,14 +62,16 @@ begin if reset = '0' then Serialized_int <= '1'; CptBits_flag_reg <= '0'; + Serial_reg <= '0'; Q <= (others => '0'); elsif clk'event and clk = '1' then CptBits_flag_reg <= CptBits_flag; + Serial_reg <= Serialize; if CptBits_flag = '1' and CptBits_flag_reg = '0' then Serialized_int <= '1'; Q <= REG; - elsif Serialize = '1' then + elsif(Serial_reg='0' and Serialize='1')then Serialized_int <= '0'; end if; end if; diff --git a/lib/lpp/lpp_uart/UART.vhd b/lib/lpp/lpp_uart/UART.vhd --- a/lib/lpp/lpp_uart/UART.vhd +++ b/lib/lpp/lpp_uart/UART.vhd @@ -45,9 +45,9 @@ port( ); end entity; - --! @details Gestion de la Reception/Transmission donc de la Vectorisation/Serialisation ---! ainsi que la detection et le reglage de le frequence de transmission optimale sur le bus (Generateur de Bauds) +--! ainsi que la detection et le reglage de le frequence de transmission optimale sur le bus (Generateur de Bauds) + architecture ar_UART of UART is signal Bclk : std_logic;