Question
J'ai le code suivant pour compter jusqu'à 59. Cela commence bien, mais après 31, commence à afficher des caractères ASCII tels que '(', '$', '#' etc., au lieu de chiffres. Toute idée d'où je viens ' m va mal?
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
entity counter is
port(clk: IN STD_LOGIC;
secs:OUT INTEGER RANGE 0 to 59);
end counter;
architecture counter_behav of counter is
signal countSVal: INTEGER RANGE 0 to 59:=0;
begin
process(clk)
begin
if(rising_edge(clk)) then
if(countSVal>=59) then
countSVal <= 0;
else
countSVal <= countSVal + 1;
end if;
secs <= countSVal;
end if;
end process;
end counter_behav;
La solution
Puisque vous n'imprimez rien, je suppose que vous regardez cela dans un visualiseur de forme d'onde. Définissez le type indiqué en entier, vous pouvez l'avoir en ASCII, comme l'a dit AnthonyWJones.
Autres conseils
Je n'ai aucune idée de ce qu'est vhdl, cependant, il semble fort probable que tout ce que vous utilisez pour observer la sortie affiche pas les caractères ASCII antérieurs à 32, car il s'agirait de caractères de contrôle. , donc ça ne fait que compromettre et vous montrer leurs valeurs. Étant donné que les caractères 32 et plus sont imprimables, il passe à ceux-ci car c’est ce que l’outil pense être les valeurs.
Insérer un signal supplémentaire:
signal my_char: character;
Effectuez ensuite la conversion de nombre entier en caractère:
my_char <= character'val(countSVal);
Vérifiez le signal my_char sous le débogueur ou dans l’afficheur de formes d’ondes et vous verrez les caractères ASCII. Je l'ai vérifié avec Aldec Active-HDL 6.1.