2013-07-15 4 views
1

Ma question est en ce qui concerne le code suivant:Mise en œuvre du flip flop avec le processus. [VHDL]

library ieee; 
use ieee.std_logic_1164.all; 

entity exam is port (
    I,CLK,RESET : in std_logic; 
    Q : out std_logic 
); 
end entity; 

architecture exam_arc of exam is 
    signal temp_sig : std_logic; 
begin 
    process (CLK,RESET) 
    begin 
     if RESET = '1' then 
      temp_sig <='0'; 
     elsif CLK'event and CLK='1' then 
      temp_sig <= I; 
     end if; 
     Q <= temp_sig; 
    end process; 
end exam_arc; 

Il semble que ce morceau de code simule une bascule D qui fonctionne sur le front montant de l'horloge, mais la réponse [cette question est pris d'un examen] à cette question prétend que cette bascule D fonctionne sur le front descendant de l'horloge.

Quel type de bascule ce code VHDL simule?

+1

indentation du code approprié empêche le cancer des yeux - j'ai entendu .. – drahnr

Répondre

5

C'est une question piège. Notez que le processus se réveille à la fois sur les fronts montants et descendants, et que le signal intermédiaire temp_sig est assigné sur le rising_edge. Ajoutez cela à la sémantique de l'assignation du signal (assignation différée) et voyez ce que vous obtenez.

contrôle Croix simulation Jim via suggère ...

+0

Il semble donc que le signal les évaluations sont faites à la fin du processus, ai-je bien compris? Et merci! –

2

Vous pouvez simplement le synthétiser vous-même. Voir également ffv3http://www.cs.uregina.ca/Links/class-info/301/register/lecture.html qui est presque identique.

Mise à jour
je Missguided par la mise en forme manquant - en fait, il est en fait basculer sur le front descendant comme une autre réponse montre déjà.

Bien que toutes les affectations soient effectuées en séquence, les affectations de signaux se produisent toujours à la fin du processus, temp_signal est donc un demi-cycle d'horloge (front descendant suivant) et ne contient pas la valeur récemment affectée.

http://www.gmvhdl.com/process.htm
How does signal assignment work in a process?

0

Avez-vous simulé il? Quand Q change et pourquoi? Quand les signaux sont-ils mis à jour? Pendant un front montant, est-ce que Q obtient la valeur de I? Assurez-vous de le simuler.

2

séparé l'affectation à Q dans sa propre déclaration de processus avec la même liste de sensibilité. Le comportement des modèles de simulation sera identique bien qu'ils varient dans le nombre de processus.

DUT: 
    process (CLK,RESET) 
    begin 
     if RESET = '1' then 
      temp_sig <='0'; 
     elsif CLK'event and CLK ='1' then 
      temp_sig <= I; 
     end if; 
--  Q <= temp_sig; 
    end process; 

QDEVICE: 
    process (CLK, RESET) 
    begin 
     Q <= temp_sig; 
    end process; 

Le bord périphérique de stockage sensible à l'attribution temp_sig est clairement un front positif cadencé bascule sensible à CLK et asynchrone remis à zéro par RESET (élevé).

Le processus QDEVICE est-il une construction cible de synthèse? Il se comporte comme un verrou suiveur sur la bascule temp_sig, mais il n'y a aucune indication quant à la polarité d'une validation. Voir IEEE Std norme IEEE pour 1076,6 à 2004 VHDL Registre Transfer Level (RTL) Synthèse, 6.2.1.1 stockage sensible au niveau du processus avec la liste de sensibilité:

Un élément de stockage sensible au niveau doit être modélisé pour un signal (ou variable) lorsque toutes les conditions suivantes s'appliquent:

c) Il existe des exécutions du processus qui n'exécutent pas une affectation explicite (via une instruction d'affectation) au signal (ou variable).

Sans qualification (par niveau), la règle c n'est pas respectée. En outre, dans le processus d'origine, vous citez le comportement ne correspond pas à l'une des spécifications IEEE Std 1076.6-2004 6.2 Clock edge dont aucune ne comprend l'utilisation d'un signal intermédiaire. Brian a raison, c'est une question piège. Un flip flop avec un suiveur-quelque chose d'autre fournissant un retard. Et la valeur «U» dans la simulation pour q jusqu'à un événement sur CLK ou RESET devrait être révélatrice.

enter image description here

0

permet de regarder la ligne de code suivante:

elsif CLK'event and CLK='1' then 

CLK est votre signal de synchronisation (aka l'horloge).

L'événement CLK 'est déclenché en cas de modification de la valeur de CLK. CLK = '1' signifie que l'horloge est haute.

Donc, si l'horloge a changé et qu'elle est actuellement à l'état haut, alors nous allons exécuter le code dans cette instruction ELSIF.

Nous savons qu'il n'y a que 2 états pour les variables binaires, donc si CLK a changé ET qu'il est passé à l'état haut, il était à l'origine dans un état bas. Cela signifie que le code ne s'exécutera que lorsque l'horloge passera de bas en haut.

Si vous voulez exécuter sur un haut à bas déclencheur alors vous changeriez la déclaration à lire comme ceci:

elsif CLK'event and CLK='0' then