Você está na página 1de 12

Chuan He Alexandre Iliadis

Projet : TELECOMMANDE INFRAROUGE Electronique Numrique

SOMMAIRE
I] SCHEMA GLOBAL
p.3

II] DESCRIPTION BLOC PAR BLOC

p.4

1) ENCODEUR a) VHDL

p.4 p.4 p.5 p.5 p.5 p.6 p.7 p.7

b) Simulation 2) COMPTEUR MODULO 8 a) VHDL b) Simulation 3) DIVISEUR DE FREQUENCE a) VHDL b) Simulation 4) DIVISEUR DE FREQUENCE a) VHDL b) Simultation

p.7 p.8 p.9 p.11

III] CONCLUSION

p.12

I)

SCHEMA DENSEMBLE

Une tlcommande 16 touches infra-rouge doit permettre lutilisateur de slectionner un certain programme (ici une LED) distance. En entre du circuit nous aurons donc les 16 touches de lappareil (lhorloge tant gnre par une puce externe au circuit et la remise zro une touche part). Pour raliser notre tlcommande nous dcrirons notre circuit comme ci-dessous :

Nous utiliserons tout dabord un encodeur pour transformer le signal 16 bits en signal 4 bits. En sortie de ce bloc, un signal 4 bits comme prvu et un signal 1 bit APPUI qui permet de lancer le compteur modulo 8 et le squenceur, les deux autres principaux blocs. On mettra un diviseur de frquence pou r avoir lhorloge du circuit 10kHz au lieu des 250kHz en entre. Le compteur 3 bits (modulo 8) nous permettra de dfinir prcisment tel instant donn quel doit tre le signal de sortie, savoir le bit START ou le code Manchester ou bien le bit STOP. Quant au squenceur il renfermera la machine dtats accompagne dun registre dcalage ainsi que dun gnrateur de code Manchester et dun multiplexeur.

II)

DESCRIPTION BLOC PAR BLOC

La tlcommande 16 touches possde donc 4 blocs que lon va dcrire dans les paragraphes suivants. Le nombre de blocs est arbitraire puisquon aurait pu tous les grouper en un seul ensemble ou au contraire les dtailler plus (le squenceur principalement). 1. ENCODEUR Les 16 touches de la tlcommande correspondent chacune un signal dentre 16 bits. En sortie on aura logiquement un signal de 4 bits de "0000" "1111", puisquil existe 24 = 16 possibilits, par exemple pour 5 nous aurons 5 => "0101", pour 1 => "0001" etc. Pour raliser lencodeur en VHDL, nous utiliserons la structure "case ... is when ... ", dont le code, "touche" est lentre de 16 bits, "S" la sortie de 4 bits et appui une autre sortie qui contrle ltat du bloc COMPTEUR_3 et SEQUENCEUR. a) CODE VHDL
entity decodeur is Port ( touche : in STD_LOGIC_VECTOR (15 downto 0); S : out STD_LOGIC_VECTOR (3 downto 0); appui : out STD_LOGIC); end decodeur; architecture Behavioral of decodeur is begin calcul_sortie : process(touche) begin case touche is when "1111111111111110" => S <= "0000" ; appui <= '1'; when "1111111111111101" => S <= "0001" ; appui <= '1'; when "1111111111111011" => S <= "0010" ; appui <= '1'; when "1111111111110111" => S <= "0011" ; appui <= '1'; when "1111111111101111" => S <= "0100" ; appui <= '1'; when "1111111111011111" => S <= "0101" ; appui <= '1'; when "1111111110111111" => S <= "0110" ; appui <= '1'; when "1111111101111111" => S <= "0111" ; appui <= '1'; when "1111111011111111" => S <= "1000" ; appui <= '1'; when "1111110111111111" => S <= "1001" ; appui <= '1'; when "1111101111111111" => S <= "1010" ; appui <= '1'; when "1111011111111111" => S <= "1011" ; appui <= '1'; when "1110111111111111" => S <= "1100" ; appui <= '1'; when "1101111111111111" => S <= "1101" ; appui <= '1'; 4

when "1011111111111111" => S <= "1110" ; appui <= '1'; when "0111111111111111" => S <= "1111" ; appui <= '1'; when others => appui <= '0'; end case; end process; end Behavioral;

b) SIMULATION

Sur le premier signal on envoie successivement le code touche 9 (1111110111111111) puis un code erron (0111110111111111). Lorsque la touche est valide (nombre entre 1 et 16) la sortie correspond (9 en binaire scrit bien 1001) et appui est active. Lorsque le code touche est erron (donc pas dappui) le bit appui passe bien 0. 2. COMPTEUR MODULO 8. En sortie de notre tlcommande nous devons avoir un signal compos de 3 signaux pralablement prpars : le Bit START sur 2 priodes T puis le Code Manchester sur 4 T et enfin - toujours la suite - le Bit STOP sur 2 T. Le signal de sortie sera donc une succession de signaux dune longueur chacun de 8 T. Pour dterminer lequel parmi les 3 signaux primaires doit tre envoy linstant t, on va utiliser un compteur 3 bits, cest--dire 8 possibilits, chacune correspondant une priode. A chaque priode on affectera les bits start, code et stop selon le besoin : Principalement, pour 0 et 1, on activera start, pour 2, 3, 4 et 5 on mettra code 1 et enfin pour 6 et 7 on passera stop 1. a) CODE VHDL
entity compteur is Port ( appui : in stop : out code : out H : in end compteur; architecture Behavioral of compteur is signal c : std_logic_vector (3 downto 0):="0000"; 5 STD_LOGIC; STD_LOGIC; STD_LOGIC; start : out STD_LOGIC;

STD_LOGIC;

RAZ : in STD_LOGIC);

begin process (H) begin if (H'event and H='1') then if (appui='0') then c<="1111"; elsif (RAZ='0' or c="0111") then c <= "0000"; else c <= c + 1; end if; end if; end process; process (c) begin if (c = "0000" or c="0001") then start <= '1'; stop <= '0'; code <= '0'; elsif (c = "0010" or c="0011" or c="0100" or c="0101") then start <= '0'; stop <= '0'; code <= '1'; elsif (c="0110" or c="0111") then start <= '0'; stop <= '1'; code <= '0'; else start <= '0'; stop <= '0'; code <= '0'; end if; end process; end behavioral;

b) SIMULATION

Avec le compteur 3 bits on a bien ce que lon dsire : start sur 2T, code sur 4T et stop sur 2T.
6

3. DIVISEUR DE FREQUENCE La frquence dentre sur le CPLD est de 250 kHz et il est demand de travailler en 10 kHz. On va donc appliquer un diviseur de frquence pour obtenir la frquence dhorloge dsire. On va utiliser un compteur modulo 25 car
250 10

= 25. Tant que

le compteur nest pas gal 24 (de 0 24) on incrmente ce dernier chaque front montant dhorloge 250kHz et chaque fois que lon arrive 24, on applique le signal inverse de celui obtenu la fin du comptage prcdent. a) VHDL
entity frequence_10_5 is port end; architecture behavioral of frequence_10_5 is signal count : std_logic_vector (4 downto 0):="00000"; signal clk_bis : std_logic:='0'; begin process(clk, count, clk_bis) begin if (clk'event and clk='1') then if count="11000" then clk_bis <= not clk_bis; count <= "00000"; clk_out <= clk_bis; else count<=count+1; end if; end if; end process; end behavioral; (clk:in std_logic ; clk_out:out std_logic:='1');

b) SIMULATION

On voit bien sur la simulation que la sortie clk_out change dtat tous les 25 fronts montants : on a dsormais une frquence dhorloge divise par 25, ce qui nous donne ici 10 kHz.
7

4. SEQUENCEUR En entre du squenceur on aura tout dabord le signal 4 bits sortant de lencodeur, suivi du signal appui permettant lactivation du circuit. Dune autre part on aura les 3 bits start, code et stop synchrones qui aideront dterminer la situation de la machine dtats. En sortie se trouvera directement le signal final. Dans le squenceur se trouve la machine dtats. La voici en dtails :

4 diffrents tats sont grs par lautomate : Au REPOS : rien ne se passe, le signal S de sortie est 0. Tant que lon nappuie pas sur une touche (appui=0) ou que le reset est actif, ltat ne change pas. Par contre ds que lon appuie sur un bouton (appui=1), ltat passe ltat START. START : le premier bit start entre en jeu : tant quil est 1, ltat reste inchang. Pendant ce temps, la sortie est 1, puis au bout de 2 priodes, le bit start passe 0 : ltat passe quant lui ltat CODE. CODE : le bit code permet tant quil est 1 de rester dans ce mme tat. Pendant ce temps, le signal de sortie sera le code de notre touche au pralable convertis en code Manchester. Au bout de 4 priodes, le bit code passe 0, ltat devient ltat STOP.
8

A STOP : mme principe que pour les deux tats prcdents, tant que le bit stop est 1 pendant les 2 priodes, ltat reste le mme et le signal est 0 pendant cette dure, puis, ds que stop est 0, si on appuie toujours sur la touche (appui=1), on retourne ltat START, sinon ltat REPOS.

A lautomate sajoutent deux fonctions : un Registre Dcalage et un Convertisseur en Code Manchester. La premire permet de rendre un signal dentre parallle en signal de sortie srie. En entre on a effectivement le code de la touche Q qui est un signal LOGIC VECTOR (3:0) et en sortie, un signal LOGIC (0 ou 1). Par exemple, pour la touche 13 on a Q = 1101, donc au 1ier front montant la sortie sdcalage = 1, au 2me sdcalage = 1, au 3me sdcalage = 0 et au 4me sdcalage = 1. Le convertisseur en code Manchester va utiliser le signal srie de la touche et le transformer. On combinera (ou exclusif : XOR) lhorloge et sdcalage pour obtenir le codage Manchester. a) CODE VHDL
entity sequence is Port (appui : in STD_LOGIC; RAZ : in STD_LOGIC; start : in STD_LOGIC; stop : in STD_LOGIC; code : in STD_LOGIC; H : in STD_LOGIC; S : out STD_LOGIC; Q : inout STD_LOGIC_VECTOR (3 downto 0); code_man : inout STD_LOGIC; D : inout STD_LOGIC; load : inout STD_LOGIC; decalage : inout STD_LOGIC; A : inout std_logic_vector (1 downto 0); code_touche : in STD_LOGIC_VECTOR (3 downto 0)); end sequence; architecture Behavioral of sequence is type etats is (E_Repos,E_Start,E_Code,E_Stop); signal Etat_Present, Etat_Futur : etats; signaux la fois en entre et sortie des process

begin

sequentiel : process(H,RAZ) begin if RAZ='0' then Etat_Present <= E_Repos; elsif (H'event and H='1') then Etat_Present <= Etat_Futur; if (load='1') then Q<=code_touche; end if; if (decalage='1') then Q<= Q(2) & Q(1) & Q(0) & Q(3); end if; end if; end process sequentiel; D<=Q(3); code_man<=(D and H) or ((not D) and (not H)); calcul_etat_futur : process(Etat_Present,appui, start, stop, code) begin case Etat_Present is when E_Repos => if appui='1' then Etat_Futur <= E_Start; elsif (RAZ='0' or appui='0') then Etat_Futur <= E_Repos; end if; when E_Start => if start='1' then Etat_Futur <= E_Start; elsif start='0' then Etat_Futur <= E_Code; end if; when E_Code => if code='1' then Etat_Futur <= E_Code; elsif code='0' then Etat_Futur <= E_Stop; end if; when E_Stop => if stop='1' then Etat_Futur <= E_Stop; elsif (stop='0' and appui='1') then Etat_Futur <= E_Start; elsif (stop='0' and appui='0') then Etat_Futur <= E_Repos; end if; end case; end process; calcul_sortie_A : process (Etat_Present) begin case Etat_Present is when E_Repos => A<="00"; load<='1'; decalage<='0'; 10

when E_Start =>

A<="01"; load<='0'; decalage<='0';

when E_Code =>

A<="10"; load<='0'; decalage<='1';

when E_Stop =>

A<="11"; load<='1'; decalage<='0';

end case; end process; S<='1' when A="01" else code_man when A="10" else '0'; end Behavioral;

b) SIMULATION Il a t trs difficile de simuler le squenceur tout seul car ses entres (start/code/stop et H) sont synchronises par les autres blocs (compteur modulo 8 et diviseur de frquence) et retranscrire ces donnes sur le fichier FORCE est assez complexe. On a donc simul le registre dcalage et le convertisseur en code Manchester part, quant au squenceur on la simul avec le fichier top level. Convertisseur code Manchester

Registre Dcalage

Pour une entre parallle 4 bits (1011 cest--dire la touche 11) il sort chaque front montant respectivement 1, puis 0, puis 1 et enfin 1. Le cycle se rpte tant que la machine dtat est ltat code.

11

Top Level : fichier final

fig 1.

fig. 2 Sur la figure 1 on voit bien la rptition du signal de sortie, et sur la figure 2 on peut confirmer que le bit START est bien sur 2T, que le code Manchester correspond au nombre de la touche et quil est sur 4T et que le bit STOP est sur 2T. Le signal S a un retard dune priode par rapport au train des 3 bits start, code et stop. Ce retard peut tre expliqu par le fait que dans la machine dtat, ltat prsent est calcul par ltat futur et quil y a un front montant dhorloge (et donc une priode) qui spare ces deux tats.

III)

CONCLUSION

Nous avons finalement bien pu obtenir le signal de sortie demand : 1 bit start / le code Manchester / le bit stop. Le plus compliqu a t dordonner le squenceur entre le registre dcalage et la machine dtats. Lors de limplmentation sur la tlcommande, les diodes ne sallumaient correctement. Nous avons essay de rsoudre les problmes mais avons manqu de temps pour re-tester le fichier .jed sur la tlcommande.

12

Você também pode gostar