• VHDL

Combinacional

Em sistemas digitais, lógica combinacional é aquela que não depende do estado anterior (não possui memória), podemos classificar portas lógicas (and, or, nand ...), mux, demux, comparadores, full address e outros componentes como sendo do tipo combinacional.

Note

Logic is combinational if outputs at a specified time are a function only of the inputs at that time. Examples of combinational logic functions are decoders, multiplexers, and adders. ...

Trecho extraído do site da intel

VHDL

Existem duas formas de descrevermos um circuito combinacional em VHDL, uma delas é utilizando o process, não iremos tratar dessa alternativa nesse documento.

Note

O uso de process pode confundir vocês nesse primeiro momento, por parecer um função de um programa sequêncial.

Para transcrevermos uma lógica combinacional em VHDL basta escrever a implementação

Equações

Podemos escrever equações em VHDL utilizando os seguintes operadores: not, and, or, nor, xor, xnor. Como no exemplo a seguir:

\(X = (\bar{A} . B) + C)\)

Transcrevemos para:

X <= ((not A) and B) or C;

Tip 1

Abuse dos parenteses () para explicitar a lógica desejada, por exemplo:

not A and B ---> not (A and B) 
            \
             \-> (not A) and B

Tip 2

Quando desenvolvemos projetos para FPGA não tem a necessidade de simplificarmos a equação lógica, a ferramenta (Quartus) faz isso para a gente.

Concatenate

Em VHDL podemos concatenar bit para formar vetores, isso é feito da seguinte forma:

signal bit0, bit1 : std_logic;
signal vec        : std_logic_vector(1 downto 0);

begin

   vec <= bit1 & bit0;

end;

No exemplo anterior, temos um vetor de 2 bits (vec) que é formado por: [bit1, bit0].

with select

O with select em VHDL é utilizado quando desejamos que um sinal (ou saída) receba diferentes valores com base em um sinal de seleção. No exemplo a seguir, o sinal b recebe o valor 1000 quando o sinal de seleção a for 00, 0100 quando a for 01, ..., note que no último caso usamos o others, ele entrou no lugar do 11.

signal a : std_logic_vector(1 downto 0); 
signal b : std_logic_Vector(3 downto 0);

begin

with a select 
    b <= "1000" when "00",
         "0100" when "01",
         "0010" when "10",
         "0001" when others;

O hardware gerado pela descrição anterior seria:

Warning

Utilizar others na última opção!

Tip 3

Precisamos lembrar que no final tudo vai virar um hardware, o with é normalmente utilizado para implementar um multiplexiador!

Multiplexador

when else

O construtor when else é um pouco mais geral, para cada opção você pode fornecer uma condição diferente. O mesmo exemplo do with ficaria escrito da seguinte maneira:

b <= "1000" when a = "00" else 
     "0100" when a = "01" else 
     "0010" when a = "10" else 
     "0001";

Warning

A última opção não deve possuir nenhuma condição!

Porém com o when else temos a flexibilidade de realizar algo como:

b <= "1000" when (a = "00" AND en = '1') else 
     "0100" when (a = "01" AND en = '1') else 
     "0010" when (a = "10" AND en = '1') else 
     "0010" when (a = "00" AND en = '1') else 
     "0000";                                    -- enable desativado

Nesse exemplo, temos duas condições para cada opção: a e en devem satisfazer a condição, isso não é possível com o with select.

Note

others e else: Precisamos entender que um sinal do tipo std_logic em VHDL não pode assumir apenas os valores 0 e 1, mas sim: 0, 1, X, Z, W, L, H, -, para cobrir todas as opções (com dois 'bits') deveríamos possuir 64 linhas para cada with ou when que fossemos construir.