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;
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top