2016-10-19 1 views
0

Je dois écrire un programme qui change une séquence de DEL à chaque impulsion d'horloge pour une séquence.Séquence de DEL cadencée VHDL Partie 2

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


entity REG_LED is 
PORT(CLK:  IN std_logic;    -- CLK input 
LEDS:  Out std_logic_vector (4 downto 0):= "11111"); -- initialise output 
End REG_LED; 

ARCHITECTURE behavioral OF REG_LED IS 
SIGNAL Temp: std_logic_vector (3 downto 0):= "0000"; -- initailise comparison signal 
BEGIN 

CLK_Process: PROCESS (CLK) -- begin 
BEGIN 

if rising_edge(CLK) Then 
     Temp <= Temp + 1 ; 
END IF; 

iF TEMP > "1000" THEN 
    Temp <= "XXXX"; 
End IF; 

END PROCESS ; 

LED_PROCESS: Process (Temp) -- 

BEGIN 

    Case Temp is 

     When "0000" => 
      LEDS <= "11111"; 
     When "0001" => 
      LEDS <= "00001"; 
     When "0010" => 
      LEDS <= "00001"; 
     When "0011" => 
      LEDS <= "11111"; 
     When "0100" => 
      LEDS <= "00000"; 
     When "0101" => 
      LEDS <= "11111"; 
     When "0110" => 
      LEDS <= "00100"; 
     When "0111" => 
      LEDS <= "01010"; 
     When "1000" => 
      LEDS <= "10001"; 
     When others => 
      LEDS <= "10001"; 
    End Case;    

End Process; 
END behavioral; 

Est-ce que cela ressemble plus à ce que vous attendez? il simule mais je ne peux pas tester la synthèse du code car j'ai maintenant le matériel pour le tester avec. Ou s'il y a un moyen parce que je suis nouveau à VHDL je n'ai pas calculé comment le tester.

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


entity REG_LED is 
PORT(CLK:  IN std_logic;    -- CLK input 
    LEDS:  Out std_logic_vector (4 downto 0):= "11111"); -- initialise output 
End REG_LED; 

ARCHITECTURE behavioral OF REG_LED IS 
SIGNAL Temp: integer range 0 to 9:= 0; -- initailise comparison signal 
BEGIN 

    CLK_Process: PROCESS (CLK) -- begin 
    BEGIN 

    if rising_edge(CLK) Then 
     if Temp = 8 then 
      Temp <= 0; -- State Count Reset 
     else 
      Temp <= Temp + 1 ; -- State Count 
     End if; 

    END IF; 

    END PROCESS ; 

    LED_PROCESS: Process (Temp) -- LED Outputs based on Temp count 

    BEGIN 

     Case Temp is 

      When 0 => 
       LEDS <= "11111"; -- S0 
      When 1 => 
       LEDS <= "00001"; -- S1 
      When 2 => 
       LEDS <= "00001"; -- S2 
      When 3 => 
       LEDS <= "11111"; -- S3 
      When 4 => 
       LEDS <= "00000"; -- S4 
      When 5 => 
       LEDS <= "11111"; -- S5 
      When 6 => 
       LEDS <= "00100"; -- S6 
      When 7 => 
       LEDS <= "01010"; -- S7 
      When 8 => 
       LEDS <= "10001"; -- S8 

      When others => 
       LEDS <= "11111"; -- Restart Sequence 
     End Case;    

    End Process; 
+0

Quel est le but de la partie 'Temp <=" XXXX ";' –

+0

il était destiné à arrêter la séquence mais j'ai depuis redessiné comme j'ai relu mon affectation originale et les spécifications sont différentes de ce que j'avais pensé –

Répondre

1

Ce code est assez bon, mais voici une chose qui a besoin d'attention:

Vous n'avez pas ces deux paquets:

use ieee.std_logic_unsigned.all; 
use ieee.numeric_std.all; 

En fait, votre code ne fait qu'utiliser la std_logic_unsigned paquet; il n'utilise pas du tout le paquet numeric_std. Le package std_logic_unsigned définit différents opérateurs arithmétiques pour le type std_logic_vector. Ceux-ci supposent arithmétique non signée, d'où le nom. Vous faites usage du paquet std_logic_unsigned dans cette ligne:

Temp <= Temp + 1 ; 

Pour le nouveau code, vous devez vraiment utiliser le package numeric_std, pas le paquet std_logic_unsigned. Pour ce faire, vous devez changer le type de Temp en unsigned. Le type unsigned est juste un tableau de std_logic comme std_logic_vector, mais comme son nom l'indique, il est utilisé pour implémenter l'arithmétique non signée.

Alors, je voudrais

i) supprimer cette ligne:

use ieee.std_logic_unsigned.all; 

ii) modifier cette ligne:

SIGNAL Temp: std_logic_vector (3 downto 0):= "0000"; -- initailise comparison signal 

à:

SIGNAL Temp: unsigned (3 downto 0):= "0000"; -- initailise comparison signal 

iii) (comme effrayant Jeff souligne) penser à ce que le a La signature de Temp à "XXXX" est en train de faire. Ne préféreriez-vous pas que votre compteur soit arrondi à "0000"? Si, si vous voulez le geler au "1000", vous aurez besoin d'un code différent. Dans tous les cas, jamais mettre du code en dehors du test pour le rising_edge de l'horloge. (Ce n'est pas conforme au modèle que je vous ai montré Quelle serait la logique de ce code?)

+0

c'était le code avant que je l'ai modifié encore plus hier soir je me suis rendu compte qu'il y avait encore quelques bugs au cours de la simulation ainsi changé à ce –

+0

code posté ci-dessous original dans la question –

+0

j'avais mal lu ma mission je pensais qu'il a demandé la séquence de terminer à la 8e impulsion d'horloge, mais il a en fait commencer une séquence continue à iamended le code pour s'adapter aux spécifications –