Soy un novato en el mundo de VHDL, pero parece que tengo lo básico. Cajeros automáticos Estoy trabajando en un proyecto, que me obliga a tomar una entrada binaria de 4 bits (interruptores), leer este valor y convertirlo a valores decimales.
Hasta aquí tengo variables (count_ones, count_tens) que se supone que contienen el valor decimal de la entrada.
Mi código actual es el siguiente:
architecture Behavioral of Seven_Seg_Counter is
signal count_ones : integer range 0 to 9 := 0;
signal count_tens : integer range 0 to 9 := 0;
signal count_hundreds : integer range 0 to 9 := 0;
signal count_thousands : integer range 0 to 9 := 0;
signal prescaler : integer := 0;
signal anode : integer range 1 to 4 := 1;
signal digit : STD_LOGIC_VECTOR(3 downto 0) := "1110";
begin
Calculate: process (CLK)
variable countings : integer range 0 to 9 := 0;
begin
if rising_edge(CLK) then
if INPUT(3) = '1' then
countings := 8;
else
countings := 0;
end if;
if INPUT(2) = '1' then
countings := countings + 4;
else
countings := 0;
end if;
if INPUT(1) = '1' then
countings := countings + 2;
else
countings := 0;
end if;
if INPUT(0) = '1' then
countings := countings + 1;
else
countings := 0;
end if;
for I in 1 to 9 loop
if countings > 9 then
countings := countings - 10;
count_tens <= count_tens + 1;
else
count_tens <= 0;
end if;
end loop;
for G in 1 to 9 loop
if countings > 0 then
countings := countings - 1;
count_ones <= count_ones + 1;
else
count_ones <= 0;
end if;
end loop;
end if;
end process;
process (anode, count_thousands, count_hundreds, count_tens, count_ones) -- Bestemmer output som funktion signalerne anode (segmentvælger) og count_XX (den decimale værdi)
begin
case anode is
when 1 =>
case count_ones is
--abcdefg
when 0 => sseg <= "0000001"; -- 0
when 1 => sseg <= "1001111"; -- 1
when 2 => sseg <= "0010010"; -- 2
when 3 => sseg <= "0000110"; -- 3
when 4 => sseg <= "1001100"; -- 4
when 5 => sseg <= "0100100"; -- 5
when 6 => sseg <= "0100000"; -- 6
when 7 => sseg <= "0001111"; -- 7
when 8 => sseg <= "0000000"; -- 8
when 9 => sseg <= "0000100"; -- 9
end case;
when 2 => case count_tens is
--abcdefg
when 0 => sseg <= "0000001"; -- 0
when 1 => sseg <= "1001111"; -- 1
when 2 => sseg <= "0010010"; -- 2
when 3 => sseg <= "0000110"; -- 3
when 4 => sseg <= "1001100"; -- 4
when 5 => sseg <= "0100100"; -- 5
when 6 => sseg <= "0100000"; -- 6
when 7 => sseg <= "0001111"; -- 7
when 8 => sseg <= "0000000"; -- 8
when 9 => sseg <= "0000100"; -- 9
end case;
when 3 => case count_hundreds is
--abcdefg
when 0 => sseg <= "0000001"; -- 0
when 1 => sseg <= "1001111"; -- 1
when 2 => sseg <= "0010010"; -- 2
when 3 => sseg <= "0000110"; -- 3
when 4 => sseg <= "1001100"; -- 4
when 5 => sseg <= "0100100"; -- 5
when 6 => sseg <= "0100000"; -- 6
when 7 => sseg <= "0001111"; -- 7
when 8 => sseg <= "0000000"; -- 8
when 9 => sseg <= "0000100"; -- 9
end case;
when 4 => case count_thousands is
--abcdefg
when 0 => sseg <= "0000001"; -- 0
when 1 => sseg <= "1001111"; -- 1
when 2 => sseg <= "0010010"; -- 2
when 3 => sseg <= "0000110"; -- 3
when 4 => sseg <= "1001100"; -- 4
when 5 => sseg <= "0100100"; -- 5
when 6 => sseg <= "0100000"; -- 6
when 7 => sseg <= "0001111"; -- 7
when 8 => sseg <= "0000000"; -- 8
when 9 => sseg <= "0000100"; -- 9
end case;
end case;
end process;
process (anode)
begin
case anode is
when 1 => digit <= "1110";
when 2 => digit <= "1101";
when 3 => digit <= "1011";
when 4 => digit <= "0111";
end case;
end process;
segmentselect <= digit;
LED_OUT <= INPUT;
end Behavioral;
Mi idea es que almacene el valor binario (mirando a un lado los complementos de 1 y 2) en los recuentos de variables (que funcionan bien en una simulación). La siguiente parte es, donde realmente encuentro el valor de los conteos, y almaceno su dígito más a la derecha en la señal count_ones (ones), y el dígito más a la izquierda (decenas) en la señal count_tens. Por alguna razón desconocida, mi forma de encontrar las unidades y las decenas no funciona bien con esos bucles. Tal vez entendí mal cómo usarlo para bucles.
¿Alguno de ustedes podría ayudarme? Realmente lo apreciaría.
Los bucles son difíciles de hecho. La cuestión es que una entrada de 4 bits es solo el comienzo, me gustaría poder leer más, así que si puedo aprender el método básico con solo 4 bits, sería increíble.
Bueno, la señal de count_ones es para los unos, y el count_tens es para las decenas de la entrada, así que no estoy muy seguro de obtener, cómo to_integer (unsigned (INPUT)); va a funcionar, así que obtengo un valor decimal de 0 a 9 en count_ones o count_tens.
El método de resta al que hace referencia, creo, he intentado implementar eso en mis bucles, que no funcionan como se esperaba.