2017-05-05 2 views
1

Je sais que cette erreur a été rencontrée plusieurs fois sur SO, mais en tant que débutant Je suis toujours incapable de voir comment résoudre cette erreur dans mon propre code. L'erreur et le code sont tous deux imprimés ci-dessous, merci à tous pour leur contribution. L'erreur est répétée pour chaque bit de 'compte' et se réfère à la ligne notée dans le code.Erreur de code VHDL: "Erreur (10818): Impossible de déduire le registre pour <name> à <location> car il ne détient pas sa valeur en dehors du bord de l'horloge"

ARCHITECTURE behavioral OF 5bit_PHreg_vhdl IS 
SIGNAL count : STD_LOGIC_VECTOR(4 DOWNTO 0); 

BEGIN 
    PROCESS(reset, clk, SHR_EN) 
     BEGIN 
-- Check if asynchronous reset is 0 
     IF reset = '0' THEN --ERROR OCCURS HERE 
       count <= "00000"; 
-- Check if rising edge 
     ELSIF (clk'EVENT AND clk = '1') THEN 
       IF LD_EN = '1' THEN 
        count <= FA_in; 
       END IF; 
-- Check if SHR_EN is active 
     ELSIF (SHR_EN = '1') THEN 
       count(4) <= c_in; 
       count(3) <= count(4); 
       count(2) <= count(3); 
       count(1) <= count(2); 
       count(0) <= count(1); 
       c_out <= count(0); 
     END IF; 
    END PROCESS; 
    PH_reg_out <= count; 
END behavioral; 
+0

N'utilisez pas 'else' ou' elsif' après 'IF (clk'EVENT AND clk = '1')'. De plus, utilisez 'rising_edge (clk)' au lieu de 'clk'EVENT AND clk = '1''. Lire [HERE] (http://vhdlguru.blogspot.com/2010/04/difference-between-risingedgeclk-and.html) pourquoi. Je ne peux pas vous donner de réponse détaillée, parce que vous n'avez fourni qu'une partie du code, et je n'ai pas expliqué ce qu'il devrait faire. Fournissez [mcve]. – Staszek

+0

'ELSIF (SHR_EN = '1') THEN' est en dehors des conditions de réinitialisation et de bord d'horloge, sa forme n'est pas reconnue pour la synthèse. Déplacez-le et les affectations suivantes à l'intérieur de la fin précédente si c'est enregistré. Supprimez SHR_EN de la liste de sensibilité du processus. – user1155120

+0

Merci à tous ceux qui ont commenté. Je me rends compte maintenant que j'ai posté impulsivement et n'a pas adhéré à fournir une question "minime, complète et vérifiable". –

Répondre

4

ELSIF (SHR_EN = '1') THEN est en dehors des conditions de bord de remise à zéro et l'horloge, il est sous forme non reconnue pour la synthèse.

Déplacez-le et les affectations suivantes à l'extrémité précédente si c'est enregistré. Supprimez SHR_EN de la liste de sensibilité du processus.

Également en VHDL un nom ne peut pas commencer par un nombre, 5bit_PHreg_vhdl n'est pas valide en tant que nom d'entité.

la fixation de ces et remplir la déclaration d'entité manquante:

library ieee; 
use ieee.std_logic_1164.all; 

entity PH_reg_5_bit is 
    port (
     reset:  in std_logic; 
     clk:  in std_logic; 
     LD_EN:  in std_logic; 
     SHR_EN:  in std_logic; 
     FA_in:  in std_logic_vector (4 downto 0); 
     c_in:  in std_logic; 
     c_out:  out std_logic; 
     PH_reg_out: out std_logic_vector (4 downto 0) 
    ); 
end entity; 

ARCHITECTURE behavioral OF PH_reg_5_bit IS 
    SIGNAL count : STD_LOGIC_VECTOR(4 DOWNTO 0); 

BEGIN 
    PROCESS (reset, clk) -- , SHR_EN) 
     BEGIN 
-- Check if asynchronous reset is 0 
     IF reset = '0' THEN --ERROR OCCURS HERE 
       count <= "00000"; 
-- Check if rising edge 
     ELSIF (clk'EVENT AND clk = '1') THEN 
       IF LD_EN = '1' THEN 
        count <= FA_in; 
     -- Check if SHR_EN is active 
       ELSIF (SHR_EN = '1') THEN 
         count(4) <= c_in; 
         count(3) <= count(4); 
         count(2) <= count(3); 
         count(1) <= count(2); 
         count(0) <= count(1); 
       END IF; 
-- -- Check if SHR_EN is active 
--   ELSIF (SHR_EN = '1') THEN 
--     count(4) <= c_in; 
--     count(3) <= count(4); 
--     count(2) <= count(3); 
--     count(1) <= count(2); 
--     count(0) <= count(1); 
--     c_out <= count(0); 
     END IF; 
    END PROCESS; 

    c_out <= count(0); -- c_out not separately registered 
    PH_reg_out <= count; 
END behavioral; 

et votre code analyse avec succès.

Le nom de l'entité est une bonne indication que vous n'avez pas simulé votre conception.

Notez que l'ordre des conditions implique que le chargement a priorité sur le décalage.

Je ne pense pas que c_out ne devrait pas être enregistré permettant aux instances de registre à décalage d'être concaténées dans un registre à décalage plus grand en utilisant c_in et c_out. Cela signifie que son affectation doit être en dehors de l'instruction if contenant l'événement edge d'horloge, elle peut aller à côté de l'autre attribution de broche de sortie.

+0

Merci beaucoup d'avoir répondu. J'ai corrigé mon code. JSYK le nom a commencé seulement avec un nombre parce que le nom original a commencé avec mon nom réel et pour l'amour de l'anonymat je l'ai enlevé. Je me rends compte maintenant que mon profil affiche réellement mon nom tellement c'était un mouvement injustifié! –