350 likes | 513 Views
Pinout réseau de neurones. WRAPPER ENTITY: i_clk_PAD : in STD_LOGIC; i_TCK_PAD : in STD_LOGIC; i_rst_n_PAD : in STD_LOGIC; -- circuit 1 IOs i_clk_sync_PAD : in STD_LOGIC; -- PAD i_retina_dta_PAD : in STD_LOGIC_VECTOR (13 downto 0); -- PADs
E N D
Pinout réseau de neurones WRAPPER ENTITY: i_clk_PAD : in STD_LOGIC; i_TCK_PAD : in STD_LOGIC; i_rst_n_PAD : in STD_LOGIC; -- circuit 1 IOs i_clk_sync_PAD : in STD_LOGIC; -- PAD i_retina_dta_PAD : in STD_LOGIC_VECTOR (13 downto 0); -- PADs i_valid_dta_PAD : in STD_LOGIC; -- PAD o_ready_PAD : out STD_LOGIC; -- PAD i_RX_PAD : in STD_LOGIC; -- PAD o_TX_PAD : out STD_LOGIC; -- PAD o_en_AER_l1_PAD : out STD_LOGIC; -- PAD o_AER_l1_PAD : out STD_LOGIC_VECTOR (5 downto 0); -- PADs (from C2) -- circuit 2 IOs o_en_AER_l2_PAD : out STD_LOGIC; -- bump - passage par courone o_AER_l2_PAD : out STD_LOGIC_VECTOR (5 downto 0)
Interface rétine(analyse layer 1) Fréquence horloges: -clk_in (horloge provenant de la rétine->peut être à une fréquence proche?) -clk: 150MHz (horloge globale layer1) Ce composant comporte une fifo pour palier à l’asynchronisme entre les 2 horloges (profondeur 8 cases et largeur 14 bits) COMPONENT retina_commis Port ( clk : in STD_LOGIC; rst_n : in STD_LOGIC; run : in STD_LOGIC; clk_in : in STD_LOGIC; valid_out : in STD_LOGIC; ready_in : out STD_LOGIC; data_retina : in STD_LOGIC_VECTOR (13 DOWNTO 0); rd_fifo : in STD_LOGIC; empty_n : out STD_LOGIC; data_out : out STD_LOGIC_VECTOR (13 DOWNTO 0)); END COMPONENT; Signification de run Signal données provenant de la rétine Contient une machine d’état lisant la fifo de « retina_comm» 1 cycle sur 4 COMPONENT event_extractionis PORT (clk : in STD_LOGIC; rst_n : in STD_LOGIC; run : in STD_LOGIC; en_event : out STD_LOGIC_VECTOR (47 DOWNTO 0); event : out STD_LOGIC_VECTOR (383 DOWNTO 0); empty : in STD_LOGIC; rd_fifo : out STD_LOGIC; data_out : in STD_LOGIC_VECTOR (13 DOWNTO 0)); END COMPONENT; Interface coding layer et Data Link Layer Que représente Ce lien? 48 macro-cellules et donc 48*8 événements
analyse layer 1 (suite) COMPONENT top_layer1 IS PORT ( clk : in STD_LOGIC; rst_n : in STD_LOGIC; run : in STD_LOGIC; . . . spike_46 : OUT STD_LOGIC; enb_47 : OUT STD_LOGIC; addrb_47 : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); dob_47 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); spike_47 : OUT STD_LOGIC; thresh : IN STD_LOGIC_VECTOR (767 DOWNTO 0); en_event : in STD_LOGIC_VECTOR (47 DOWNTO 0); event : in STD_LOGIC_VECTOR (383 DOWNTO 0)); une des 48 sorties du layer 1 (un spike) Entrée des 4 coéf de pondération Associés à chaque événement 48*16bits : seuils déclenchement neurones
analyse layer 1 ENTITY top_config_l1 IS PORT ( clk : in STD_LOGIC; TCK : in STD_LOGIC; rst_n : in STD_LOGIC; enb_0 : IN STD_LOGIC; addrb_0 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); dob_0 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); . . . ram_word : in STD_LOGIC_VECTOR (31 DOWNTO 0); valid_word : in STD_LOGIC; ctl_word : in STD_LOGIC); END top_config_l1; Entité comportant 47 blocs RAM de 256*32bits (ils servent à stocker les coéf de pondération des synapses). Les mémoires sont elles déjà initialisées? Horloge de configuration à 20 MHz Bus servant à initialiser les différents coéf (comprendre le fonctionnement) Fichier dpram_256x32_h_in.txt pour initialiser les mémoires?
Analyse layer1 Bloc contenant les mémoires des seuils COMPONENT config_thresh1 IS PORT ( TCK : in STD_LOGIC; rst_n : in STD_LOGIC; ram_word : in STD_LOGIC_VECTOR (31 DOWNTO 0); valid_word : in STD_LOGIC; thresh : out STD_LOGIC_VECTOR (767 downto 0); ctl_word : in STD_LOGIC); END COMPONENT; 48*16bits Les différents seuils sont stoché dans un gros registre (48*16)
Analyse layer1 Composant servant à partir des octets reçus de la liaison série de constituer Les mots de configuration pour les coéf de pondération ainsi que les seuils d’activation --configuration wordconstructor COMPONENT config_RAM IS PORT ( TCK : in STD_LOGIC; rst_n : in STD_LOGIC; busy : in STD_LOGIC; en_RX : in STD_LOGIC; en_TX : out STD_LOGIC; RX_reg : in STD_LOGIC_VECTOR (7 DOWNTO 0); TX_reg : out STD_LOGIC_VECTOR (7 DOWNTO 0); ram_word : out STD_LOGIC_VECTOR (31 DOWNTO 0); valid_word : out STD_LOGIC; ctl_word : out STD_LOGIC; run : out STD_LOGIC); END COMPONENT; Octet reçu via liaison série Mot de configuration
Analyse layer1 -- External communication and data pre-processing -- Serial transmitter (1 Mbyte/s) COMPONENT send_1MB is Port ( clk : in STD_LOGIC; rst_n : in STD_LOGIC; wrt : in STD_LOGIC; dat : in STD_LOGIC_VECTOR (7 downto 0); TX : out STD_LOGIC; busy : out STD_LOGIC); END COMPONENT; -- Serial receiver (1 Mbyte/s) COMPONENT recv_1MB is Port ( clk : in STD_LOGIC; rst_n : in STD_LOGIC; rx : in STD_LOGIC; dat : out STD_LOGIC_VECTOR (7 downto 0); dat_en : out STD_LOGIC); END COMPONENT;
Analyse layer1 -- AER for the layer 1 AER_l1_inst : AER_out_l1 PORT MAP ( clk => clk, rst_n => rst_n_sync_150, run => run_int, en_aer => en_AER_l1, aer_addr => AER_l1, spk_l1 => spk_l1 ); Horloge 150MHz • Algo: • -Les événements sont stockés dans un registre mémoire. • On a un registre « roue libre » de largeur le nombre de neurones du « layer» • -Si un événement correspond à l’index du bit actif du registre en roue libre, alors l’adresse de l’événement est généré et cet événement est remis à zéro en mémoire (quand l’adresse de l’événement est générée, un signal de contrôle l’est aussi) • -La sortie n’est valable que quand en_AER=‘1’=> • Nécessité d’information sur le temps relatif au démarrage de l’accélérateur (ajouter dans le testeur ou mettre dans blancs ds la mémoire) • -Dans le pire cas (variation importante du niveau de gris ) , on a une sortie par cycle. • -Stocker dans la mémoire DDR 6 bits (sortie événement neurone) Entrée spikes 48 bits
Schéma synoptique Comment fonctionne l’interface rétine? 1 Mbits Configuration transmise de C1 à C2 via: ram_word, valid_word La séparation entre circuits Est ici 3 signaux A quelle fréquence fonctionne ce bus de données?(150MHz): Selon moi, on reçoit 150/4 Mpixels/s , donc la fréquence de rafraichissement est ~3050 image/s
Bloc extraction données rétine (layer1) • Le composant «event_extraction» mets en œuvre une machine d’état et un système de décodage de démultiplexage des événements: • Tous les quatres cycles, génération d’un événement • Le bench « top_circuit_1_tb.vhd » est obsolète 0 8 13 Préfixe pour identifier la macro cellule Identification pixel
Analyse layer 2 • Layer1: 48 neurones • Layer2: 64 neurones dans le code et 50 d’après l’article ()
Analyse layer 2 Ce bloc contient 1des 64 neurones du 2 layer ce qui inclu: 1 mémoire de 192*8 bits contenant les coéf de pondération ENTITY layer2_unit IS PORT ( clk : in STD_LOGIC; TCK : in STD_LOGIC; rst_n_150 : in STD_LOGIC; rst_n_20 : in STD_LOGIC; run : in STD_LOGIC; spike : OUT STD_LOGIC; thresh : in STD_LOGIC_VECTOR (15 DOWNTO 0); spk_l1 : in STD_LOGIC_VECTOR (47 downto 0); block_nb : in STD_LOGIC_VECTOR (15 downto 0); ram_word : in STD_LOGIC_VECTOR (31 DOWNTO 0); valid_word : in STD_LOGIC; ctl_word : in STD_LOGIC); END layer2_unit;
Analyse layer2 AER_l2_inst : AER_out_l2 PORT MAP ( clk => clk, rst_n => rst_n_sync_150, run => run, en_aer => en_AER_l2, aer_addr => AER_l2, spk_l2 => spk_l2 ); 6 bits Entrée 64 bits
Schéma testeur v1 (à base spartan6l) Nécessité d’adapter le code de l’UART pour travailler en mode sur-échantillonné (registre >8 bit pour la détection du start) Débit design testé (entrées+sorties): Entrées données: 14bits+1(37,4MHz) Sorties données: -12 (150MHz) Entrées contrôle: 2 I/O UART: 2 Sorties contrôle: 3 Sorties horloges: 3 Total: 36->35 dispo en single ended (sur- capacité) Stratégie: On initialise les poids synaptiques (UARTs), on charge la mémoire DDR avec les événements (via UART), enfin on alimente en événements le réseau ANN. AU bout d’un certain temps on récupère les données en mémoire DDR, puis on récupère les données PC via l’UART PC U A R T 1 (1) Système reset G P I O T X / R X Addr U A R T 0 (4) Bridge USB/ RS232 data (32 bits*2) A N N Trigger DMA r/w DMA + UC gestion signaux ANN Le débit du bridge est: Comment peut on utiliser le bridge USB/RS232 driver python? ->Débit maximal d’environ 1Mbits (voir doc UG) Contrôleur Mémoire DDR Externe(TX/RX) 1 (2) Circuit Horloge (3) Re-programmation dynamique avec DCM_CLKGEN (non, dans cette version) Temps de remplissage de la mémoire à prendre en compte ( 250*48*16*16*8 bits~ 25 Mbits à charger, possibilité d’utiliser SPI) Débit mémoire externe: (1): Le débit de l’UART est à 1Mbits (utilisée pour La configuration de l’ANN) (2): chercher une IP Xilinx Existante (ou voir sur opencores) (3): le circuit génère 3 horloges: 150MHz (globale), 37,5MHz (horloge entrée pixels), 20MHz (configuration). Peut on générer des fréquences <= ou y a-t-il une tolérance de la techno ASIC? (4) : Quelle est la fréquence du bus (1Mbits) Mécanisme d’exclusion mutuelle sur la mémoire (flag busy)
Schéma testeur v1.1 (à cause de la sur-capacité en I/O single ended) • Stratégie: on charge via les UARTs les poids synaptiques, • on charge la mémoire DDR avec les événements, • on lance le DMA, puis on récupère les données avec l’analyseur logique PC U A R T 1 (1) Débit design testé (entrées+sorties): Entrées données: 14bits+1(37,4MHz) Sorties données: -12+2 (150MHz) Système reset G P I O T X Addr U A R T 0 (4) Bridge USB/ RS232 data (32 bits*2) A N N Trigger DMA r/w DMA + UC gestion signaux ANN GPIO_RX ready Trigger +horloge Circuit Horloge (3) Contrôleur Mémoire DDR Externe(TX/RX) 1 (2) 2*12 Analyseur Logique (config Minimale 12 canaux <=200MHz sampling) Mémoire DDR Analyseur logique nécessaire car on a pas assez d’I/O avec la solution précédente PC
Capacité IO carte • Extension MXP: 19 I/0s single ended (J1) • Header J8 et J6: 2*8 I/0s • Besoin: 14 +12 datas et 6signaux de contrôle • 3 horloges (Comment faire sortir horloges->IO dédiées?-> utilisation OSERDES?) • Total besoin: 35 • Alim 12 volt
Circuit horloge et reset testeur v0 66.6Mhz Reset externe ANN Reset circuit OU not lock Clockgen circuit Horloge globale FPGA (vitesse bus 32 bits) et horloge globale réseau de neurones: 150 MHz, Horloge événements réseau neurones:37,5Mhz, Horloges UART 0 et 1: 1MHz, Horloge de configuration des mémoire (poids synapses, seuils): 20MHz, horloge contrôleur mémoire DDR: à déterminer Un reset par domaine d’horloge: -reset UART (synchrone 1MHz) -reset horloge globale FPGA 150MHz (synchrone 150MHz) -reset chip réseau de neurones (reset asynchrone) -reset horloge contrôleur mémoire DDR (synchrone à déterminer?)
Circuit horloge v1 66.6Mhz Clockgen circuit not lock 150Mhz 37,5MHz 20MHz 8MHz Clockgen circuit Clockgen circuit PLL_ADV 2*150MHz ( bus frequency ->DDR) et 75MHz (horloge software calibration->au maximum 100MHz ) 4MHz Horloge globale FPGA (vitesse bus 32 bits) et horloge globale réseau de neurones: 150 MHz, Horloge événements réseau neurones:37,5Mhz, Horloges UART 0 et 1: 1MHz (impossibilité de générer d’où 4MHz), Horloge de configuration des mémoire (poids synapses, seuils): 20MHz, horloge contrôleur mémoire DDR: à déterminer
Débit utile chip ANN vs débit max mémoire DDR Débit utile chip ANN (réfléchir pour faire une architecture DMA générique par rapport aux débits): 14*37,5M+12*150M=2325 Mbit/s (à approfondir demain) Pour 1000 images par seconde, on a: 1000*48*16*16=12,28Mpixels Soit un débit binaire de : 14*12,28M+12*49,15M=761,2Mbits/s (il faut tenir compte du fait qu’on est en bidirectionnel?) Débit contrôleur mémoire pour LPDDR (MCB Spartan6 avec speed grade de -2,S6LX16 CSG324 Bank 3 ):
Configuration MCB 1 Séquencement: -émission donnée -émission commande … Horloge contrôleur actif sur front montant et descendant Permet de définir la séquence d’attribution du bus (réglable ou Round robin) Principe: la fréquence du bus est 2 fois celle du banc mémoire DDR CK P/N,CKE Contrôleur mémoire FIFO Rétention commandes Codeur priorité UC R O U T A G E CS, WE CAS RAS I O B Banque Mémoire 0 Banque Mémoire 3 DQ (16 bits) 32 bits P O R T FIFO rétention données (profondeur 64) LDQ,UDQ Adresse (12 bits) + BA (3 bits) Horloge synchrone Avec les données Mémoire tampon: -Lecture/écriture bus sur front montant et descendant Ports (32 bits)
Etapes fonctionnement MCB Avec un bloc Iodelay, on centre le front montant d’horloge au milieu de la data Calibration permanente du fait des effets de la variation de température Adaptation d’impédance
MCB code généré par Xilinx mig_v3_92_0.vhd memc3_infrastructure.vhd memc3_wrapper.vhd mcb_raw_wrapper.vhd Synthèse d’horloge mcb_soft_calibration.vhd Memory chip control interface iodrp_mcb_controller.vhd iodrp_controller.vhd
Configuration MCB 2: wrapper contrôleurMCB generic ( C3_P0_MASK_SIZE : integer := 4; C3_P0_DATA_PORT_SIZE : integer := 32; C3_P1_MASK_SIZE : integer := 4; C3_P1_DATA_PORT_SIZE : integer := 32; C3_MEMCLK_PERIOD : integer := 6666; -- Memory data transferclockperiod. C3_RST_ACT_LOW : integer := 0; -- # = 1 for active low reset, -- # = 0 for active high reset. C3_INPUT_CLK_TYPE : string := "DIFFERENTIAL"; -- input clock type DIFFERENTIAL or SINGLE_ENDED. C3_CALIB_SOFT_IP : string := "TRUE"; -- # = TRUE, Enables the soft calibration logic, -- # = FALSE, Disables the soft calibration logic. C3_SIMULATION : string := "FALSE"; -- # = TRUE, Simulating the design. Useful to reduce the simulation time, -- # = FALSE, Implementing the design. DEBUG_EN : integer := 0; -- # = 1, Enabledebugsignals/controls, -- = 0, Disabledebugsignals/controls. C3_MEM_ADDR_ORDER : string := "BANK_ROW_COLUMN"; -- The order in which user addressisprovided to the memorycontroller, -- ROW_BANK_COLUMN or BANK_ROW_COLUMN. C3_NUM_DQ_PINS : integer := 16; -- Externalmemory data width. C3_MEM_ADDR_WIDTH : integer := 13; -- Externalmemoryaddresswidth. C3_MEM_BANKADDR_WIDTH : integer := 2 -- Externalmemorybankaddresswidth. );
Configuration MCB 2: wrapper contrôleurMCB port ( mcb3_dram_dq : inoutstd_logic_vector(C3_NUM_DQ_PINS-1 downto 0); mcb3_dram_a : out std_logic_vector(C3_MEM_ADDR_WIDTH-1 downto 0); mcb3_dram_ba : out std_logic_vector(C3_MEM_BANKADDR_WIDTH-1 downto 0); mcb3_dram_cke : out std_logic; mcb3_dram_ras_n : out std_logic; mcb3_dram_cas_n : out std_logic; mcb3_dram_we_n : out std_logic; mcb3_dram_dm : out std_logic; mcb3_dram_udqs : inoutstd_logic; mcb3_rzq : inoutstd_logic; mcb3_dram_udm : out std_logic; c3_sys_clk_p : in std_logic; c3_sys_clk_n : in std_logic; c3_sys_rst_i : in std_logic; c3_calib_done : out std_logic; c3_clk0 : out std_logic; c3_rst0 : out std_logic; mcb3_dram_dqs : inoutstd_logic; mcb3_dram_ck : out std_logic; mcb3_dram_ck_n : out std_logic; Signal envoit adresse colonne puis ligne (10 et 12) Adresse banc mémoire
Cas d’utilisation: détection d’image • D’après les gens du CEA, la rétine a un «frame rate» d’environ 1000 images par seconde (on peut donc déduire la fréquence d’émission des données à l’accélérateur matériel ) • Dans le testeur, on pré-charge le flot de données brutes associées au cas d’utilisation suivant: la détection d’un quatre blanc sur fond noir. • Le scénarii de test est le suivant: on émet une séquence de 30 images à l’accélérateur en modulant le niveau de gris du quatre (modulation linéaire-> on part d’un niveau de gris de 255 puis décroissance linéaire ) Niveau gris 255 30 Nb image
Schéma carte interfaçagechip CEA avec chip réseau ANN -La RETINE + L2 du list émet des bursts de: 256*24bits ou 3072*24bits -de la rétine+L2 vers le bridge on aura 24 liaison séries avec les signaux de contrôle associés: clk_strobe et signal valid - RETINE+L2 (matrice de processeur->SIMD,12*16 processeurs->1 par macro-cellule) Bridge (à base de carte spartan6l) Conversion fromat données bitmap (niveau gris ou RGB ou autre vers format Événements macro-cellule) Réseau ANN (1 accélérateurs matériel traitant un cadrant de 48 macro-cellules (*4=192 macro-cellules)) *4 24+8 bits (bus parallèle dont chaque bit représente un bout de donnée d’un MACRO_PROC) 14 bits-
NEMESIS bridge_rétine L2_réseau ANN v1 Capacité banc IO? Déclenchement SERDES? ->différentiel ou single-ended (standard?) Stratégie: on initialise les seuils, on initialise les poids synaptiques (UARTs) ,on génère les événements à partir des « burst », on les stocke, puis on émet les événements 1 à 1 au réseau ANN 14 signaux Données Entrée + 2 signaux UART + 3 Signaux d’horloge + 1 signal données Entrée Valides + 1 signal Réseau prêt Système reset U A R T 1 Image antérieure 24 RAM blocks (32*18K disponibles)* G P I O T X 0 Trigger DMA (réseau ANN et rétine OK) 24 I S E R D E S (1->8, 1->4) BUFFER *24 A N N 24 pixels (8 bits) 2*12 liaisons série *24 DMA + UC gestion signaux ANN 24 seuils 24 soustracteur 24 comparateurs Trigger +horloge synchro Circuit Horloge Compteur pixels 2*12 ANN ready? Analyseur Logique (config Minimale 12 canaux <=200MHz sampling) horloge/4 ou horloge/8 (si diff) 24 *14 (événements) Signaux contrôle+ horloge maître design GPIO RX addr 32 bits Contrôleur Mémoire DDR Externe(TX/RX) 1 (2) GPIO TX1 UART U A R T 0 ANN ready CS PC l’horloge fournie par la rétine est maître (est ce possible ?) Mémoire LPDDR 32 Mbits ->stockage burst: -3072*24*1,75 bits= -256*24*1,75 bits= *:Stockage image antérieure rétine (256*8=2048 bits, mémoire FPGA: 576Kbits)+stockage données burst après traitement? PC
Questions à poser • Comment le routage (fonctionnalitéeà implanter sur le FPGA) vers les cadrant doit être réalisé par le bridge, que représente les 4 bus de de données de 24 bits de issus de la couche rétine. Ne devrait on pas en avoir 8 pour 8 mémoires? Est ce quatre flux dupliqués? • Le design de bridge que je devrai faire, devra t il tester un cadrant ou la rétine complète (ressources FPGA insuffisantes)
Interface 32 bits • Le FPGA spartan6l avec le package CSG324 a quatre bancs d’IO ayant les caractéristiques suivantes: • 32 Global clock (GCLK) input pins (8 per bank) can connect directly to the global clock buffers (BUFGs), to the BUFIO2 and then to local I/O clocking, or to the BUFIO2 and then to DCMs and PLLs • Each Spartan-6 device has 16 BUFGs (2 banks share 8) Au niveau du nombred’I/O disponibles (voir doc carte LX16)-> header J1 (Mini expansion port-> I/O type -> ,achat alimentation de 12 volts nécessaire)->attention toutes les IO ne sont pas sur le même banc et IO diff->limite la capacité) Nécessitéd’acheter la carte d’extension FMC pour l’entrée 32 bits-> du coup l’horloge du système sera issue d’un des connecteur du FMC
NEMESIS bridge_rétine L2_réseau ANN v1.1 (dataflow) 14 signaux Données Entrée + 2 signaux UART + 3 Signaux d’horloge + 1 signal données Entrée Valides + 1 signal Réseau prêt Stratégie: on initialise les mémoires de seuils, on initialise les mémoires de poids Synaptiques (UARTs), les données de la rétine sont ensuite traitées en continu Système reset U A R T 1 Image antérieure 24 RAM blocks (32*18K disponibles) G P I O T X 0 24 I S E R D E S (1->8, 1->4) BUFFER A N N 24 pixels (8 bits) OSERDES 2*12 liaisons série *24 24 seuils 24*14 événements 24 soustracteur 24 comparateurs Trigger +horloge synchro Circuit Horloge Compteur pixels 2*12 Horloge rétine ANN ready? Analyseur Logique (config Minimale 12 canaux <=200MHz sampling) horloge/4 ou horloge/8 (si diff) Signaux contrôle+ horloge maître design GPIO RX addr 32 bits GPIO TX1 UART0 U A R T 0 ANN ready CS PC PC