O código abaixo produz -
Erro (10327): erro VHDL em XXXX.vhd(1581): não é possível determinar a definição do operador ""&"" -- encontradas 47 definições possíveis Erro (10647): erro de inferência de tipo VHDL em XXXX.vhd(1581): o tipo de expressão é ambíguo - "std_logic_vector" ou "slvn_array" são duas correspondências possíveis Erro (10411): erro de conversão de tipo VHDL em XXXX.vhd(1581): não é possível determinar o tipo de objeto ou expressão próximo ao texto ou símbolo "UNSIGNED"
----CODE
usb_hid_phy_offload_address <= std_logic_vector(unsigned(ENDPOINT0_CTRL_REG) + unsigned((("00000") & (cfg_hid_ep(v_selp)(5 downto 0)) & ("00"))));
---END CODE
Tentei todas as combinações que me vêm à mente. Sugestões são bem-vindas.
constant g_num_usbs : integer range 1 to 8 := 2 ;
type slvn_array is array (natural range <>) of std_logic_vector ;
signal usb_hid_phy_offload_address : std_logic_vector(12 downto 0) ;
constant ENDPOINT0_CTRL_REG : std_logic_vector(12 downto 0) := '0' & x"040" ;
signal cfg_hid_ep : slvn_array(g_num_usbs-1 downto 0)( 7 downto 0) ;
Supondo que minha edição esteja correta e que você renomeou o tipo nios_reg_array para slvn_array.
VHDL define implicitamente '&' para todos os arrays unidimensionais. Portanto, concatenar é definido para:
Alguns simuladores transmitem mensagens melhores que outros. O exemplo acima é do nvc, um simulador de código aberto — parabéns a Nick G.
O seguinte usa o "&" definido para o tipo unsigned em vez de std_logic_vector e funcionará. Observe que movi o local onde unsigned foi aplicado para ficar logo ao redor da parte std_logic_vector do array e deixei a concatenação fora dele.
Como o comprimento de ENDPOINT0_CTRL_REG corresponde ao de usb_hid_phy_offload_address, não há necessidade do "00000" extra na concatenação e será simplificado para:
Sabendo quais assinaturas causaram o problema, você também pode evitá-lo concatenando com std_logic em vez de std_logic_vector:
Todos os itens acima são compilados.