Quand un signal doit-il être inséré dans la liste de sensibilité d'un processus?
Je ne sais pas quand un signal déclaré dans une architecture doit être inséré dans la liste de sensibilité d'un processus.
Existe-t-il une loi générale qui peut être suivie dans n'importe quelle situation?
j'ai de réelles difficultés à comprendre quand je dois inclure un signal dans une liste de sensibilité de processus.
4 réponses
la "loi générale" est que
rien à ce que votre processus a besoin de savoir à propos de change doit être dans la liste de sensibilité.
pour un registre synthétisable typique avec une réinitialisation synchrone:
process (clk) is
begin
if rising_edge(clk) then
if reset = '1' then
-- do reset things
else
-- read some signals, assign some outputs
end if;
end if;
end process;
Uniquement l'horloge doit être dans la liste, comme tout le reste n'est regardé quand l'horloge change (en raison de la if rising_edge(clk)
déclaration.
si vous avez besoin d'un asynchrone reset:
process (clk, reset) is
begin
if reset = '1' then
-- do reset things
elsif rising_edge(clk) then
-- read some signals, assign some outputs
end if;
end process;
puis reset
le signal doit aussi être dans la liste de sensibilité, car votre design doit vérifier sa valeur à chaque fois qu'il change, indépendamment de ce que fait l'horloge.
pour la logique combinatoire, j'évite d'utiliser des processus complètement à cause des problèmes de mise à jour de la liste de sensibilité, et du potentiel de simulation se comportant alors différemment du code synthétisé. Ce a été facilité par le all
mot-clé dans VHDL-2008, mais je ne me suis pas encore trouvé vouloir écrire une logique combinatoire longue et compliquée telle qu'un processus pourrait aider.
si un signal est dans la liste de sensibilité d'un processus, le processus "se réveillera" et sera évalué chaque fois que la valeur de ce signal change. S'il ne figure pas dans la liste de sensibilité, un signal peut changer, mais un processus ne sera pas réévalué pour déterminer ce que devraient être les nouveaux extrants.
Pour La Logique Combinatoire: vous voulez probablement que tous vos signaux d'entrée soient inclus dans la liste de sensibilité. S'ils ne sont pas inclus dans la liste de sensibilité, alors ce sera résultat: votre sortie ne change pas même lorsque le signal d'entrée change. C'est une erreur courante (en raison de la négligence). Notez que dans VHDL 2008 vous pouvez utiliser le mot-clé" all " pour inclure automatiquement tous les signaux nécessaires dans votre processus et éviter de créer des verrous.
Pour La Logique Synchrone: il est probable que vous ne voulez que votre signal d'horloge (et peut-être votre réinitialisation) dans la liste de sensibilité. C'est parce que vous ne sont concernés par la valeur de vos signaux (autres que l'horloge) lorsque l'horloge de votre système a changé. C'est parce que vous décrivez typiquement des registres (composés de tongs) qui ne permettent de changer leur valeur de sortie que sur un bord d'horloge.
tout cela peut prêter à confusion dans le cas de l'utilisation de HDL pour la synthèse car seul un sous-ensemble des circuits que vous décrivez dans VHDL peut être implémenté dans une FPGA. Par exemple, vous ne pouvez pas avoir un élément de mémoire primitif qui est sensible à deux arêtes d'horloge indépendantes, même si vous pouvez décrire un tel circuit en incluant deux horloges dans une liste de sensibilité.
de plus, les outils de synthèse (en parlant du Xilinx XST dans ce cas) ne respectent pas nécessairement toujours la liste de sensibilité du processus. Si vous ne parvenez pas à lister tous les processus dont les valeurs sont évaluées dans le corps du processus, le XST émettra un avertissement disant qu'il va supposer que les signaux dont les valeurs sont évaluées sont sur la liste de sensibilité. Cela peut conduire à des différences entre les simulations comportementales et le matériel réel. Gardez à l'esprit.
...en outre, soyez averti, la liste de sensibilité n'a aucune influence sur le comportement de votre dessin une fois qu'il est synthétisé. Il n'est utilisé que pendant la simulation. Il est donc assez facile d'introduire une différence de comportement entre le RTL et le code synthétisé en modifiant la liste de sensibilité.
les règles que Josh donne sont bonnes, mais surtout, lisez les avertissements que vos outils vous donnent et agissez en conséquence. Ils vérifient normalement que la liste de sensibilité est correcte et signalent tout problème. Emacs Le mode VHDL a également une commande pour mettre à jour la liste de sensibilité, et il est normalement assez bon à elle.
Hmmmm, Ninja avais