Soy nuevo en VHDL y tengo un problema con mi código que parece que no puedo solucionar. Se supone que debemos hacer esto utilizando la asignación de señal seleccionada o la búsqueda en la tabla. El mío es una especie de combinación de los dos, ya que se supone que debemos usar no importa entradas que no sucederán.
Básicamente, se supone que el código da la misma salida para la entrada de complemento de 2 o el binario de desplazamiento. Entonces, por ejemplo, el número decimal 7 es "1111" en binario de compensación y "0111" en el complemento de 2. Ambas formas deben generar una salida de "1111100000" dependiendo del valor del interruptor oe ('1' para binario de compensación, '0' para el complemento de 2).
He depurado mi código tanto como puedo a este nivel y no entiendo lo que estoy haciendo mal.
Active-HDL actualmente me está dando errores en las líneas 48 y 55. Recibo dos errores de "expresión simple esperada".
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity pitch_decoder_2 is
port(d, c, b, a : in std_logic;
ob : in std_logic;
led : out std_logic_vector(9 downto 0));
end pitch_decoder_2;
architecture myarch of pitch_decoder_2 is
type tbl is array (15 downto 0) of std_logic_vector(9 downto 0);
constant table : tbl := (
"1111100000", -- 7
"1111100000", -- 6
"1111100000", -- 5
"1111100000", -- 4
"0111100000", -- 3
"0011100000", -- 2
"0001100000", -- 1
"0000100000", -- 0
"0000110000", -- -1
"0000111000", -- -2
"0000111100", -- -3
"0000111110", -- -4
"0000111111", -- -5
"0000111111", -- -6
"0000111111", -- -7
"0000111111"); -- -8
signal input : std_logic_vector(3 downto 0);
signal tmp : std_logic_vector(2 downto 0);
begin
input <= std_logic_vector' (d, c, b, a);
tmp <= std_logic_vector' (c, b, a);
with input select
led <= table(to_integer(unsigned(d & tmp)))
when "0000" | "0001" | "0010" | "0011" |
"0100" | "0101" | "0110" | "0111" |
"1000" | "1001" | "1010" | "1011" |
"1100" | "1101" | "1110" | "1111"
and ob = '1',
table(to_integer(unsigned(not d & tmp)))
when "0000" | "0001" | "0010" | "0011" |
"0100" | "0101" | "0110" | "0111" |
"1000" | "1001" | "1010" | "1011" |
"1100" | "1101" | "1110" | "1111"
and ob = '0',
"----------" when others;
end myarch;
Además, si tiene alguna sugerencia sobre cómo puedo mejorar el código mientras mantengo las instrucciones de asignación, no dude en sugerir cualquier cosa.