Baixe o app para aproveitar ainda mais
Prévia do material em texto
LÓGICA PROGRAMÁVEL AULA 4 Prof. Ederson Cichaczewski 2 CONVERSA INICIAL Nesta aula, iremos conhecer o projeto em VHDL de uma unidade lógica e aritmética, circuitos codificadores, multiplexadores, contadores, registradores de deslocamento e geradores de sinais. A linguagem de descrição de hardware VHDL nos permite implementar qualquer circuito digital sem que tenhamos que nos preocupar com quais são as primitivas de base (portas lógicas, flip-flops etc.) para configuração ou como conectá-las. Após a síntese, você verá uma representação gráfica do circuito final. TEMA 1 – UNIDADE LÓGICA E ARITMÉTICA (ULA) A unidade lógica e aritmética (ULA) realiza todas as operações lógicas e aritméticas de um sistema computacional. As operações são realizadas de acordo com instruções provenientes da unidade de controle. Os dados utilizados nessas operações são binários e provenientes da memória do sistema. 1.1 Exemplo prático: ULA de quatro operações A ULA de 1 bit de dados e 2 bits de controle realiza apenas quatro operações lógicas (e não contempla operações aritméticas). As entradas "d1" e "d0" definem a operação executada entre os bits das entradas "a" e "b". O resultado é apresentado na saída "s". Figura 1 ‒ Diagrama de uma unidade lógica de 1 bit de dados 3 Tabela 1 ‒ Operações de uma unidade lógica de 2 bits de controle Em VHDL, pode-se usar as estruturas “IF ELSE” e “CASE WHEN” com ou sem aninhamento em uma codificação sequencial. Figura 2 ‒ Exemplo de descrição sem aninhamento em estrutura “IF ELSE” Figura 3 ‒ Exemplo de descrição com aninhamento em estrutura “IF ELSE” 4 Figura 4 ‒ Exemplo de descrição sem aninhamento em estrutura “CASE WHEN” Figura 5 ‒ Exemplo de descrição com aninhamento em estrutura “CASE WHEN” Nos casos sem aninhamento, os sinais que definem a decisão são concatenados em um único sinal, o que resulta em descrições mais concisas e claras. No processo de síntese das estruturas aninhadas, cada comando “CASE” ou “IF” leva à inserção de um circuito de seleção. No caso das descrições sem aninhamento, a decisão é tomada utilizando-se um único circuito de seleção. 5 1.2 Exemplo prático: ULA de oito operações A ULA que realiza oito operações, entre lógicas e aritméticas, possui 3 bits de controle. Figura 6 ‒ Diagrama de uma unidade lógica de 3 bits de controle Tabela 2 ‒ Operações de uma unidade lógica de 3 bits de controle opr Operação 000 ts rs + ss 001 ts rs + ss + ci 010 ts rs - ss 011 ts rs - ss - ci 100 ts rs E ss 101 ts rs OU ss 110 ts rs OU-EXLUSIVO ss 111 ts NÃO rs Na entrada, o barramento "opr" define a operação a ser realizada entre os dados "‘rs" e "ss", e "ci" é uma entrada de carry. A saída "ov" significa overflow, "zr" indica resultado nulo e "ts", o resultado da operação. Para os barramentos de dados de entrada e saída, pode-se usar a definição de sinal com o padrão "STD_LOGIC_VECTOR". O bit MSB da entrada de controle pode definir se a operação será lógica ou aritmética, e as operações em si são definidas pelos demais bits. A estratégia de codificação concorrente também pode ser utilizada por meio da estrutura “WITH SELECT”. 6 1.3 Exemplo prático: ULA de oito bits e 16 operações Aqui, vemos a ULA com barramento de dados de oito bits, oito operações lógicas e oito operações aritméticas em código concorrente. Figura 9 ‒ Descrição VHDL de uma ULA de 8 bits de dados e 16 operações 7 TEMA 2 – CIRCUITOS CODIFICADORES E MULTIPLEXADORES 2.1 Codificador de prioridade Um codificador monitora várias entradas; quando uma delas é ativada, este produz um código na saída. Quando mais de uma entrada é ativada ao mesmo tempo, o codificador de prioridade ignora a entrada menos significativa. Figura 7 ‒ Exemplo de diagrama de um codificador de prioridade Tabela 3 ‒ Exemplo de tabela verdade da operação de um codificador de prioridade p3 p2 p1 c1 c0 - não importa 1 - - 1 1 0 1 - 1 0 0 0 1 0 1 0 0 0 0 0 O circuito é um codificador de prioridade entre três entradas denominadas “p3”, “p2” e “p1”, sendo a entrada “p3” a de maior privilégio. Caso ela esteja ativa ‒ “p3 = 1” ‒, seu código é representado nas said́as “c1” e “c0”, independentemente da condição das outras entradas. As entradas restantes, “p2” e “p1”, têm uma prioridade decrescente. A descrição VHDL com construção concorrente "WHEN ELSE" é apresentada a seguir. 8 Figura 8 ‒ Descrição do detector de prioridade com construção WHEN ELSE Essa descrição tem uma maior correspondência com a operação do circuito, em que a condição de cada entrada é verificada individualmente segundo a sua prioridade. Figura 9 ‒ Descrição do detector de prioridade com construção WITH SELECT No caso da construção “WITH SELECT”, como todas as condições devem ser incluid́as na construção, o código contém um detalhamento maior. 2.2 Multiplexador (MUX) O multiplexador (MUX) é um dispositivo que atua como uma chave seletora para sinais digitais. As entradas de seleção são usadas para especificar o canal de entrada que transferirá os dados para a saída. 9 Figura 10 ‒ Exemplo de MUX de quatro entradas A descrição VHDL de um MUX com 4 bits de entrada usando construção concorrente "WITH SELECT" é apresentada a seguir. Figura 11 ‒ Descrição do MUX de quatro entradas com construção WITH SELECT 2.3 Decodificador BDC para sete segmentos É um circuito usado para receber uma entrada no código BCD de 4 bits ("D3", "D2", "D1", "D0") e gerar sete saídas ("a", "b", "c", "d", "e", "f", "g") que acionem os segmentos de um display de LEDs. 10 Figura 12 ‒ Configurações de um display de sete segmentos de LED A tabela verdade para a configuração anodo comum é apresentada a seguir. Tabela 4 ‒ Tabela verdade de um conversor BCD para sete segmentos em anodo comum A descrição VHDL que usa o "PROCESS" do decodificador BCD para sete segmentos é apresentada a seguir. Figura 13 ‒ Descrição VHDL de um decodificador BCD para sete segmentos 11 TEMA 3 – CONTADORES EM VHDL Um contador pode ser descrito como uma máquina de estados em que o código de cada estado corresponde ao valor da contagem. Não é necessário preocupar-se em como conectar flip-flops na descrição, mas é importante considerar algumas características: entrada de clock ativo por borda; entrada de reset assíncrona; a saída é atualizada sincronamente à ocorrência de uma borda ativa (subida ou descida) no clock. Figura 14 ‒ Exemplo de um contador de 0 a 9 (4 bits) A descrição VHDL de um contador de 0 a 9 que usa o "PROCESS" e a estrutura sequencial "IF ELSE" é apresentada a seguir. Figura 15 ‒ Exemplos de descrição VHDL de um contador de 0 a 9 12 Essa descrição realiza uma contagem entre os valores “0” e “9” com reset assińcrono e carga de dados paralela sińcrona. A operação de carga é controlada pelo sinal “ld” (load). Como o incremento do contador é realizado por meio de uma operação de soma, o tipo dos sinais “d” e “q”, bem como o da variável “qv”, são declarados como inteiros. O código se utiliza do emprego de uma variável em vez do de um sinal para definir o registrador que armazena o valor da contagem. O teste executado na linha 20 leva o contador a um estado previsto ‒ o valor “0” ‒ caso o valor da contagem exceda “9”. Isso previne a ocorrência de problemas devidos à falta de inicialização ou carga de um valor incorreto. A borda ativa é a de subida no clock. Em síntese: a ferramenta associa a primitiva de um módulo contador "conter_up_sload_sclear_aclear_clock4". Figura 16 ‒ Contador sintetizado em nível RTL TEMA 4– REGISTRADORES DE DESLOCAMENTO Os registradores de deslocamento realizam a transferência de dados, podendo realizar conversões de dados em formatos serial e paralelo. Em VHDL, utilizam-se vetores para descrever os dados. O deslocamento de dados significa que cada bit é transferido para a posição imediatamente à direita nos índices do vetor. O novo bit é armazenado na posição mais à esquerda; já o último bit, na posição mais à direita, é perdido. 13 Figura 17 ‒ Exemplo de processo de deslocamento de bits para a direita O novo bit entra na posição "Q3". O bit da posição "Q0" é perdido. 4.1 Registrador de entrada serial/saída serial (SISO) Aqui é utilizado um vetor de bits como registrador. O deslocamento se dá por uma operação de concatenação (&). Uma entrada chamada shift permite habilitar a operação de deslocamento; se isso não ocorrer, mantém-se na saída os dados atuais (que já estão guardados lá). A descrição VHDL do registrador SISO com "PROCESS" e estrutura sequencial "IF" é apresentada a seguir. Figura 18 ‒ Descrição VHDL do registrador SISO 4.2 Registrador de entrada paralela/saída serial (PISO) Esse registrador possui entradas de controle distintas para: carga (load) paralela; deslocamento (shift) serial. 14 A operação de concatenação é usada para o deslocamento de bits. Um vetor de bits é usado como registrador. A descrição VHDL do registrador PISO é apresentada a seguir. Figura 19 ‒ Descrição VHDL do registrador PISO TEMA 5 – GERADORES DE SINAIS A partir de um sinal de clock, podemos obter sinais com formatos específicos (arbitrários) e frequências diferentes. Uma estratégia para a sua implementação é utilizar a máquina de estados. A base para definir o formato do sinal arbitrário é um contador. Pode-se implementar circuitos monoestáveis, que mantêm sua saída ativa por um tempo definido. 5.1 Exemplo prático: gerador de sinal arbitrário com máquina de estados As características do gerador de sinal são as seguintes: máquina de oito estados; contador de 0 a 7; detecta a borda de subida do clock. O sinal a ser gerado é apresentado a seguir. 15 Figura 20 ‒ Diagrama de tempo com 1 período do sinal A descrição VHDL do gerador é apresentada a seguir. Figura 25 ‒ Descrição VHDL do gerador de sinal arbitrário com máquina de estados 5.2 Gerador de sinal arbitrário sem máquina de estados que utiliza a construção "CASE WHEN" Características do gerador de sinal: contador de 0 a 7; 16 detecta a borda de subida do clock; O resultado da simulação deste gerador é apresentado a seguir. Figura 21 ‒ Diagrama de tempo do gerador de sinal arbitrário sem máquina de estados A descrição VHDL do gerador de sinal arbitrário sem máquina de estados é apresentada a seguir. Figura 22 ‒ Descrição VHDL do gerador de sinal arbitrário sem máquina de estados 5.3 Exemplo prático: gerador de sinal monoestável Aqui, um sinal de disparo (trigger) carrega um contador descrescente; a saída fica em nível alto enquanto o contador não chega a zero, e o gerador de sinal monoestável utiliza abordagem não redisparável. 17 A descrição VHDL do gerador de sinal monoestável é apresentada a seguir. Figura 23 ‒ Descrição VHDL do gerador de sinal monoestável A simulação do gerador de sinal monoestável é apresentada a seguir. Figura 24 – Diagrama de tempo do gerador de sinal monoestável A saída é ativada apenas na borda de subida do clock quando o trigger está ativado. Eventos de trigger durante a contagem são ignorados. 18 FINALIZANDO Nesta aula, vimos o projeto em VHDL de uma unidade lógica e aritmética, circuitos codificadores, multiplexadores, contadores, registradores de deslocamento e geradores de sinais. A compreensão do conteúdo desta aula é fundamental para darmos continuidade do conteúdo da disciplina. 19 REFERÊNCIAS COSTA, C. Projetos de circuitos digitais com FPGA. 3. ed. São Paulo: Érica, 2014. cap. 3. D’AMORE, R. VHDL: descrição e síntese de circuitos digitais. 2. ed. Rio de Janeiro: LTC, 2012. cap. 3, 4, 6 e 11. PEDRONI, V. A. Eletrônica digital moderna e VHDL. Rio de Janeiro: Elsevier, 2010. cap. 5 e 9. TOCCI, R.; WIDMER, N. S. Sistemas digitais: princípios e aplicações. 11. ed. São Paulo: Pearson, 2011. cap. 7 e 9.
Compartilhar