2013-01-05 2 views
1

Je veux permuter la valeur de input0 et input1, et sortir le plus petit. Lorsque je simule mon projet dans Modelsim, la forme d'onde de la sortie du signal est la ligne rouge. Quelle est mon erreur?VHDL échanger deux valeurs

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity MF is 
    port (clk : in std_logic; 
      input0: in std_logic_vector(2 downto 0); 
      input1: in std_logic_vector(2 downto 0)); 
end MF; 

architecture Behavioral of MF is 
    signal bubble0: std_logic_vector(2 downto 0); 
    signal bubble1: std_logic_vector(2 downto 0);        

begin 
    bubble0 <= input0;    
    bubble1 <= input1; 
    output <= bubble0;      -- my output 
    process(clk) 
    begin 
     if rising_edge(clk) then 
      if bubble0 > bubble1 then  -- swap 
      bubble1 <= bubble0; 
      bubble0 <= bubble1; 
      end if;           
     end if; 
    end process; 
end Behavioral; 

Répondre

3

Je vois plusieurs problèmes:

1) Vous assignez des valeurs à bubble0 et bubble1 à la fois de manière asynchrone et à l'intérieur d'un processus (ce qui est un « combat de bus » avec plus d'un pilote sur chaque signal, qui IS légal en VHDL, mais vous devez être conscient de ce que vous faites ... généralement, cela est utilisé pour faire des bus à trois états, mais vos deux affectations conduisent le signal constamment, ce qui entraîne probablement le 'non défini 'état lors de la résolution du signal).

2) Vous n'attribuez pas de valeurs à bubble0 et bubble1 dans tous les cas de votre instruction if dans le processus.

3) Vous ne pouvez pas comparer directement deux valeurs std_logic_vector pour l'amplitude numérique, vous devez d'abord les convertir en un type numérique approprié (tel que signed ou unsigned).

On ne sait pas exactement comment vous voulez que votre sortie se comporter, mais peut-être quelque chose comme ce qui suit vous obtiendrez plus loin ... cela met à jour les signaux de bulles selon le cas à chaque front montant de l'horloge:

begin 
    output <= bubble0;      -- my output 
    process(clk) 
    begin 
     if rising_edge(clk) then 
      if unsigned(input0) > unsigned(input1) then  -- swap 
       bubble1 <= input0; 
       bubble0 <= input1; 
      else 
       bubble0 <= input0;    
       bubble1 <= input1; 
      end if;           
     end if; 
    end process; 
end Behavioral; 
Questions connexes