teclado de interfaz de vhdl con fpga

0
entity hex_kp is
    Port (
      coloumn : in  STD_LOGIC_VECTOR (3 downto 0);
      sevenseg : out  STD_LOGIC_VECTOR (7 downto 0);
      ca : out  STD_LOGIC_VECTOR (3 downto 0)
    );
end hex_kp;

architecture Behavioral of hex_kp is
  signal row: std_logic_vector(3 downto 0);

  process(row, column)
  begin
    ca <="0111";
    if(row = "0111") then
      case coloumn is
        when "0111" =>
          sevenseg <= "00000110";
        when "1011" =>
          sevenseg <= "01011011";
        when "1101" =>
          sevenseg <= "01001111";
        when "1110" =>
          sevenseg <= "01110001";
        when others =>
          sevenseg <= (others => '0');
      end case;
    end if;

Esta es una parte de mi código VHDL para conectar el teclado con Basys2. Sin embargo, da error a la parte process(row, coloumn) . Cuando lo excluyo, da error a la parte if (row = "0111") . Primero escribí la fila como salida, pero luego la cambié para señalar. Los mismos errores ocurren en la fila de situación como una salida. No puedo ver mi error. ¿Alguien puede ayudar?

    
pregunta Ayca Ekin

1 respuesta

1

Suponiendo que la fila es una entrada:

library ieee;
use ieee.std_logic_1164.all;

entity hex_kp is
    port ( 
        row:        in  std_logic_vector (3 downto 0);
        coloumn:    in  std_logic_vector (3 downto 0);  -- 'column 'is mispelled
        sevenseg:   out std_logic_vector (7 downto 0);  -- why is 7 segs 8 long?
        ca :        out std_logic_vector (3 downto 0)
    );
end entity hex_kp;

architecture behavioral of hex_kp is
    -- signal row: std_logic_vector(3 downto 0);  -- who drive row?
begin  -- this was missing
UNLABELLED:
    process(row, coloumn)  -- was 'column' (didn't match declaration)
    begin
        ca <="0111";
        if row = "0111" then
            case coloumn is
                when "0111" =>
                    sevenseg <= "00000110"; 
                when "1011" => 
                    sevenseg <= "01011011";  
                when "1101" =>
                    sevenseg <= "01001111";
                when "1110" =>
                 sevenseg <= "01110001";
                when others =>
                    sevenseg <= (others => '0');
            end case;
        end if;
    end process;
end architecture behavioral;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity hex_kp_tb is
end entity;

architecture foo of hex_kp_tb is
    signal row:         std_logic_vector (3 downto 0);
    signal coloumn:     std_logic_vector (3 downto 0);
    signal sevenseg:    std_logic_vector (7 downto 0);
    signal ca:          std_logic_vector (3 downto 0);
    signal count:       unsigned (7 downto 0) := (others => '0');
begin

DUT: 
    entity work.hex_kp
        port map (
            row => row,
            coloumn => coloumn,
            sevenseg => sevenseg,
            ca => ca
        );
STIMULUS:
    process
    begin
        row <= std_logic_vector (count(3 downto 0));
        coloumn <= std_logic_vector (count(7 downto 4));
        wait for 100 ns;
        count <= count + 1;
        if count = "11111111" then
            wait;
        end if;
    end process;
end architecture;

Faltaba el begin para el cuerpo de la arquitectura. También escribió mal la columna, mientras la deletrea correctamente en un lugar.

Su código modificado analiza, elabora y el banco de pruebas agregado simula:

Tengaencuentaqueelhechodenotenerotracosaparalasentenciaifbasadaenunvalorparticularderowhacequeloslatchesconservenelvalordesevensegparaotrosvaloresderow.

Estonoesparticularmenterobusto,'row="0111" es una evaluación combinatoria que puede causar problemas técnicos. Podría considerar usar el resultado de la comparación de igualdad como una habilitación para algo con un reloj.

También puedes deshacerte de los cierres usando otra cosa para la sentencia if que asigna sevenseg a algún valor.

    
respondido por el user8352

Lea otras preguntas en las etiquetas