2016-02-24 16 views
-1

[ma forme d'onde] [1] Le shifter est un composant qui est capable de mettre en œuvre des opérations de décalage arithmétique et logique. Pour cette implémentation, vous n'êtes pas autorisé à utiliser l'opérateur de décalage. L'entrée AL détermine si vous avez une opération de décalage arithmétique ou logique. dir a également décidé de la direction de votre quart de travail. Le décalage de la valeur d'entrée détermine également le nombre de changements que vous attendez. Vous pouvez supposer que chaque décalage de bit prend 10 ns dans la composante de décalage. Par exemple, si vous avez choisi shift = 5 quel que soit le sens ou le type de décalage (arithmétique ou logique), le retard de ce composant est de 50 ns.Calculer le décalage VHDL de décalage de 32 bits

Comment trouver le retard? chaque bit a 10 ns de retard, que dois-je faire pour un décalage de 10 *?

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use ieee.std_logic_unsigned.all; 

ENTITY shifter IS 
    GENERIC (BW : INTEGER :=32); 
    PORT (i : IN STD_LOGIC_VECTOR (BW -1 DOWNTO 0); 
      dir : IN BIT; -- dir ='0' means shift right and dir ='1' means shift left 
      AL: IN BIT ; -- Arithmetic or logical shift asume AL='1' means arithmetic an AL ='0' means logical 
      shifting : IN INTEGER range 0 to BW -1; 
      o: OUT STD_LOGIC_VECTOR (BW -1 DOWNTO 0)); 
    END ; 

ARCHITECTURE shifter_arch OF shifter IS 

BEGIN 
process(dir,i,AL,shifting) 
variable temp: std_logic_vector(31 downto 0); 
begin 
if dir='0' then 
    if AL='0' then 
     temp:= i(BW-(1+shifting) downto 0)&(BW-1 downto BW-(1+shifting)=> '0'); 
    else 
     temp:= i(BW-(1+shifting) downto 0)&(BW-1 downto BW-(1+shifting)=> i(BW-1)); 
    end if; 

elsif dir ='1' then 
    if AL='0' then 
     temp:= i(BW-1 downto shifting)&((shifting-1) downto 0=> '0'); 
    else 
     temp:= i(BW-1 downto shifting)&((shifting-1) downto 0=> i(0)); 
    end if; 

end if; 
o <= temp ; 
end process; 
END shifter_arch ; 
+0

Votre shifter n'est pas analysé avec succès. L'extérieur de la boucle de génération dépend du 'déplacement 'comme la limite droite et le décalage est un port d'entrée (non statique). IEEE Std 1076-2008 11.8 Générer des instructions "La plage discrète dans la spécification de paramètre de génération d'une instruction for generate doit être une plage discrète statique, de même que chaque condition dans une instruction if generate doit être une expression statique." * Doit * (* doit * -1993) a un poids obligatoire, et devrait avoir produit une erreur au lieu de ne pas élaborer. Voulez-vous utiliser des instructions de boucle séquentielles (à l'intérieur d'un processus)? – user1155120

+0

que devrais-je obtenir le décalage n bits sans générer? –

+0

Une boucle for dans un processus? – user1155120

Répondre

0

premier: vous écrivez 10 ns, mais vous prenez une photo de 1 ps étape dans votre simulateur, et je ne peux pas comprendre. second: si vous n'avez pas réussi dans ISim, changez votre simulateur en ModelSim et compilez votre code dans Quartos et non dans ISE et c'est un simulateur. parce qu'ils ne supportaient pas mieux la simulation du temps.