Usando portas de buffer em VHDL?
É uma má prática de codificação usar portas de buffer em VHDL?
Eu defino uma entidade com uma porta de saída com o_done.
entity blahblah is
port (
...other signals...
o_done : out std_logic;
);
end entity blahblah;
O sintetizador não gosta que eu leia uma porta de saída e não a sintetizará - embora seja um código VHDL 2008 legal. Não consigo mudar meu sintetizador.
Eu uso o_done em 2 processos com clock:
process begin
wait until rising_edge(clk);
if (reset = '1') then
o_done <= '0';
else
if ( State1 ) then
o_done <= '1';
elsif ( o_done = '1' AND State0 ) then
o_done <= '1';
else
o_done <= '0';
end if;
end if;
end process;
process begin
wait until rising_edge(clk);
if (reset = '1') then
count <= to_unsigned(0, 8);
else
if( stateS0 AND done = '1' ) then
count <= to_unsigned(0, 8);
elsif( stateS1 AND y_counter >= 2 AND p >= 0 ) then
count <= count + 1;
end if;
end if;
end process;
Novamente, o_done, desde que definido como out na declaração de porta, não é sintetizável, pois o mecanismo de síntese não é totalmente compatível com VHDL 2008. Não consigo mudar o sintetizador.
Então, como faço para contornar o_done sendo uma porta de saída e querendo lê-lo?
Posso fazer um sinal intermediário - como faço isso normalmente?
Respostas
Sim, você pode usar a solução simples de criar um sinal interno:
signal done : std_logic ;
Use este sinal dentro do seu processo com clock.
E simplesmente atribua-o o_donecomo uma instrução simultânea dentro da definição de arquitetura:
o_done <= done ;
Eu realmente não tive a necessidade de usar portas de buffer em códigos VHDL até agora. Isso é algo que extraí do Guia de Síntese Xilinx Vivado:
O VHDL permite o modo de porta de buffer quando um sinal é usado internamente e como uma porta de saída quando há apenas um driver interno. As portas de buffer são uma fonte potencial de erros durante a síntese e complicam a validação dos resultados da pós-síntese por meio da simulação. referência: Capítulo 5, Guia de Síntese Xilinx Vivado