UNE période d'horloge en fonction de l'impulsion sur le signal de déclenchement
je suis prise d'une interface midi. UART fonctionne très bien, il envoie les 8 bits du message avec un drapeau à une unité de contrôle. Lorsque le drapeau passe au niveau haut, l'unité de stocker le message dans un registre et de faire un clr_flag élevé afin de définir l'indicateur de l'UART encore bas. Le problème est que je ne peux pas faire ce clr_flag une période longue. J'ai besoin d'elle pour être UNE période de temps, parce que ce signal de contrôle également une machine d'état qui indique quel type de message est stocké (note_on -> key_note -> vitesse, par exemple).
Ma question est de savoir comment un signal (drapeau dans ce cas) déclenche une impulsion juste pour un clk période? ce que j'ai fait maintenant presque une impulsion au cours d'une période d'horloge, mais je l'ai fait deux fois, parce que le drapeau n'est pas devenu 0 encore. j'ai essayé de nombreuses façons, et maintenant j'ai ceci:
get_data:process(clk, flag)
begin
if reset = '1' then
midi <= (others => '0');
clr_flag <= '0';
control_flag <= '0';
elsif ((clk'event and clk='1') and flag = '1') then
midi <= data_in;
clr_flag <= '1';
control_flag <= '1';
elsif((clk'event and clk='0') and control_flag = '1') then
control_flag <= '0';
elsif((clk'event and clk='1') and control_flag = '0') then
clr_flag <= '0';
end if;
end process;
le problème avec cette double impulsion ou plus d'une période d'impulsion(avant cela, j'ai eu quelque chose qui a fait clr_flag une période de deux clk impulsion), c'est que le système va passer si deux membres au lieu d'un drapeau.
donc en bref: quand un signal passe au niveau haut (indépendantes du moment où il passe au niveau bas), un pouls pendant une période d'horloge doit être généré.
merci pour votre aide.
- J'ai seulement commencé à étudier le vhdl, et il y a quelque chose de magique pour moi, c'est pourquoi je réponds dans les commentaires. Essayez de supprimer clk événement de elsif. Parfois, il m'a aidé.
Vous devez vous connecter pour publier un commentaire.
Le truc pour faire un seul cycle d'impulsion est de réaliser que le fait d'avoir fait le pouls, vous devez vous attendre aussi longtemps que l'entrée de déclenchement est élevé avant de revenir au point de départ. Essentiellement, vous êtes la construction d'un très simple de l'état de la machine, mais avec seulement 2 états, vous pouvez utiliser un booléenne simple de les distinguer.
Morten est correct sur la nécessité d'adopter l'un des modèles standard pour un processus cadencé; j'ai choisi un autre qui fonctionne tout aussi bien.
Il y a plusieurs problèmes à résoudre afin de rendre la conception d'un cycle
d'impulsion à l'aide de flip flops (registres).
Tout d'abord, l'utilisation de tongs en matériel VHDL constructions typiquement
suit une structure comme:
De sorte que le
get_data
processus doit être mis à jour en conséquence, donc:clk
) etreset
if
sur l'événement doit être comme ci-dessusclk
doit être utilisé, donc pas de vérifier surclk = '0'
De faire un cycle d'impulsion sur
clr_flag
quandflag
passe au niveau haut peut être fait avec unsynchrone '0' à '1' détecteur sur
flag
, à l'aide d'une version deflag
qui estretardée d'un seul cycle, appelé
flag_ff
ci-dessous, puis vérifier(flag =
.''1) and (flag_ff = '0')
Le code résultant peut alors ressembler à ceci:
Ci-dessous est un moyen de créer un signal (flag2), qui dure exactement une période d'horloge à partir d'un signal (flag1), qui dure au moins une période d'horloge.
Je n'ai pas de programme en VHDL~ voici ce que j'ai l'habitude de le faire pour la même proposer en Verilog:
Je suis nouveau sur le verilog et c'est l'exemple de code, que j'ai utilisé pour le déclenchement. Espérons que cela sert votre but. Vous pouvez essayer la même logique en VHDL.