Alice Rocquain Mercredi 8 novembre 2006 Pierre Hoffmann GEII1 groupe A Décodeur de réception France Inter Récupération de l horaire atomique Partie numérique : VHDL Rapport d étape
Présentation du projet France-Inter envoie continuellement sur sa porteuse à 162kHz des informations horaires. On pourra ainsi y retrouver l heure qu il est, mais aussi la date, le mois, le jour de la semaine etc. France-Inter s appuie sur une horloge atomique ce qui permet d avoir la plus grande précision possible. Nous allons donc réaliser le décodeur horaire. Le signal France Inter est capté par l antenne. Après un traitement du signal (partie analogique traitée prochainement), on récupère une trame facilement décryptable, et on en déduit l information horaire. Programmation du diviseur de fréquence Tout au cours du processus de traitement du signal analogique, plusieurs fréquences d horloges sont demandées. La partie analogique demande du 200kHz, 160kHz, 2kHz et du 200Hz. Le problème est que l on ne dispose pas de 4 quartz possédant chacun une fréquence particulière Nous ne disposons que d un VCXO à 20MHz. Nous allons donc synthétiser un programme en VHDL permettant de diviser successivement ce 20MHz en fréquences plus petites (celles qui nous intéressent). Deux solutions de programmation s ouvrent à nous : o La première facile à réaliser mais peu optimisée consiste à créer autant de «Entity» que de fréquences demandées (une pour le 200kHz, une pour le 160kHz et ainsi de suite). 2
o La seconde, et celle que nous retiendrons, consiste en la création d une seule et unique «Entity» possédant un paramètre en entrée (utilisation de la fonction «generic map ( )» ). Notre «Entity» doit donc posséder une structure la plus générale possible pour pouvoir s adapter à chaque situation différente. Que faire lorsque le paramètre passé en argument est pair, impair? Description de «Entity» et de son architecture a) Interconnexion des diviseurs de fréquences Afin de faciliter la programmation et d optimiser le programme, nous mettons nos diviseurs de fréquences de la manière qui suit : b) Schéma d instanciation de l entity Le compteur ne peut «tourné» que lorsque EN est actif. 3
A chaque fois que le compteur recommence un cycle, RCO passe à 1 durant un cycle d horloge c) Programme en VHDL commenté Diviseur de fréquence Ce programme a été compilé, simulé, synthétisé et testé avec succès. Il remplit le cahier des charges. Cependant une forme plus optimisée existe. Elle modifie la partie traitant de la mise en forme d un signal ayant un paramètre impair. Auteurs : Alice Rocquain et Pierre Hoffmann But : «Entity» permettant de diviser un signal en fonction d un paramètre d entrée entity comptebox is // entity nommée comptebox generic (argum : integer // argum : paramètre d entrée de type integer port( clk: in std_logic; en: in std_logic; rco: out std_logic; outclk : out std_logic // déclaration des entrées/sorties de l entity end entity comptebox; // fin entity architecture archibox of comptebox is signal compteur1 : integer range 0 to argum/2 ; signal paire : std_logic :='0'; signal outclock : std_logic :='0'; signal temp : std_logic := '0'; // création des signaux temporaires begin outclk <= outclock; process begin wait until rising_edge (clk if argum mod 2 = 0 then paire <='1'; else paire <='0'; //début de la partie séquentielle //horologe principale : clk = 20MHz // vérification de la parité du paramètre 4
if en ='1' then //si enable actif alors if paire = '1' then // si paramètre pair alors => if compteur1 < argum/2-1 then // test de la valeur du compteur temporaire compteur1<= compteur1+ 1; //si inférieur : incrémentation du compteur else else compteur1 <= 0; outclock <= not outclock; if compteur1 < argum/2-1 then compteur1<= compteur1+ 1; // si supérieur au demi du paramètre //RAZ du compteur //inversion de la sortie // si paramètre impair // même test que pour impair else if temp = '0' and compteur1 < argum/2 then compteur1<= compteur1+ 1; // améliore la précision //une fois sur deux : ajoute +1 else outclock <= not outclock; compteur1 <= 0; temp<= not temp; if outclock = '0' and compteur1 = 0 then rco<='1'; else rco<='0'; end process; end archibox; //gestion du RCO //fin process puis architecture Quelles valeurs envoyer en paramètre pour obtenir les fréquences désirées? Fréquences désirées Valeur du paramètre d entrée (division par ) 160 khz 125 200 khz 100 2kHz 100 200Hz 10 5
Le test-bensh permettant de tester les différentes fréquences a été créé, compilé et synthétisé avec succès. Cependant il ne présente maintenant plus aucun intérêt pour le projet France- Inter, c est pour cela qu il n est pas présent dans ce rapport. Programmation de l automate La partie analogique se chargeant de la réception et de la mise en forme du signal nous envoie à nous numériciens un signal de la forme : Pour pouvoir assurer le bon fonctionnement de la partie «Afficheur», il est impératif de décomposer le signal reçu sous la forme : Tout l enjeu du nouveau programme à réaliser était de réussir à se situer dans le temps afin de pouvoir sortir des signaux INIT, COM, SID et DAV cohérents par rapport au signal d entrée. Nous avons donc réalisé un automate en VHDL. a) Diagramme de transition La variable «count» est exprimée en ms afin de faciliter la compréhension du diagramme de transition. Bien évidemment lors de la programmation, nous remplacerons les valeurs en milli secondes par une valeur qu un compteur devra atteindre afin de réaliser la temporisation. 6
b) Programme en VHDL commenté Nous allons décomposer cet automate en deux programmes complémentaires. Un programme se chargera de réaliser un comptage en boucle. C est grâce à lui que l on pourra se repérer par rapport au temps. Notre second programme collectera cette information concernant le temps, et se chargera pour ainsi dire de réaliser l automate. 1) Programme «Compteur» «Création de la base TEMPS» Ce programme a été compilé et simulé avec succès. Il remplit le cahier des charges. Auteurs : Alice Rocquain et Pierre Hoffmann But : Compte indéfiniment Permet de se repérer dans l espace temps entity councoun is port( clk : in std_logic; //déclaration des entrées/sorties 7
country : out integer range 1 to 241; raz : in std_logic end entity councoun; architecture archimede of councoun is signal SYS_count : integer range 1 to 241; begin country<=sys_count; process begin wait until rising_edge (clk //fonctions de comptage en tenant compte de RAZ et des débordements if raz='0' then SYS_count<=SYS_count+1; if SYS_count=240 then SYS_count <= 1; end process; end archimede; //fin du process, architecture 2) Programme «Automate» Ce programme a été compilé et simulé avec succès. Il remplit le cahier des charges. Auteurs : Alice Rocquain et Pierre Hoffmann But : Décompose le signal d entrée en répondant au cahier des charges - Automate entity totomate is 8
port( clk : in std_logic; FI : in std_logic; count : in integer range 0 to 241; init : out std_logic; com : out std_logic; sid : out std_logic; dav : out std_logic; raz : out std_logic // déclaration des entrées sortie de totomate end entity totomate; architecture archibobox of totomate is // déclaration des signaux internes type etat_type is (E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12 signal etat : etat_type; signal SYS_count : integer range 0 to 241; begin with etat select com <= '1' when E1, '0' when E2, '1' when E9, '0' when E10, '0' when others; //affectations des sorties with etat select init <= '0' when E9, '1' when E10, '1' when others; with etat select raz <= '1' when E9, '0' when E1, '0' when others; process begin wait until rising_edge (clk case etat is when E1 => etat<=e2; // conditions pour passer d un état à l autre when E2 => if SYS_count = 16 then etat<=e3; when E3 => if FI = '1' then etat<=e4; if SYS_count = 28 then etat<= E11; 9
when E4 => etat<= E5; when E5 => etat <= E6; when E6 => if SYS_count = 190 then etat <= E7; end if ; when E7 => if FI = '1'then etat <= E1; if SYS_count = 240 then etat <= E8; when E8 => if FI = '1' then etat <= E9; when E9 => etat <= E10; when E10 => if SYS_count = 16 then etat <= E3; when E11 => etat <= E12; when E12 => etat <= E6; end case; end process; end archibobox; //fin du process, architecture 10
3) Programme «Test-bensh» Nous avons deux programmes. Il est nécessaire de faire un test-bensh afin de les «rassembler» a) Schéma d instanciation b) Programme en VHDL commenté Ce programme a été compilé et simulé avec succès. Il remplit le cahier des charges. 11
Auteurs : Alice Rocquain et Pierre Hoffmann But : Rassemble les deux programmes précédents ENTITY benscha IS port( FI : in std_logic; clk: in std_logic; init: out std_logic; com : out std_logic; sid : out std_logic; dav : out std_logic END benscha; -------------------------------------------------- ARCHITECTURE archimoi OF benscha IS --------- DECLARATIONS --------- COMPONENT councoun //declarations des components //pour le compteur port( clk : in std_logic; country : out integer range 0 to 254; raz : in std_logic END COMPONENT; COMPONENT totomate //pour l automate port( clk : in std_logic; FI : in std_logic; count : in integer range 0 to 254; init : out std_logic; com : out std_logic; sid : out std_logic; dav : out std_logic; raz : out std_logic END COMPONENT; SIGNAL SYS_init : std_logic; SIGNAL SYS_com : std_logic; SIGNAL SYS_sid : std_logic; SIGNAL SYS_dav : std_logic; SIGNAL SYS_clk : std_logic; SIGNAL SYS_raz : std_logic; SIGNAL SYS_count : integer range 0 to 254; 12
SIGNAL SYS_FI : std_logic; BEGIN init<=sys_init; com <= SYS_com; sid <= SYS_sid; dav<= SYS_dav; SYS_FI <=FI ; SYS_clk <= clk; //Instanciation Instance1 : totomate PORT MAP ( // «On attache les fils» clk => SYS_clk, FI=> SYS_FI, count=> SYS_count, init => SYS_init, com => SYS_com, sid =>SYS_sid, dav =>SYS_dav, raz =>SYS_raz Instance2 : councoun PORT MAP ( clk =>SYS_clk, country=>sys_count, raz =>SYS_raz END archimoi ; //fin du process, architecture En guise de conclusion La partie numérique a donc permis de générer avec une redoutable précision différentes fréquences d horloges, permettant ainsi à la partie analogique de pouvoir travailler. Elle permet aussi de «décoder» la trame analogique qui nous est transmise et de «l encoder» pour que le module afficheur puisse faire son travail. 13