Hola, buenos dias. Hoy estuve realizando unos cuantos ejercicios en VHDL sobre contadores y registros, por eso queria hacer algunas preguntas que surgieron sobre algunos de ellos, y revisar si el procedimiento es correcto.
En el caso de la señal "cuenta", por ahora preferi dejarla declarada como buffer, dado que el profesor nos envio un modelo basico de contadores donde la señal estaba representada asi, pero mas que nada para que el despues no me invada con preguntas especificas sobre alguna modificacion adicional que haya realizado, o algo asi, jeje.
Del siguiente ejercicio, queria saber si es valida la estructura condicional asincrona formada por el reset y la carga. ¿Esta bien utilizar el elseif? ¿No puede suceder que se saltee alguna condicion que deba cumplirse?
Contador binario ascendente 4 bits c/ carga paralela asincrónica
• 1 entrada CLOCK.
• 1 entrada de indicación de carga (1bit): mientras esté activa, implica la carga paralela a salida.
• 1 entrada carga paralela (4 bits): se introduce el dato de carga
• 1 entrada Reset Asincrónico: la cuenta vuelve a 0000.
• 4 salidas (1 bit): conteo.
Código:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity contador_3 is
port (clk, carga, rst : in std_logic;
datos : in std_logic_vector (3 downto 0);
cuenta : buffer std_logic_vector (3 downto 0));
end contador_3;
architecture comportamiento of contador_3 is
begin
process (clk, carga, rst, datos)
begin
if (rst='1') then
cuenta<="0000";
elsif (carga='1') then
cuenta<=datos;
elsif (clk'event and clk='1') then
cuenta<=cuenta+1;
end if;
end process;
end comportamiento;
Ahora tenemos un contador johnson, que basicamente lo simplifique a partir de uno mucho mas complejo, que traia resets sincronos y asincronos, pero lo adapte a las condiciones que se pedian en el ejercicio. Me gustaria saber si, a simple vista, esta mas o menos bien representado, o si hay algo que te parece que pueda faltar...
Contador Johnson ascendente n bits
• 1 entrada CLOCK.
• 1 entrada de Habilitación: si no está habilitado, el contador ignora los pulsos de CLK
• n salidas (1 bit): conteo.
Código:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity johnson is
generic (n : natural := 4);
port (clk, habilitacion : in std_logic;
cuenta : out std_logic_vector (n-1 downto 0));
end johnson;
architecture comportamiento of johnson is
signal reg_john, nxt_john : std_logic_vector (n-1 downto 0);
begin
process (clk)
begin
if (clk'event and clk='1') then
if (habilitacion='1') then
reg_john<=nxt_john;
end if;
end if;
end process;
process (reg_john)
begin
nxt_john<=reg_john (n-2 downto 0) & not reg_john (n-1);
end process;
cuenta<=reg_john;
end comportamiento;
Finalmente, el ultimo ejercicio que resolvi es el de un registro, pero con este no tuve mayor dificultad.
Registro de desplazamiento
• Registro de desplazamiento de 8 bits
• Activo por flanco ascendente de CLOCK
• Entrada datos serie
• Salida datos PARALELO
• Entrada de HABILITACIÓN por nivel (H=0 => ignora CLK)
• Carga PARALELO de datos asincrónica
Código:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity registro_5 is
port (clk, entrada, habilitacion, carga : in std_logic;
datos : in std_logic_vector (7 downto 0);
salida : out std_logic_vector (7 downto 0));
end registro_5;
architecture comportamiento of registro_5 is
signal tmp : std_logic_vector (7 downto 0);
begin
process (clk, carga, datos)
begin
if (carga='1') then
tmp<=datos;
elsif (clk'event and clk='1') then
if (habilitacion='1') then
tmp<=tmp (6 downto 0) & entrada;
end if;
end if;
end process;
salida<=tmp;
end comportamiento;
Lo que voy a intentar hacer es la simulacion de los ejercicios, ya que estimo que es una buena forma para chequear que la logica de cada programa se cumple para cada caso. Mil gracias por su tiempo. Saludos.
---
Hola. Estuve simulando los ejercicios de contadores y funcionaron perfecto. El unico problema lo tuve cuando simule el contador johnson, por el hecho de que, en la salida de la cuenta, me muestra todas letras 'U's, y estando la habilitacion seteada en "1" en determinados momentos. A continuacion dejo el screenshot:
¿Que significaria esa 'U' que me aparece? ¿De que manera lo podria solucionar?
Tambien probe simulando el contador johnson original que tenia, y sucede lo mismo.
Espero su respuesta. Muchas gracias.
PD: La cuenta deberia ser
esta.