Exercices VHDL
Exercices VHDL
ArchOrd (I)
ArchOrd (I)
EXERCISE VHDL
Methodology : Define/understand desired behaviour Draw timing diagram Define entity Define block diagram and identify sequential components Write top-level architecture (often structural) and sub-level architecture (typically behavioural, RTL, ) Write test bench Simulate and validate (correct bugs) Synthesize Verify synthesis result versus expectations
ArchOrd (I)
EXERCISE VHDL
ArchOrd (I)
SOLUTION VHDL
library ieee ; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity StoPConv is port (Clk, Reset, Start, DataIn : in std_logic; DataOut : out std_logic_vector(7 downto 0); Valid : out std_logic); end StoPConv; architecture synth of StoPConv is signal SIPOContenu : std_logic_vector(7 downto 0); signal ValidInt : std_logic; signal Cnt : integer range 0 to 8; begin SIPO: process (Clk) begin if (Clk'event and Clk='1') then if (Reset='1') then SIPOContenu <= (others => '0'); elsif (ValidInt='0') then SIPOContenu <= SIPOContenu(6 downto 0) & DataIn; end if; end if; end process; LatchOut: process (Reset, SIPOContenu, ValidInt) begin if (Reset='1') then DataOut <= (others => '0'); elsif (ValidInt='1') then DataOut <= SIPOContenu; end if; end process;
ArchOrd (I)
SOLUTION VHDL
Counter: process (Clk) begin if (Clk'event and Clk='1') then if (Start='1') then Cnt <= 0; elsif (Cnt /= 7) then Cnt <= Cnt + 1; end if; end if; end process; CounterValid: process (Cnt) begin ValidInt <= '0'; if (Cnt = 7) then ValidInt <= '1'; end if; end process; Valid <= ValidInt; end synth;
ArchOrd (I)
EXERCISE VHDL
Pattern Recognition: A flow of bits are received sequentially on a single signal A 8-bit pattern to identify is received in parallel; a load signal indicates a new pattern The module outputs a found signal to indicate that the last 8 bits received serially are identical to the pattern A clock signal synchronizes all operations Interface: o std_logic or std_logic_vector Inputs: o Reset o Clk o Pattern (8 bits) o Load o DataIn Outputs: o Found
ArchOrd (I)
library ieee ; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;
SOLUTION VHDL
entity Pattern is port (Clk, Reset, Load, DataIn : in std_logic; Pattern : in std_logic_vector(7 downto 0); Found : out std_logic ); end Pattern; architecture synth of Pattern is signal SIPOContenu : std_logic_vector(7 downto 0); signal RegContenu : std_logic_vector(7 downto 0); begin SIPO: process (clk) begin if (Clk'event and Clk='1') then if (Reset='1') then SIPOContenu <= (others => '0'); else SIPOContenu <= SIPOContenu(6 downto 0) & DataIn; end if; end if; end process; Reg: process (Clk) begin if (Clk'event and Clk='1') then if (load='1') then RegContenu <= Pattern; end if; end if; end process; Comp: process (SIPOContenu, RegContenu) begin Found <= '0'; if (SIPOContenu = RegContenu) then Found <= '1'; end if; end process; end synth;
ArchOrd (I)
EXERCISE VHDL
Programmable Counter: Counter of falling edges from 0 to any number (<=15) specified as follows A 4-bit word signals the highest number N to be reached after which the counter restarts from 0; a load signal indicates a new value The module outputs a zero signal when it restarts; the zero signal is thus active for one clock cycle every N+1 cycles Interface: o std_logic or std_logic_vector Inputs: o Reset o Clk o MaxCount (4 bits) o Load Outputs: o Count (4 bits) o Zero
ArchOrd (I)
SOLUTION VHDL
library ieee ; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity Counter is port (Clk, Reset, Load : in std_logic; MaxCount : in std_logic_vector(3 downto 0); Count : out std_logic_vector(3 downto 0); Zero : out std_logic ); end Counter; architecture synth of Counter is signal RegContenu : std_logic_vector(3 downto 0); signal CountContenu : std_logic_vector(3 downto 0); signal CountReset, ResetInt : std_logic; Begin Reg: process (Clk) begin if (Clk'event and Clk='0') then if (load='1') then RegContenu <= MaxCount; end if; end if; end process; Counter: process (Clk) begin if (Clk'event and Clk='0') then if (CountReset='1') then CountContenu <= (others=>'0'); else CountContenu <= CountContenu + 1; end if; end if; end process; Count <= CountContenu; Comp: process (RegContenu, CountContenu) begin ResetInt <= '0'; if (RegContenu = CountContenu) then ResetInt <= '1'; end if; end process; CountReset <= Reset or ResetInt;
ArchOrd (I)
SOLUTION VHDL
CompZero: process (CountContenu) begin Zero <= '0'; if (CountContenu = 0) then Zero <= '1'; end if; end process; end synth;
10
ArchOrd (I)
EXERCISE VHDL
library IEEE; use IEEE.std_logic_1164.all; entity toto is port (A, B, C : in std_logic; Q1, Q2 : out std_logic); end toto; architecture synth of toto is signal V, R : std_logic; begin process (V, C) begin if (V='1) then Q2 <= C; end if; end process; R <= B xor C; process (A) begin if (A'event and A='1') then Q1 <= C; V <= R; end if; end process; end synth;Complter le diagramme des temps suivant:
A B C R V Q1 Q2
11
ArchOrd (I)
SOLUTION VHDL
12
ArchOrd (I)
EXERCISE VHDL
13
ArchOrd (I)
SOLUTION VHDL
14
ArchOrd (I)
EXERCISE VHDL
Le but de cet exercice est de dvelopper un composant effectuant les oprations de rotation. Afin de simplifier le travail, nous nous limiterons des rotations dun maximun de trois positions vers la droite ou vers la gauche, et nous travaillerons avec des mots de huit bits (huit bits dentre, X7,,X0, et huit bits de sortie, Q7,,Q0). Loprateur est dcompos en huit tranches identiques, chacune calculant un bit Qi du rsultat. La sortie Qi dpend de sept bits dentre: Xi+3, Xi+2, Xi+1, Xi, Xi-1, Xi-2 et Xi-3. Trois bits de contrle sont ncessaires: RL indique le sens de la rotation; S1 et S0 codent le nombre de positions de la rotation. Le tableau 1 rsume le fonctionnement dune tranche. On demande de dessiner le circuit correspondant en utilisant uniquement les multiplexeurs deux entres dfinis par le composant VHDL ci-dessous:
component mux_2x1 port ( D0 : in std_logic; D1 : in std_logic; S : in std_logic; Q : out std_logic); -- D0 si S=0; D1 sinon end component; RL 0 0 0 0 1 1 1 1 S1 0 0 1 1 0 0 1 1 S0 0 1 0 1 0 1 0 1 Qi Xi Xi-1 Xi-2 Xi-3 Xi Xi+1 Xi+2 Xi+3 Remarques Aucune rotation Rotation gauche dune position Rotation gauche de deux positions Rotation gauche de trois positions Aucune rotation Rotation droite dune position Rotation droite de deux positions Rotation droite de trois positions Tableau 1
Aprs avoir donn une description VHDL du composant mux_2x1, crire une architecture VHDL structurelle correspondant au circuit dessin au point .
15
ArchOrd (I)
SOLUTION VHDL
16
ArchOrd (I)
SOLUTION VHDL
17
ArchOrd (I)
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY mux_2x1 IS port (D0, D1, S : in std_logic; Q : out std_logic ); END mux_2x1; ARCHITECTURE synth OF mux_2x1 IS BEGIN process (D0, D1, S) begin if S=0 then Q <= D0; else Q <= D1; end if; end process; END synth;
SOLUTION VHDL
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY tranche IS port (S0, S1, RL : in std_logic; X : in std_logic_vector(6 downto 0); Q : out std_logic ); END tranche; ARCHITECTURE struct OF tranche IS component mux_2x1 port (D0, D1, S : in std_logic; Q : out std_logic ); end component; signal Sa1, Sa2, Sa3, Sa4, Sb1, Sb2 : std_logic; BEGIN a1: a2: a3: a4:
b1: mux_2x1 port map (Sa1, Sa2, S1, Sb1); b2: mux_2x1 port map (Sa3, Sa4, S1, Sb2); c1: mux_2x1 port map (Sb1, Sb2, RL, Q); END struct;
18
ArchOrd (I)
SOLUTION VHDL
19
ArchOrd (I)
EXERCISE VHDL
process (CLK, F) begin if CLK=1 then FOUT <= F; end if; end process; end toto;
20
ArchOrd (I)
SOLUTION VHDL
21
ArchOrd (I)
EXERCISE VHDL
Pour implmenter lalgorithme de cryptage IDEA, lopration suivante est ncessaire : S = A + B + cout(A+B) (1)
o les deux entres A et B, ainsi que la sortie S, sont des valeurs non signes sur n bits. Une premire solution nave est celle illustre par la figure 1. Montrer quil est impossible de raliser ce circuit laide dun additionneur retenue propage (oprateur daddition dans le code VHDL). Indication: Montrer que le circuit comporte une boucle combinatoire conduisant dans certains cas des oscillations. Choisissez une petite valeur de n (par exemple n=8) et donnez un exemple dentres A et B provoquant ce phnomne. Proposer deux circuits implmentant lquation (1), sans crer de boucle combinatoire, pour des oprandes de seize bits, et donner les codes VHDL correspondants. Une solution doit tre combinatoire et lautre squentielle (pour ce cas-ci, respecter le timing de la figure 2). Il est interdit dutiliser deux additionneurs en srie.
Figure 1
22
ArchOrd (I)
EXERCISE VHDL
Figure 2
23
ArchOrd (I)
SOLUTION VHDL
Les cas qui provoquent des oscillations sont ceux qui remplissent les deux conditions suivantes: Pour Cin=0, Cout=0 (ce qui implique que Cin va passer 1) Pour Cin=1, Cout=1 (ce qui implique que Cin va passer 0) Ces conditions sont respectes par tous les cas o la somme des oprandes vaut 11111111. Exemple: A = 11111111h B = 00000000h
Squences Etat initial Aprs Tprop additionneur Aprs Tprop inverseur Aprs Tprop additionneur Aprs Tprop inverseur Aprs Tprop additionneur
S U
Cout Cout_inv U 0 0 1 1 0 0 0 1 1 0 0
11111111 00000000
11111111 00000000 11111111 11111111 00000000 11111111 11111111 00000000 00000000 11111111 00000000 00000000 11111111 00000000 11111111
On constate que la sortie S oscille entre les deux valeurs 11111111h et 00000000h. La priode doscillation est fonction du temps de propagation des composants.
24
ArchOrd (I)
SOLUTION VHDL
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY idea IS port ( A, B : in std_logic_vector(15 downto 0); S : out std_logic_vector(15 downto 0) ); END idea; ARCHITECTURE synth OF idea IS signal S1 : std_logic_vector(15 downto 0); signal S2 : std_logic_vector(16 downto 0); BEGIN S1 <= A + B + 1; S2 <= ('0' & A) + ('0' & B); process (S1, S2) begin if (S2(16) = '1) then S <= S2(15 downto 0); else S <= S1; end if; end process; END synth;
25
ArchOrd (I)
SOLUTION VHDL
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY idea IS port ( A, B : in std_logic_vector(15 downto 0); clk, R : in std_logic; S : out std_logic_vector(15 downto 0) ); END idea; ARCHITECTURE synth OF idea_seq IS signal S1 : std_logic_vector(16 downto 0); signal cin : std_logic; BEGIN S1 <= ('0' & A) + ('0' & B) + cin; S <= S1(15 downto 0); process (r, clk) begin if (r = '1') then cin <= '0'; elsif (clk'event and clk='1') then cin <= not S1(16); end if; end process; END synth;
26
ArchOrd (I) Considrer le programme VHDL de la figure 1. Dessiner le schma logique correspondant.
EXERCISE VHDL
Indiquer si les listes de sensitivit des processus this et that contiennent des signaux superflus. Si cest le cas, donner une liste minimale.
library ieee; use ieee.std_logic_1164.all; entity toto is port (a, b, c : in std_logic; f : out std_logic); end toto; architecture titi of toto is signal d, e : std_logic; begin this: process (a, b, c, e) begin if (b'event) and (b = '0') then if c = '1' then f <= a; else f <= not e; end if; end if; end process; that: process (a, b, d) begin if (b = '0') then e <= d; else d <= not a; end if; end process; end titi; Figure 1
27
ArchOrd (I)
SOLUTION VHDL
Les listes de sensibilit minimales : this: process (b) - that: process (a, b ,d )
28
ArchOrd (I)
EXERCISE VHDL
Le tableau suivant donne le code Gray pour les digits dcimaux : 0 1 2 3 4 5 6 7 8 9 0000 0001 0011 0010 0110 0100 0101 0111 1111 1110
Le systme reprsent la figure 2 reoit des digits dcimaux cods en Gray, sur une ligne srielle X (un seul bit dentre, le bit de poids faible le premier). Le dbut de lenvoi dun digit est indiqu par un signal start (cest--dire, start=1 en mme temps que le premier bit dinformation). Il est possible que des erreurs de transmission fassent apparatre des codes faux (ceux napparaissant pas dans le tableau prcdent).
Figure 2
A la fin de lenvoi dun digit, le systme doit afficher en parallle son equivalent dcimal cod en 4 bits, avec un bit E associ pour indiquer une ventuelle erreur de transmission. Dans le cas dune erreur, le digit affich doit tre 1111, avec E=1. (Attention : les 4 bits de D et le bit derreur correspondant doivent tre affichs en mme temps, la fin de lenvoi).
29
ArchOrd (I)
EXERCISE VHDL
La figure 3 donne un exemple de comportement du systme (lentre X reoit les digits 1001 et 0100, dans cet ordre, avec un trou dun coup dhorloge entre les deux).
Figure 3
Ecrire le code VHDL dcrivant une solution pour le systme. Faire le schma logique correspondant et expliquer son fonctionnement.
30
ArchOrd (I)
SOLUTION VHDL
library ieee; use ieee.std_logic_1164.all; entity gray is port (clk : in std_logic; reset : in std_logic; start, x : in std_logic; d : out std_logic_vector (3 downto 0); e : out std_logic); end gray; architecture test of gray is signal shift, ld : std_logic; signal ShiftOut : std_logic_vector (3 downto 0); signal CountOut : std_logic_vector (1 downto 0); signal CountIn : std_logic_vector (1 downto 0); signal addr : std_logic_vector (3 downto 0); signal MemOut : std_logic_vector (4 downto 0); begin compteur: process (start, CountOut) begin CountIn <= "00"; shift <= '1'; ld <= '0'; case CountOut is when "00" => if start='1' then CountIn <= "01"; else shift <= '0'; end if; when "01" => CountIn <= "10"; when "10" => CountIn <= "11"; when "11" => CountIn <= "00"; ld <= '1'; when others => null; end case; end process; process (clk, reset) begin if reset='1' then CountOut <= "00"; else if (clk'event) and (clk='1') then CountOut <= CountIn; end if; end if; end process;
31
ArchOrd (I)
SOLUTION VHDL
sreg: process (clk, reset) begin if reset='1' then ShiftOut <= (others => '0'); else if (clk'event) and (clk='1') then if (start='1') or (shift='1') then ShiftOut <= x & ShiftOut(3 downto 1); end if; end if; end if; end process; addr <= x & ShiftOut (3 downto 1); mem: process (addr) begin case addr is when "0000" when "0001" when "0010" when "0011" when "0100" when "0101" when "0110" when "0111" when "1110" when "1111" when others end case; end process;
=> => => => => => => => => => =>
MemOut MemOut MemOut MemOut MemOut MemOut MemOut MemOut MemOut MemOut MemOut
<= <= <= <= <= <= <= <= <= <= <=
"00000"; "00010"; "00110"; "00100"; "01010"; "01100"; "01000"; "01110"; "10010"; "10000"; "11111";
load: process (clk, reset) begin if reset='1' then d <= "0000"; e <= '0'; else if (clk'event) and (clk='1') then if ld='1' then d <= MemOut (4 downto 1); e <= MemOut (0); end if; end if; end if; end process; end test;
32
ArchOrd (I)
SOLUTION VHDL
Rsultat de la simulation :
33
EXERCISE VHDL
: : : :
architecture fsm of slice is signal current_slice, next_slice : std_logic_vector(1 downto 0); begin slice <= current_slice; register_layer: process (clk, reset) begin if reset=1 then current_slice <= (others => 0); elsif clkevent and clk=1 then current_slice <= next_slice; end if; end process register_layer; behavior: process (current_slice, previous_slice) begin next_slice(1) <= current_slice(0); case previous_slice is when 01 => next_slice(0) <= not current_slice(0); when others => next_slice(0) <= current_slice(0); end case; end process behavior; end fsm;
library ieee; use ieee.std_logic_1164.all; entity counter is port (clk : in std_logic; reset : in std_logic; count : out std_logic_vector (1 downto 0)); end counter; architecture sliced of counter is component slice
34
ArchOrd (I)
port (clk reset previous_slice slice end component; : : : :
EXERCISE VHDL
in std_logic; in std_logic; in std_logic_vector(1 downto 0); out std_logic_vector(1 downto 0));
signal bootstrap : std_logic_vector(1 downto 0); signal slices_collection : std_logic_vector(3 downto 0); begin bootstrap <= 01; first_slice: slice port map (clk => clk, reset => reset, previous_slice => bootstrap, slice => slices_collection(1 downto 0)); count(0) <= slices_collection(1); second_slice: slice port map (clk => clk, reset => reset, previous_slice => slices_collection(1 downto 0), slice => slices_collection(3 downto 2)); count(1) <= slices_collection(3); end sliced;
a. Dessinez le schma logique de lentit counter b. Dessinez le graphe des tats de la machine squentielle de lentit slice c. Dcrivez le comportement de la sortie count, en indiquant la squence dtats pour chaque tranche (slice), partir du reset initial.
35
ArchOrd (I)
SOLUTION VHDL
a.
c. First_Slice:
36
ArchOrd (I)
EXERCISE VHDL
Supposez un systme qui contrle louverture dune porte, aprs introduction dun code de 4 digits sur un clavier. Le clavier possde 7 touches numriques, de 0 6, et une touche <del> permettant leffacement du dernier digit introduit. Lorsquune touche est presse, un code binaire sur 3 bits est envoy au systme (signal keycode), ainsi quun signal keyon, actif tant que la touche est presse (le code envoy pour la touche <del> est 111). Si la squence 3625 est introduite, quel que soit ltat du systme, un signal opendoor est produit pendant un seul cycle dhorloge, pour commander louverture de la porte.
opendoor
37
ArchOrd (I)
Keycode clk
SOLUTION VHDL
In
Shift_Reg
shift_right_3 shift_left_3
12
Keyon
Controler
Opendoor
Signals Status
reset
s0
Keyon='0' -
ArchOrd (I)
SOLUTION VHDL
library ieee; use ieee.std_logic_1164.all; entity porte is port (clk reset keyon keycode opendoor end porte;
: : : : :
architecture synth of porte is type typeetat is (S0, S1, S2); signal state, next_state : typeetat; signal reg : std_logic_vector(11 downto 0); signal ld_shift_right_3, shift_left_3 : std_logic; begin shiftreg: process(clk, reset) begin if reset='1' then reg <= (others=>'0'); elsif (clk'event and clk='1') then if (ld_shift_right_3='1') then reg <= keycode & reg(11 downto 3); elsif (shift_left_3='1') then reg <= reg(8 downto 0) & "000"; end if; end if; end process shiftreg;
sync: process(clk, reset) begin if (reset='1') then state <= s0; elsif (clk'event and clk='1') then state <= next_state; end if; end process sync;
ArchOrd (I)
SOLUTION VHDL
ctrl: process(state, keycode, keyon, reg_contenu) begin ld_shift_right_3 <= '0'; shift_left_3 <= '0'; next_state <= state; opendoor <= '0'; case state is when s0 => if (keyon='1') then if(keycode="111") then shift_left_3 <= '1'; else ld_shift_right_3 <= '1'; end if; next_state <= s1; end if; when s1 => if (reg="101010110011") then opendoor <= '1'; next_state <= s2; elsif (keyon='0') then next_state <= s0; end if; when s2 => if (keyon='0') then next_state <= s0; end if; end case; end process ctrl;
-- 5'2'6'3
end synth;
40
ArchOrd (I)
EXERCISE VHDL
-- beh
A_i <= ('0' & A); B_i <= ('0' & B); C_i <= ('0' & carry); sum <= A_i + B_i + C_i; C <= sum(0); process (CLK, nRST) begin -- process if nRST = '0' then carry <= '0'; elsif CLK'event and CLK = '1' then carry <= sum(1); end if; end process; end beh;
41
ArchOrd (I)
1. Dessinez le schma logique correspondant.
EXERCISE VHDL
2. Dessinez un diagramme de temps pour les signaux A, B, C et carry lorsque les valeurs 10112 et 00102 sont envoyes en srie (en commenant par le bit de poids faible) sur les entres A et B, respectivement. Dessinez les 6 premiers cycles dhorloge. 3. Dcrivez en une phrase la fonction du circuit. Expliquez quel rle a dans l'algorithme le composant ralis par les lignes: elsif CLK'event and CLK = '1' then carry <= sum(1); end if;
42
ArchOrd (I)
SOLUTION VHDL
1.
2.
FF delay clk A B C Carry FF delay
1 0 1
1 1 0
0 0 1
1 0 1
3. Ce composant est un additionneur srie. (Les oprandes sont entrs en srie et le produit est dlivr en srie, au fur et mesure: 1 -> 0 -> 1 -> 1) L'tat du report (Carry) est mmoris dans une bascule pour l'addition du bit suivant (de poids suprieur).
43
ArchOrd (I)
EXERCISE VHDL
Considrez un systme qui envoie 256 mots de 8 bits sur une ligne parallle. Le transmetteur est un composant parfaitement synchrone sur le flanc montant dun signal dhorloge CLK. Il lit les 256 mots transmettre dune mmoire asynchrone. Il commence la transmission le cycle suivant la rception du signal de START. Il transmet en squence tous les mots partir de ladresse 0 jusqu ladresse 255 ; il envoie la fois le mot lui-mme (sur le bus DATA) et son numro identificateur (sur le bus NUM). En mme temps il active le signal VALID. Aprs le 256e mot (dont lidentificateur est 255), il se remet en attente du signal START pour un nouvel envoi.
a. Dessinez un schma blocs possible pour le transmetteur TX. Utilisez des composants classiques tels que portes logiques, registres, additionneurs, etc. Si vous utilisez un contrleur, dessinez le diagramme des tats complet. b. Ecrivez le code VHDL qui ralise le transmetteur. c. Il se trouve que le canal sur lequel les data sont envoyes ne garantit pas une bonne transmission. On modifie le transmetteur pour quil implmente le protocole dacquittement suivant : Le transmetteur reoit des acquittements de la part du rcepteur lorsque le signal ACK est actif. Si ACK est actif, le transmetteur peut lire le numro du mot acquitt sur le bus ACKNUM. Ces acquittements informent le transmetteur du dernier mot bien reu destination. Remarquez que le rcepteur nest tenu ni acquitter
44
ArchOrd (I)
EXERCISE VHDL
chaque mot individuellement, ni le faire un moment prcis (avec la limitation ci-dessous). Le transmetteur nenvoie jamais plus que 4 mots sans avoir reu dacquittement. Si cela arrive, au lieu denvoyer un cinquime mot, il revient en arrire et recommence transmettre partir du premier mot qui na pas t acquitt. Cela se rpte tant quun nouveau mot nest pas acquitt.
Remarquez que les mots 1, 2 et 4 ne sont jamais acquitts et que cela na aucun impact sur la transmission. Notez aussi que, au contraire, le retard des acquittements aprs le mot 5 fait que aprs avoir envoy les quatre mots 6, 7, 8 et 9 le transmetteur recommence envoyer partir du mot 6. Modifiez le schma blocs du transmetteur TX pour raliser ce protocole. Ignorez les dtails du protocole la fin de
45
ArchOrd (I)
EXERCISE VHDL
lenvoi des 256 mots (par exemple, garantissez juste larrt du systme aprs le premier envoi du mot 255). Discutez en dtail ou ralisez les modifications significatives au code VHDL.
46
ArchOrd (I)
SOLUTION VHDL
a) Le transmetteur doit effectuer la tache suivante : chaque fois que start est actif, il doit lire et transmettre le contenu de la mmoire. Pour ce faire, il doit gnrer successivement les adresses de 0 255. Une fois la mmoire lue et transmise, le transmetteur se remet en attente du signal start. Le schma blocs du transmetteur est donc constitu dun compteur qui a les proprits suivantes : Il commence compter depuis 0 quand start devient actif. Il sarrete de compter lorsquil a atteint 255. Il recommence compter depuis 0 quand start est activ nouveau. Lidentifiant dune donne est choisie comme son adresse. Le schma bloc ci-dessous effectue cette tache.
47
ArchOrd (I) b)
entity transmetteur-basic ( START : IN std_logic ; CLK : IN std_logic ; RST : IN std_logic ; MEMDATA : IN std_logic_vector(7 downto 0); DATA : OUT std_logic_vector(7 downto 0); MEMADDR : OUT std_logic_vector(7 downto 0); NUM : OUT std_logic_vector(7 downto 0); VALID : OUT std_logic) architecture synth of transmetteur-basic is
SOLUTION VHDL
signal enable, countNotZero : std_logic; signal count: std_logic_vector(7 downto 0); signal next_count: std_logic_vector(7 downto 0); begin DATA <= MEMDATA; NUM <= count; MEMADDR <= count; VALID <= enable; enable <= start_int or countIszero; countNotzero <= 1 when not(count = 00000000) else 0; comb: process(count, enable) begin next_count <= count; if enable = 1 then next_count <= count + 1; end if; end comb; reg: process(CLK, RST) begin if RST = 1 then count <= (others = 0); start_int <= 0; elsif CLKevent and CLK=1 then count <= next_count; start_int <= start; end if; end reg; end synth;
48
ArchOrd (I)
SOLUTION VHDL
c) Le transmetteur doit maintenant garder en mmoire, en plus de ce quil fait en a), lidentificateur du dernier mot recu correctement par le rcepteur. Au cas ou ladresse du prochain mot transmettre est suprieure de 4 lidentificateur ACK_NUM recu du rcepteur, ladresse gnre par le transmetteur est le dernier ACK_NUM + 1. Le schema bloc est modifi comme suit :
49
ArchOrd (I)
SOLUTION VHDL
De plus, la valeur du registre ack_reg est prise en compte pour la nouvelle valeur du registre count :
comb : process (count, ack_reg, enable) begin next_count <= count; if count = ack_reg +4 then next_count <= ack_reg + 1; elsif enable = 1 then next_count <= count + 1; end if; end comb ;
50
ArchOrd (I)
EXERCISE VHDL
Dessinez le circuit correspondant au code VHDL suivant (tous les signaux sont du type std_logic) :
architecture synthesizable of test is signal E : std_logic; begin process (A, B, C, D, E) begin if A'event and A = '0' then if B = '0' then E <= C; else E <= D; end if; F <= E; end if; end process; end synthesizable;
a. Dessinez le circuit correspondant si le signal E tait remplac par une variable. b. Considrez maintenant le code VHDL suivant :
architecture synthesizable of test is begin process (A, B, C, D) variable E : std_logic; begin if A'event and A = '0' then F <= E; if B = '0' then E := C; else E := D; end if; end if; end process; end synthesizable;
Est-ce quil correspond au mme circuit que lun des deux circuits dessins aux points a. ou b. ? Si oui, lequel ? Expliquez brivement votre rponse.
51
ArchOrd (I)
SOLUTION VHDL
52
ArchOrd (I)
SOLUTION VHDL
La valeur de la variable E est assigne immdiatement et utilise tout de suite pour F. Sa valeur entre deux excutions du process est donc inutile. c) Entre deux excutions du process, la variable E garde en mmoire sa valeur. Pour effectuer cette mmorisation, il faut une bascule. Ce cas est par consquent identique celui de a).
53
ArchOrd (I)
EXERCISE VHDL
Considrez lopration arithmtique de division entre deux entiers non signs. Elle peut se raliser en reprsentation binaire exactement selon la mme mthode quon utilise en dcimal dans le calcul lmentaire : on considre itrativement des groupes de chiffres du dividende partir de la gauche et on y soustrait le plus grand multiple possible du diviseur. Le multiple utilis reprsente un chiffre du quotient, calcul de gauche a droite. Le dernier rsultat de la soustraction reprsente le reste de la division. Etudiez laide de cet exemple le procd en binaire :
Pour effectuer la division, on excute les pas suivants jusqu' que tous les chiffres du dividende aient ts considrs : 1. Ajoutez un chiffre du dividende au groupe de chiffres considrs, en prenant en compte les chiffres du dividende partir de la gauche. la premire itration, considrez seulement le bit de poids fort. 2. Si les chiffres considrs reprsentent un nombre plus grand ou gal au diviseur, soustrayez le diviseur des chiffres considrs ; autrement soustrayez zro. 3. Si vous avez soustrait le diviseur, ajoutez droite un 1 au quotient ; autrement, ajoutez 0. Rptez partir du pas 1 tant quil reste des chiffres au dividende. On veut implmenter un tel oprateur avec plusieurs copies dun circuit qui ralise exactement une itration de lalgorithme dcrit ci-dessus (pas de 1 a 3).
54
ArchOrd (I)
EXERCISE VHDL
a. Dcrivez les signaux dentre et de sortie du circuit qui ralise une itration de lalgorithme de division. Spcifiez le nombre de bits ncessaires pour encoder chacun des signaux et expliquez clairement la prcision requise. (Supposez que toutes les copies de ce circuit sont identiques, mme si certaines pourraient tre simplifies). b. Combien de bits sont ncessaires pour coder le quotient ? Combien pour coder le reste ? Combien de copies du circuit ci-dessus sont ncessaires pour raliser une division ? Montrez avec un schma blocs comment connecter les copies du circuit et ralisez ainsi un diviseur complet. c. Dessinez le schma blocs du circuit qui ralise une itration de la division. Utilisez exclusivement des additionneurs, soustracteurs, multiplexeurs et portes logiques lmentaires, selon ncessit. d. Ecrivez le code VHDL du circuit qui ralise une itration de la division.
55
ArchOrd (I)
SOLUTION VHDL
a) La figure ci-dessous reprsente le circuit (DividerBlock) qui effectue une itration de lalgorithme de division.
Le circuit en question a comme entres : un bit du dividende (DividendBit), trois bits issus de litration prcdente (Input) et, le diviseur (Divider), cod sur 3 bits. Commentaires : 1. Lentre Input doit contenir 3 bits et non pas 2. En effet, Input reprsente un reste de la division partielle de letage prcdent. Il ne peut donc reprsenter au maximum la valeur (diviseur 1), qui requiert le mme nombre de bits que le diviseur. 2. Le circuit a les sorties : QuotientBitle bit du quotient qui est obtenue litration en question, et, Output3 bits de reste utiliss lors de litration suivante, ou, pour obtenir le reste final, lors de la dernire itration. b) Le quotient compte 6 bits (considrez la division par 1). Le reste est cod sur 3 bits (voir le commentaire sur la prcision de Input). 6 copies du circuit DividerBlock sont ncssaires, puisque que chacune fournit un bit du quotient.
56
ArchOrd (I)
SOLUTION VHDL
Q(5)
Q(4)
Q(3)
Q(2)
Q(1) Q(0)
57
ArchOrd (I)
SOLUTION VHDL
Notez bien que le bit de poids fort aprs soustraction (quivalent un bit de signe en complment deux) permet dobtenir directement de bit de quotient par inversion : si le rsultat de la soustraction est ngatif, le bit du quotient est nul. d) Le circuit est compltement combinatoire.
process(Input, DividendBit, Divider) signal sub : std_logic_vector(3 downto 0); begin sub <= (input & DividendBit) - (0 & divider); quotientBit <= not sub(3); if sub(3) = 0 then Output <= sub(2 downto 0); else Output <= Input(1 downto 0) & DividendBit; end if; end process;
58
ArchOrd (I)
EXERCISE VHDL
b. Pour chaque composant du circuit dessin, expliquez en une dizaine de mots pourquoi le code donn lui correspond. Ecrivez une autre version de ce circuit en VHDL, en utilisant un processus spar pour chaque composant.
59
ArchOrd (I)
SOLUTION VHDL
b) Le signal H est issu dun multiplexeur a 4 entres. Le signal F est mis jour seulement lorsque A(1) vaut 0, et, prend alors une valeur dpendent de A(0). Quant au signal G, il est seulement mis a jour lorsque A(0) et A(1) sont diffrents. Le code VHDL suivant dcrit le mme circuit :
library ieee; use ieee.std_logic_1164.all; entity test is port ( A : in std_logic_vector(1 downto 0); B, C, D, E : in std_logic;
60
ArchOrd (I)
F, G, H end test; : out std_logic);
SOLUTION VHDL
architecture synthesizable of test is signal Fmux,ADiff : std_logic; begin ADiff <= A(0) xor A(1); mux0: process (A, B, C, D, E) begin case A is when "00" => H <= B; when "01" => H <= C; when "10" => H <= D; when "11" => H <= E; when others => null; end case; end process; mux1: process (A, B, C) begin if A(0) = 0 then Fmux <= B; else Fmux <= C; end if; end process;
latch0: process (A, Fmux) begin if A(1) = 0 then F <= Fmux; end if; end process; latch1 : process (ADiff, B) begin if ADiff = 1 then G <= B; end if; end process; end synthesizable;
61
EXERCISE VHDL
A l'activation du signal START, on effectue chaque cycle les tches suivantes : 1) Lecture des oprandes A et B une adresse des mmoires MEM_OP_A et MEM_OP_B respectivement. 2) Addition des oprandes lus A et B pour produire la somme S. 3) Ecriture de la somme S dans la mmoire MEM_SUM la mme adresse. 4) Incrmentation de ladresse. La squence commence l'adresse 0 et se poursuit jusqu' l'adresse 31, c'est--dire lorsque les 32 oprandes contenus dans les mmoires MEM_OP_A et MEM_OP_B ont t additionns et les 32 sommes crites dans MEM_SUM. Lors de la dernire itration, le signal DONE est actif pendant un cycle. Les signaux de contrle ADDR, WRITE_EN et DONE sont gnrs par un contrleur. L'activation du signal START est ignore lorsque le signal ADDR est diffrent de 0. Le chronogramme suivant illustre le fonctionnement du systme :
62
ArchOrd (I)
EXERCISE VHDL
a. Soit Tread le temps d'accs en lecture aux mmoires MEM_OP_A et MEM_OP_B. Soit Tadd le temps ncessaire pour effectuer une addition. Soit Twrite lintervalle entre (a) le moment o la valeur crire doit tre prsente lentre de la mmoire MEM_SUM et (b) le flanc montant de lhorloge. Soit Tcycle la priode de l'horloge du systme. Donnez une relation entre ces paramtres afin que le systme fonctionne correctement. Que pourrait-on faire si cette relation n'tait pas vrifie? b. Dcrivez le fonctionnement du contrleur par une machine tats finis. Dessinez le diagramme des tats. Sagit-il dune machine de Mealy ou Moore ? c. A partir de la machine tats finis, dcrivez le contrleur du systme en VHDL. d. Il se peut que l'additionneur commette parfois des erreurs. On utilise donc un additionneur capable de dtecter certaines de ces erreurs. En plus des entres et sorties ordinaires, il a un signal de sortie ERROR qui indique si le calcul ralis est erron. On veut modifier le systme dcrit au dbut pour prendre en compte ce signal derreur. Lorsque le signal ERROR est actif, le contrleur maintient les adresses inchanges jusqu' ce que ladditionneur ait corrig lerreur, ce qui dsactive donc ERROR. La somme est alors crite normalement dans MEM_SUM. Modifiez le contrleur du systme (graphe des tats et VHDL) pour implmenter cette correction derreurs. e. On veut maintenant construire cet additionneur qui dtecte des erreurs. Pour cela on note p(X) la parit d'un mot de nbits: p(X) = X0 xor X1 xor X2 xor Xn-1. On appelle C le mot compos par les retenues (carries) internes un additionneur retenue propage (ripple-carry adder) construit partir dadditionneurs complets (full adders). La dtection derreur se base sur le fait que laddition prserve la relation de parit suivante: p(A) xor p(B) = p(C) xor p(S).
63
ArchOrd (I)
EXERCISE VHDL
A partir dun additionneur ripple carry 3-bit, dessinez le schma blocs interne d'un additionneur utilisant cette relation de parit et dont linterface externe est la suivante :
3 A p(A) 4 3 B p(B) Error S p(S)
Comme indiqu dans la figure, ladditionneur reoit les signaux de parit dj calculs et doit produire le signal de parit pour la somme.
64
ArchOrd (I)
SOLUTION VHDL
a) Puisque les oprations 1), 2), 3) et 4) sont effectues durant le mme cycle, il faut que Tread +Tadd + Twrite < Tcycle . Si cela nest pas le cas,une solution qui ne change pas les caractristiques des mmoires et de ladditionneur est dintroduire un registre entre les mmoires doprandes et ladditionneur. Cette modification implique deux conditions : Tread < Tcycle et Tadd + Twrite < Tcycle. . qui sont plus facilement vrifies que la premire. b) Pour contrler le systme, on peut utiliser un compteur de 5 bits avec enable .La machine tats fini correspondante est dcrite dans la Figure ci-dessous.
Figure 1 Ltat du compteur est counter . Il sagit dune machine de Mealy parce que le signal DONE prends les valeurs 0 et 1 dans ltat Count . Il est possible de dcrire le contleur par une machine de Moore, comme fait dans la figure ci-dessous :
65
ArchOrd (I)
SOLUTION VHDL
66
ArchOrd (I)
SOLUTION VHDL
c)
Le VHDL dcrivant le systme complet avec une machine dtat comme celle de la figure 1 est :
entity MEM_ADDR_MEM( clk : in std_logic; start : in std_logic; addr : in std_logic_vector(4 downto 0); A : in std_logic; B : in std_logic; S: out std_logic; write_en : std_logic; done: out std_logic); architecture synth of MEM_ADDR_MEM is type state_t is (WaitStart, Count) ; signal state, next_state : state_t; signal counter, next_counter: std_logic_vector(4 downto 0); signal enable: std_logic;
begin S <= A + B; addr <= counter; write_en <= enable; reg : process(clk) begin if clkevent and clk=1 then state <= next_state; counter <= next_counter; end if end process reg; comb_count: process(counter, enable) begin next_counter <=counter; if enable = 1 then next_counter <= counter + 1; end if;
67
ArchOrd (I)
SOLUTION VHDL
end process comb_count; enable <=1 when state = Count else 0; comb_state: process(counter, state, start) begin next_state <=state; if start = 1 and state = WaitStart then next_state <= Count; elsif counter = 11111 then next_state <= WaitStart; end if; end process comb_state; comb_out: process(counter,) begin done <=0; if counter = 11111 then done <= 1; end if; end process comb_out; end architecture synth;
68
ArchOrd (I)
SOLUTION VHDL
e) Comme indiqu dans la figure ci-dessous, la valeur binaire p(A)xor p(B) est compare la valeur binaire p(C)xor p(S).
Comme la relation de lnonc ne prcise pas comment les valeurs binaires p(C) et p(S) sont obtenues, dautres solutions incluant plus de bits dans le calcul des parit sont considrs correctes
69
ArchOrd (I)
EXERCISE VHDL
a. Dessinez le circuit dcrit par ce code. Est-il squentiel ou combinatoire? Justifiez votre rponse de faon concise. b. Dcrivez dans une table la valeur de D en fonction des 8 combinaisons possibles pour les signaux A, B, et C. c. Ecrivez en VHDL le code d'un process dcrivant le mme circuit en utilisant des variables pour s1, s2 et s3.
70
ArchOrd (I)
SOLUTION VHDL
Ce circuit est combinatoire, puisque (a) tout changement des signaux A, B, ou C provoque lvalution des signaux s1, s2, et s3, et (b) son tour, tout changement des signaux s1, s2, ou s3 provoque lvaluation du signal D. Par consquent, dpend uniquement des entres A, B, et C, i.e., le circuit est combinatoire.
sensitivit du process conduit une situation o, probablement, le circuit simul comporte des latch, et le circuit synthtis est combinatoire car le synthtiseur ne prend pas en compte la liste de sensitivit telle que figurant dans le fichier VHDL. Cest donc une situation viter.
71
ArchOrd (I)
SOLUTION VHDL
b)
72
ArchOrd (I)
SOLUTION VHDL
c)
signal A, B, C, D: std_logic; ... process(A, B, C, s1, s2, s3) variable s1, s2, s3: std_logic; begin s2 := A xor B; s3 := A xor C; if s3 = '1' then s1 := C; else s1 := A; end if;
if s2 = '0' then D <= A; else D <= s1; end if; end process;
Il est ncessaire dassigner les variables pour s1, s2 et s3 avant leur utilisations lors des tests et/ou affectations. Autrement, la variable garde la dernire valeur qui lui a t assigne et se comporte donc comme lment de mmoire.
73
ArchOrd (I)
EXERCISE VHDL
Lalgorithme CORDIC ( COordinate Rotation DIgital Computer ) permet de calculer les fonctions trigonomtriques en utilisant les formules itratives :
xi +1 = xi d i y i 2 i , y i +1 = y i + d i xi 2 i , z i +1 = z i d i tan 1 (2 i ) ,
o d i =
X, y0 = 0 et z0 = ) sont les
et
y n = An x 0 sin( ) .
On utilise ces formules pour calculer les fonctions trigonomtriques dun angle . Le schma du systme qui ralise cette fonctionnalit est donn dans la figure suivante :
74
ArchOrd (I)
EXERCISE VHDL
On effectue 10 itrations pour calculer les fonctions trigonomtriques de nombres signs reprsents en complment deux sur 11 bits. Les entres X0, Y0 et Z0 servent charger avant le dbut du calcul les registres avec leur constantes dinitialisation (vous ne devez pas vous soucier du choix de ces valeurs initiales). La mmoire ROM contient les coefficients tan 1 (2 i ) dj calculs ( ladresse 0 de la ROM on trouve le coefficient de litration 0, ladresse 1 le coefficient de litration 1, etc.). Les signaux de contrle xop_sel, yop_sel et zop_sel dterminent lopration de lALU : si le signal de contrle est zro, lALU ralise une addition, autrement une soustraction. Les multiplexeurs sont contrls par les signaux xmux_sel, ymux_sel et zmux_sel comme indiqu dans la figure. Le bit de poids fort du registre Zreg est connect au signal sgn_z, indiquant donc le signe du nombre qui y est mmoris. a. Quelle est la fonction des deux blocs inconnus identifis par un point dinterrogation sur le schma ? Dcrivez-les en VHDL. Quelle est la taille de la mmoire ROM ? Quelle est la taille en bits des signaux ROM_addr et shn ? b. Quels sont les signaux ncessaires en entre du contrleur pour oprer ce circuit ? Quelles sont ses sorties ? Supposez que le signal StartCordic indique au contrleur le dbut de lexcution et que le signal EndCordic est gnr par le contrleur et indique la fin dexcution et la validit du rsultat. Ceci est rsum sur le chronogramme suivant :
75
ArchOrd (I)
EXERCISE VHDL
c. Dessinez le diagramme dtat de la machine tats finis (FSM) en charge de contrler lexcution de lalgorithme. d. Ecrivez le code VHDL du contrleur complet. e. Est-il utile de continuer le calcul aprs le 10me cycle pour augmenter la prcision du rsultat ? Justifiez votre rponse. f. Le systme propos ne permet quun calcul la fois : pour commencer une nouvelle srie ditrations, on doit attendre que la srie prcdente soit termine. En supposant que vous avez un nombre dALUs illimit disposition, suggrez le schma dun systme droul permettant de produire des nouveaux rsultats chaque cycle dhorloge.
76
ArchOrd (I)
SOLUTION VHDL
a) Les deux blocs inconnus permettent de calculer xi 2 i et yi 2 i dans les formules itratives. Comme il sagit de division avec des puissances de deux, il suffit davoir des blocs qui font le dcalage arithmtique droite. Donc, les deux blocs implmentent la fonctionnalit Shift Right Arithmetic (SRA montrs dans la figure ci-dessous). La valeur lentre du bloc est dcale arithmtiquement droite par shn (de 0 10, donc, il nous faut 4 bits pour le signal) positions. La mmoire ROM doit stocker 10 coefficients, sa taille est, donc, 16 mots dont 10 sont utiliss. Pour adresser une mmoire de cette taille, il nous faut un signal de 4 bits (ROM_addr dans la figure). Le code VHDL de SRA est donn ensuite.
entity SRA is port( XY : in std_logic_vector(10 downto 0); shn : in std_logic_vector(3 downto 0); S: out std_logic_vector (10 downto 0); ) end entity SRA;
77
ArchOrd (I)
SOLUTION VHDL
architecture SRA_behav of SRA is begin shift: process(shn, XY) variable num: integer; begin num := unsigned(shn) S<=(10 downto 10-num=>XY(10)) & XY(9 downto num); end process shift; end architecture SRA_behav;
b) Le signal en entre du contrleur est StartCordic. Les sorties sont tous les signaux ncessaires pour oprer ce circuit (xreg_ld, yreg_ld, zreg_ld, xmux_sel, ymux_sel, zmux_sel, shn, ROM_addr), plus le signal EndCordic. Les signaux xop_sel, yop_sel, zop_sel dpendent seulement du signal sgn_z et ne sont pas sorties du contrleur. c) La figure ci-dessous montre le diagramme dtat de la machine tats finis (FSM) en charge de contrleur. Les sorties de la machine dpendent de son tat, comme la figure le montre.
78
ArchOrd (I)
SOLUTION VHDL
79
ArchOrd (I)
SOLUTION VHDL
-- comput state case fsm_state is when Idle => if (StartCordic = '1') then next_state <= Init; end if; when Init => xreg_ld <= 1; yreg_ld <= 1; zreg_ld <= 1; reset_cnt <= 1; next_state <= Count; when Count => xreg_ld <= 1; yreg_ld <= 1; zreg_ld <= 1; xmul_sel <= 1; ymul_sel <= 1; zmul_sel<=1; increase_cnt <= 1; ROM_addr <= stdlogic(cnt,4); Shn <= stdlogic(cnt,4); if (cnt >= 8) then next_state <= End; end if; when End => EndCordic <= 1; xmul_sel <= 1; ymul_sel <= 1; zmul_sel<=1; ROM_addr <= stdlogic(cnt,4); Shn <= stdlogic(cnt,4); next_state <= Idle; end case; end process fsm_compute_state; end architecture CORDIC_FSM;
e) Il nest pas utile de continuer le calcul aprs le 10me cycle car la prcision de nombres utiliss est sur 11 bit. La poursuite des itrations produit seulement des oscillations au tour du point de convergence. f) On pourrait imaginer un circuit droul qui permet de commencer un nouveau calcul chaque cycle dhorloge. En droulant le circuit, on multiplie les ressources utilises. Entre chaque deux stages, il faut insrer des registres. A travers ces registres, les valeurs intermdiaires dun calcul peuvent avancer vers la sortie, en devenant de plus plus finales. On appelle ce type de transformation pipelining car la faon de traitement ressemble un pipe . La figure ci-dessous donne une ide de pipelining du circuit CORDIC.
80
ArchOrd (I)
SOLUTION VHDL
81
EXERCISE VHDL
ARCHITECTURE arch OF ent IS a, b, c, d, e, f, g, h, sel : STD_LOGIC; BEGIN dout <= h; d <= NOT din; c <= NOT b; f <= NOT e; sel <= g XOR h; a <= d WHEN sel = '1' ELSE g; p1 : PROCESS (t1, a, c) BEGIN IF t1 ='1' THEN b <= a; ELSE h <= c; END IF; END PROCESS p1; p2 : PROCESS (t2, din, f) BEGIN IF t2 ='1' then e <= din; ELSE g <= f; END IF; END PROCESS p2; END ARCHITECTURE arch;
a. Dessinez le schma logique du circuit dcrit par ce code. b. Ce circuit est-il combinatoire ou squentiel? Justifiez votre rponse de la faon la plus prcise et la plus concise possible. c. Le circuit entre les signaux din, t2 et g reprsente, une petite exception prs, un composant trs frquemment employ. Lequel ? Dessinez un circuit quivalent cette partie du schma en utilisant ce composant.
82
ArchOrd (I)
SOLUTION VHDL
a)
b)
Le circuit est squentiel puisquil contient des latches. Autrement dit, ces lments de mmoire font que la sortie ne dpend pas uniquement que des entres.
c)
Un flip flop est constitu de 2 latches interconnectes par un inverseur et dont les enable ont des polarits opposes. On peut donc dessiner le circuit quivalent suivant.
Il sagit dun flip-flop, actif au flanc descendant de lhorloge, dont la sortie est linverse de lentre.
83