Comme d'autres l'ont déjà fait remarquer, vous devriez synchroniser avec le CLK_50M
et vous devriez rebondir vos entrées (certains FPGA le font automatiquement pour vous, consultez votre manuel).
La raison pour laquelle vous voyez une fonctionnalité partielle provient de la façon dont le synthétiseur interprète le RTL. Si la liste de sensibilité est déclenchée par un front et que ce signal est référencé dans le corps du bloc always, alors le synthétiseur pense qu'il s'agit d'un signal asynchrone sensible au niveau. Ceci est prévu pour la réinitialisation asynchrone & définie (parfois nommé clear & preset). La conception ASIC utilise généralement des flops avec une réinitialisation asynchrone dans la plupart des cas. Les FPGA ont tendance à avoir un nombre limité de flops avec un jeu ou un repos asynchrone, donc vérifiez votre manuel et utilisez avec parcimonie.
Avec votre code, Negative
est l'horloge et Positive
est traitée comme une entrée asynchrone haute active.
Modifiez le code en un équivalent comportemental fonctionnel (en simulation) vu ci-dessous, puis Positive
sera l'horloge et Negative
sera l'entrée haute asynchrone active.
[email protected](posedge Positive or posedge Negative)
begin
if(Negative == 1)
LED <= LED - 1;
else
LED <= LED + 1;
end
Il y a plusieurs ressources pour l'apprentissage Verilog disponible en ligne (utilisez votre moteur de recherche préféré), et j'ai des ressources affichées sur my profile bien plus visant à SystemVerilog.
Voici un code pseudo pour vous diriger dans la bonne direction pour votre projet:
always @(posedge CLK_50M)
begin
past_Positive <= Positive;
// ...
case({/* ... , */ past_Positive,Positive})
4'b0001 : LED <= LED + 1;
4'b0100 : LED <= LED - 1;
// ...
endcase
end
Ce serait probablement mieux demandé au site d'échange de pile électronique. –
Je pense que c'est plus lié à la programmation qu'à la conception électronique. J'utilise un tableau avec un design de référence donc le problème n'est pas électronique mais de programmation. – Chumanista
Strictement parlant, il s'agit encore de conception matérielle, pas de programmation. Verilog est un langage de description * hardware *, pas un langage de programmation (logiciel). La ligne est quelque peu floue, cependant. –