1
Experimento 6:
IMPLEMENTAÇÃO EM FPGA DE UM SOMADOR COM DOIS DÍGITOS DECIMAIS DE SAÍDA
1 OBJETIVO
Neste experimento, é realizada a implementação em FPGA de um circuito somador com dois dígitos decimais de saída. É abordado o problema da descrição em VHDL dos vários sistemas digitais constituintes e sua integração, bem como o de interfaceamento do circuito FPGA com as unidades de entrada e de saída.
2 MATERIAL UTILIZADO
• Placa de prototipagem Basys2 da Diligent, Inc., com o FPGA Spartan 3E-100 CP132 (XC3S100E-CP132), da Xilinx.
• Um microcomputador PC.
• Software de desenvolvimento ISE WebPACK, da Xilinx, para síntese do código VHDL.
• Software Adept, da Diligent, para programação do FPGA.
3 PARTE EXPERIMENTAL
Este experimento consiste na implementação de um circuito somador de duas palavras de 4 bits, sendo a saída apresentada em dois mostradores de 7 segmentos. O circuito deve ser elaborado com auxílio da placa Basys2. O FPGA XC3S100E deve receber na entrada 8 bits provenientes de 8 chaves lógicas, representando em código binário dois números inteiros entre 0 e 15 (bits A3, A2, A1, A0 e B3, B2, B1, B0). As saídas do FPGA, por sua vez, devem acionar os dois mostradores de 7 segmentos da placa Basys2, que exibirão o resultado da soma, em decimal. O diagrama de blocos desse sistema é apresentado na Figura 1.
No entanto, esse sistema será implementado por partes. Cada parte será implementada e testada individualmente. Finalmente, as diferentes partes serão integradas e o somador será testado. Cada parte é detalhada a seguir.
3.1 Somador de duas palavras de 4 bits com saída binária
Primeiro, implementaremos um somador de duas palavras de 4 bits com saída binária. Esse somador terá 8 bits de entrada e 5 bits de saída, conforme ilustrado na Figura 2. Note que 5 bits de saída são suficientes, pois cada palavra de 4 bits pode assumir valores entre 0 e 15; portanto, o maior resultado possível para a soma será 30 (15+15), número o qual pode ser representado com apenas 5 bits: 11110.
Para implementar esse somador, usaremos o código do somador completo, desenvolvido no experimento 4. As entradas e saídas do somador completo são mostradas na Figura 3.
Lembre-se que, no experimento 4, foi implementado um somador de palavras de 3 bits. Modifique esse código para implementar seu somador de palavras de 4 bits. Note, contudo, que o somador implementado no experimento 4 contava com um bit de entrada Cin (carry-in ou “vem-um”),
enquanto que o somador a ser implementado neste experimento não dispõe dessa entrada. Portanto, faça as devidas alterações.
Lembrem-se ainda que, neste experimento, não iremos simular os sistemas, mas sim implementá-los em hardware, usando o FPGA. Portanto, os atrasos de cada porta lógica não devem ser especificados no
2 código VHDL, pois estes corresponderão ao atraso real de cada porta física no FPGA. Se, em seu código, houver especificações de atrasos (ex: “after 10 ns”), remova essas especificações. Lembre-se também de usar STD_LOGIC ao invés do tipo BIT.
Figura 2 – Somador de duas palavras de 4 bits com saída binária. Este somador pode ser implementado cascateando quatro somadores completos, como o apresentado na Figura 3.
Figura 3 – Somador completo, já implementado em VHDL no experimento 4.
Como entradas, utilize as oito chaves de duas posições (SW7 a SW0) da placa Basys2. Como saída, utilize cinco LEDs (LD4 a LD0). Para isso, em um arquivo UCF (universal constraints file), associe cada bit de entrada e saída aos pinos correspondentes do FPGA. Os pinos do FPGA associados a cada dispositivo de entrada e saída da placa Basys2 são listadas no Anexo I.
3.2 Conversor binário/BCD com 5 bits de entrada e dois dígitos de saída
A seguir, implementaremos um conversor binário/BCD com 5 bits de entrada e dois dígitos de saída, conforme ilustrado na Figura 4. Na saída do conversor, o dígito D representa as dezenas, enquanto que o dígito U representa as unidades.
Você pode usar estruturas “with-select” para implementar este conversor (uma estrutura “with-select” para cada dígito de saída). Note que o vetor S de entrada só pode assumir valores binários entre 0 e 31. Portanto, o dígito D só poderá assumir valores
BCDs entre 0 e 3. Use essa informação para simplificar seu código.
Figura 4 – Conversor binário/BCD com 5 bits de entrada e dois dígitos de saída.
Como entradas, utilize cinco chaves de duas posições (SW4 a SW0) da placa Basys2. Como saída, utilize os oito LEDs (LD7 a LD0) da placa. Para isso, em um arquivo UCF, associe cada bit de entrada e saída aos pinos correspondentes do FPGA. Os pinos do FPGA associados a cada dispositivo de entrada e saída da placa Basys2 são listadas no Anexo I. 3.3 Somador de palavras de 4 bits com saída em
BCD
Na sequência, implementaremos um somador de palavras de 4 bits com saída em BCD. Para isso, utilizaremos as entidades desenvolvidas nos itens anteriores, conforme ilustrado na Figura 5.
Figura 5 – Somador de palavras de 4 bits com saída em BCD, implementado utilizando os sistemas apresentados nas Figuras 2 e 4.
Como entradas, utilize as oito chaves de duas posições (SW7 a SW0) da placa Basys2. Como saída, utilize os oito LEDs (LD7 a LD0) da placa. Para isso, em um arquivo UCF, associe cada bit de entrada e saída aos pinos correspondentes do FPGA. Os pinos do FPGA associados a cada dispositivo de entrada e saída da placa Basys2 são listadas no Anexo I.
3
Figura 6 – Conversor BCD/7 segmentos de dois dígitos. 3.4 Conversor BCD/7 segmentos de dois dígitos
Agora implementaremos um conversor BCD/7 segmentos de dois dígitos. As entradas serão duas palavras BCD de 4 bits cada, representando a casa das dezenas e a casa das unidades de um número decimal. A saída do conversor terá dois números representados em 7 segmentos, associados aos dígitos das dezenas e das unidades, respectivamente. Esses dígitos deverão ser mostrados no mostrador da placa Basys2, conforme ilustrado na Figura 6.
3.4.1 Conversor BCD/7 segmentos
No diagrama de blocos apresentado na Figura 6, note que o bloco correspondente ao conversor BCD/7 segmentos é utilizado duas vezes.
Lembre-se que, no experimento 5, já implementamos esse conversor. Portanto, neste experimento simplesmente reutilizaremos a entidade implementada no experimento anterior. Conforme ilustrado na Figura 6, essa entidade será usada duas vezes no sistema em questão.
3.4.2 Multiplexador do display
A placa Basys2 dispõe de quatro mostradores de 7 segmentos. No entanto, há somente 12 pinos associados aos mostradores:
• 4 pinos para escolher qual(is) mostrador(es) está(ão) ligado(s);
• 7 pinos para acender cada segmento individual; e • 1 pino para o ponto decimal (não utilizado neste
experimento).
Assim, para mostrar dígitos diferentes em cada um dos mostradores, é necessário alternar entre os mostradores, em uma frequência mais rápida que a de detecção do olho humano, escrevendo um dígito
em cada mostrador de cada vez, de modo que somente um mostrador fique aceso de cada vez. Assim, temos a percepção de que os quatro mostradores estão acesos ao mesmo tempo, quando na verdade eles estarão se alternando no tempo. Esse processo é chamado de multiplexação.
Para que os quatro dígitos apareçam brilhantes e continuamente iluminados, cada dígito deve ser aceso uma vez a cada 1 a 16 ms (o que corresponde a uma taxa de atualização de 1 kHz a 60 Hz). Por exemplo, usando uma taxa de atualização de 60 Hz, os mostradores serão atualizados uma vez a cada 16 ms, e cada dígito ficará iluminado por um quarto do ciclo de atualização, isto é, 4 ms.
O controlador tem que garantir que o código de 7 segmentos correto é escrito nos pinos correspondentes quando o mostrador associado a ele está aceso. Para ilustrar esse processo, se AN1 está ligado enquanto b e c estão acionados, então o dígito “1” aparecerá no primeiro mostrador. A seguir, se AN2 está ligado enquanto a, b e c estão acionados, então o dígito “7” aparecerá no segundo mostrador. Se essas duas configurações forem trocadas a cada 4 ms, então um observador verá o número “17” escrito nos mostradores, pois a taxa de atualização é rápida demais para que o olho humano perceba essa alternância.
A figura 7 mostra um exemplo de um diagrama de temporização para o controle de um mostrador de quatro dígitos.
ATENÇÃO: Os pinos da placa Basys2 associados ao mostrador de 7 segmentos — a, b, c, d, e, f, g, AN0, AN1, AN2 e AN3 — são ativos em nível baixo. Portanto, para acender um dos segmentos, ou para selecionar um dos mostradores, é preciso escrever o bit 0 no mesmo.
Um exemplo de código para alternar entre os mostradores AN0 e AN1 é apresentado a seguir.
4 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity mostrador is
Port ( ck: in STD_LOGIC; --clock da placa
digito : out STD_LOGIC_VECTOR (6 downto 0); --digito a ser mostrado displays : out STD_LOGIC_VECTOR (3 downto 0) ); --seletor de mostrador end mostrador;
architecture mostrador_op of mostrador is
signal display0,display1 : STD_LOGIC_VECTOR (6 downto 0);
signal cntDiv: STD_LOGIC_VECTOR(28 downto 0); -- general clock div/cnt alias clkDisp: STD_LOGIC is cntDiv(16); -- divided clock: 50MHz/2^17=381Hz begin
display0 <= "0000001"; -- decimal "0" display1 <= "1001111"; -- decimal "1"
-- CODIGO PARA ALTERNAR ENTRE OS MOSTRADORES AN0 E AN1 ckDivider: process(ck)
begin
if ck'event and ck='1' then cntDiv <= cntDiv + '1'; end if;
case clkDisp is when '0' =>
digito <= display0;
displays <= "1110"; -- seleciona mostrador AN0 when others =>
digito <= display1;
displays <= "1101"; -- seleciona mostrador AN1 end case;
end process; end mostrador_op;
Figura 7 - Temporização de multiplexação dos mostradores de 7 segmentos.
Note que a entidade implementada no código acima tem um bit de entrada (ck) e dois vetores de saída: digito e display. O sinal de entrada ck corresponde ao clock da placa, e deve ser associado ao pino “B8” do FPGA no arquivo UCF. Já os vetores de saída, digito e display, correspondem, respectivamente, aos sete segmentos a, b, c, d, e, f e
g do dígito a ser mostrado, e aos pinos AN0, AN1, AN2 e AN3, que indicam quais dos quatro mostradores devem mostrar o dígito.
No código acima, note que alterna-se entre o primeiro mostrador, AN0, fazendo-se
displays <= "1110";
e o segundo mostrador, AN1, fazendo-se displays <= "1101";
Quando o mostrador AN0 é acionado, o digito de saída estará refletindo o conteúdo do sinal display0, que contém o código 7 segmentos associado ao número decimal 0: “0000001” (em lógica invertida). Quando o mostrador ANq é acionado, o digito de saída estará refletindo o conteúdo do sinal display1, que contém o código 7 segmentos associado ao número decimal 1: “1001111” (em lógica invertida). Assim, o mostrador mostrará o número decimal “10”.
5 Portanto, para se implementar a entidade “multiplexador do display”, ilustrada na Figura 6, basta modificar o código apresentado acima, substituindo os sinais display0 e display1 por dois “ports” de entrada, Dseg e Useg, cada um com 7 bits. 3.4.3 Pinos de entrada e saída
Como entradas, utilize as oito chaves de duas posições (SW7 a SW0) da placa Basys2 e o pino associado ao clock da placa. Como saída, utilize os pinos associados ao mostrador de 7 segmentos da placa: a, b, c, d, e, f, g, AN0, AN1, AN2 e AN3. Para isso, em um arquivo UCF, associe cada bit de entrada e saída aos pinos correspondentes do FPGA. Os pinos do FPGA associados a cada dispositivo de entrada e saída da placa Basys2 são listadas no Anexo I. Note que são, ao todo, 9 pinos de entrada e 11 pinos de saída (ver Figura 6).
3.5 Somador com dois dígitos decimais de saída Finalmente, integraremos os sistemas (entidades) desenvolvidos anteriormente para implementar um somador com dois dígitos decimais de saída, conforme ilustrado na Figura 1. Note que, para isso, basta integrar o sistema da Figura 5 ao sistema de Figura 6.
Como entradas, utilize as oito chaves de duas posições (SW7 a SW0) da placa Basys2 e o pino associado ao clock da placa. Como saída, utilize os pinos associados ao mostrador de 7 segmentos da placa: a, b, c, d, e, f, g, AN0, AN1, AN2 e AN3. Para isso, em um arquivo UCF, associe cada bit de entrada e saída aos pinos correspondentes do FPGA. Os pinos do FPGA associados a cada dispositivo de entrada e saída da placa Basys2 são listadas no Anexo I. Note que são, ao todo, 9 pinos de entrada e 11 pinos de saída (ver Figura 6).
4 INSTRUÇÕES PARA A REALIZAÇÃO DO EXPERIMENTO
4.1 Pré-relatório
• Apresente o diagrama de blocos do somador de palavras de 4 bits com carry-in. Traga o código VHDL dos somadores do experimento 4 para usar como base.
• Apresente a tabela verdade do conversor binário-BCD.
• Traga o código VHDL do conversor binário/7 segmentos implementado no experimento 5.
• Apresente o diagrama de blocos de cada sistema a ser implementado no experimento. Identifique cada conexão entre blocos no diagrama.
• Apresente a lista dos pinos de entrada e saída do FPGA a serem usados em cada sistema a ser implementado.
4.2 Vistos
Serão seis vistos:
• Visto 1: Somador de duas palavras de 4 bits com saída binária (discutido na seção 3.1 e ilustrado na Figura 2). Esse somador deve ser implementado cascateando-se quatro somadores completos, como o apresentado na Figura 3. (vale 1 ponto) • Visto 2: Conversor binário/BCD com 5 bits de
entrada e dois dígitos de saída (discutido na seção 3.2 e ilustrado na Figura 4). (vale 1 ponto)
• Visto 3: Somador de palavras de 4 bits com saída em BCD (discutido na seção 3.3 e ilustrado na Figura 5). Este sistema deve ser implementado utilizando as entidades desenvolvidas nos vistos 1 e 2. (vale 2 pontos)
• Visto 4: Rodar o código da entidade “mostrador”, apresentado na seção 3.4.2. (vale 1 ponto)
• Visto 5: Conversor BCD/7 segmentos de dois dígitos (discutido na seção 3.4 e ilustrado na Figura 6). (vale 1 ponto)
• Visto 6: Somador com dois dígitos decimais de saída (discutido na seção 3.5 e ilustrado na Figura 1). (vale 2 pontos)
A pontuação de cada visto é informada acima e totaliza 8 pontos. Os 2 pontos restantes correspondem à nota de pré-relatório. O grupo terá duas aulas para conseguir todos os vistos.
Para cada visto, siga o seguinte procedimento: 1) crie um novo projeto;
2) inclua os arquivos VHDL com os códigos a serem aproveitados;
3) crie novo(s) arquivo(s) VHDL com os novos códigos e adicione-o(s) ao projeto;
4) crie um arquivo UCF com a pinagem do FPGA e adicione-o ao projeto;
5) verifique a sintaxe (“Check Syntax”), sintetize seu sistema (“Synthesize - XST”), implemente-o (“Implement Design”) e gere o arquivo .BIT (“Generate Programming File”), verificando se cada um desses passos foi completado com sucesso antes de executar o próximo; e
6 4.3 Relatório
O relatório é individual, deve ser feito à mão, e consiste em responder ao questionário abaixo. Não é necessário entregar um relatório formal, com introdução, metodologia, resultados, etc.
1) Quantas entidades compuseram o sistema implementado no visto 6? Descreva cada uma delas (entradas, saídas, o que cada uma faz) e também a maneira como elas se interligam entre si. (4 pontos) 2) Porque a saída do somador de 4 bits não pode ser ligada diretamente nas entradas dos conversores para código de 7 segmentos? Como você contornou este problema? (2 pontos)
3) Explique a finalidade do arquivo .UCF. Que tipo de informação ele inclui? Quaisquer pinos poderiam ter sido usados? (2 pontos)
4) Explique porque é necessário multiplexar os mostradores do display de 7 segmentos. Explique também como isso foi feito. (2 pontos)
7 ANEXO I: ASSOCIAÇÃO DOS DISPOSITIVOS DE ENTRADA E SAÍDA DA PLACA BASYS2 AOS PINOS DO FPGA
Para que o circuito descrito possa ser implementado em FPGA, é necessário associar os sinais de entrada e de saída a pinos desse dispositivo. Para tanto, clique em “Project\New Source” e escolha “Implementation Constraints File”. O nome do arquivo pode ser o mesmo do projeto (“meuprojeto.ucf”), e pode ser salvo na mesma pasta que os códigos VHDL. Certifique-se de que a opção “Add to project” está marcada e clique em "Next”. Verifique suas seleções e clique em “Finish”.
O arquivo aberto será utilizado para o mapeamento dos pinos. A sintaxe utilizada para mapeamento dos pinos é a seguinte:
NET "entrada" LOC = "P11"; # SW0 NET "saida" LOC = "M5"; # LD0 NET "vetor<5>" LOC = "L3"; # SW1 NET "ck" LOC = "B8"; # CLOCK
Atenção para a sintaxe do código, em especial para o uso das aspas duplas, dos símbolos de maior e menor, do igual e do ponto-e-vírgula. O texto após o símbolo # corresponde a um comentário, e é opcional.
A tabela A1 lista os nomes dos pinos correspondentes aos principais dispositivos de entrada e saída da placa Basys2.
A figura A1 apresenta a disposição dos LEDs em um display ou mostrador de 7 segmentos. Muitos mostradores de 7 segmentos dispõem ainda de um LED adicional, que implementa o ponto decimal. No entanto, o ponto decimal não será utilizado neste experimento.
Figura A1 - Disposição dos LEDs em um display de 7 segmentos.
Tabela A1 - Nomes dos pinos correspondentes aos principais dispositivos de entrada e saída da placa Basys2.
Dispositivos de entrada Dispositivos de saída
Chave Pino LED Pino
SW7 N3 LD7 G1 SW6 E2 LD6 P4 SW5 F3 LD5 N4 SW4 G3 LD4 N5 SW3 B4 LD3 P6 SW2 K3 LD2 P7 SW1 L3 LD1 M11 SW0 P11 LD0 M5 Botão Pino BTN3 A7 BTN2 M4 BTN1 C11 BTN0 G12 Clock Pino CK B8
A placa Basys2 dispõe de quatro mostradores de 7 segmentos. No entanto, há somente 12 pinos associados aos mostradores, conforme listado na tabela A2.
Os pinos da placa Basys2 listados na tabela A2 são ativos em nível baixo. Portanto, para acender um dos segmentos, ou para selecionar um dos mostradores, é preciso escrever o bit 0 no mesmo.
Tabela A2 - Nomes dos pinos associados aos mostradores de 7 segmentos. Seletor de mostrador Segmentos
Mostrador Pino Segmento Pino
AN3 K14 a L14 AN2 M13 b H12 AN1 J12 c N14 AN0 F12 d N11 e P12 f L13 g M12 ponto decimal N13