Nuevo en FPGA y necesita ayuda para hacer una calculadora

0

Tengo una tarea en mis manos para programar un FPGA que puede calcular un cierto valor de función cuando se le da X e Y entre 1 y 10. La función en cuestión es 3 * X ^ 2 + 300 * Y.

He escrito algún tipo de código que compila. Cuando programo la placa, veo que se encienden los LED correspondientes a los interruptores que se están activando.

Noté algunos problemas con mi código pero estoy atascado porque estoy seguro de que todo está mal escrito. Lo único que funciona son los LED cuando muevo los interruptores. Sinceramente, no tengo ni idea de qué hacer en este momento.

Este es mi código.

    library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity KursinisCalc is
        Port(
            --CLOCKAS--
            CLOCK_50 : in STD_LOGIC;
            --LEDAI--
            LEDG : out STD_LOGIC_VECTOR (9 DOWNTO 0);
            --SWITCHAI--
            SW : in STD_LOGIC_VECTOR(9 DOWNTO 0);
            --7SEG DISP--
            HEX0_D : out STD_LOGIC_VECTOR(7 DOWNTO 0) :="01000000";
            HEX1_D : out STD_LOGIC_VECTOR(7 DOWNTO 0) :="01000000";
            HEX2_D : out STD_LOGIC_VECTOR(7 DOWNTO 0) :="01000000";
            HEX3_D : out STD_LOGIC_VECTOR(7 DOWNTO 0) :="01000000"
        );
end entity;

architecture main of KursinisCalc is
  signal NUMHEX: STD_LOGIC_VECTOR (3 DOWNTO 0);
  signal NUMD: STD_LOGIC_VECTOR (7 DOWNTO 0);

  component to_7seg is
    Port ( A : in  STD_LOGIC_VECTOR (3 downto 0);
          seg7 : out  STD_LOGIC_VECTOR (7 downto 0)
             );
end component;

    signal cnt: integer RANGE 0 TO 50000000 :=0;
    signal SK1: integer RANGE 0 TO 10 :=5;
    signal SK2: integer RANGE 0 TO 10 :=5;
    signal REZ: integer RANGE 0 TO 3300 :=0;
    signal REZBIN: STD_LOGIC_VECTOR(15 DOWNTO 0);
    signal HEX: STD_LOGIC_VECTOR(3 DOWNTO 0);

    alias SW1 is SW(9 DOWNTO 6);
    alias SW2 is SW(3 DOWNTO 0);
    alias LEDG2 is LEDG(3 DOWNTO 0);
    alias LEDG1 is LEDG(9 DOWNTO 6);
    alias clk is CLOCK_50;
begin

G1: to_7seg port map (NUMHEX, NUMD);
    process(clk)
        begin
        if (rising_edge(clk)) then
            if(SW1 /= "0000" and SW1 <= "1010") then
                SK1 <= to_integer(unsigned(SW1));
            end if;
            if(SW2 /= "0000" and SW2 <= "1010") then
                SK2 <= to_integer(unsigned(SW2));
            end if;
            LEDG1 <= SW1;
            LEDG2 <= SW2;
            REZ <= 3*SK1*SK1+300*SK2;
            REZBIN <= STD_LOGIC_VECTOR(to_unsigned(REZ,16));
            NUMHEX <= REZBIN(3 DOWNTO 0);
            HEX0_D <= NUMD;
            NUMHEX <= REZBIN(7 DOWNTO 4);
            HEX1_D <= NUMD;
            NUMHEX <= REZBIN(11 DOWNTO 8);
            HEX2_D <= NUMD;
            NUMHEX <= REZBIN(15 DOWNTO 12);
            HEX3_D <= NUMD;
        end if;
    end process;

end main;

Este es el código para el componente

    library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity to_7seg is
    Port ( A : in  STD_LOGIC_VECTOR (3 downto 0);
          seg7 : out  STD_LOGIC_VECTOR (6 downto 0)
             );
end to_7seg;

architecture Behavioral of to_7seg is

begin

--'a' corresponds to MSB of seg7 and 'g' corresponds to LSB of seg7.
process (A)
BEGIN
    case A is
        when "0000"=> seg7 <="0000001";  -- '0'
        when "0001"=> seg7 <="1001111";  -- '1'
        when "0010"=> seg7 <="0010010";  -- '2'
        when "0011"=> seg7 <="0000110";  -- '3'
        when "0100"=> seg7 <="1001100";  -- '4' 
        when "0101"=> seg7 <="0100100";  -- '5'
        when "0110"=> seg7 <="0100000";  -- '6'
        when "0111"=> seg7 <="0001111";  -- '7'
        when "1000"=> seg7 <="0000000";  -- '8'
        when "1001"=> seg7 <="0000100";  -- '9'
        when "1010"=> seg7 <="0001000";  -- 'A'
        when "1011"=> seg7 <="1100000";  -- 'b'
        when "1100"=> seg7 <="0110001";  -- 'C'
        when "1101"=> seg7 <="1000010";  -- 'd'
        when "1110"=> seg7 <="0110000";  -- 'E'
        when "1111"=> seg7 <="0111000";  -- 'F'
        when others =>  NULL;
    end case;
end process;

end Behavioral;

Lo siento mucho si me perdí algo o si no soy lo suficientemente específico, intentaré agregar la información que pueda obtener.

    
pregunta Kappa Gnome

1 respuesta

0

Actualmente tienes una instancia de tu componente:

G1: to_7seg port map (NUMHEX, NUMD);

y tratas de usarlo cuatro veces por separado:

NUMHEX <= REZBIN(3 DOWNTO 0);
HEX0_D <= NUMD;
NUMHEX <= REZBIN(7 DOWNTO 4);
HEX1_D <= NUMD;
NUMHEX <= REZBIN(11 DOWNTO 8);
HEX2_D <= NUMD;
NUMHEX <= REZBIN(15 DOWNTO 12);
HEX3_D <= NUMD;

Recuerda, esto es hardware, y todo sucede en paralelo. No puede ejecutar cuatro conjuntos de señales a través de una sola instancia como esa.

En su lugar, necesita cuatro instancias separadas del componente:

G1: to_7seg port map (REZBIN( 3 downto  0), HEX0_D);
G2: to_7seg port map (REZBIN( 7 downto  4), HEX1_D);
G3: to_7seg port map (REZBIN(11 downto  8), HEX2_D);
G4: to_7seg port map (REZBIN(15 downto 12), HEX3_D);
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas