2013-05-29 2 views
0

J'ai une question à propos de mon code VHDL. Le code est pour un robot, qui devrait être capable de détecter une mine. Ce morceau de code est le code de ce détecteur de mines spécifique. Le processus teller_sensor ne fonctionne pas. Je sais que, puisqu'il sera programmé sur une puce FPGA, vous ne pouvez avoir qu'une horloge. Mais je ne sais pas quoi faire pour que le processus fonctionne. J'espère que les gars vous êtes prêt à me aider :)VHDL Malentendu à propos de l'horloge

Roberto

Voici le code:

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
use IEEE.numeric_std.all; 
library ieee; use ieee.numeric_std.all; 

entity metaal_detector is 
port (clk : in std_logic; 
     sensor : in std_logic; 
     reset : in std_logic; 
     metaal : out std_logic 
); 
end entity metaal_detector; 

architecture behavioural of metaal_detector is 
signal count, count_sensor, stand, clock1, sensor1, stand1 : unsigned (10 downto 0); 
signal reset_teller, resets, metaals: std_logic; 

begin 

teller_clk: process (clk) 
begin 
if rising_edge(clk) then 
    if ((reset ='1') or (resets = '1')) then 
    count <= (others => '0'); 
    else 
    count <= count + 1; 
    end if; 
end if; 
end process; 


teller_sensor: process (sensor) 
begin 
if rising_edge(clk) then 
    if ((reset ='1') or (resets = '1')) then 
    count_sensor <= (others => '0'); 
    else 
    if (sensor'event and sensor='1') then 
     count_sensor <= count_sensor + 1; 
    end if; 
    end if; 
end if; 
end process; 


process(clk) 
begin 
if (unsigned(clock1) = 71) then 
    stand <= clock1; 
    reset_teller <= '1'; 
else 
    reset_teller <= '0'; 
    stand <= stand; 
end if; 
end process; 

process(clk) 
begin 
if (unsigned(stand1) < 70) then 
    metaals <= '1'; 
else 
    metaals <= '0'; 
end if; 
end process; 


clock1 <= count; 
sensor1 <= count_sensor; 
stand1 <= stand; 
resets <= reset_teller; 
metaal <= metaals; 

end architecture behavioural; 

Répondre

1

Spécifiez clk plutôt que capteur au sommet du processus. Puis échantillonnez l'état du capteur à l'intérieur, c'est-à-dire au bord de l'horloge d'intérêt.

Une telle approche n'est pas dépourvue de problèmes théoriques (métastabilité, théorie de l'échantillonnage), mais elle est susceptible de vous mener vers un certain degré de fonctionnalité.

À l'heure actuelle, rien ne se passe, car cela ne peut se produire que si un changement de capteur déclenche le processus en même temps qu'il y a un front montant de clk. Dans le matériel qui serait rare (et non implémentable avec des blocs typiques où le détecteur de bord fait partie de l'entrée d'horloge) - dans la simulation il peut être impossible (vous devriez lire le langage détaillé et les règles du simulateur) mais dans aucun cas Fera-t-il ce dont vous avez besoin?

+0

Merci pour la réponse Chris. J'ai changé de capteur pour clk dans la liste de sensibilité. Cependant, je ne comprends pas vraiment ce que vous entendez par "alors échantillonner l'état du capteur à l'intérieur, c'est-à-dire au bord de l'horloge d'intérêt". Pourriez-vous expliquer cela pour moi? – Earless