-- Fichier : racine.vhd -- Synthetisable ? : oui -- Société : ENSERB -- Auteur : P.Nouel -- Date de création : oct 96 -- Contenu : coeur du circuit Racine carree pour Tp Xilinx ------------------------------------------------------------------------------- --------------- SYNTHESE VHDL d'un multiplieur par additions et decalages --- --- Initialisation : i = -1, chargement entree ---- repeter ---- i = i + 1 -- x = x - ( 2 i + 1 ) -- jusqu'a x < 0 -- fin_repeter -- stop ------------------------------------------------------------------------------ LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE ieee.numeric_std.ALL; ENTITY racine IS PORT ( SIGNAL h, raz: IN std_ulogic; SIGNAL e : IN std_ulogic_vector(15 DOWNTO 0); SIGNAL fin_calcul : OUT std_ulogic; SIGNAL r : OUT std_ulogic_vector(7 DOWNTO 0)); END racine ; ARCHITECTURE moore OF racine IS TYPE t_etat IS (debut, add, sous, fin); SIGNAL etat : t_etat; SIGNAL init, plus, moins ,neg : std_ulogic ; SIGNAL acc : unsigned(16 DOWNTO 0); -- pour accumulation SIGNAL res : unsigned(7 DOWNTO 0); -- pour r BEGIN sequenceur: BLOCK BEGIN fsm : PROCESS (h,raz) BEGIN IF (raz = '1') THEN etat <= debut; -- raz asynchrone et prioritaire ELSIF (h = '1' AND h'last_value = '0' AND h'event) THEN -- front montant pour le séquenceur CASE etat IS WHEN debut => etat <= add ; WHEN add => etat <= sous; WHEN sous => IF neg = '1' THEN etat <= fin; ELSE etat <= add; END IF; WHEN fin => etat <= fin; END CASE; END IF; END PROCESS fsm ; -- sorties ( machine de Moore) init <= '1' WHEN etat = debut ELSE '0'; plus <= '1' WHEN etat = add ELSE '0'; moins <= '1' WHEN etat = sous ELSE '0'; fin_calcul <= '1' WHEN etat = fin ELSE '0'; END BLOCK sequenceur; traitement: BLOCK BEGIN ut: PROCESS BEGIN ------ sur front descendant WAIT UNTIL h = '0' AND h'last_value = '1' AND h'event; IF init = '1' THEN res <= "11111111" ; acc <= '1' & unsigned(e); ELSIF plus = '1' THEN res <= res + "00000001"; ELSIF moins = '1' THEN acc <= acc - ( res & '1'); END IF; END PROCESS ut; neg <= acc (8); r<= std_ulogic_vector(res); END BLOCK traitement; END;