« Si » vs « quand » pour faire multiplexeur
Question
On m'a dit d'utiliser la déclaration « quand » pour faire multiplexeur mais pas utiliser « si » la déclaration qu'il fera des erreurs de synchronisation ... Je ne comprends pas ... Alors, quelle est la différence entre « si » et « quand »? et ils correspondent à la même chose que dans le matériel?
La solution
OK, permet de discuter des points d'abord sur la différence entre si et quand des déclarations:
- Les deux sont appelés Dataflow éléments de conception.
instruction WHEN
- déclaration simultanée
- pas utilisé dans le procédé, utilisé uniquement dans l'architecture comme procédé est exécution séquentielle
if
- déclaration séquentielle
- utilisé dans le processus tel qu'il est énoncé séquentiel, et non utilisé en dehors du processus
Et vous savez multiplexeur est un composant ne ont pas besoin bloc de processus, son comportement ne change pas avec le changement de son entrée, il sera procédé à l'extérieur, de sorte que vous devez écrire à l'aide lors de la déclaration comme il est énoncé simultané .. Et si vous l'avez écrit avec instruction if, les erreurs de synchronisation peuvent se produire. En outre toutes les références et aussi Xilinx aide (si vous utilisez Xilinx) sont en train d'écrire le bloc à l'aide Multiplexeur instruction WHEN pas instruction if
Référence: Digital Design priciples et pratiques, John F. Wakerly, 3e édition
Autres conseils
Voir ci:
- déclarations simultanées VHDL , qui comprend
when
. - déclarations successives VHDL , qui comprend
if
.
Fondamentalement, if
est séquentiel, et when
est simultanée. Ils ne correspondent pas à la même chose que dans le matériel ... Cette page décrit, au fond, quelques-unes des considérations particulières nécessaires pour synthétiser une instruction if
.
Les deux styles de codage sont tout à fait valables.
Rappelons quelques éléments. A partir de HDL, la synthèse se fait en deux étapes:
- premier, le VHDL est analysé afin de détecter modèles RTL (consistant en éléments RTL: bascules, des expressions arithmétiques, les multiplexeurs, la logique de commande). Nous disons que ces éléments sont « inférer » (i.e. vous devez coder en utilisant le bon modèle pour obtenir ce que vous vouliez au départ. Vous devez imaginer comment ces éléments sont connectés, avant le codage).
- La deuxième étape est réelle synthèse logique , qui prend un paramètre de technologie cible particulière en compte (types de portes disponibles, le calendrier, zone, puissance).
Ces deux étapes se sépare clairement les besoins fonctionnels RTL (logique de direction, calculs) de risques technologiques (synchronisation, etc.).
Revenons à la première étape (RTL):
En ce qui concerne Multiplexeurs, plusieurs styles de codage sont possibles:
-
en utilisant assignement simultané:
y <= a1 a2 lorsque COND1 autre lorsque cond2 autre cond3;
-
en utilisant l'instruction if dans un processus:
Procédé(a1, a2, a3, cond1, cond2) commencer si (cond1) puis y <= a1; elsif (cond2), puis y <= a2; autre y <= a3; fin si; fin;
-
en utilisant une autre affectation concurrente forme, propice générique si les descriptions: sel est un nombre entier et muxin un ensemble de signaux, alors:
muxout <= muxin (sel); --will déduire un MUX
Notez que les 3 styles de codage fonctionnent toujours. Notez également qu'ils sont « un peu plus » que multiplexeur simple que la force de style de codage de la présence d'un codage prioritaire (si ELSIF, quand d'autre), ce qui est le cas d'un multiplexeur à base d'équation simple, vraiment symétrique.
-
en utilisant une instruction case
Procédé(a1, a2, a3, cond1, cond2) la variable cond: std_logic (1 downto 0); commencer cond: = cond2 & cond1; cas est cond lorsque "01" => y <= a1; lorsque "10" => y <= a2; lorsque les autres => y <= a3; Fin de cas; fin;
-
en utilisant une instruction select (dans notre par exemple, deux assignements simultanées nécessaire):
sel <= cond2 & cond1; AVEC SELECT sel y <= a1 QUAND "01", a2 QUAND "10", a3 QUAND LES AUTRES;
Une dernière remarque est sur la montée de l'abstraction, même pour la conception RTL: les synthétiseurs sont vraiment mature. Jetez un oeil à des styles de codage Jiri Gaisler pour LEON2 processeur open source par exemple, ainsi que ses styles de codage ( voir ici ). Il prones une approche très différente, mais tout à fait valable, des livres classiques.
Vous devriez toujours comprendre ce que le synthétiseur RTL inférera.
Dans le cas contraire, la synthèse du comportement permet d'oublier (en partie) ce que le synthétiseur inférera. Mais c'est une autre histoire.