Tourner à gauche verilog cas
Ma tâche est d'écrire un 16 bits ALU en verilog. J'ai trouvé des difficultés quand je fais la part qui doit faire tourner l'opérande et de faire les 2 en complément à l'addition et la soustraction. Je sais travailler que par le papier et le crayon, mais je ne peux pas comprendre les façons de faire en Verilog.
par exemple:
Un est désigné comme a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
si je vais tourner sur 4 bits,
la réponse serait
a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 a15 a14 a13 a12
j'ai essayé de concaténation, mais il s'avère incorrecte.
besoin de vous tous aider...
- Vous pouvez résoudre votre problème avec la concaténation ou de changement d'opérateur ">> ""<< " qu'est-Ce exactement que vous voulez faire pivoter et est-il un simple décalage de bits?
- Essayez de rechercher un barrel shifter: stackoverflow.com/search?q=[verilog]+barrel+shifter
- Double Possible de Verilog Barrel Shifter
Vous devez vous connecter pour publier un commentaire.
Pourquoi concaténation incorrect? Cela devrait faire ce que vous demandez.
Suivantes à l'aide d'un levier de vitesses:
Quand
shift
est 0 la gaucheA_in
est sélectionné. Commeshift
augmentation de la gaucheA_in
se décale vers la gauche et l'Esm de la droiteA_in
remplit.Si la synthèse, alors vous pouvez utiliser muxes, comme le changement dynamique de la logique tend à exiger plus de portes. Une 16-bits barrel shifter aura besoin de 4 niveaux de 2 à 1 muxes.
A_in
qui réduit sa longueur. Sishift
est 0, alors décaler le droitA_in
parregsize - shift
bits de décalage regsize bits qui laisse un bit à 0 long d'expression que les concat opérateur remplit avec un implicitement tronquée à gaucheA_in
nous laissantA_in
. Sishift
est de 1 à regsize, en déplaçant le droitA_in by
regsize de décalage de bits laisserashift
bits sur la droite pour la gaucheA_in
seulement remplitregsize - shift
bits résultant en un ensemble de rotation gauche parshift
bits.Où
bits_to_rotate
peut être la valeur d'une variable (soit un signal ou d'un règlement).Cela permettra d'en déduire un générique levier de vitesses à l'aide de multiplexeurs, ou un baril de levier de vitesses, ce qui convient mieux le matériel cible. Le synthétiseur va prendre soin à ce sujet.
Oh, bien. Si vous souhaitez faire pivoter au lieu de shift, la chose est un peu plus compliqué:
~
il est le droit de l'opérateur. Si vous voulez tourner à gauche en 1, vous avez besoin de <<1 >>15.~4'b0001 = 4'b1110 (14)
. Devrait être>>(16-bits_to_rotate)
?La meilleure façon que j'ai trouvé à faire c'est trouver un modèle. Lorsque vous voulez tourner à gauche 8 bits du signal de position 1 (
8'b00001111 << 1
), le résultat est8'b00011110
) également lorsque vous voulez tourner à gauche 9 positions (8'b00001111 << 9
) le résultat est le même,8'b00011110
, et aussi la rotation 17 positions, ce qui réduit les possibilités de table d'à côté:Donc, si vous regardez, les trois premiers bits de tous les numéros sur le conte de l'équivalent de rotation position 1 (1,9,17,25...249) sont égales 001 (1).
Les trois premiers bits de tous les numéros sur le tableau équivalent pour faire pivoter 6 positions (6,14,22,30...254) sont égales à 110 (6).
De sorte que vous pouvez appliquer un masque (
8'b00000111
) pour déterminer le bon décalage nul de tous les autres bits:reg_out_temp
est être le double dereg_in_1
, dans ce casreg_out_temp
est 16 bits etreg_in_1
8 bits, de sorte que vous pouvez obtenir le procédé bits pour les autres octets lorsque vous déplacez les données de sorte que vous pouvez les combiner à l'aide d'un OU d'une expression:Par deux cycles d'horloge que vous avez le résultat. Pour un 16 bits rotation, votre masque doit être
8'b00011111
(8'h1F
) parce que les quarts de travail va de 0 à 16 ans, et votre registre temporaire doit être de 32 bits.