Domanda
Ho il seguente codice per contare fino al 59. Inizia bene ma dopo 31 inizia a mostrare caratteri ASCII come '(', '$', '#' ecc., invece dei numeri. Qualche idea su dove io ' sto sbagliando?
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;
Soluzione
Dato che non stai stampando nulla, suppongo che tu lo stia guardando in un visualizzatore di forme d'onda. Imposta il tipo mostrato su intero, potresti averlo come ASCII come ha detto AnthonyWJones.
Altri suggerimenti
Non ho idea di cosa sia Vhdl, tuttavia, sembra molto probabile che qualsiasi cosa tu stia usando per osservare l'output non ti mostra caratteri ASCII precedenti a 32 perché quelli sarebbero caratteri di controllo , quindi compromette e ti mostra i loro valori. Dal momento che 32 e più sono caratteri stampabili, passa a usarli perché questo è ciò che lo strumento pensa che siano i valori.
Inserisci segnale aggiuntivo:
signal my_char: character;
Quindi esegui la conversione da intero a carattere:
my_char <= character'val(countSVal);
Controlla il segnale my_char sotto debugger o nel visualizzatore di forme d'onda e vedrai i caratteri ASCII. L'ho verificato con Aldec Active-HDL 6.1.