Você está na página 1de 67

Dispositivos Lgicos Programveis

Apostila com prticas em VHDL.

Julho 2015.
Prof. Joo Ranhel
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 1

Introduo

Esta uma apostila para introduzir dispositivos programveis aos alunos de iniciao em Eletrnica Digital
(na UFPE: Tcnicas Digitais). Acredito, e as evidncias de mercado/indstria apontam isso, que circuitos
integrados discretos so o passado. A questo : como ensinar aos iniciantes em circuitos digitais que os
dispositivos lgicos programveis (CPLDs, FPGAs e os SoCs) podem ser compreendidos com a mesma
facilidade que os circuitos da gerao anterior?

A primeira coisa tomar contato logo de cara com os circuitos. A segunda isolar o objeto de estudo,
tirando-o do contexto dos kits de desenvolvimento que algumas empresas vendem, que so caros e trazem
muitos recursos (displays, LCDs, chaves e botes, sada VGA, conversores A/D e D/A, entrada e sada de
udio, memria, etc.). So recursos desejveis para quem desenvolve sistemas digitais mais avanados.
Para o aluno que est comeando aprender portas, blocos lgicos combinacionais e circuitos sequenciais,
ter muito recurso na placa pode intimidar, pode criar rudo onde no precisa existir algum.

Acredito que ensinar lgica programvel diretamente no objeto a ser programado (CPLD e FPGA) muito
mais construtivo. Por isso, sou adepto das placas de FPGA e CPLD mnimas. Elas possuem apenas os
circuitos integrados bsicos para alimentao do chip, cristais osciladores, memria de configurao
(embora dispensvel), e os conectores ligados direto nos pinos do circuito integrado.

A burocracia brasileira dificulta a compra de pequenos dispositivos. Um kit mnimo custa menos de US$ 40
nos sites de venda pela Internet. Muitos alunos podem comprar um kit assim. O desenvolvimento desse
aluno, tendo o kit para trabalhar, superior ao daquele que s faz as prticas e daqueles que s aprendem
na teoria. Acreditando que estudantes devem ter acesso a esse material, solicitei a alguns alunos que
ajudassem a criar os kits na UFPE. O resultado foi a confeco de placas de alta qualidade. A ideia que o
resultado desse desenvolvimento seja hardware livre (Hardware_Livre_UFPE) e por isso disponibilizamos os
esquemas dos projetos. Os arquivos desenvolvidos no CAD Eagle esto livres para quem quiser. A pessoa
pode escolher uma empresa que confeccione as placas de circuito impresso (PCBs) e o custo de produo
de cada PCB tem sido entre 1 e 2 dlares sem componentes. Escolhemos um CI FPGA que custa menos de
US 12. As listas de materiais esto disponveis, portanto, o aluno pode montar sua prpria FPGA e as placas
bsicas de entrada e sada. Alm disso, alunos j desenvolveram outros mdulos que so agregadas ao
sistema como os shields do Arduino (alis, uma placa desenvolvida por aluno agrega Arduino ao sistema).

Dessa forma, agora temos nossos kits minimalistas para aprendizado de eletrnica digital em dispositivos
lgicos programveis. Aos alunos pioneiros que ajudaram no projeto (Jssica Ribeiro, Andr Moraes, Joo
Henrique CC Albuquerque, Dierson Antnio Silva, Samuel Sobral dos Santos, Jos Rodrigues O Neto)
devemos nossos sinceros agradecimentos. Eles fizeram os kits se tornarem realidade.

Ensinar descrio (ou configurao) de hardware logo no primeiro contato com eletrnica digital pode
parecer improdutivo ou demasiado complexo, afinal, o aluno tem que aprender uma linguagem. A prtica
tem mostrado que no. Ensinamos aos alunos que comeamos por montar tabelas verdade. Em seguida,
extramos das tabelas equaes booleanas, ou seja, leis matemticas. Equaes so apenas outra forma
(mais abstrata) de representao das tabelas. Depois vem simplificao algbrica, e ento ensinamos a
transformar equaes em diagramas. Portas e blocos lgicos desenhados em circuitos eletrnicos so
apenas outra forma de representao das tabelas e equaes. Se, logo de incio, mostramos aos alunos que
existe outra forma de representar a mesma coisa, a descrio na forma de texto, o aluno aprende sem o
salto entre a forma antiga de criar projetos em eletrnica digital e a forma nova.

A apostila um texto guia sobre dispositivos programveis, VHDL, e o uso dos kits desenvolvidos no Depto.
de Eletrnica e Sistemas (DES) da UFPE. Um livro para aprofundar nesses assuntos imprescindvel.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 2

Lgica Programvel

Dispositivos Lgicos Programveis (PLDs programmable logic devices) so componentes eletrnicos


utilizados para construir sistemas digitais. Introduzidos na dcada de 1980, estes circuitos surgiram para
atender a grande demanda crescente na complexidade dos sistemas digitais, demandas de diminuio e
simplificao das placas de circuito impresso (PCBs), de consumo de energia, de velocidade de operao,
entre outras. Ao contrrio de um circuito integrado (CI) discreto com portas ou blocos lgicos, cuja funo
fixa, um PLD tem uma funo indefinida quando fabricado. Em geral, o usurio/criador do sistema digital
que programa um PLD determinando sua funcionalidade.

Alternativa aos circuitos programveis so os circuitos cuja funo destinada a um propsito especfico,
denominados ASICs (application-specific integrated circuit - ou circuitos integrados de aplicao especfica).
Estes CIs so geralmente mais velozes, otimizados com relao ao consumo de energia, geralmente mais
baratos quando fabricados aos milhes, e suas funes so definidas na fabricao. Geralmente, ASICs no
necessitam de muitos componentes externos porque sua alta densidade permite absorver grande parte dos
subsistemas, que so implementados dentro dos prprios chips. Os problemas com ASICs so: seu
desenvolvimento caro e demorado, no podem ser reprogramados; portanto, sua funo e/ou vida til
fica dependente do tempo de existncia do produto ao que foi destinado.

Em contrapartida, os PLDs so flexveis e podem ser reutilizados, garantindo ao produto vida til maior
porque novas verses dos sistemas digitais podem ser programadas com seu uso, apesar de custarem mais
que os ASICs, de consumirem um pouco mais de energia em geral, e de no atingirem as velocidades de
operao mais altas que os concorrentes ASICs. Em comparao com outras tecnologias de circuitos
integrados digitais (por exemplo, circuitos discretos hoje obsoletos), os dispositivos de lgica programvel
apresentam um ciclo de projeto menor e custos reduzidos.

Os PLDs podem, atualmente, ser classificados em dois tipos de circuitos: CPLDs (complex programmable
logic device) e FPGAs (Field Programmable Logic Arrays). As CPLDs so mais simples que as FPGAs e so
utilizadas para implementao de sistemas ou circuitos lgicos de complexidade intermediria, so
reconfigurveis e sua configurao no voltil. As FPGAs permitem implementar sistemas lgicos de
grande complexidade em funo de possurem blocos lgicos mais complexos (explicado adiante), sistemas
de roteamento em maior escala, sistemas de distribuies de sinais globais como clock e reset, circuitos
aritmticos e DPS com multiplicadores, somadores, etc; e principalmente, blocos de memria interna
inclusive memria RAM de porta dupla (dual-port RAM). Existem FPGAs com configurao no voltil, mas
a maioria utiliza memria RAM esttica que voltil. Portanto, uma caracterstica marcante das FPGAs
que elas precisam ser reconfiguradas cada vez que so desligadas. Essa reconfigurao pode ser feita de
vrias maneiras diferentes: automaticamente aps o reset pela FPGA que l os bits de reconfigurao numa
memria externa, por um microprocessador externo, ou via uma porta especial chamada JTAG.

Vamos trabalhar com os CIs FPGA da Altera. Portanto, vamos explicar o que h dentro de uma famlia de
FPGAs especificas chamada CYCLONE II.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 3

Evoluo da lgica programvel


Os arranjos lgicos programveis:

Um arranjo lgico programvel consiste em circuitos que possuem estrutura interna baseada em um
conjunto deportas AND-OR (o conjunto de portas AND e OR so chamados de arranjos) que podem ser
ligados ou desligados para se obter, geralmente, SOMA DE PRODUTOS. As entradas desse circuito so
ligadas s portas AND (formando produtos: P = ABC ... Z) e as sadas das portas AND so conectadas s
entradas das portas OR (realizando a soma: X = P1 + P2 + ... + PN), que so as sadas do circuito.

Lgica Programvel em ROM:

possvel fazer lgica programvel em memrias ROM. Antes das PLD's serem inventadas, as memrias
ROM foram utilizadas para implementar lgica combinatria. Considere uma ROM com m entradas (Linhas
de endereo) e n sadas (bits de dados). Quando usadas como memria, cada ROM contm 2n palavras de
n-bits. Considere que as entradas so ligadas no a um endereo m-bits mas a m sinais lgicos
independentes; teremos em tese 2m funes booleanas possveis desses sinais. Por exemplo, suponha que
m=3 = {A,B,C}. Podemos ter as seguintes combinaes (endereos):

Contudo, a estrutura da ROM permite apenas n destas funes sejam obtidas nos pinos de sada. Ou seja,
se escolhermos o bit D0 como sada, podemos gravar a ROM para gerar em D0 uma soma de qualquer dos
produtos acima, basta gravar um bit 1 na posio equivalente ao termo da equao desejado. Como
temos n sadas (digamos 8 bits) ento teremos n (8) funes lgicas possveis, uma em cada pino de sada
de dados (D0, D1, D2, D3, D4, D5, D6, D7). Um exemplo em D0 poderia ser gravar: {1 + 0 + 0 + 1 + 1 + 0 + 0 + 0}
que significa que no bit D0 teramos a funo:

A ROM torna-se equivalente a n de circuitos lgicos paralelos, cada qual gerando sua funo lgica
independente de m entradas. Pode-se utilizar ROM (PROMs, EPROMs, EEPROMs) para esse fim para gerar
qualquer funo lgica combinacional com m entradas, o que tornando o dispositivo lgico disponvel para
aplicaes variadas. O inconveniente que as ROMs ficam com grande parte de seu circuito sem utilizao,
so mais lentas que os circuitos convencionais, consomem mais energia, no permitem implementao de
lgica sequencial; portanto implementar lgica programvel em ROM ineficiente. A noo de
programao de memria ROM como PLD mostrada na figura 1.

Fig. 1: Uma ROM vista como dispositivo programvel (img modificada da internet).
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 4

Circuitos Programveis Especficos:

Na dcada de 1970 comearam a surgir os circuitos programveis especficos. A ideia principal era atender
uma demanda de engenharia que precisava de lgica combinacional programvel para diminuio dos
espaos utilizados em PCBs. Datas marcantes e as principais tecnologias introduzidas foram:

PLA (Programmable Logic Array ou arranjo lgico programvel)

Em 1970, a Texas Instruments desenvolveu um CI programvel por mscara baseado em memria


associativa. Este componente, o TMS2000 era programado alterando-se a camada de metal durante a
fabricao. A Texas criou o termo Programmable Logic Array (PLA) para este dispositivo. Em 1973, a
National Semiconductor introduziu um dispositivo PLA programvel por mscara (DM7575) com 14
entradas e 8 sadas sem registradores de memria. A ideia principal da PLA ilustrada na figura 2

Fig. 2: arranjo tpico de um PLA: tanto a matriz AND quanto a matriz OR so programveis (img internet).

Este tipo de circuito era particularmente difcil de ser programado devido ao fato de o projetista ter que
escolher a programao tanto dos termos de produto quanto da soma. Para melhor utilizar os Cis isso
requeria dos projetistas realizar simplificaes dos circuitos desejados, o que resultava em pouca economia
de tempo de projeto.

No exemplo da Fig. 2 vemos como devem ser programadas as conexes tanto na matriz AND quanto na
matriz OR para se obter cada uma das 6 funes de sada.

PAL - (Programmable Array Logic ou Matriz lgica programvel)

A MMI introduziu um dispositivo diferente das PLAs em 1978, com uma arquitetura mais simples porque
omitia a matriz programvel OR, ou seja, a matriz OR j vem configurada. Isto tornava os componentes
mais rpidos, menores e mais baratos, e o projetista deveria optar pelo tipo de arranjo de sada que
desejava. As PALs tambm possuam flip-flops (ver Fig. 3) incorporados s matrizes OR, que podiam ser
programados para criar mquinas sequenciais e mquinas de estados finitos (FSM) mais facilmente.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 5

Em certo sentido a PAL desmistifica o processo de construo de sistemas digitais porque um software de
design convertia equaes booleanas de engenharia em padres de queima ou no de fusveis necessrios
para programar o componente. Os componentes PAL rapidamente se tornaram populares.

Acompanhando o avano dos circuitos integrados, surgem as primeiras linguagens de descrio de


hardware HDL (Hardware Description Language), tais como ABEL, CUPL, ou PALASM. Algumas linguagens
oferecem opes de sntese, ou seja a capacidade de converter a descrio do circuito em configurao (ou
programao) dos circuitos integrados.

Fig. 3: circuito do PAL PLUS 16R4 da Philips: a matriz AND programvem e a matriz OR fixa. Note-se a presena de
flip-flops, apropriados para criao de FSM (imagem manual Philips).

GAL - (Generic Array Logic)

Com o sucesso das PALs, a Lattice semiconductor em 1985 expandiu a ideia criando os GAL, que tem as
mesmas propriedades lgicas das PAL mas podem ser apagadas e reprogramadas. Estes circuitos se
mostraram teis no estgio de prototipagem de um projecto, quando alguns erros lgicos podem surgir. As
GAL podem ser programadas e reprogramadas usando um programador PAL ou usando uma tcnica de um
circuito embutido em alguns chips. Um componente similar, o PEEL (programmable electrically erasable
logic), foi produzido pela ICT.1

Atualmente estes circuitos e tcnicas de criao de sistemas lgicos programveis foram substitudos pelos
novos dispositivos que surgiram a partir dos anos 1980, baseados em blocos lgicos programveis.

1
Fonte: http://pt.wikipedia.org/wiki/Dispositivo_l%C3%B3gico_program%C3%A1vel (17/09/2014)
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 6

Elementos Lgicos Programveis:

A Altera chama Elementos Lgicos (LE Logic Elements) as estruturas que compem a nova base de
dispositivos programveis, mais genricas e versteis que as tradicionais matrizes de AND-OR dos arranjos
lgicos programveis.

Fig. 4: Multiplexador de 2 entradas, e uma Look-up Table (LUT) de 2 entradas. As sadas do MUX na LUT so definidas
pelas variveis de entrada A e B, e os registrador de deslocamento armazena os bits.

O principal componente introduzido neste tipo de tecnologia o conceito de LUT (Look-up Table). Uma LUT
composta de um multiplexador (figura 4) associado geralmente a um registrador de deslocamento cujos
bits de sua sada paralelizada so aplicados ao MUX. Assim, a sada F do multiplex selecionada em funo
das entradas (A e B no exemplo). Se um determinado termo da funo est ativo ou no uma questo
de ligar (1) ou desligar (0) o bit de dado respectivo nos flip-flops do registrador.

Por exemplo, no esquema da figura 4, para obter a equao precisamos gravar os bits
1001 nos flip-flops. Para obter a funo (funo XOR) precisamos gravar os bits 0110 nos
flip-flops do registrador ( ).

Associado s LUTs colocam-se algumas entradas adicionais e um ou dois flip-flops do tipo D para reter
dados, ou seja, para permitir criao de lgica sequencial. A esse conjunto a Altera d o nome de Logical
Elements (LE), ou elementos lgicos, como pode ser visto na figura 5. Outro nome comum para esse bloco
Configurable Logic Block (CLB).

Fig. 5: Esquemtico de um bloco lgico configurvel composto de uma LUT, um flip-flop e um multiplex de sada.

A complexidade dos elementos lgicos varia de tecnologia para tecnologia, e de fabricante para fabricante.
comum construir elementos lgicos com 4, com 5 ou com 6 entradas nos multiplexadores. Isso depende
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 7

da famlia de elementos lgicos programveis onde sero utilizados. A figura 6 mostra um elemento lgico
configurvel de uma CPLD da Altera.

Fig. 6: Elemento Lgico (LE) configurvel numa CPLD Altera. Nos dispositivos mais complexos como FPGA, os LEs
possuem entradas em cascatas para operaes aritmticas e outras funes (imagem manual Altera).

Embora exista CPLDs com matrizes de portas AND e OR associadas a elementos lgicos (LUT), uma
tendncia que os circuitos, mesmo CPLDs, sejam feitos com elementos lgicos como os descritos acima.
PALs e GALs so construdos em tamanhos pequenos, ou seja, com relativamente poucos componentes
configurveis. So apropriados para criao de circuitos lgicos de baixa complexidade, e so equivalentes
a algumas centenas de portas lgicas. Para sistemas lgicos maiores pode-se usar Complex PLD ou CPLDs.

CPLDs (Complex Programmable Logic Devices)

CPLDs contm o equivalente a vrias PALs que podem ser interligadas dentro de um nico chip por meio de
barramentos programveis. Dentro de um chip CPLD temos centenas ou milhares de elementos lgicos
programveis podem ser interligados por barramentos de interconexo dentro do chip. CPLDs podem
assim substituir milhares de portas lgicas e/ou blocos lgicos vendidos em CIs discretos.

Alguns CPLDs mais antigos podem ser configurados/programados usando o programador PAL ou
programador universal, mas este mtodo torna-se inconveniente para CIs com centenas de pinos. Assim,
surgiu outro mtodo de programao que consiste em soldar o componente PCB, ligar um cabo serial que
transfere dados de configurao a partir de um PC, e programar (configurar a melhor palavra) o CI na
prpria PCB junto com os outros componentes. O CPLD contm um circuito que decodifica os dados seriais
e configura o chip. Cada fabricante comeou a usar um nome proprietrio para o sistema de configurao
dos chips que usam essa metodologia; por exemplo, a Lattice chamou (ISP) "In-system Programming" (ou
programao no sistema), termo que ainda utilizado.

Contudo, o mtodo mais comum de gravao o JTAG, que discutiremos adiante. Note que foi falado que
o CPLD programado via cabo serial, esta a razo por termos utilizado um registrador de deslocamento
na representao dos bits de configurao da LUT na Fig. 4. Na verdade, todos os bits de configurao de
um CPLD ou FPGA (tanto os das LUTs quanto os que configuram os barramentos de interconexes) so
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 8

introduzidos nos chips serialmente; os bits de configurao percorrem um registrador de deslocamento


bastante grande, que armazena todos os bits de configurao possveis dentro do chip.

A Fig. 7 ilustra como um diagrama de blocos com a configurao interna de um CPLD da Altera.

Fig. 7: Diagrama de blocos de um CPLD Altera (MAX V). Cada Bloco Lgico (LAB) formado de vrios elementos lgicos
programveis (Les). Um barramento interconecta blocos lgicos. Os blocos IOE mostram os circuitos que
interconectam cada bloco com os pinos de entrada e sada do circuito integrado (img manual Altera).

Os CPLDs modernos so muito utilizados para fazer pontes entre barramentos (bus-bridge), quando h
diferenas entre tipos de barramentos num sistema. Podem ainda ser utilizados para fornecer lgica
complementar para FPGAs.

Fig. 8: kit EPM240 Altera MAX II CPLD. O kit custa ~ US$ 18,00. Baseado no CPLD EPM240 possui: 240 elementos
lgicos LEs, 192 macro clulas, 80 pinos I/O, opera at 340 MHz (foto da internet).

Atualmente (09/2014) possvel comprar uma placa (kit) de desenvolvimento CPLD em sites da internet
por menos de US$20, como a placa da figura 8. Estes kits facilitam o uso dos CPLDs porque j vem com toda
a parte de alimentao e regulao de tenso, filtros, entrada de programao JTAG e cristal oscilador
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 9

instalados na placa. Os pinos de entrada e sada (I/O) disponveis para os usurios esto conectados a
barras de pinos, facilitando o acesso ao usurio. Por esse motivo, so bons para criar prottipos rpidos.

FPGA (Field Programmable Gate Array)

FPGAs so circuitos integrados reprogramveis que usam conjuntos de elementos lgicos (LEs, como
descritos anteriormente) como unidades bsicas de construo de blocos programveis. Cada fabricante d
um nome ao seu conjunto de elementos lgicos, assim, podemos encontrar blocos lgicos programveis
(PLBs ou Programmable Logic Blocks) ou Logic Array Blocks (LABs), e assim por diante. Para se ter uma
ideia, na famlia Cyclone IV da Altera, cada LAB possui:
16 LEs
LAB control signals
LE carry chains
Register chains
Local interconnect

Apenas por essa pequena descrio d para perceber que o que diferencia FPGAs de CPLDs a
complexidade da construo dos elementos programveis. isso associam-se a integrao em grande
escala permitindo que um chip possua milhares e at milhes de elementos lgicos (fig. 5). A fig. 9 ilustra
como esto estruturadas as FPGAs da famlia Cyclone II da Altera.

Fig. 9: Organizao interna das matrizes de blocos lgicos (LAB) na Cyclone II da Altera. Cada LAB contm 16
elementos lgicos (Fig. 6) interconectados localmente. Entre LABs vizinhos h um barramento de interconexo local.
Para interconectar LABs distantes, h uma estrutura de barramentos de interconexo formando uma matriz (array)
com barramentos para colunas e linhas que formam a matriz de interconexes (img manual Altera).

Alm de possuirem as estruturas de blocos lgicos programveis, as FPGAs possuem tambm subsistemas
ou blocos lgicos dedicados. Por exemplo:

Sistema de gerenciamento de clock dedicado para gerenciar sinais vrios sinais de clock (relgios do
sistema), sinais de reset e enable global, etc. Para isso, os blocos dos FGPAs avanados possuem PLLs
(Phase Locked Loop) que permitem multiplicar e dividir o clock de entrada gerando duty-cicles variados.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 10

Advanced I/O support que permite gerar sinais diferenciais de alta velocidade nas sadas (para
transceptores diferenciais), ou permitem controlar os vrios nveis de tenso (Single-ended I/O standard
support, including 2.5-V and 1.8-V, SSTL class I and II, 1.8-V and 1.5-V HSTL class I and II, 3.3-V PCI and PCI-X
1.0, 3.3-, 2.5-, 1.8-, and 1.5-V LVCMOS, and 3.3-, 2.5-, and 1.8-V LVTTL).

Multiplicadores e Acumuladores embutidos para facilitar operaes aritmticas em hardware de alta


velocidade, facilitando implementao de processamentos de sinais digitais (DSPs).

Bloco de memria RAM internamente os chips FPGAs possuem atualmente RAM esttica de alta
velocidade, alguns com dual-port RAM.

possvel comprar um kit FPGA atualmente (Fig. 10) por valores como ~US$ 30,00 (09/2014). Um circuito
integrado FPGA hoje, com 6.000 LEs pode custar em torno de US$ 12,00; apesar de haver CIs FPGA
especializados que custam at US$ 20.000,00 ou mais.

Fig. 10: Placa (kit) FPGA CoreEP4CE6 Cyclone IV Altera. A placa feita par prover alimentao ao FPGA, sinal de clock e
acesso aos pinos do JTAG usados para configurar o chip. Os pinos e entrada e sada da FPGA ficam todos disponveis
para o usurio (foto do site DX na internet).

Uma tendncia tambm embutir microprocessadores nas FPGAs, criando os chamados SoC (System on
Chips). Esse tipo de componente permite aproveitar o melhor dos dois mundos: a flexibilidade de rodar
software nos microprocessadores, dentro de uma FPGA que permite processamento em hardware.

Com dispositivos to complexos, fica evidente a necessidade de utilizao de uma ferramenta apropriada
para configur-los. Um FPGA pode chegar a ter milhes de bits que precisam ser ligados ou desligados,
basicamente para trs fins: implementar a lgica desejada nos LEs, configurar o roteamente e as
interconexes locais ou na matriz geral do chip, ou preencher os bits dos blocos de memria interna do
chip. Assim, um FPGA pode facilmente alcanar milhes de bits necessrios para configur-lo. Por esse
motivo, usa-se FFs tipo D em cada bit, e os dados de configurao so introduzidos no chip cada vez que o
FPGA religado.

Cada bit interno pode representar um fio que o usurio precisaria ligar num protoboard, ou uma trilha a ser
feita na PCB. S para dar um exemplo, se uma FPGA tem 2 milhes de bits internos para configurao, e o
usurio gastasse 1 segundo para ligar cada bit, ele levaria ~556 horas contnuas para liga-los; ou ~ 23 dias
contnuos. Fica evidente a necessidade da assistncia de um computador para realizar tal tarefa. Para isso
foram desenvolvidos as ferramentas Electronic Design Automation (EDA ou ECAD), que fazem a
automao do projeto eletrnico. O programa EDA da Altera, onde o usurio descreve o hardware de seu
projeto o QUARTUS II.

O usurio pode configurar esses chips para implementar funcionalidades complexas e personalizadas em
hardware. Para isso, ele dever descrever o hardware desejado utilizando uma linguagem de descrio de
hardware (HDL Hardware Description Language), que so introduzidas no QUARTUS. As duas linguagens
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 11

mais conhecidas para descrio de hardware so VERILOG e VHDL, na qual sero baseadas nossas prticas
descritas adiante.

JTAG (Joint Test Action Group)

J da dcada de 1970 o projeto das PCBs se tornaram complexo o bastante para causar um embarao para
a indstria eletrnica: como testar cada placa produzida? Com os circuitos integrados crescendo em
complexidade o nmero de trilhas da placas aumentavam. Mais ainda, surgiram PCBs com vrios layers e as
trilhas ficavam escondidas e sem pontos de acesso para serem testadas. Posteriormente surgiram CIs
cujos pinos (e as trilhas) ficavam escondidos em baixo dos CIs (os BGAs ou ball gate arrays). Para resolver o
problema o IEEE criou um grupo que ficou conhecido como Joint Test Action Group, que criou um padro
denominado IEEE 1149.1, que define uma ferramenta para testes de placas, conhecido tambm como
Standard Test Access Port e Boundary-Scan Architecture.

A imagem 11 mostra como o padro IEEE 1149.1 insere no chip a capacidade de funcionar na cadeia de CIs
com arquitetura boundary-scan. Estes chips possuem em cada pino do CI um sistema de chaveamento que
permite desconectar a lgica interna do CI, portanto temos os ncleos lgicos do CI desconectados do
mundo externo; assim como desconectar as trilhas externas da lgica interna, portanto, uma trilha da placa
pode ser isolada. O boundary-scan permite excitar tanto a lgica interna do chip (com as trilhas
desconectadas) quanto as trilhas externas (com as lgicas internas dos chips desconectadas). Para isso os
CIs com JTAG possuem pinos adicionais dedicados, e so interconectados em cadeia. Assim, possvel
deslocar os bits da cadeia de forma que podemos ler como est cada pino isolado de cada CI da cadeia.

Fig. 11: Chip com o boundary-scan architecture (ou JTAG). Estes chips possuem em cada pino do CI um sistema de
chaveamento que pode desconectar a lgica interna, pode desconectar as trilhas externas, e permite excitar tanto a
lgica interna quanto as trilhas externas. Os chips so interconectados em cadeia.

Dessa forma, podemos excitar uma trilha e verificar se o sinal chega apenas nos pinos aos quais ela est
ligada, verificando se h rompimento ou curto nas trilhas.

Por outro lado, se podemos desconectar os CIs e podemos excit-los internamente, podemos ento usar o
boundary-scan para dois outros propsitos: gravar bits dentro do chip e verificar o status desses bits; ou
seja, podemos configurar ou programar os chips. Por outro lado, se podemos ler os bits dentro do chip
ento podemos usar o JTAG como ferramenta de depurao (debugging). A figura 12 mostra uma placa de
circuito impresso com alguns CIs com e outros sem JTAG, e a forma como a cadeia ligada.

Os pinos JTAG do chip tem nomes definidos: TDI (test data input), TCK (test clock), TMS (test mode select) e
TDO (test data output). Para fazer a cadeia, conectam-se os pinos em paralelo exceto TDI/TDO que so
ligados em srie. O pino TDI1 do 1 chip (por onde entram os dados da cadeia) est ligado no terminal JTAG.
O pino TDO1 do 1 chip ligado ao TDI2 do 2 chip na cadeia, e seu TDO2 ligado ao TDI do chip seguinte e
assim por diante, at que TDO do ltimo chip se conecta ao terminal JTAG (figura 12).
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 12

Fig. 12: Placa de circuito impresso (PCB) com um terminal JTAG de acesso externo. Note como os CIs so ligados em
cadeia, com o TDOn de cada chip conectado ao TDIn+1 do chip seguinte. Os outros sinais so ligados em paralelo em
todos os CIs. Isso forma a cadeia boundary-scan que permite testar a placa, program-la, e debugar projetos.

Vamos utilizar o terminal JTAG da placa para programar/configurar a placa FGPA, por isso precisamos de
um cabo ou adaptador serial que converta a sada do PC para a entrada JTAG da placa. O adaptador chama
USB-Blaster (figura 13). Este adaptador vem com dois cabos: um que se conecta USB do PC e ao conversor
de nveis, e um flat-cable JTAG (10 pinos) que conecta o conversor ao conector JTAG da placa.

Fig. 13: Adaptador JTAG da Altera (USB-Blaster): O cabo preto conectado a uma sada USB do PC e ao conversor de
nveis. O cabo chato (flat-cable) conectado no conversor e no terminal JTAG da placa (foto da internet).
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 13

LINGUAGEM DE DESCRIO DE HARDWARE (HDL)

Como j foi dito, existem duas linguagens de descrio de hardware mais utilizadas atualmente: Verilog e
VHDL. Vamos utilizar a ltima por entender que ela est mais prxima do projetista de hardware, embora
Verilog tambm seja uma linguagem eficiente que bastante utilizada na indstria eletrnica.

Ciclo de Desenvolvimento utilizando HDL:

Criar um projeto em HDL segue um ciclo de desenvolvimento. Primeiro o projetista cria um projeto e
descreve o circuito usando VHDL. Durante o processo o projetista pode verificar sintaxe, etc e garantir que
cada arquivo de cdigo gerado est descrito corretamente. Geralmente, cada arquivo VHDL descreve um
circuito, um bloco lgico, um sistema. Se achar interessante a metfora, pense nestes arquivos como se
fossem um circuito integrado que voc compraria numa loja para integrar ao seu sistema. Um arquivo deve
descrever como esses vrios arquivos VHDL esto interligados que o arquivo que descreve a estrutura
global do projeto.

O fluxo de projeto pode ser visto na figura 14. Aps descrever em VHDL os blocos que fazem parte do
sistema (fig. 14 System Design) o usurio pode verificar a funcionalidade do projeto (bloco no canto
superior direito: Functional Simulation, Design Rule Checking e RTL View, onde se pode ver graficamente
os blocos no nvel de transferncia de registradores, ou RTL).

Em seguida, o usurio deve impor as restries ao projeto, ou seja, deve configurar quais pinos fsicos do CI
receber os sinais que na descrio de hardware foram tratados por nomes. Pode ainda fazer anlises de
performance aproximada e consumo, ambas baseadas em simulao (Fig 14 I/O Assignment & Analysis).
Na sequncia o usurio deve fazer a sntese propriamente dita (RTL Synthesis). O programa Quartus rotear
as funes desejadas dentro do dispositivo escolhido (Place & Route Process). O programa vai gerar um
arquivo que uma fileira de bits 1s e 0s respeitando o que descrito (a funo que deve ser executada)
associada aos pinos fsicos do FPGA. Nesse momento fazemos a gravao do arquivo configurador no
dispositivo.

Fig. 14: Fluxo de criao de um projeto em HDL (retirado manual Quartus II)

Projetistas j em estgio avanados podem editar os locais a distribuio de funes na planta do chip (Chip
Editor), mas podem tambm analisar por meio de simulaes as reas de dissipao de energia na FPGA de
forma mais realstica, assim como a temporizao dos sinais de forma estimada, porm mais realista. Para
isso, usam-se ferramentas de simulao (Power Analyis, Board-Level Timing, etc, quadro direita inferior
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 14

na fig. 14). Esses procedimentos so avanados e no sero vistos na apostila. Pode-se ainda utilizar o JTAG
e outras ferramentas de software para DEBUGAR seu hardware j na placa (Fig. 14 In-System Verification).
Esse o processo normal de criao de um projeto utilizando uma linguagem HDL e uma ferramenta EDA.
Agora, vamos analisar como se faz a descrio de hardware.

VHDL (Very high-speed integrated circuits Hardware Description Language)

VHDL foi originalmente proposta pelo Depto de Defesa americano (DARPA) e depois foi transferida para o
IEEE (Institute of Electrical and Electronics Engineers) que a padronizou. A linguagem formalmente
conhecida como IEEE 1076, ratificada em 1987, depois revisada em 1993, pequenas alteraes foram
introduzidas em 2000 e 2002, e por ltimo, em setembro de 2008 foi aprovado pelo REVCOM a mais
recente verso, IEEE 1076-2008.

A ideia inicial da linguagem de descrio de hardware era padronizar a forma de descrever os circuitos
lgicos de milhares de placas de diversos fornecedores do DARPA, em substituio aos desenhos dos
circuitos; assim, seria possvel passar a descrio de uma placa de um fornecedor para outro fornecedor
com mais facilidade. Em seguida, observou-se que a linguagem de descrio do hardware tambm serve
para simulaes, para testar se o circuito opera da forma que se espera. Portanto, um HDL serve tambm
para simular funcionamento dos circuitos, o que no objeto desta apostila.

Depois, ferramentas foram criadas para sintetizar circuitos em CPLDs e FPGAs. Sintetizar significa
transformar a descrio dos circuitos em conexes dentro dos CIs de lgica programvel, de forma que o
comportamento e as funcionalidades descritas na linguagem se tornem efetivamente circuitos de hardware
dentro dos chips. Ns vamos trabalhar com esta perspectiva.

Quais as vantagens de se utilizar VHDL?

Vantagens Desvantagens
Projeto independente da tecnologia; Hardware gerado menos otimizado;
Facilidade na atualizao dos projetos; Simulaes mais lentas que implementaes
Intercmbio de projetos entre equipes de Dificuldade em encontrar pessoal treinado para
desenvolvedores lidar com a linguagem;
Reconfigurao parcial e dinmica;
Reduz tempo de projeto e custo;
Elimina erros de baixo nvel;
Simplifica a documentao
Aumento da performance

Toda linguagem tem um conjunto de regras (chamada sintaxe) que permite a um compilador,
interpretador e/ou sintetizador verificar se no h ambiguidades ou descries incongruentes. Vamos
ento analisar quais os conjuntos de sintaxes bsicos de VHDL.

Lembre-se de uma coisa primordial: quando voc est trabalhando em um HDL voc no est
PROGRAMANDO, no sentido de fazer um programa em C ou assembly, voc est DESCREVENDO
um hardware. Portanto, saiba primeiro o que voc quer fazer no hardware.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 15

VHDL (regras e sintaxe)

VHDL no sensvel maisculas e minsculas, nem aos espaos inseridos;

Inserimos comentrios em VHDL utilizando dois sinais --; depois desses sinais podemos escrever
qualquer coisa que o compilador ignora (at o prximo ENTER);

Como outras linguagens, um enunciado, comando, declarao em VHDL termina com ;

VHDL s reconhece os caracteres 1...9 e as letras A-Z ou a-z e ainda o caractere underline _. Um
identificador (varivel, uma porta, ou nome de um sinal) tem que comear com uma letra. Identificadores
no podem tambm terminar com 2 _nem ter dois underlines seguidos.

Um exemplo de trecho de VHDL:


-- esta linha tem um comentrio

C <= b; -- isto um comando em que o sinal b conectado a C

c <= b; -- esta linha de comando exatamente igual anterior, porque C igual a c para VHDL

As seguintes palavras so reservadas:


access after alias all attribute block
body buffer bus constant exit file
for function generic group in is
label loop mod new next null
of on open out range rem
return signal shared then to type
until use variable wait while with
VHDL est baseada na abordagem da caixa preta. Para descrevermos uma coisa a partir de caixas pretas
precisamos seguir um procedimento hierrquico. Em VHDL descrevemos a caixa preta numa seo
chamada ENTITY, que descreve a interface do circuito descrito com o mundo. Porm, o que existe dentro
dessa caixa preta descrito em outra seo chamada ARCHITECTURE.
Vejamos um exemplo:
----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joao Ranhel
--
-- Module Name: Circuito Controle Lampada
--
-- Descrio:
-- Circuito que controla uma lampada por mltiplos interruptores
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- descrio de uma entidade (a interface de um circuito)


entity Interruptor_3_IN is
-- estas so as portas que conectam a entidade ao mundo externo
Port ( CHV : in STD_LOGIC_VECTOR (2 downto 0);
LED : out STD_LOGIC);
end Interruptor_3_IN;

-- aqui comea a descrio de "como funciona" o circuito


architecture df_Interruptor_3_IN of Interruptor_3_IN is
begin

-- esta declarao cria o circuito XOR com os sinais de entrada


LED <= CHV(0) XOR CHV(1) XOR CHV(2);

end df_Interruptor_3_IN;
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 16

As 10 primeiras linhas desse cdigo comeam com --, ou seja o que vem na frente comentrio, para
descrever o projeto e ser desconsiderado na hora da sintetizao. Depois vem as declaraes
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

Essa parte do cdigo diz para o compilador/sintetizador quais bibliotecas a serem utilizadas na descrio e
quais funes, componentes ou blocos da bibliotecas sero usados. No caso, usamos todos (all). Depois
vemos a descrio da ENTITY, que a interface do projeto:
entity Interruptor_3_IN is
-- estas so as portas que conectam a entidade ao mundo externo
Port ( CHV : in STD_LOGIC_VECTOR (2 downto 0);
LED : out STD_LOGIC);
end Interruptor_3_IN;

A descrio da caixa preta comea com a palavra-chave entity, ento vem o nome do circuito
Interruptor_3_IN. Nunca use caracteres com acentos nem espaos nos nomes, e procure usar nomes
que signifiquem o que o circuito faz. Depois vem a palavra-chave is. A descrio dessa caixa preta s
termina com a palavra-chave end, seguida do nome da entidade e ponto e vrgula ;.

No meio da definio da entidade h um bloco (Port) de descrio das portas que entram ou saem da caixa
preta. No exemplo, h um sinal de entrada chamado CHV que um vetor (um barramento) de 3 bits; quer
dizer, h trs sinais/fios chamado CHV que entram na caixa (CHV(2), CHV(1) e CHV(0)). Depois do nome do
sinal vem : in que determina que so fios/sinais de entrada. O tipo do sinal (STD_LOGIC_VECTOR) diz que se
trata de um vetor, e a abrangncia (2 downto 0) diz que o vetor tem o bit mais significativo com o index 2,
e o menos significativo com o index 0.

No bloco (Port) tambm est descrito que existe uma porta chamada LED que um sinal de sada (: out) e
que um sinal lgico padro (STD_LOGIC), ou seja, um fio nico por onde o sinal sai da entidade.

A caixa preta descrita acima pode ser representada pelo seguinte diagrama de bloco:

CVH(2)

CVH(1) Interruptor_3_IN LED

CVH(0)

Em seguida no cdigo surge a descrio do que existe dentro dessa caixa preta chamada. O incio da
descrio da arquitetura do circuito comea com a palavra-chave architecture.

architecture df_Interruptor_3_IN of Interruptor_3_IN is


begin

-- esta declarao cria o circuito XOR com os sinais de entrada


LED <= CHV(0) XOR CHV(1) XOR CHV(2);

end df_Interruptor_3_IN;

Literalmente, a primeira linha quer dizer: a arquitetura cujo nome df_Interruptor_3_IN da caixa preta
chamada Interruptor_3_IN . O nome df_Interruptor_3_IN o nome da arquitetura, voc pode
utilizar o nome que quiser, respeitando as regras descritas acima.

A descrio da arquitetura comea com a palavra-chave begin e termina com a palavra-chave end, seguida
do nome da arquitetura e de ponto e vrgula ;. No meio h uma atribuio, um comando que diz: LED
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 17

recebe o sinal da sada de (<=) uma porta XOR, cujos sinais de entrada so CHV(0) XOR CHV(1) XOR CHV(2). O
circuito completo descrito no cdigo acima pode ser representado assim:

CVH(2)

CVH(1) LED

CVH(0)

Estilos de Descrio em VHDL

Em VHDL devemos sempre lembrar que os blocos que estamos descrevendo acontecem em paralelo.

Existem trs diferentes estilos ou abordagens para programao em VHDL: fluxo de dados (data flow),
descrio de estruturas (structure) e ainda descrio de comportamento (behavior).

Fluxos de dados so descritos geralmente por meio do operador <=, que especifica diretamente as
relaes entre sinais. Podemos pensar que o equivalente seria lgica combinacional, ou seja, as sadas
dependem apenas das entradas que so usadas como operadores. Note-se que neste estilo de
programao o projetista descreve o circuito lgico como se estivesse detalhando graficamente. O
projetista tem que descrever as conexes e as operaes que ocorrem entre os sinais.

Estruturas so necessrias para conectar hierarquicamente os vrios blocos de um sistema digital. Assim, o
estilo estrutural necessrio para compor o bloco lgico hierrquico de maior importncia no projeto.

Comportamento um estilo mais abstrato de descrio de hardware. Neste estilo o projetista apenas diz
como o circuito deve se comportar, sem se importar com como esto conectados os elementos lgicos
que executam aquelas funes. Sabemos que o estilo behavioral est sendo utilizado porque a descrio de
comportamento marcada pelo uso de processos.

Um processo (process) caracterizado pela palavra-chave process seguido de uma lista de sinais que
disparam aquele processo. Veja o seguinte exemplo:
ARCHITECTURE arq_detecta OF detecta IS
begin
process(clk,sensor_1)
begin
if(rising_edge(clk) and sensor_1='1') then
led <= '1';
else
led <= '0';
end if;
end process;
end arq_detecta;

Dentro dessa arquitetura aparece um processo, descrito a partir da palavra-chave process(). Dentro dos
parnteses est indicado que dois sinais disparam este processo: o sinal clk e o sinal sensor_1. A descrio
do comportamento do circuito comea depois do begin dentro do processo e termina em end process;.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 18

Dentro temos uma estrutura if (alguma condio) then, que termina em end if; e que tem uma alternativa
else no meio. O que testado (alguma condio) testado em relao a ser uma verdade booleana; por
exemplo, if (x or 1) then, sempre resultar 1, portanto sempre ser executado. J if (x and y and 0) then,
nunca ser executado porque uma AND com entrada zero resulta zero, portanto, neste caso o else seria
executado.

O teste do if do exemplo acima sobre ter ocorrido o evento de subida do sinal de clock (rising_edge(clk) e
(and) se o sinal do sensor_1 est em nvel lgico 1. Se isso ocorrer ento a primeira parte do if
executada e o else ser ignorado, portanto, o sinal led assume o valor 1.

Caso contrrio, se o sinal sensor_1 estiver em 0, o bloco do if ser ignorado e o bloco dentro do else ser
executado, fazendo o sinal led ser igual a 0.

Toda vez que o ocorrer um evento (uma variao) no sinal de clk ou no sinal sensor_1 este processo ser
executado e estas condies sero testadas.

Tenha em mente que em VHDL os processos acontecem em paralelo, assim, a descrio de hardware pode
ter vrios processos mas, fisicamente no CI eles ocorrem em paralelo.

Mais detalhes da linguagem VHDL deve ser buscada nos livros que descrevem detalhes da linguagem. Um
livro indicado Free Range VHDL Book - Free Range Factory, que pode ser baixado do site:

http://www.freerangefactory.org/dl/free_range_vhdl.pdf

A seguir, vamos descrever uma srie de prticas para consolidar o aprendizado dos diversos.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 19

Departamento de Eletrnica & Sistemas - UFPE


Prtica 0: Apresentao das placas.

I. PRTICA ZERO... as placas ACIONADO o valor gerado para a FPGA


ser 1 (+V). Quando soltamos o boto o
Durante o semestre vamos executar prticas sinal enviado para a FPGA zero volts, ou
no laboratrio que dependem do nvel lgico 0.
conhecimento de basicamente trs mdulos: A Fig. 1 mostra a placa de entrada
- placa de circuito impresso de entrada (BASIC_IN), e seu esquema eletrnico
- placa de circuito impresso de sada mostrado em anexo.
- placa FPGA (Field Programmable Gate Array).
1.2 Placa de sada: possui oito LEDs que
As placas precisam ser conectadas com a indicam se o sinal est em nvel lgico 1
FPGA por meio de um cabo flat cable de 16 (aceso) ou em nvel lgico 0 (apagado). A
vias. Basta encaixar o cabo no conector na placa possui tambm um display de 7-
placa e o outro lado no conector desejado na segmentos. So na verdade oito LEDs
FPGA. montados na forma de uma matriz que
Tanto a placa de entrada quanto a placa de imitam a forma como escrevemos nmeros.
sada PRECISAM ser energizadas para Como so LEDs, esses displays podem ter
funcionar. A alimentao ser feita por meio todos os nodos dos LEDs ligados em
de um cabo de alimentao com dois fios: comum (nodo-comum) ou todos os lados
+3,3V e terra (GND). Prestem ateno na dos ctodos em comum. O display utilizado
POLARIDADE e no troquem esses fios. O NODO COMUM.
pino de alimentao mais prximo do A Fig. 2 mostra uma placa de sada, e o
conector com a FPGA o fio +3,3V. esquema da placa BASIC_OUT mostrado
em anexo.
Quem trocar os dois fios vai queimar tanto a
FPGA quanto a placa de entrada/sada.

1.1 Placa de entrada: possui um conjunto de


chaves que nos permitem inserir na FPGA
sinais 1 (+V) ou 0 (zero volts). Cada chave
tem um LED associado e quando ele est
ligado (aceso) o nvel lgico ser 1 (est
enviando +V para a FPGA). Quando o LED
estiver apagado a tenso enviada para a
FPGA ser zero volts, ou seja, nvel lgico
0.

Fig. 2: placa BASIC_OUT com cabo flat cable

A. Propostas da aula prtica:

1) Conectar uma placa BASIC_IN a uma


placa BASIC_OUT.
Observar quais dos LEDs da placa de sada
pulsam quando os botes so acionados.
2) Ligar e Desligar as chaves (dip-switches)
na placa BASIC_IN de forma que os nmeros
Fig. 1: placa BASIC_IN com flat cable. apaream no display de 7-segmentos na
placa BASIC-OUT.
A placa tambm possui DOIS botes que
serviro para gerar pulsos em futuras 3) Explique a lgica pela qual os LEDs
prticas. Enquanto um boto estiver acendem ou apagam nas duas placas, sendo
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 20

que um INVERSOR utilizado como driver 3) Fundamentao Terica: Contm a teoria


(fornecedor) de corrente para cada um dos utilizada na prtica. Uma breve descrio
LEDs. sobre o que faz o circuito (no caso o
comparador de magnitude). Ou seja, explique
4) Explique como funciona a lgica que
de onde saiu o circuito inicial;
acende os LEDS no DISPLAY, uma vez que
o display do tipo NODO COMUM (ou seja, 4) Metodologia: deve conter o arranjo
todos os nodos dos diodos leds do display experimental, os mtodos de medio e os
esto ligados em +3,3V) resultados da simulao/experimentos;
5) Explique para que servem os resistores R1 5) Anlise: deve conter a anlise dos
... R8 na placa BASIC_OUT. resultados experimentais em comparao
com os resultados tericos e/ou simulados.
* Monte os circuitos por etapas, e teste cada
etapa, ou seja, garanta que a placa que voc Dificuldades e problemas com resultados
ligou est funcionando. devem estar registrados nessa seo;
B. Execuo 6) Concluses: apresente as concluses do
Espera-se aqui que o aluno alimente as duas relatrio. O que se pode afirmar sobre os
placas e que as interconecte modelos utilizados e comentrios sobre as
CORRETAMENTE. Observe os vrios nveis aplicaes podem estar nessa seo.
de tenso que significam 1 ou 0 lgico.
7) Referncias (Opcional): deve conter as
Observe que a interpretao do conjunto de referncias utilizadas na prtica.
1s e 0s depende do contexto, por exemplo,
quando um nmero binrio representado
por nveis lgicos e quando um nmero
III. Ferramentas e Literatura
representado por um conjunto de lmpadas
ligadas ou desligadas.
- Programa QUARTUS II da Altera ou ISE da XILINX;

II. Organizao do Relatrio - Placa FPGA ou CPLD;

O relatrio deve ser organizado nos - Livros:


seguintes tpicos (os ttulos dos tpicos no - B. Mealy, F. Tappero, Free Range VHDL. Rel: 1.17/2013.
precisam ser os mesmos indicados) (Usem http://www.freerangefactory.org
200 palavras por tpico aprendam a ser concisos); - Pong P. FPGA Prototyping by VHDL Examples: Xilinx
1) Resumo (Opcional): Deve conter um breve Spartan-3 Version, 1 ed. Wiley-Interscience; 2008.
resumo sobre o trabalho com os principais
resultados obtidos;
2) Introduo/Motivao: Deve conter uma
breve introduo/motivao sobre a prtica,
com objetivos e roteiros
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 21

ESQUEMA DA PLACA BASIC_IN (Placa de ENTRADA de Sinais)


-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 22

ESQUEMA DA PLACA BASIC_OUT (Placa de SADA de Sinais)


-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 23

1.3 Placa de FPGA: criada e montada aqui no DES da UFPE, a placa de FPGA baseada no
circuito integrado CYCLONE IV da empresa Altera.
A alimentao das placas FPGA pode ser utilizados para qualquer funo que voc
feita de duas formas: pelo prprio conector desejar.
mini-USB (prefervel), ou por meio de dois A placa FPGA tambm tem 4 sadas de 3,3V
pinos de entrada (+V), e neste caso, que podem ser utilizadas para alimentar as
certifique-se da polaridade da conexo. No placas bsicas de entrada e sada.
conector mini-USB a tenso de entrada
+5V e os reguladores internos tratam de
baixar para os valores corretos. Se utilizar os
pinos de entrada, certifique-se de que uma
tenso estabilizada de +5V.

As placas precisam ser CONFIGURADAS


(ou programadas) via JTAG, que um
conector especial de 10 pinos na placa.
Conecte o cabo de configurao da Altera
(USB Blaster) no conector JTAG e o outro
lado do cabo na USB do micro.
Fig. 1: placa FPGA DES / UFPE.
Entre no programa QUARTUS II e escolha
como dispositivo a FPGA Cyclone IV
Outras placas que forem desenvolvidas para
(EP4CE6C22I8L), que o chip utilizado em
este sistema podem ter que precisar ter suas
nosso projeto.
prprias fontes de energia. O regulador
interno dessa placa pode fornecer no mximo
Descreva o hardware desejado em VHDL,
800 mA suficiente para a prpria FPGA + 4
conforme as prticas seguintes.
placas Basic_IO, mas no para outros fins.
Pode acontecer tambm de uma placa (e.g.
Depois faa a sntese da descrio. O
Arduino) que fornecer +5V para esta placa
Quartus II vai gerar um arquivo de bits 1s e
FPGA.
0s. necessrio tambm configurar os
nomes dos sinais internamente descritos no
A placa tem uma chave LIGA/DESLIGA.
cdigo VHDL com os pinos reais do CI
Certifique-se de que esteja ligada antes de
FPGA. Para isso, tem que entrar no PIN
gravar o circuito. Um LED azul acende
PLANNER e fazer as conexes.
quando a placa est energizada e ligada.
Outro LED (vermelho) indica que a FPGA
Depois disso, com os pinos configurados,
est programada (algumas verses da placa
faa a gravao do arquivo sintetizado com
no tem este LED). preciso que os dois
os pinos definidos na FPGA. Utilize o mdulo
LEDs estejam ligados para indicar que a
gravador no QUARTUS II e certifique-se de
que a placa FPGA (o chip EP4CE6C22I8L) FPGA est programada.
foi reconhecida. Depois de programado, o
H um boto de RESET na placa caso
circuito que voc descreveu estar
voc o pressione a FPGA ser resetada e
configurado na FPGA.
toda a programao se perde (note que o
Se voc desligar a energia da placa voc ter LED vermelho apaga).
que gravar o chip FPGA novamente, porque
a memria de configurao interna do chip Nas verses da placa com memria de
configurao, a FPGA se reconfigura auto-
do tipo RAM voltil.
maticamente depois do reset ou de ser
ligada. Para gravar a memria da placa
Conecte os cabos flat cables na FPGA e
FPGA (quando a placa tem memria)
pode comear a operar seu circuito.
preciso utilizar o conector AS, em vez do
JTAG.
A placa FPGA tem quatro terminais com 16
pinos de sada, portanto, temos 48 pinos de
entrada ou sada prontos para serem
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 24

ESQUEMA DA PLACA BASIC_FPGA FOLHA 1


-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 25

ESQUEMA DA PLACA BASIC_FPGA FOLHA 2


-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 26

KIT Altera DE2-115


Outra opo para executarmos as prticas ser utilizar o kit Altera DE2-115. Este kit utiliza uma
FPGA da mesma famlia Altera Cyclone IV EP4CE115F29C7N. Contudo, a placa do kit tem uma
srie de recursos a mais que no sero utilizados em nossas prticas, como por exemplo um
display de LCD, sada VGA, memrias, conversores A/D, etc.
O kit contm chaves deslizantes (sliders) e pulsadores push-bottom de entrada (INPUTS) na
prpria placa de circuito impresso (PCB printed circuit board). Tambm possui elementos de
sada como LEDs e DISPLAYs. No kit h 18 chaves deslizantes (SW0...SW 17) que no tem
debouncing (servem apenas para entrada de nveis lgicos), quatro pulsadores (KEY0 ... KEY3)
com debouncing que servem para entrada de pulsos, oito LEDS verdes (LEDG0 ... LEDG7) e 18
vermelhos (LEDR0 ... LEDR17). Possui ainda oito displays de 7-segmentos (HEX0 ... HEX7) nodo
comum, ou seja, so ativados em 0 (acendem o segmento com um ZERO). Estes so os
dispositivos de entrada e sada que utilizaremos dessa placa em Tcnicas Digitais.

Cada um desses pinos de I/O est conectado a um pino da FPGA, portanto menos malevel
que nosso kit, contudo mais prtico, porque no precisamos usar flat-cables. Dessa forma, ao
escolher uma chave ou um LED ou display, certifique-se de que a pinagem est de acordo com o
manual da placa (reproduzido a seguir).
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 27

Signal Name FPGA Pin No. Description I/O Standard


Chaves deslizantes (no debouncing) =0 posio para fora =1 para dentro da placa
SW[0] PIN_AB28 Slide Switch[1]
SW[1] PIN_AC28 Slide Switch[3]
SW[2] PIN_AC27 Slide Switch[1]
SW[3] PIN_AD27 Slide Switch[3]
SW[4] PIN_AB27 Slide Switch[4]
SW[5] PIN_AC26 Slide Switch[5]
SW[6] PIN_AD26 Slide Switch[6]
SW[7] PIN_AB26 Slide Switch[7]
SW[8] PIN_AC25 Slide Switch[8]
SW[9] PIN_AB25 Slide Switch[9]
SW[10] PIN_AC24 Slide Switch[10]
SW[11] PIN_AB24 Slide Switch[11]
SW[12] PIN_AB23 Slide Switch[12]
SW[13] PIN_AA24 Slide Switch[13]
SW[14] PIN_AA23 Slide Switch[14]
SW[15] PIN_AA22 Slide Switch[15]
SW[16] PIN_Y24 Slide Switch[16]
SW[17] PIN_Y23 Slide Switch[17]
Push-bottoms (com debouncing) =0 se pressionado =1 no pressionado
KEY[0] PIN_M23 Push-button[0]
KEY[1] PIN_M21 Push-button[1]
KEY[2] PIN_N21 Push-button[2]
KEY[3] PIN_R24 Push-button[3]
LEDs VERDES (ctodo comum = acende com 1)
LEDG[0] PIN_E21 LED Green[0]
LEDG[1] PIN_E22 LED Green[1]
LEDG[2] PIN_E25 LED Green[2]
LEDG[3] PIN_E24 LED Green[3]
LEDG[4] PIN_H21 LED Green[4]
LEDG[5] PIN_G20 LED Green[5]
LEDG[6] PIN_G22 LED Green[6]
LEDG[7] PIN_G21 LED Green[7]
LEDG[8] PIN_F17 LED Green[8]
LEDs VERMELHOS (ctodo comum = acende com 1)
LEDR[0] PIN_G19 LED Red[0]
LEDR[1] PIN_F19 LED Red[1]
LEDR[2] PIN_E19 LED Red[2]
LEDR[3] PIN_F21 LED Red[3]
LEDR[4] PIN_F18 LED Red[4]
LEDR[5] PIN_E18 LED Red[5]
LEDR[6] PIN_J19 LED Red[6]
LEDR[7] PIN_H19 LED Red[7]
LEDR[8] PIN_J17 LED Red[8]
LEDR[9] PIN_G17 LED Red[9]
LEDR[10] PIN_J15 LED Red[10]
LEDR[11] PIN_H16 LED Red[11]
LEDR[12] PIN_J16 LED Red[12]
LEDR[13] PIN_H17 LED Red[13]
LEDR[14] PIN_F15 LED Red[14]
LEDR[15] PIN_G15 LED Red[15]
LEDR[16] PIN_G16 LED Red[16]
LEDR[17] PIN_H15 LED Red[17]
CLOCK de input (gerador de clock da placa 50 MHz)
CLOCK_50 PIN_Y2 50 MHz clock input
CLOCK2_50 PIN_AG14 50 MHz clock input
CLOCK3_50 PIN_AG15 50 MHz clock input
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 28

Signal Name FPGA Pin No. Description I/O Standard


DISPLAY 7seg - 0 (nodo comum = acende segmento com nvel 0)
HEX0[0] PIN_G18 Seven Segment Digit 0[0]
HEX0[1] PIN_F22 Seven Segment Digit 0[1]
HEX0[2] PIN_E17 Seven Segment Digit 0[2]
HEX0[3] PIN_L26 Seven Segment Digit 0[3]
HEX0[4] PIN_L25 Seven Segment Digit 0[4]
HEX0[5] PIN_J22 Seven Segment Digit 0[5]
HEX0[6] PIN_H22 Seven Segment Digit 0[6]
DISPLAY 7seg - 1
HEX1[0] PIN_M24 Seven Segment Digit 1[0]
HEX1[1] PIN_Y22 Seven Segment Digit 1[1]
HEX1[2] PIN_W21 Seven Segment Digit 1[2]
HEX1[3] PIN_W22 Seven Segment Digit 1[3]
HEX1[4] PIN_W25 Seven Segment Digit 1[4]
HEX1[5] PIN_U23 Seven Segment Digit 1[5]
HEX1[6] PIN_U24 Seven Segment Digit 1[6]
DISPLAY 7seg - 2
HEX2[0] PIN_AA25 Seven Segment Digit 2[0]
HEX2[1] PIN_AA26 Seven Segment Digit 2[1]
HEX2[2] PIN_Y25 Seven Segment Digit 2[2]
HEX2[3] PIN_W26 Seven Segment Digit 2[3]
HEX2[4] PIN_Y26 Seven Segment Digit 2[4]
HEX2[5] PIN_W27 Seven Segment Digit 2[5]
HEX2[6] PIN_W28 Seven Segment Digit 2[6]
DISPLAY 7seg - 3
HEX3[0] PIN_V21 Seven Segment Digit 3[0]
HEX3[1] PIN_U21 Seven Segment Digit 3[1]
HEX3[2] PIN_AB20 Seven Segment Digit 3[2]
HEX3[3] PIN_AA21 Seven Segment Digit 3[3]
HEX3[4] PIN_AD24 Seven Segment Digit 3[4]
HEX3[5] PIN_AF23 Seven Segment Digit 3[5]
HEX3[6] PIN_Y19 Seven Segment Digit 3[6]
DISPLAY 7seg - 4
HEX4[0] PIN_AB19 Seven Segment Digit 4[0]
HEX4[1] PIN_AA19 Seven Segment Digit 4[1]
HEX4[2] PIN_AG21 Seven Segment Digit 4[2]
HEX4[3] PIN_AH21 Seven Segment Digit 4[3]
HEX4[4] PIN_AE19 Seven Segment Digit 4[4]
HEX4[5] PIN_AF19 Seven Segment Digit 4[5]
HEX4[6] PIN_AE18 Seven Segment Digit 4[6]
DISPLAY 7seg - 5
HEX5[0] PIN_AD18 Seven Segment Digit 5[0]
HEX5[1] PIN_AC18 Seven Segment Digit 5[1]
HEX5[2] PIN_AB18 Seven Segment Digit 5[2]
HEX5[3] PIN_AH19 Seven Segment Digit 5[3]
HEX5[4] PIN_AG19 Seven Segment Digit 5[4]
HEX5[5] PIN_AF18 Seven Segment Digit 5[5]
HEX5[6] PIN_AH18 Seven Segment Digit 5[6]
DISPLAY 7seg - 6
HEX6[0] PIN_AA17 Seven Segment Digit 6[0]
HEX6[1] PIN_AB16 Seven Segment Digit 6[1]
HEX6[2] PIN_AA16 Seven Segment Digit 6[2]
HEX6[3] PIN_AB17 Seven Segment Digit 6[3]
HEX6[4] PIN_AB15 Seven Segment Digit 6[4]
HEX6[5] PIN_AA15 Seven Segment Digit 6[5]
HEX6[6] PIN_AC17 Seven Segment Digit 6[6]
DISPLAY 7seg - 7
HEX7[0] PIN_AD17 Seven Segment Digit 7[0]
HEX7[1] PIN_AE17 Seven Segment Digit 7[1]
HEX7[2] PIN_AG17 Seven Segment Digit 7[2]
HEX7[3] PIN_AH17 Seven Segment Digit 7[3]
HEX7[4] PIN_AF17 Seven Segment Digit 7[4]
HEX7[5] PIN_AG18 Seven Segment Digit 7[5]
HEX7[6] PIN_AA14 Seven Segment Digit 7[6]
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 29

Departamento de Eletrnica & Sistemas - UFPE


Prtica 01: Lgica Combinacional Portas Lgicas em VHDL.

I. Experimento e Simulao 1) Resumo (Opcional): Deve conter um breve


resumo sobre o trabalho com os principais
Considere este problema: em uma sala h resultados obtidos;
trs portas (A, B, C). Em cada porta h um
2) Introduo/Motivao: Deve conter uma
interruptor que pode estar ligado 1 ou
breve introduo/motivao sobre a prtica,
desligado 0.
com objetivos e roteiros
A C
S1 S3
3) Fundamentao Terica: Contm a teoria
utilizada na prtica. Uma breve descrio
B S2
Fig. 1 . sobre o que faz o circuito (no caso o
comparador de magnitude). Ou seja, explique
Em qualquer porta que voc entrar/sair voc de onde saiu o circuito inicial;
aciona o interruptor (muda o estado dele de
4) Metodologia: deve conter o arranjo
10 ou de 01) e a lmpada muda seu
experimental, os mtodos de medio e os
estado (acende ou apaga). Use um LED.
resultados da simulao/experimentos;
A. Propostas da aula prtica: 5) Anlise: deve conter a anlise dos
resultados experimentais em comparao
1) Descrever o circuito que realiza o controle com os resultados tericos e/ou simulados.
da lmpada usando VHDL e o estilo data- Dificuldades e problemas com resultados
flow. devem estar registrados nessa seo;
* Monte os circuitos por etapas, e teste cada 6) Concluses: apresente as concluses do
etapa, assim voc garante que no vai relatrio. O que se pode afirmar sobre os
passar para mdulos mais complexos sem modelos utilizados e comentrios sobre as
que os mdulos mais simples estejam aplicaes podem estar nessa seo.
funcionando.
7) Referncias (Opcional): deve conter as
B. Execuo referncias utilizadas na prtica.
Espera-se aqui que o aluno implante circuitos
em CPLD ou em FPGA, e no apenas
simule.
III. Ferramentas e Literatura
Esteja atento que os nveis lgicos das
CPLDs e FPGAs so 3,3V para entradas e - Programa QUARTUS II da Altera ou ISE da XILINX;
sadas. Pode-se utilizar LEDs para medir
sadas e chaves DIP-Switches para entrada - Placa FPGA ou CPLD;
dos nveis lgicos. Utilize as placas - Livros:
BASIC_IN e BASIC_OUT. Preste ateno
- B. Mealy, F. Tappero, Free Range VHDL. Rel: 1.17/2013.
nos pinos e sinais utilizados e faa a escolha http://www.freerangefactory.org
correta no PIN PLANNER.
- Pong P. FPGA Prototyping by VHDL Examples: Xilinx
Spartan-3 Version, 1 ed. Wiley-Interscience; 2008.
II. Organizao do Relatrio
O relatrio deve ser organizado nos
seguintes tpicos (os ttulos dos tpicos no
precisam ser os mesmos indicados) (Usem no
mximo 200 palavras por tpico aprendam a ser
concisos);
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 30

Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 01/08/2012
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Circuito Controle Lmpada
--
-- Descrio:
-- Circuito que controla uma lmpada por mltiplos interruptores
-- O estilo utilizado somente dataflow
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- descrio de uma entidade (a interface de um circuito COM O MUNDO EXTERIOR)


entity Pratica_01 is
-- estas so as portas que conectam essa entidade ao mundo externo
Port ( s1, s2, s3 : in STD_LOGIC;
lamp : out STD_LOGIC);
end Pratica_01;

-- aqui comea a descrio de "como funciona" este circuito

architecture df_Pratica_01 of Pratica_01 is


begin
-- esta declarao cria o circuito XOR com
lamp <= s1 XOR s2 XOR s3;

end df_Pratica_01;

-- -------------------------------------------------------------------------------------
----------
Como Interligar as placas:

1 lembre-se de alimentar as placas de entrada e sada. O terminal +V est sempre mais


prximo do conector do flat cable.

2 Os terminais +V e GND para alimentar as placas E/S esto marcados na FPGA.

3 Escolha o conector que desejar na FPGA. Conecte o flat cable tanto na FPGA quanto nas
placas de Entrada/Sada sempre com os cabos voltados para fora das placas.

Dois modos de ligar as placas Entrada e Sada na FPGA (lembre-se de configurar os pinos no
PIN PLANNER)
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 31

Departamento de Eletrnica & Sistemas - UFPE


Prtica 02: Lgica Combinacional ENCODER (exerccio da Caixa dgua)

I. Experimento e Simulao TABELA VERDADE:


Considere o exerccio feito em sala, na qual ENTRADAS SADAS
vrios sensores (bias) indicam o nvel de
H G F E D C B A D3 D2 D1 D0
gua numa caixa dgua.
Nosso projeto foi criar um circuito digital que 1 1 1 1 1 1 1 1 1 0 0 0
codificasse as entradas e gerasse como 0 1 1 1 1 1 1 1 0 1 1 1
sada um nmero binrio BCD. 0 0 1 1 1 1 1 1 0 1 1 0
0 0 0 1 1 1 1 1 0 1 0 1
0 0 0 0 1 1 1 1 0 1 0 0
0 0 0 0 0 1 1 1 0 0 1 1
0 0 0 0 0 0 1 1 0 0 1 0
0 0 0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0

II. Organizao do Relatrio


Fig. 1 Problema da Caixa dgua e o diagrama de
O relatrio deve ser organizado nos
blocos do ENCODER.
seguintes tpicos (Usem no mximo 200
palavras/tpico aprendam a ser sintticos);
A partir deste bloco, construir em VHDL um
codificador (encoder) de 8 entradas para 1) Resumo (Opcional): Deve conter um breve
BCD (4 bits) que considera a prioridade dos resumo sobre o trabalho com os principais
sinais de maior valor (H>G>F>E>D>C>B>A) resultados obtidos;
2) Introduo/Motivao: Deve conter uma
A. Propostas da aula prtica:
breve introduo/motivao sobre a prtica,
com objetivos e roteiros
1) Descrever um circuito codificador com
prioridade (H>...>A), em VHDL. Vamos usar 3) Fundamentao Terica: Contm a teoria
a estrutura WITH e SELECT para desenhar o utilizada nessa prtica. Uma breve descrio
circuito a partir da tabela da verdade apenas. sobre o que fazem os circuitos (encoders).
Ou seja, explique de onde saiu o circuito
Neste projeto vamos tambm introduzir o inicial, conforme desenvolvido em sala;
conceito de LOGIC_VECTOR em VHDL.
4) Metodologia: deve conter o arranjo
Logic Vector permite que voc entre com um experimental, os mtodos de medio e os
conjunto de dados (um barramento) e determine resultados da simulao/experimentos;
a dimenso desse barramento (ou seja, a
quantidade de bits que o barramento vai ter). 5) Anlise: contm a anlise dos resultados
experimentais em comparao a teoria.
A tabela a seguir mostra o circuito conforme Dificuldades e problemas devem estar
desenvolvemos em sala, agora considerando registrados nessa seo;
apenas que a chave maior prioritria
6) Concluses: apresente as concluses do
2) DESAFIO: tente modificar o cdigo para relatrio.
15 chaves de entrada... 7) Referncias (Opcional): deve conter as
referncias utilizadas na prtica.
B. Execuo
Espera-se aqui que o aluno sintetize e
implante os circuitos em CPLD/FPGA.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 32

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 09/04/2016
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Circuito ENCODER 8 inputs para BCD
--
-- Descrio:
-- Circuito que apresenta a estrutura WITH SELECT e o conceito de LOGIC_VECTOR
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- descrio de uma entidade (a interface de um circuito COM O MUNDO EXTERIOR)


--conforme aprendemos at agora, a entity seria assim (note que est comentado...)
-- entity Encoder_8IN_BCD_Prior is
-- estas so as portas que conectam essa entidade ao mundo externo
-- Port ( A, B, C, D, E, F, G, H : in STD_LOGIC;
-- D3, D2, D1, D0 : out STD_LOGIC);
-- end Encoder_8IN_BCD_Prior;

-- PORM, vamos utilizer o conceito de LOGIC_VECTOR para definir entrada/sada

entity Encoder_8IN_BCD_Prior is
-- estas so as portas NA FORMA DE VETORES que conectam essa entidade ao mundo externo
Port ( I : in STD_LOGIC_VECTOR(7 downto 0);
D : out STD_LOGIC_VECTOR(3 downto 0));
end Encoder_8IN_BCD_Prior;

-- aqui comea a descrio de "como funciona" este circuito


architecture df_Encoder_8IN_BCD_Prior of Encoder_8IN_BCD_Prior is
begin
-- esta estrutura cria um circuito a partir de uma tabela verdade

with I select
D(3 downto 0) <=
"1000" when "11111111", -- a boia #8 est ativa, sai BCD = 8
"0111" when "01111111", -- a boia #8 est desativada e #7 ativa, BCD = 7
"0110" when "00111111", -- # 6 com prioridade
"0101" when "00011111", -- # 5
"0100" when "00001111", -- # 4
"0011" when "00000111", -- # 3
"0010" when "00000011", -- # 2
"0001" when "00000001", -- # 1
"0000" when others; -- se nenhuma boia est ativa

end df_Encoder_8IN_BCD_Prior;
-- -----------------------------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 33

Departamento de Eletrnica & Sistemas - UFPE


Prtica 03: Lgica Combinacional - Comparador de 4 bits em VHDL

I. Experimento e Simulao BASIC_IN e BASIC_OUT. Preste ateno


nos pinos e sinais utilizados e faa a escolha
Considere o circuito da Fig. 1. correta no PIN PLANNER.

II. Organizao do Relatrio


O relatrio deve ser organizado nos
seguintes tpicos (os ttulos dos tpicos no
precisam ser os mesmos indicados) (Usem no
mximo 200 palavras por tpico aprendam a ser
concisos);

1) Resumo (Opcional): Deve conter um breve


resumo sobre o trabalho com os principais
resultados obtidos;
2) Introduo/Motivao: Deve conter uma
breve introduo/motivao sobre a prtica,
com objetivos e roteiros
Fig. 1 2 comparadores de 4 bits em cascata.
3) Fundamentao Terica: Contm a teoria
Trata-se de dois circuitos comparadores de utilizada na prtica. Uma breve descrio
4-bits ligados em cascata, formando um sobre o que faz o circuito (no caso o
comparador de 8 bits. comparador de magnitude). Ou seja, explique
de onde saiu o circuito inicial;
A. Propostas da aula prtica: 4) Metodologia: deve conter o arranjo
experimental, os mtodos de medio e os
1) Descrever um circuito comparador de 1-bit resultados da simulao/experimentos;
em VHDL usando o estilo data-flow.
5) Anlise: deve conter a anlise dos
2) Descrever um circuito comparador de 4- resultados experimentais em comparao
bits usando estilo estrutural a partir do com os resultados tericos e/ou simulados.
componente descrito no item anterior, tal que
forme um bloco lgico como um dos circuitos Dificuldades e problemas com resultados
da Fig. 1. devem estar registrados nessa seo;
3) Tarefa: Descreva um circuito comparador 6) Concluses: apresente as concluses do
de 8-bits tal como o desenho da Fig. 1, relatrio. O que se pode afirmar sobre os
utilizando o estilo estrutural, a partir dos modelos utilizados e comentrios sobre as
circuitos anteriores. aplicaes podem estar nessa seo.
* Monte os circuitos por etapas, e teste cada 7) Referncias (Opcional): deve conter as
etapa, assim voc garante que no vai referncias utilizadas na prtica.
passar para mdulos mais complexos sem
que os mdulos mais simples estejam
funcionando. III. Ferramentas e Literatura
B. Execuo
Espera-se aqui que o aluno implante os - Programa QUARTUS II da Altera ou ISE da XILINX;
circuitos em CPLD ou em FPGA, e no - Placa FPGA ou CPLD;
apenas simule.
- Livros:
Esteja atento que os nveis lgicos das - B. Mealy, F. Tappero, Free Range VHDL. Rel: 1.17/2013.
CPLDs e FPGAs so 3,3V para entradas e http://www.freerangefactory.org
sadas. Pode-se utilizar LEDs para medir
- Pong P. FPGA Prototyping by VHDL Examples: Xilinx
sadas e chaves DIP-Switches para entrada
Spartan-3 Version, 1 ed. Wiley-Interscience; 2008.
dos nveis lgicos. Utilize as placas
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 34

Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Comparador de 1 bit - dataflow
--
-- Descrio:
-- Mdulo comparador de 1 BIT de A com 1 bit de B
-- que ser usado como COMPONENTE num comparador de 4 bits
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- descrio de uma entidade (a interface de um circuito) que compara 1 bit


entity Igual_1bit is
-- estas so as portas que conectam essa entidade ao mundo externo
Port ( A, B : in STD_LOGIC;
AigB : out STD_LOGIC);
end Igual_1bit;

-- aqui comea a descrio de "como funciona" este circuito comparador de 1 bit


architecture df_Igual_1bit of Igual_1bit is
signal p0, p1 : std_logic;
begin
-- estas declaraes fazem os produtos dos termos (AND)
p0 <= (not A) and (not B);
p1 <= A and B;

-- esta declarao faz a soma(OR) dos termos


AigB <= p0 or p1;

end df_Igual_1bit;

-- esta forma de escrever (soma de produtos) apenas didtica...


-- seria possvel (1) no declarar p0 e p1,
-- (2) fazer uma nica linha, assim:
-- AigB <= ((not A) and (not B)) or (A and B);

-- ------------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 35

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Comparador de 4 bits - Estrutural + dataflow
--
-- Descrio:
-- Este mdulo a ESTRUTURA principal de um comparador de 4 bits
-- criado a partir do componente 'Igual_1bit' que compara o bit A com B
-- (obs: este um exemplo didtico de como se monta estrutura com componentes
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- esta a declarao da entidade (da interface do circuito com o mundo)


entity Comparador_4_bits is
-- aqui declaramos as portas de entrada e sada da entidade
Port ( A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);
A_igual_B : out STD_LOGIC);
end Comparador_4_bits;

-- aqui comea a descrio de como conectar 4 comparadores de 1Bit numa ESTRUTURA


architecture str_Comparador_4_bits of Comparador_4_bits is
signal X : STD_LOGIC_VECTOR (3 downto 0); -- 4 sinais p/ interligar componentes
begin
-- instancia o comparador do bit '0' usando Igual1
-- work.Igual_1bit indica biblioteca do prj e a entity que vamos usar
ig_bit0 : entity work.Igual_1bit(df_Igual_1bit)
-- port map = como se conectam as portas de Igual1 aos sinais internos
port map(A => A(0), B => B(0), AigB => X(0));

-- instancia o comparador do bit '1' usando Igual1


ig_bit1 : entity work.Igual_1bit(df_Igual_1bit)
port map(A => A(1), B => B(1), AigB => X(1));

-- instancia o comparador do bit '2' usando Igual1


ig_bit2 : entity work.Igual_1bit(df_Igual_1bit)
port map(A => A(2), B => B(2), AigB => X(2));

-- instancia o comparador do bit '3' usando Igual1


ig_bit3 : entity work.Igual_1bit(df_Igual_1bit)
port map(A => A(3), B => B(3), AigB => X(3));

-- uma porta AND une os 4 sinais de X(0...3) porque A=B apenas quando todos forem =1
(AND)
A_igual_B <= X(0) and X(1) and X(2) and X(3);
end str_Comparador_4_bits;

-- OBS: O MESMO RESULTADO se obtm com o circuito descrito abaixo apenas com dataflow:

-- architecture str_cmp4_bits of Compara_4_bits is


-- signal X : std_logic_vector (3 downto 0);
-- begin
-- X(0) <= A(0) xnor B(0); -- o sinal X(0) recebe o resultado de A(0)
xnor B(0)
-- X(1) <= A(1) xnor B(1);
-- X(2) <= A(2) xnor B(2);
-- X(3) <= A(3) xnor B(3);
-- A_igual_B <= X(0) and X(1) and X(2) and X(3);
-- end str_cmp4_bits;

-- OBS: O MESMO RESULTADO se obtm tambm com o cdigo seguinte, que descreve FIG 1.
-- architecture str_cmp4_bits of Compara_4_bits is
-- signal X : std_logic_vector (3 downto 0);
-- begin
-- X(0) <= A(0) xor B(0); -- o sinal X(0) recebe o resultado de A(0)
xnor B(0)
-- X(1) <= A(1) xor B(1);
-- X(2) <= A(2) xor B(2);
-- X(3) <= A(3) xor B(3);
-- A_igual_B <= X(0) nor X(1) nor X(2) nor X(3);
-- end str_cmp4_bits

-- --------------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 36

Departamento de Eletrnica & Sistemas - UFPE


Prtica 04: Lgica Combinacional Somador e Subtratores completos

I. Experimento e Simulao 3) Descreva um circuito que faa a


Considere o circuito da Fig. 1. soma/subtrao, com a entrada M.
* Monte os circuitos por etapas, e teste cada
etapa, assim voc garante que no vai
passar para mdulos seguinte sem que os
mdulos mais simples estejam ok.
B. Execuo
Espera-se aqui que o aluno sintetize e
implante os circuitos em CPLD/FPGA.

Fig. 1 Somador/Subtrator completo de 1 bit (Img do II. Organizao do Relatrio


livro Idoeta/Capuano, fig 5.57- pag 225).
O relatrio deve ser organizado nos
A partir deste circuito, construir em VHDL um seguintes tpicos (Usem no mximo 200
palavras/tpico aprendam a ser sintticos);
somador/subtrator completo de 4 bits.
1) Resumo (Opcional): Deve conter um breve
resumo sobre o trabalho com os principais
resultados obtidos;
2) Introduo/Motivao: Deve conter uma
breve introduo/motivao sobre a prtica,
com objetivos e roteiros
3) Fundamentao Terica: Contm a teoria
utilizada na prtica. Uma breve descrio
sobre o que fazem os circuitos (somador e
Fig. 2 Somador/Subtrator de 4 bits. subtrator). Ou seja, explique de onde saiu o
circuito inicial, conforme desenvolvido em
Trata-se de um bloco lgico capaz de somar sala;
dois nmeros digitais de 4-bits (A+B) quando 4) Metodologia: deve conter o arranjo
a entrada (modo) M = 1, ou subtrair (A-B) experimental, os mtodos de medio e os
quando a entrada M = 0. O circuito gera uma resultados da simulao/experimentos;
sada S0...S3 como resultado e um 5) Anlise: deve conter a anlise dos
transporte (Ts) quando a soma maior que resultados experimentais em comparao
1111 ou quando a subtrao resultar um com os resultados tericos e/ou simulados.
nmero negativo (se A>B).
Dificuldades e problemas com resultados
A. Propostas da aula prtica: devem estar registrados nessa seo;
6) Concluses: apresente as concluses do
1) Descrever um circuito somador completo relatrio. O que se pode afirmar sobre os
de 1-bit em VHDL usando o estilo data-flow. modelos utilizados e comentrios sobre as
Depois descrever o circuito subtrator aplicaes podem estar nessa seo.
completo tambm utilizando data-flow. 7) Referncias (Opcional): deve conter as
2) Descrever um circuito somador e tambm referncias utilizadas na prtica.
o subtrator de 4-bits usando o estilo
estrutural, a partir dos componentes
descritos no item anterior.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 37

Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).

Descrio de um circuito SOMADOR COMPLETO:


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
-- Create Date: 08/12/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Somador e Subtrator Completo 1Bit - dataflow
-- Descrio:
-- Este mdulo soma UM BIT presente em A com B, quando (M=0)
-- subtrai 1 bit de A do bit em B, quando (M=1)
-- dependendo da varivel M (que controla o modo de operao)
-- O mdulo leva em conta o Carry IN (varivel Te) e sai Carry Out (em Ts)
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- esta a declarao da entidade (da interface do componente com o mundo)

entity Soma_Sub_1Bit is
Port ( A, B, Te, M : in STD_LOGIC;
S, Ts : out STD_LOGIC);
end Soma_Sub_1Bit;

architecture df_Soma_Sub_1Bit of Soma_Sub_1Bit is


begin
-- aqui comea a descrio em dataflow dos circuitos
S <= A xor B xor Te;
Ts <= (B and Te) or ((M xor A) and (B or Te));
end df_Soma_Sub_1Bit;

-----.---------..---------..---------..---------..---------..---------..---------.------
-- Company: UFPE
-- Engineer: Joo Ranhel
-- Create Date: 08/17/2013
-- Module Name: Somador e Subtrator Completo 4-Bits - Structural + dataflow
-- Descrio:
-- Este mdulo soma/subtrai 4 bits de A com B, dependendo do valor da entrada M.
-- Se M=0 soma, se M=1 subtrai. O resultado sai em S(3...0) e Carry_Out em Ts.
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- esta a declarao da entidade (da interface do circuito com o mundo)


entity Somador_Subtrator_4bits is
Port ( A, B : in STD_LOGIC_VECTOR (3 downto 0);
M : in STD_LOGIC;
S : out STD_LOGIC_VECTOR (3 downto 0);
Ts_out : out STD_LOGIC);
end Somador_Subtrator_4bits;

-- esta a declarao da arquitetura (que descreve a estrutura do circuito)


architecture st_Somador_Subtrator_4bits of Somador_Subtrator_4bits is
signal xT : STD_LOGIC_VECTOR (3 downto 0);
signal Te0: STD_LOGIC;
begin
-- o primeiro sinal de Carry_IN zero sempre, isso fora esta condio...
Te0 <= '0';
-- aqui instancia os componentes somador/subtrator de 1 bit para o bit (0) ... (3)
Soma_Sub_0: entity work.Soma_Sub_1Bit(df_Soma_Sub_1Bit)
Port map(A=>A(0), B=>B(0), Te=>Te0, M=>M, S=>S(0), Ts=> xT(0));

Soma_Sub_1: entity work.Soma_Sub_1Bit(df_Soma_Sub_1Bit)


Port map(A=>A(1), B=>B(1), Te=>xT(0), M=>M, S=>S(1), Ts=> xT(1));

Soma_Sub_2: entity work.Soma_Sub_1Bit(df_Soma_Sub_1Bit)


Port map(A=>A(2), B=>B(2), Te=>xT(1), M=>M, S=>S(2), Ts=> xT(2));

Soma_Sub_3: entity work.Soma_Sub_1Bit(df_Soma_Sub_1Bit)


Port map(A=>A(3), B=>B(3), Te=>xT(2), M=>M, S=>S(3), Ts=> xT(3));
-- o sinal de Carry_Out o prprio sinal de saida Ts do mdulo Soma_Sub_3
Ts_out <= xT(3);
end st_Somador_Subtrator_4bits;

-- ---------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 38

Departamento de Eletrnica & Sistemas - UFPE


Prtica 05: Lgica Combinacional Decoder 7 segmentos

I. Experimento e Simulao os nveis lgicos das CPLDs e FPGAs


so 3,3V para entradas e sadas.
Considere o circuito da Fig. 1.
II. Organizao do Relatrio
O relatrio deve ser organizado nos
seguintes tpicos (os ttulos dos tpicos
no precisam ser necessariamente os
mesmos indicados) (Usem no mximo
200 palavras/tpico sejam concisos);

1) Resumo (Opcional): Deve conter um


breve resumo sobre o trabalho com os
principais resultados obtidos;
Fig. 1 Decoder BCD / 7-segmentos.
2) Introduo/Motivao: Deve conter
Trata-se de um bloco lgico (decoder) uma breve introduo/motivao sobre
que transforma uma entrada BCD em a prtica, com objetivos e roteiros
sinais que acendem ou apagam os 3) Fundamentao Terica: Contm a
LEDs de um display de 7 segmentos. teoria utilizada na prtica. Uma breve
descrio sobre o circuito decoder de
A. Propostas da aula prtica: BCD-7seg.
1) Descrever um circuito em VHDL 4) Metodologia: deve conter o arranjo
usando o estilo data-flow que faa a experimental, os mtodos de medio
converso BCD para 7 segmentos. e os resultados da simulao;
Utilize o comando condicional with 5) Anlise: contm anlise / resultados
select (com o sinal BCD como a experimentais em comparao com os
expresso de seleo). Note que with- resultados tericos e/ou simulados.
select ainda estilo data-flow!!!
Dificuldades e problemas devem estar
2) Utilizando o estilo VHDL estrutural registrados nessa seo;
agregue este decoder no circuito
somador / subtrator da prtica passada 6) Concluses: apresente as
(prtica 03). O circuito utilizar apenas concluses do relatrio. O que se pode
um dgito para mostrar o resultado. afirmar sobre os modelos utilizados e
Contudo, utilize o ponto decimal do comentrios sobre as aplicaes
display para mostrar Carry-OUT (Ts). podem estar nessa seo.
3) DESAFIO (obrigatrio): descreva 7) Referncias (Opcional): deve conter
em VHDL o projeto da caixa dgua as referncias utilizadas na prtica.
desenvolvido em sala, incluindo o
decoder para 7-segmentos. Faa voc III. Ferramentas e Literatura
mesmo o cdigo e inclua no relatrio.
- Programa QUARTUS II da Altera ou ISE da XILINX;
* Monte os circuitos por etapas, e teste
- Placa FPGA ou CPLD;
cada etapa, assim voc garante que
no vai passar para mdulos mais - Livros:
complexos sem que os mdulos mais - B. Mealy, F. Tappero, Free Range VHDL. Rel:
simples estejam funcionando. 1.17/2013. http://www.freerangefactory.org
B. Execuo
Espera-se que o aluno implemente
circuitos em FPGA. Esteja atento que
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 39

Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).

Descrio de um circuito DECODIFICADOR BCD-7-SEG:


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/15/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Decodificador_7_segmentos - Dataflow
--
-- Descrio:
-- Este mdulo decodifica um valor em binrio (numBCD) para 7 segmentos (sseg)
-- O mdulo est escrito para ctodo comum e para nodo comum
-- OBS: O ponto o MSB sseg(7), g = sseg(6), e a = sseg(0)
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- caixa preta: entra um nmero BCD e sai 7seg + DP


entity Decoder_7seg is
Port (numBCD : in STD_LOGIC_VECTOR (3 downto 0); -- nums BCD de 4 bits
sseg : out STD_LOGIC_VECTOR (7 downto 0)); -- sinal 7 segmtos + dp
end Decoder_7seg;

-- declarao da arquitetura, que descreve em dataflow como o circuito se comporta...


architecture df_Decoder_7seg of Decoder_7seg is
begin

-- fora desligamento do ponto (para lig-lo preciso uma lgica adicional)


sseg(7) <= '1';

-- converso para 7-seg ANODO COMUM-dataflow (pode ser copiado em outros projs)
with numBCD select
sseg(6 downto 0) <=
"1000000" when "0000", -- alg 0 decimal, anodo comum
"1111001" when "0001", -- 1
"0100100" when "0010", -- 2
"0110000" when "0011", -- 3
"0011001" when "0100", -- 4
"0010010" when "0101", -- 5
"0000010" when "0110", -- 6
"1111000" when "0111", -- 7
"0000000" when "1000", -- 8
"0010000" when "1001", -- 9
"0001000" when "1010", -- A (hexa) anodo comum
"0000011" when "1011", -- B
"1000110" when "1100", -- C
"0100001" when "1101", -- D
"0000110" when "1110", -- E
"0001110" when "1111", -- F
"1111111" when others;

-- converso para 7-seg CTODO COMUM-dataflow (pode ser copiado em outros projs)
-- with numBCD select
-- sseg(6 downto 0) <=
-- "0111111" when "0000", -- alg 0 decimal, anodo comum
-- "0000110" when "0001", -- 1
-- "1011011" when "0010", -- 2
-- "1001111" when "0011", -- 3
-- "1100110" when "0100", -- 4
-- "1101101" when "0101", -- 5
-- "1111101" when "0110", -- 6
-- "0000111" when "0111", -- 7
-- "1111111" when "1000", -- 8
-- "1101111" when "1001", -- 9
-- "1110111" when "1010", -- A (hexa) anodo comum
-- "1111100" when "1011", -- B
-- "0111001" when "1100", -- C
-- "1011110" when "1101", -- D
-- "1111001" when "1110", -- E
-- "1110001" when "1111", -- F
-- "0000000" when others;

end df_Decoder_7seg;
-- -------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 40

O cdigo acima pode ser reutilizado em vrios projetos. Reutilizando o projeto do somador ficar assim:

Obs: escolha uma chave deslizante do KIT DE2-115 da placa para ser o MODE. No kit UFPE escolha um dos
botes de pulsador. Ligue TS-OUT em um LED para verificar quando ocorre overflow.

Descrio de um circuito SOMADOR COMPLETO com decoder 7-segmentos:


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
-- Create Date: 08/12/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Somador e Subtrator Completo 1Bit - dataflow
-- Descrio:
-- Este mdulo soma UM BIT presente em A com B, quando (M=0)
-- subtrai 1 bit de A do bit em B, quando (M=1)
-- dependendo da varivel M (que controla o modo de operao)
-- O mdulo leva em conta o Carry IN (varivel Te) e sai Carry Out (em Ts)
-- O mdulo gera uma sada EM DISPLAY DE 7SEGs.
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- esta a declarao da entidade (da interface do componente com o mundo)


entity Soma_Sub_1Bit is
Port ( A, B, Te, M : in STD_LOGIC;
S, Ts : out STD_LOGIC);
end Soma_Sub_1Bit;

-- arquitetura que descreve por dataflow o circuito que soma e/ou subtrai 1 bit
architecture df_Soma_Sub_1Bit of Soma_Sub_1Bit is
begin
-- aqui comea a descrio em dataflow dos circuitos
S <= A xor B xor Te;
Ts <= (B and Te) or ((M xor A) and (B or Te));
end df_Soma_Sub_1Bit;
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 41

-----.---------..---------..---------..---------..---------..---------..---------.------
-- Company: UFPE
-- Engineer: Joo Ranhel
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Somador e Subtrator Completo 4-Bits - Structural + dataflow
-- Descrio:
-- Este mdulo soma/subtrai 4 bits de A com B, dependendo do valor da entrada M.
-- Se M=0 soma, se M=1 subtrai. O resultado sai em S(3...0) e Carry_Out em Ts.
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- esta a declarao da entidade (da interface do circuito com o mundo)


entity Somador_Subtrator_4bits is
Port ( A, B : in STD_LOGIC_VECTOR (3 downto 0);
M : in STD_LOGIC;
sseg : out STD_LOGIC_VECTOR (6 downto 0);
Ts_out : out STD_LOGIC);
end Somador_Subtrator_4bits;

-- arquitetura que descreve a estrutura do somador de 4 bits, baseado no somador 1 bit


architecture st_Somador_Subtrator_4bits of Somador_Subtrator_4bits is
signal S : STD_LOGIC_VECTOR (3 downto 0);
signal xT : STD_LOGIC_VECTOR (3 downto 0)
signal Te0: STD_LOGIC;
begin
-- o primeiro sinal de Carry_IN zero sempre, isso fora esta condio...
Te0 <= '0';
-- aqui instancia os componentes somador/subtrator de 1 bit para o bit (0) ... (3)
Soma_Sub_0: entity work.Soma_Sub_1Bit(df_Soma_Sub_1Bit)
Port map(A=>A(0), B=>B(0), Te=>Te0, M=>M, S=>S(0), Ts=> xT(0));

Soma_Sub_1: entity work.Soma_Sub_1Bit(df_Soma_Sub_1Bit)


Port map(A=>A(1), B=>B(1), Te=>xT(0), M=>M, S=>S(1), Ts=> xT(1));

Soma_Sub_2: entity work.Soma_Sub_1Bit(df_Soma_Sub_1Bit)


Port map(A=>A(2), B=>B(2), Te=>xT(1), M=>M, S=>S(2), Ts=> xT(2));

Soma_Sub_3: entity work.Soma_Sub_1Bit(df_Soma_Sub_1Bit)


Port map(A=>A(3), B=>B(3), Te=>xT(2), M=>M, S=>S(3), Ts=> xT(3));

-- o sinal de Carry_Out o prprio sinal de saida Ts do mdulo Soma_Sub_3


Ts_out <= xT(3);

-- aqui entra o decoder p/ 7-segmentos


-- converso para 7-seg ANODO COMUM-dataflow (pode ser copiado em outros projs)
with S select
sseg(6 downto 0) <=
"1000000" when "0000", -- alg 0 decimal, anodo comum
"1111001" when "0001", -- 1
"0100100" when "0010", -- 2
"0110000" when "0011", -- 3
"0011001" when "0100", -- 4
"0010010" when "0101", -- 5
"0000010" when "0110", -- 6
"1111000" when "0111", -- 7
"0000000" when "1000", -- 8
"0010000" when "1001", -- 9
"0001000" when "1010", -- A (hexa) anodo comum
"0000011" when "1011", -- B
"1000110" when "1100", -- C
"0100001" when "1101", -- D
"0000110" when "1110", -- E
"0001110" when "1111", -- F
"1111111" when others;

end st_Somador_Subtrator_4bits;

-- ---------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 42

Departamento de Eletrnica & Sistemas - UFPE


Prtica 06: Lgica Sequencial Flip-Flop D e REGISTRADOR - Behavioral.

I. Experimento e Simulao 1) Resumo (Opcional): Deve conter um breve


resumo sobre o trabalho com os principais
Considere o circuito da Fig. 1. resultados obtidos;
2) Introduo/Motivao: Deve conter uma
breve introduo/motivao sobre a prtica,
com objetivos e roteiros. O objetivo aqui
D Q compreender como FFs so gerados em
VHDL.
ck
3) Fundamentao Terica: Contm a teoria
utilizada na prtica. Uma breve descrio
Fig. 1 Flip-Flop tipo D controla acender um LED. sobre o que faz o circuito (no caso o FF tipo
D). Ou seja, explique de onde saiu o circuito
Esta prtica mostra como um Flip-Flop tipo D e qual o objetivo de existir um FF-D.
criado usando a linguagem VHDL.
4) Metodologia: deve conter o arranjo
A. Propostas da aula prtica: experimental, os mtodos de medio e os
resultados da simulao/experimentos;
1) Criar um circuito que retm um BIT, 5) Anlise: deve conter a anlise dos
quando um sinal de clock ativado. Para resultados experimentais em comparao
isso, use uma chave deslizante para entrada com os resultados tericos e/ou simulados.
do dado D, e um boto pulsador para gerar o
clock do circuito. Dificuldades e problemas com resultados
devem estar registrados nessa seo;
2) Descrever um flip-flop usando o estilo
behavioral. Nesse caso, dentro da seo 6) Concluses: apresente as concluses do
architecture voc deve definir um PROCESS. relatrio. O que se pode afirmar sobre os
modelos utilizados e comentrios sobre as
3) Tarefa: depois de executar o FF-D da aplicaes podem estar nessa seo.
forma proposta, troque o sensor de evento do
clock de rising_edge() para falling_edge() e 7) Referncias (Opcional): deve conter as
descreva a mudana no comportamento. referncias utilizadas na prtica.

4) Tarefa: depois de executar o circuito


anterior, crie um REGISTRADOR de 8 bits
(latch de 8 bits). III. Ferramentas e Literatura

B. Execuo - Programa QUARTUS II da Altera ou ISE da XILINX;


Espera-se aqui que o aluno implante os
- Placa FPGA ou CPLD;
circuitos em CPLD/FPGA.
- Livros:
Esteja atento que os nveis lgicos das
CPLDs e FPGAs so 3,3V para entradas e - B. Mealy, F. Tappero, Free Range VHDL. Rel: 1.17/2013.
http://www.freerangefactory.org
sadas. Utilize as placas BASIC_IN e
BASIC_OUT. Preste ateno nos pinos e - Pong P. FPGA Prototyping by VHDL Examples: Xilinx
sinais utilizados e faa a escolha correta no Spartan-3 Version, 1 ed. Wiley-Interscience; 2008.
PIN PLANNER. Os pulsadores da placa
BASIC_IN (e da FPGA) possuem debouncing
(por meio de um inversor schmitt trigger).

II. Organizao do Relatrio


O relatrio deve ser organizado nos
seguintes tpicos (os ttulos dos tpicos no
precisam ser necessariamente os mesmos
indicados) (Mximo 200 palavras por tpico
escrevam snteses);
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 43

Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).

Descrio de um circuito FLIP-FLOP tipo D (base para criar o REGISTRADOR)


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 31/05/2016
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: FLIP-FLOP D + REGISTRADOR - Behavioral
--
-- Descrio: Este cdigo mostra um flip-flop tipo D (1 bit).
-- O clock de input advm do sinal de PULSO de uma chave.
-- Use chaves deslizantes (switches) para ajustar os bits de dados.
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- aqui definimos a entidade


entity Registrador is
Port ( clk : in STD_LOGIC;
Din : in STD_LOGIC;
Q : out STD_LOGIC);
end Registrador;

-- aqui comea o architecture (descrio do comportamento do circuito)


architecture bh_Registrador of Registrador is
begin

-- processo que memoriza os bits de entrada (Din) em Flip-Flops tipo D


mem_FF: process(clk) -- inicia a descrio de um porcesso
begin
if rising_edge(clk) then -- SE ocorrer evento clk (sobe/desce)
Q <= Din; -- Q memoriza o valor de Din
end if;
end process mem_FF; -- fim descrio do processo

end bh_Registrador;

-- TAREFA 1: troque rising_edge() na forma sensorial do clock para falling_edge()

-- TAREFA 2: transforme este circuito em um REGISTRADOR de 4 ou 8 bits


-- -------------------------------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 44

Departamento de Eletrnica & Sistemas - UFPE


Prtica 07: Lgica Sequencial Contador Binrio - Behavioral.

I. Experimento e Simulao indicados) (Mximo 200 palavras por tpico


escrevam snteses);
Considere o circuito da Fig. 1.
1) Resumo (Opcional): Deve conter um breve
max_ou resumo sobre o trabalho com os principais
Contador
Qt resultados obtidos;
n-1
clk_Pulse
BINRIO 2) Introduo/Motivao: Deve conter uma
...
Reset breve introduo/motivao sobre a prtica,
Q0 com objetivos e roteiros
3) Fundamentao Terica: Contm a teoria
utilizada na prtica. Uma breve descrio
Fig. 1 Divisor de clock E circuito contador binrio.
sobre o que faz o circuito (no caso o divisor
de clock). Ou seja, explique de onde saiu o
Contadores podem funcionar com clock
circuito inicial dos circuitos contadores;
contnuo gerado automaticamente, ou podem
contar pulsos gerados por sensores (ou 4) Metodologia: deve conter o arranjo
manualmente). experimental, os mtodos de medio e os
resultados da simulao/experimentos;
A. Propostas da aula prtica: 5) Anlise: deve conter a anlise dos
resultados experimentais em comparao
1) Criar um contador binrio hexa que conte com os resultados tericos e/ou simulados.
os pulsos gerados por um boto pulsador,
com sada em 4 LEDs. Use RESET. Dificuldades e problemas com resultados
devem estar registrados nessa seo;
2) Descrever um contador decimal de 4-bits
em VHDL usando o estilo behavioral 6) Concluses: apresente as concluses do
tambm com sada nos LEDs. Utilize RESET. relatrio. O que se pode afirmar sobre os
modelos utilizados e comentrios sobre as
3) Tarefa: mostre o resultado dos contadores aplicaes podem estar nessa seo.
no display de 7 segmentos usando o
conversor desenvolvido na prtica 4! 7) Referncias (Opcional): deve conter as
referncias utilizadas na prtica.
4) Tarefa: depois de executar o contador da
forma proposta, troque o sensor de evento do
clock de rising_edge() para falling_edge() e
descreva a mudana no comportamento. III. Ferramentas e Literatura
B. Execuo - Programa QUARTUS II da Altera ou ISE da XILINX;
Espera-se aqui que o aluno implante os
circuitos em CPLD / FPGA, e no apenas - Placa FPGA ou CPLD;
simule. - Livros:
Esteja atento que os nveis lgicos das - B. Mealy, F. Tappero, Free Range VHDL. Rel: 1.17/2013.
CPLDs e FPGAs so 3,3V para entradas e http://www.freerangefactory.org
sadas. Utilize as placas BASIC_IN e - Pong P. FPGA Prototyping by VHDL Examples: Xilinx
BASIC_OUT. Preste ateno nos pinos e Spartan-3 Version, 1 ed. Wiley-Interscience; 2008.
sinais utilizados e faa a escolha correta no
PIN PLANNER. As chaves da placa
BASIC_IN j possuem debouncing (por meio
de um inversor schmitt trigger).

II. Organizao do Relatrio


O relatrio deve ser organizado nos
seguintes tpicos (os ttulos dos tpicos no
precisam ser necessariamente os mesmos
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 45

Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).

Descrio de um circuito CONTADOR BINRIO


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 01/08/2014
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Binary_Counter - Structural + Behavioral
--
-- Descrio: Este cdigo mostra um contador binrio sncrono com reset assncrono
-- de N bits (N declarado no generic, e vc pode modificar p/ qualquer
-- nmero de bits desejado).
-- O clock de input advm do sinal de PULSO de entrada
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- aqui definimos a entidade


entity Binary_Counter is
generic( N : integer := 4); -- altere aqui o nm de bits do contador
Port ( clk_Pulse : in STD_LOGIC;
reset : in STD_LOGIC;
max_out : out STD_LOGIC;
Q : out STD_LOGIC_VECTOR (N-1 downto 0));
end Binary_Counter;

-- aqui comea o architecture (descrio do comportamento do circuito)


architecture bh_Binary_Counter of Binary_Counter is
signal r_conta: unsigned(N-1 downto 0);
signal r_proxi: unsigned(N-1 downto 0);

-- comeo da arquitetura
begin

-- processo que memoriza o valor de contagem


mem_contagem: process(clk_Pulse,reset)
begin
if (reset='0') then -- se reset (assncrono) desce p/ ZERO
r_conta <= (others => '0'); -- bits dos FFs de contagem so zerados
elsif rising_edge(clk_Pulse) then -- com evento de clk_Pulse...
r_conta <= r_proxi; -- r_conta memoriza o valor de r_proxi
end if;
end process mem_contagem;

-- esse procedimento incrementa o prximo estado


r_proxi <= r_conta + 1; -- calcula o prximo estado na contagem

-- este procedimento conecta as sadas dos FFs r_conta com as sadas Q da entidade
Q <= STD_LOGIC_VECTOR(r_conta); -- Q(i) converte vetor em sada(pinos)

-- este procedimento gera um pulso '1' quando o ltimo nmero (2**N-1) atingido
max_out <= '1' when r_conta=(2**N-1) else '0';

end bh_Binary_Counter;

-- OBS: neste cdigo, o nmero de BITS do contador (ou seja, o nmero de FFs) definido
-- por voc, no GENERIC (default = 4) e pode ser mudado na hora de instanciar esse
-- componente, em outra estrutura, usando generic map ( N => 10 ), por exemplo.

-- TAREFA: troque rising_edge() na forma sensorial do clock para falling_edge()


-- -------------------------------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 46

Departamento de Eletrnica & Sistemas - UFPE


Prtica 08: Lgica Sequencial Contador de MDULO-M.

I. Experimento e Simulao
II. Organizao do Relatrio
Considere o circuito da Fig. 1. O relatrio deve ser organizado nos
seguintes tpicos (os ttulos dos tpicos
no precisam ser necessariamente os
mesmos indicados) (sejam sintticos, usem
200 palavras por tpico no mximo);
1) Resumo (Opcional): Deve conter um
breve resumo sobre o trabalho com os
principais resultados obtidos;
2) Introduo/Motivao: Deve conter
Fig. 1 Contador decimal sncrono de 4-bits. uma breve introduo/motivao sobre
a prtica, com objetivos e roteiros
Trata-se de um contador binrio de 4 3) Fundamentao Terica: Contm a
bits cujo clock est ligado aos FFs em teoria utilizada na prtica. Uma breve
paralelo (contador sncrono). Note que descrio sobre o que faz o circuito (no
portas AND adicionais detectam caso o contador binrio, contador de
quando o FF-C muda (quando a dcada, e divisor de frequncia). Ou
contagem chega a 3) e quando o FF-D seja, explique de onde saiu o circuito
muda (quando chega a 7). inicial;
Este contador conta at 10 e reseta os
FFs quando a porta NAND tem 4) Metodologia: deve conter o arranjo
entradas = 1. Portanto, depois do experimental, os mtodos de medio
nmero 9, ao receber um clock, o e os resultados da
contador volta para 0000. Por isso simulao/experimentos;
chamado contador decimal binrio. 5) Anlise: deve conter a anlise dos
O contador de mdulo-M conta em resultados experimentais em
binrio at o nmero M que voc o comparao com os resultados tericos
programar. e/ou simulados.

A. Propostas da aula prtica: Dificuldades e problemas com


resultados devem estar registrados
1) Descreva um contador DECIMAL nessa seo;
binrio em VHDL usando o estilo 6) Concluses: apresente as
behavioral. concluses do relatrio. O que se pode
2) Descreva um circuito contador que afirmar sobre os modelos utilizados e
conte at qualquer valor M (mdulo-M). comentrios sobre as aplicaes
podem estar nessa seo.
3) DESAFIO: usando os componentes
contador de Mod-M e divisor de clock, 7) Referncias (Opcional): deve conter
criar um cronmetro: um contador de 4 as referncias utilizadas na prtica.
dgitos que conte em dcimos de
segundos. III. Ferramentas e Literatura
- Programa QUARTUS II da Altera ou ISE da XILINX;
B. Execuo
Espera-se aqui que o aluno implante os - Placa FPGA ou CPLD;
circuitos em CPLD ou em FPGA. Esteja - Livros: - B. Mealy, F. Tappero, Free Range VHDL.
atento que os nveis lgicos das CPLDs Rel: 1.17/2013. http://www.freerangefactory.org
e FPGAs so 3,3V. Pode-se utilizar - Pong P. FPGA Prototyping by VHDL Examples: Xilinx
LEDs para medir sadas e chaves DIP- Spartan-3 Version, 1 ed. Wiley-Interscience; 2008.
Switches para I/O dos nveis lgicos.
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 47

Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).

Contador binrio com reset assncrono:


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Contador de Mdulo M - Behavioral
--
-- Descrio:
-- Este circuito um contador de N bits de mdulo M, ou seja
-- o contador conta de 0 at M (M tem que ser representvel em N bits)
-- Os valores de N e M podem ser ajustados no GENERIC ou em GENERIC MAP...
-- Cada vez que o valor mximo atingido, o contador gera um pulso em max-out.
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- aqui comea a descrio da entidade (interface)


entity Conta_Mod_M is
generic(N : integer := 4; -- num de bits desse contador
M : integer := 10); -- mdulo do contador (conta at M)
Port (clk : in STD_LOGIC;
reset : in STD_LOGIC;
max : out STD_LOGIC;
Q : out STD_LOGIC_VECTOR (N-1 downto 0));
end Conta_Mod_M;

-- aqui comea a descrio da arquitetura (comportamento do circuito)


architecture bhv_Conta_Mod_M of Conta_Mod_M is
signal r_conta: unsigned(N-1 downto 0); -- sinal p/ registrar contagem
signal r_proxi: unsigned(N-1 downto 0); -- sinal p/ proximo valor

begin
-- este processo conta pulsos e memoriza em r_conta
mem_conta: process(clk,reset)
begin
if (reset='0') then -- reset assncrono em ZERO
r_conta <= (others => '0'); -- zera todos os bits de r_conta
elsif rising_edge(clk) then -- sem reset, na subida de clk
r_conta <= r_proxi; -- memoriza proximo valor
end if;
end process mem_conta;

-- prximo estado lgico


r_proxi <= (others=>'0') when r_conta>=(M-1) else r_conta+1;

-- gera o pulso max se chegou no maior valor do mdulo M


pulso_out: process(r_conta)
begin
if r_conta=(M-1) then max <= '1'; else max <= '0'; end if;
end process pulso_out;

-- conecta os sinais do contador r_conta com as sadas Q da interface


Q <= STD_LOGIC_VECTOR (r_conta);
end bhv_Conta_Mod_M;

-- -----------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 48

Departamento de Eletrnica & Sistemas - UFPE


Prtica 09: Lgica Sequencial e Combinacional Multiplex para 4 Displays 7-seg

I. Experimento e Simulao 3) Descrever um circuito que faa


multiplexao entre D1, D2, D3 e D4. Para
Considere a placa de display mostrada na cada dgito (i) ligado, decodificar o nmero
Fig.1. BCD equivalente (BCD-7seg) gerando o par:
Di ligado e Num_7-segi.
B. Execuo
Espera-se aqui que o aluno implante os
circuitos em CPLD ou em FPGA.

II. Organizao do Relatrio


O relatrio deve ser organizado nos
seguintes tpicos: (sejam concisos);
Fig. 1 Placa com 4 Displays 7 Segmentos.
1) Resumo (Opcional): Deve conter um breve
resumo sobre o trabalho com os principais
Trata-se de uma placa que serve como resultados obtidos;
interface para vrios projetos: 4 displays de
7-segmentos, nodo comum (cada segmento 2) Introduo/Motivao: Deve conter uma
acende quando ligado a GND). breve introduo/motivao sobre a prtica,
Para isso, a placa possui uma entrada VCC com objetivos e roteiros
que pode ser ligada em 3,3V na 3) Fundamentao Terica: Contm a teoria
FPGA/CPLD. utilizada na prtica. Uma breve descrio
Note que na pinagem tem apenas sobre o que faz o circuito (no caso o
A,B,C,D,E,F,G e H (pto decimal). Depois tem Multiplexador temporal 4 dgitos e 7-
D1, D2, D3 e D4. O que temos que fazer segmentos). Ou seja, explique de onde saiu
multiplexar os displays. o circuito inicial;
Colocamos o valor BCD da unidade no
decoder BCD-7seg e ativamos D1 (D1=0). 4) Metodologia: deve conter o arranjo
Em seguida colocamos o valor da dezena no experimental, os mtodos de medio e os
decoder e ativamos D2 (=0), e repetimos isso resultados da simulao/experimentos;
para a centena ativando D3 e milhar, 5) Anlise: deve conter a anlise dos
ativando D4. Isso se chama varredura. Se resultados experimentais em comparao
fizermos a varredura o suficiente (digamos, com os resultados tericos e/ou simulados.
60 vezes por segundo), nossos olhos no
percebem que deixamos os displays Dificuldades e problemas com resultados
apagados do tempo. devem estar registrados nessa seo;
Por que multiplexar? 6) Concluses: apresente as concluses do
Para economizar fios e conexes! relatrio. O que se pode afirmar sobre os
Note que para o dispositivo multiplexado modelos utilizados e comentrios sobre as
temos 13 fios, enquanto que para 4 dgitos aplicaes podem estar nessa seo.
de 7-segs seriam necessrios 32 fios + VCC
ou GND. 7) Referncias (Opcional): deve conter as
referncias utilizadas na prtica.
A. Propostas da aula prtica:
III. Ferramentas e Literatura
1) Instanciar em VHDL o divisor de clock que - Programa QUARTUS II da Altera ou ISE da XILINX;
gere 10 Hz, e outro que gere o clock de - Placa FPGA ou CPLD;
varredura de 240 Hz.
- Livros:
2) Descrever um circuito cronmetro digital
- B. Mealy, F. Tappero, Free Range VHDL. Rel: 1.17/2013.
que conte dcimos de segundo: http://www.freerangefactory.org
(cent_seg dez_seg uni_seg dcimo_seg).
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 49

Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Estrutura Display de 4 dgitos x 7 segmentos
-- Descrio:
-- Este arquivo a ESTRUTURA principal do contador de 4 dgitos, com 7 seg multiplexado
-- clk deve ser ligado nos 32 MHz e reset deve ser um PINO de entrada na placa
-- sai sseg:(sseg(7) o pto decimal, sseg(6) o LED "g", e sseg(0) o Led "a" (ativos=0)
-- dig: qual dos dgitos est ligado (ativo em 0): dig(3) o milhar, dig(0) unidade.
-- NOTA: neste programa usa-se 4 bits (portanto, N=4 no genrico em mod_M_conta seno d erro)
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Display_4dig_7seg_mux is
Port ( clk, reset : in STD_LOGIC;
sseg : out STD_LOGIC_VECTOR (7 downto 0);
dig : out STD_LOGIC_VECTOR (3 downto 0));
end Display_4dig_7seg_mux;

architecture st_Display_4dig_7seg_mux of Display_4dig_7seg_mux is


-- sinais internos dessa architeture
signal clk_10Hz : STD_LOGIC; -- clock para 1o. contador
signal mx1,mx2,mx3,mx4 : STD_LOGIC; -- val max = clk p/ mdulos seguintes
signal cU,cD,cC,cM : STD_LOGIC_VECTOR (3 downto 0); -- nums BCD de 4 bits Unid Dez Cen Mil

begin
-- instanciar o componente divisor de frequncia para 10 Hz...
clock_10Hz : entity work.clk_div(bh_clk_div)
generic map(N => 1600000) -- (Na Papilio, 32Mhz, N=1600000 -> clkout= 10Hz)
port map(CLKin => clk,
reset => reset,
CLKout => clk_10Hz);
-- instanciar 1o. contador de mdulo M (unidade)
conta_Un : entity work.conta_mod_M(bhv_conta_mod_M)
generic map(N => 4, M => 10) -- N = 4 bits e M = 10 (modulo 10)
port map(clk => clk_10Hz,
reset => reset,
max => mx1,
q => cU);
-- instanciar 2o. contador de mdulo M (dezena)
conta_Dz : entity work.conta_mod_M(bhv_conta_mod_M)
generic map(N => 4, M => 10) -- N = 4 bits e M = 10 (modulo 10)
port map(clk => mx1,
reset => reset,
max => mx2,
q => cD);
-- instanciar 3o. contador de mdulo M (centena)
conta_Cn : entity work.conta_mod_M(bhv_conta_mod_M)
generic map(N => 4, M => 10) -- N = 4 bits e M = 10 (modulo 10)
port map(clk => mx2,
reset => reset,
max => mx3,
q => cC);
-- instanciar 4o. contador de mdulo M (milhar)
conta_Ml : entity work.conta_mod_M(bhv_conta_mod_M)
generic map(N => 4, M => 10) -- N = 4 bits e M = 10 (modulo 10)
port map(clk => mx3,
reset => reset,
max => mx4,
q => cM);
-- instanciar o multiplex nesta estrutura
mux_4x_7s : entity work.Mux_4dig_7seg(bh_Mux_4dig_7seg)
port map(clk => clk,
reset => reset,
nU => cU,
nD => cD,
nC => cC,
nM => cM,
sseg => sseg,
dig => dig);
end st_Display_4dig_7seg_mux;
-- FIM da entidade principal --
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 50

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Multiplex de 4 dgitos e 7 segmentos
-- Descrio:
-- Este mdulo pode ser utilizado em vrios projetos que utilizem 4 nums c/ display 7 seg
-- entra 4 nums em nU...nM, sai o vetor dig "1110"=dig unidade e "0111"=milhar (ativo low)
-- sai sseg (7 downto 0) 0 LED "a" o LSB, "g" = sseg(6), e ponto decimal em sseg(7).
-- O circuito apaga os leds zerados esquerda (blanking em dgitos no significativos)
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- caixa preta: entra clock + 4 nums BCD e sai 7seg DP + sinal dgito da vez...
entity Mux_4dig_7seg is
Port ( clk, reset : in STD_LOGIC; -- sinal de clock
nU,nD,nC,nM : in STD_LOGIC_VECTOR (3 downto 0); -- nums BCD de 4 bits
sseg : out STD_LOGIC_VECTOR (7 downto 0); -- sinal 7 segmtos + dp
dig : out STD_LOGIC_VECTOR (3 downto 0)); -- seleo dgito na placa
end Mux_4dig_7seg;

architecture bh_Mux_4dig_7seg of Mux_4dig_7seg is


-- declara o uso do componente divisor de clock do sistema (usa 120 Hz para varredura)
signal dignxt : STD_LOGIC_VECTOR (3 downto 0);
signal digaux : STD_LOGIC_VECTOR (3 downto 0);
signal clk_varre : STD_LOGIC; -- sinal de clock de varredura

-- comeo da arquitetura
begin
-- instanciar o componente divisor de frequncia para 10 Hz...
clock_varre : entity work.clk_div(bh_clk_div)
generic map(N => 132000) -- N = 132.000 faz o clk out ~ 120 Hz
port map(CLKin => clk,
reset => reset,
CLKout => clk_varre);

-- a cada pulso de clk_varre o circ seleciona O PROXIMO dgito (display 7 seg)


proc_varredura: process(clk_varre, reset) is
begin
if (reset='0') then -- reset assncrono em ZERO
dignxt <= "1110" ; -- mostra apenas o 1. digito
elsif(clk_varre'event and clk_varre='1') then -- na subida de clock de varredura
if dignxt="1110" then -- blanking: se estiver varrendo dig UN
if nM>"0000" or nC>"0000" or nD>"0000" then -- e algum dos nums (Dz, Cn, Milhar)>0
dignxt <= "1101"; -- passa a varrer a dezena
else -- se nenhum for maior que zero
dignxt <= "1110"; -- mostra apenas o dig da unidade
end if;
elsif dignxt="1101" then -- blanking: se estiver varrendo dig DZ
if nM>"0000" or nC>"0000" then -- e (Cn ou Ml)>0
dignxt <= "1011"; -- varre a centena
else -- se no,
dignxt <= "1110"; -- volta a varrer a unidade
end if;
elsif dignxt="1011" then -- blanking: se estiver varrendo centena
if nM>"0000" then -- e Ml > 0
dignxt <= "0111"; -- varre a milhar
else
dignxt <= "1110"; -- caso contrrio, volta para unidade
end if;
elsif dignxt="0111" then
dignxt <= "1110";
else -- pega o resto (por segurana)
dignxt <= "1110";
end if;
end if;
end process proc_varredura;

-- processo que ajusta o valor do dado digaux para un, dz, cn, milhar...
Ajst_digaux : process (dignxt) is
begin
case (dignxt) is
when "1110" => digaux <= nU; sseg(7) <= '1';
when "1101" => digaux <= nD; sseg(7) <= '0'; -- deixei o pto fixo na dezena!
when "1011" => digaux <= nC; sseg(7) <= '1';
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 51

when "0111" => digaux <= nM; sseg(7) <= '1';


when others => digaux <= "1111"; sseg(7) <= '1';
end case;
end process Ajst_digaux ;
-- e ajusta a sada dig para selecionar o prox dgito a ser ligado
dig <= dignxt;

-- converso para sete segmentos (ANODO COMUM dataflow)


with digaux select
sseg(6 downto 0) <=
"1000000" when "0000", -- alg 0 decimal, anodo comum
"1111001" when "0001", -- 1
"0100100" when "0010", -- 2
"0110000" when "0011", -- 3
"0011001" when "0100", -- 4
"0010010" when "0101", -- 5
"0000010" when "0110", -- 6
"1111000" when "0111", -- 7
"0000000" when "1000", -- 8
"0010000" when "1001", -- 9
"0001000" when "1010", -- A (hexa) anodo comum
"0000011" when "1011", -- B
"1000110" when "1100", -- C
"0100001" when "1101", -- D
"0000110" when "1110", -- E
"0001110" when "1111", -- F
"1111111" when others;
end bh_Mux_4dig_7seg;

-- FIM do circuito multiplex --

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Divisor de clock - Behavioral
-- Descrio:
-- Mdulo DIVISOR DE CLOCK por um valor N inteiro (CLKin dividido por N).
-- (duty cycle=50%: a sada CLKout='1' por N/2 pulsos de CLKin; CLKout='0' durante N/2 pulsos)
-- Ajuste os generics N_varre e N_10Hz no incio do mdulo (na entity) p/ mudar f_varre e timer
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- esta a entidade do divisor de clock


entity clk_div is
generic ( N : integer := 16000000); -- default: este nm gera 1Hz => (32M/16.000.000)/2
port ( CLKin : in std_logic; -- entra o clock a ser dividido
reset : in std_logic; -- entra o reset
CLKout: out std_logic); -- sai clock out dividido por N (duty cicle ~50%)
end clk_div;

-- aqui a arch que descreve o comportamento do divisor de clock


architecture bh_clk_div of clk_div is
signal r_conta: integer; -- sinal (vetor inteiro de N bits,) p/ r_conta
signal f_clk : std_logic; -- flag que indica se clkout est em 1 ou 0
begin -- comeo da descrio do comportamento
divide_clock: process(CLKin) -- processo (devido a lgica seq do r_conta)
begin
if (reset='0') then -- reset assncrono em ZERO
r_conta <= 0; -- zera o contador
elsif rising_edge(CLKin) then -- se acontecer a subida de clock
if (r_conta = N) then -- se r_conta j contou at N
f_clk <= NOT(f_clk); -- inverte o f_clk (1-> 0; ou 0 -> 1)
r_conta <= 0; -- e zera o contador
else -- caso contrrio,
r_conta <= r_conta+1; -- incrementa o r_conta
end if;
end if;
end process divide_clock;
CLKout <= f_clk; -- fazer o clock de sada igual ao valor do f_clk
end bh_clk_div;
-- FIM do circuito divisor de clock
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 52

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais - PR_04B
-- Module Name: Contador de Mdulo M - Behavioral
--
-- Descrio:
-- Este circuito um contador de N bits de mdulo M, ou seja
-- o contador conta de 0 at M (M tem que ser representvel em N bits)
-- Os valores de N e M podem ser ajustados no GENERIC ou em GENERIC MAP...
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- aqui comea a descrio da entidade (interface)


entity Conta_Mod_M is
generic(N : integer := 4; -- num de bits desse contador
M : integer := 10); -- mdulo do contador (conta at M)
Port (clk : in STD_LOGIC;
reset : in STD_LOGIC;
max : out STD_LOGIC;
Q : out STD_LOGIC_VECTOR (N-1 downto 0));
end Conta_Mod_M;

-- aqui comea a descrio da arquitetura (comportamento do circuito)


architecture bhv_Conta_Mod_M of Conta_Mod_M is
signal r_conta: unsigned(N-1 downto 0); -- sinal p/ registrar contagem
signal r_proxi: unsigned(N-1 downto 0); -- sinal p/ proximo valor

begin -- da architecture

-- este processo conta pulsos e memoriza em r_conta


mem_conta: process(clk,reset)
begin
if (reset='0') then -- reset assncrono em ZERO
r_conta <= (others => '0'); -- zera todos os bits de r_conta
elsif falling_edge(clk) then -- sem reset, na descida de clk
r_conta <= r_proxi; -- memoriza proximo valor
end if;
end process mem_conta;

-- prximo estado lgico


r_proxi <= (others=>'0') when r_conta>=(M-1) else r_conta+1;

-- gera o pulso max se chegou no maior valor do mdulo M


pulso_out: process(r_conta)
begin
if r_conta=(M-1) then max <= '1'; else max <= '0'; end if;
end process pulso_out;

-- conecta os sinais do contador r_conta com as sadas Q da interface


Q <= STD_LOGIC_VECTOR (r_conta);
end bhv_Conta_Mod_M;

-- FIM do contador de mdulo M --

-- --------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 53

Cdigo VHDL para utilizao no KIT DE2-115


----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Estrutura Display de 4 dgitos x 7 segmentos
-- Descrio:
-- Este arquivo a ESTRUTURA principal do contador de 4 dgitos, com 7 seg multiplexado
-- clk deve ser ligado nos 50 MHz e reset deve ser um PINO de entrada na placa
-- sai sseg1,sseg2,sseg3,sseg4,:(ssegX(6) o LED "g", e ssegX(0) o Led "a" (ativos=0)
-- NOTA: neste programa usa-se 4 bits (portanto, N=4 no genrico em mod_M_conta seno d erro)
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Display_4dig_7seg_mux is
Port ( clk, reset : in STD_LOGIC;
sseg1, sseg2, sseg3, sseg4 : out STD_LOGIC_VECTOR (6 downto 0));
end Display_4dig_7seg_mux;

architecture st_Display_4dig_7seg_mux of Display_4dig_7seg_mux is


-- sinais internos dessa architeture
signal clk_10Hz : STD_LOGIC; -- clock para 1o. contador
signal mx1,mx2,mx3,mx4 : STD_LOGIC; -- val max = clk p/ mdulos seguintes
signal cUn,cDz,cCn,cMl : STD_LOGIC_VECTOR (3 downto 0); -- nums BCD de 4 bits Unid Dez Cen Mil
signal sseg : STD_LOGIC_VECTOR (6 downto 0); -- vetor 7 segmentos
signal dig : STD_LOGIC_VECTOR (3 downto 0); -- vetor c/ qual dos displays acende

begin
-- instanciar o componente divisor de frequncia para 10 Hz...
clock_10Hz : entity work.clk_div(bh_clk_div)
generic map(N => 1600000) -- (Na Papilio, 32Mhz, N=1600000 -> clkout= 10Hz)
port map(CLKin => clk,
reset => reset,
CLKout => clk_10Hz);
-- instanciar 1o. contador de mdulo M (unidade)
conta_Un : entity work.conta_mod_M(bhv_conta_mod_M)
generic map(N => 4, M => 10) -- N = 4 bits e M = 10 (modulo 10)
port map(clk => clk_10Hz,
reset => reset,
max => mx1,
q => cUn);
-- instanciar 2o. contador de mdulo M (dezena)
conta_Dz : entity work.conta_mod_M(bhv_conta_mod_M)
generic map(N => 4, M => 10) -- N = 4 bits e M = 10 (modulo 10)
port map(clk => mx1,
reset => reset,
max => mx2,
q => cDz);
-- instanciar 3o. contador de mdulo M (centena)
conta_Cn : entity work.conta_mod_M(bhv_conta_mod_M)
generic map(N => 4, M => 10) -- N = 4 bits e M = 10 (modulo 10)
port map(clk => mx2,
reset => reset,
max => mx3,
q => cCn);
-- instanciar 4o. contador de mdulo M (milhar)
conta_Ml : entity work.conta_mod_M(bhv_conta_mod_M)
generic map(N => 4, M => 10) -- N = 4 bits e M = 10 (modulo 10)
port map(clk => mx3,
reset => reset,
max => mx4,
q => cMl);
-- instanciar o multiplex nesta estrutura
mux_4x_7s : entity work.Mux_4dig_7seg(bh_Mux_4dig_7seg)
port map(clk => clk,
reset => reset,
nUn => cUn,
nDz => cDz,
nCn => cCn,
nMl => cMl,
sseg => sseg,
dig => dig);
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 54

-- esta parte do circuito liga apenas UM dos displays por vez (time multiplex) ...

proc_mux_display: process(dig) is
begin
if dig="1110" then -- se estiver varrendo dig UN
sseg1 <= sseg;
else
sseg1 <= "1111111"; -- se no, apaga o display
end if;
if dig="1101" then -- se estiver varrendo dig UN
sseg2 <= sseg;
else
sseg2 <= "1111111"; -- se no, apaga o display
end if;
if dig="1011" then -- se estiver varrendo dig UN
sseg3 <= sseg;
else
sseg3 <= "1111111"; -- se no, apaga o display
end if;
if dig="0111" then -- se estiver varrendo dig UN
sseg4 <= sseg;
else
sseg4 <= "1111111"; -- se no, apaga o display
end if;
end process proc_mux_display;

end st_Display_4dig_7seg_mux;
-- FIM da entidade principal
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 55

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Multiplex de 4 dgitos e 7 segmentos
-- Descrio:
-- Este mdulo pode ser utilizado em vrios projetos que utilizem 4 nums c/ display 7 seg
-- entra 4 nums em nU...nM, sai o vetor dig "1110"=dig unidade e "0111"=milhar (ativo low)
-- sai sseg (7 downto 0) 0 LED "a" o LSB, "g" = sseg(6), e ponto decimal em sseg(7).
-- O circuito apaga os leds zerados esquerda (blanking em dgitos no significativos)
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- caixa preta: entra clock + 4 nums BCD e sai 7seg DP + sinal dgito da vez...
entity Mux_4dig_7seg is
Port (clk, reset : in STD_LOGIC; -- sinal de clock e reset
nUn,nDz,nCn,nMl : in STD_LOGIC_VECTOR (3 downto 0); -- nums BCD de 4 bits
sseg : out STD_LOGIC_VECTOR (6 downto 0); -- sinal 7 segmtos
dig : out STD_LOGIC_VECTOR (3 downto 0)); -- seleo dgito na placa
end Mux_4dig_7seg;

architecture bh_Mux_4dig_7seg of Mux_4dig_7seg is


-- declara o uso do componente divisor de clock do sistema (usa 120 Hz para varredura)
signal dignxt : STD_LOGIC_VECTOR (3 downto 0);
signal digaux : STD_LOGIC_VECTOR (3 downto 0);
signal clk_varre : STD_LOGIC; -- sinal de clock de varredura

-- comeo da arquitetura
begin
-- instanciar o componente divisor de frequncia para 10 Hz...
clock_varre : entity work.clk_div(bh_clk_div)
generic map(N => 200000) -- N = 200.000 faz o clk out ~ 125 Hz
port map(CLKin => clk,
reset => reset,
CLKout => clk_varre);

-- a cada pulso de clk_varre o circ seleciona O PROXIMO dgito (display 7 seg)


proc_varredura : process(reset, clk_varre) is
begin
if (reset='0') then -- reset assncrono em ZERO
dignxt<="1110" ; -- mostra apenas o 1. digito
elsif (rising_edge(clk_varre)) then -- na subida de clock de varredura
if dignxt="1110" then -- blanking: se estiver varrendo dig UN
if nMl>"0000" or nCn>"0000" or nDz>"0000" then -- e algum dos nums (Dz, Cn, Milhar)>0
dignxt <= "1101"; -- passa a varrer a dezena
else -- se nenhum for maior que zero
dignxt <= "1110"; -- mostra apenas o dig da unidade
end if;
elsif dignxt="1101" then -- blanking: se estiver varrendo dig DZ
if nMl>"0000" or nCn>"0000" then -- e (Cn ou Ml)>0
dignxt <= "1011"; -- varre a centena
else -- se no,
dignxt <= "1110"; -- volta a varrer a unidade
end if;
elsif dignxt="1011" then -- blanking: se estiver varrendo centena
if nMl>"0000" then -- e Ml > 0
dignxt <= "0111"; -- varre a milhar
else
dignxt <= "1110"; -- caso contrrio, volta para unidade
end if;
elsif dignxt="0111" then
dignxt <= "1110";
else -- pega o resto (por segurana)
dignxt <= "1110";
end if;
end if;
end process proc_varredura;
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 56

-- processo que ajusta o valor do dado digaux para un, dz, cn, milhar...
Ajst_digaux: process (dignxt) is
begin
case (dignxt) is
when "1110" => digaux <= nUn;
when "1101" => digaux <= nDz;
when "1011" => digaux <= nCn;
when "0111" => digaux <= nMl;
when others => digaux <= "1111";
end case;
end process Ajst_digaux ;
-- e ajusta a sada dig para selecionar o prox dgito a ser ligado
dig <= dignxt;

-- converso para sete segmentos (ANODO COMUM dataflow)


with digaux select
sseg(6 downto 0) <=
"1000000" when "0000", -- alg 0 decimal, anodo comum
"1111001" when "0001", -- 1
"0100100" when "0010", -- 2
"0110000" when "0011", -- 3
"0011001" when "0100", -- 4
"0010010" when "0101", -- 5
"0000010" when "0110", -- 6
"1111000" when "0111", -- 7
"0000000" when "1000", -- 8
"0010000" when "1001", -- 9
"0001000" when "1010", -- A (hexa) anodo comum
"0000011" when "1011", -- B
"1000110" when "1100", -- C
"0100001" when "1101", -- D
"0000110" when "1110", -- E
"0001110" when "1111", -- F
"1111111" when others;
end bh_Mux_4dig_7seg;

-- FIM do circuito multiplex --


-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 57

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Divisor de clock - Behavioral
-- Descrio:
-- Mdulo DIVISOR DE CLOCK por um valor N inteiro (CLKin dividido por N).
-- (duty cycle=50%: a sada CLKout='1' por N/2 pulsos de CLKin; CLKout='0' durante N/2 pulsos)
-- Ajuste os generics N_varre e N_10Hz no incio do mdulo (na entity) p/ mudar f_varre e timer
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- esta a entidade do divisor de clock


entity clk_div is
generic ( N : integer := 16000000); -- default: este nm gera 1Hz => (32M/16.000.000)/2
port ( CLKin : in std_logic; -- entra o clock a ser dividido
reset : in std_logic; -- entra o reset
CLKout: out std_logic); -- sai clock out dividido por N (duty cicle ~50%)
end clk_div;

-- aqui a arch que descreve o comportamento do divisor de clock


architecture bh_clk_div of clk_div is
signal r_conta: integer; -- sinal (vetor inteiro de N bits,) p/ r_conta
signal f_clk : std_logic; -- flag que indica se clkout est em 1 ou 0
begin -- comeo da descrio do comportamento
divide_clock: process(CLKin) -- processo (devido a lgica seq do r_conta)
begin
if (reset='0') then -- reset assncrono em ZERO
r_conta <= 0; -- zera o contador
elsif rising_edge(CLKin) then -- se acontecer a subida de clock
if (r_conta = N) then -- se r_conta j contou at N
f_clk <= NOT(f_clk); -- inverte o f_clk (1-> 0; ou 0 -> 1)
r_conta <= 0; -- e zera o contador
else -- caso contrrio,
r_conta <= r_conta+1; -- incrementa o r_conta
end if;
end if;
end process divide_clock;
CLKout <= f_clk; -- fazer o clock de sada igual ao valor do f_clk
end bh_clk_div;
-- FIM do circuito divisor de clock

----------------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 58

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais - PR_04B
-- Module Name: Contador de Mdulo M - Behavioral
--
-- Descrio:
-- Este circuito um contador de N bits de mdulo M, ou seja
-- o contador conta de 0 at M (M tem que ser representvel em N bits)
-- Os valores de N e M podem ser ajustados no GENERIC ou em GENERIC MAP...
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- aqui comea a descrio da entidade (interface)


entity Conta_Mod_M is
generic(N : integer := 4; -- num de bits desse contador
M : integer := 10); -- mdulo do contador (conta at M)
Port (clk : in STD_LOGIC;
reset : in STD_LOGIC;
max : out STD_LOGIC;
Q : out STD_LOGIC_VECTOR (N-1 downto 0));
end Conta_Mod_M;

-- aqui comea a descrio da arquitetura (comportamento do circuito)


architecture bhv_Conta_Mod_M of Conta_Mod_M is
signal r_conta: unsigned(N-1 downto 0); -- sinal p/ registrar contagem
signal r_proxi: unsigned(N-1 downto 0); -- sinal p/ proximo valor

begin -- da architecture
-- este processo conta pulsos e memoriza em r_conta
mem_conta: process(clk,reset)
begin
if (reset='0') then -- reset assncrono em ZERO
r_conta <= (others => '0'); -- zera todos os bits de r_conta
elsif falling_edge(clk) then -- sem reset, na descida de clk
r_conta <= r_proxi; -- memoriza proximo valor
end if;
end process mem_conta;
-- prximo estado lgico
r_proxi <= (others=>'0') when r_conta>=(M-1) else r_conta+1;
-- gera o pulso max se chegou no maior valor do mdulo M
pulso_out: process(r_conta)
begin
if r_conta=(M-1) then max <= '1'; else max <= '0'; end if;
end process pulso_out;

-- conecta os sinais do contador r_conta com as sadas Q da interface


Q <= STD_LOGIC_VECTOR (r_conta);
end bhv_Conta_Mod_M;
-- FIM do contador de mdulo M --
-- --------------------------------------------------------------------------
-- Apostila: Dispositivos Lgicos Programveis e VHDL - Prof. Joo Ranhel 59

Departamento de Eletrnica & Sistemas - UFPE


Prtica 10: Lgica Sequencial Mquina de Estados, MUX e Contadores

I. Experimento e Simulao 2) Descrever um circuito cronmetro digital


que conte centsimos de segundo:
Considere a placa mostrada na Fig. 1.
( 105 104 103 102 101 1 10-1 10-2)
segundos.
3) Descrever um circuito que multiplexe
D1...D8. Para cada dgito (i) ligado,
decodificar o valor equivalente (BCD-7seg).
4) Descrever um circuito que gere string com
2 bytes: string = (bits D1...D8) & (7-seg + dp)
Fig. Placa display com 8 dgitos de 7-segmentos. 5) Criar uma mquina de estados que tome
cada bit dessa string e coloque em DIO, suba
Trata-se de uma placa com 8 dgitos de 7- o pulso SCK, desa o pulso SCK, repita isso
seg que possui apenas 5 fios de entrada: para os 16 bits. Ao final, suba o RCK, desa
VCC, GND, SCK, RCK e DIO. Esta placa o pulso RCK e indique o final da serializao.
utiliza comunicao SERIAL. A placa possui Gerar o par: Di ligado e Num_7-segi..
dois circuitos integrados 74HC595
registrador de deslocamento, cujo diagrama - A prtica requer conceito de MQUINA DE
de blocos aparece na Fig. 2. ESTADOS para enviar dados serializados.

II. Organizao do Relatrio


O relatrio deve ser organizado nos
seguintes tpicos (sejam sucintos);
1) Resumo (Opcional;
2) Introduo/Motivao: Deve conter uma
breve introduo/motivao sobre a prtica;
3) Fundamentao Terica: Contm a teoria
utilizada na prtica. Uma breve descrio
sobre o que faz o circuito, incluindo o
74HC595;
4) Metodologia: deve conter o arranjo
Os sinais OE e MR esto devidamente experimental, os mtodos de medio e os
ligados. Deve-se colocar o dado disponvel resultados da simulao/experimentos;
em DIO, na subida de SCK o dado
serializado para o shift-register. Depois que 8 5) Anlise: deve conter a anlise dos
bits de dados so deslocados para o SR resultados experimentais em comparao
devemos dar um pulso de clock em RCK com os resultados tericos e/ou simulados.
para copiar o contedo do SR para a sada 6) Concluses: apresente as concluses do
do 74HC595 (Q0...Q7). relatrio. O que se pode afirmar sobre os
As sadas dos dois 74HC595 servem para: modelos utilizados e comentrios sobre as
a) o 1 74HC595 retm qual dgito (D1...D8) aplicaes podem estar nessa seo.
deve estar ligado (ativo em 1);
b) o 2 74HC595 retm o cdigo 7-segs 7) Referncias (Opcional): deve conter as
(nodo comum) que o dgito (D1...D8) deve referncias utilizadas na prtica.
mostrar.
III. Ferramentas e Literatura
A. Propostas da aula prtica: - Programa QUARTUS II da Altera ou ISE da XILINX;
- Placa FPGA ou CPLD;
1) Instanciar clock_div p/ gerar 100 Hz, e
outro que gere o clock de varredura de 4KHz.
Cdigo em VHDL (esta uma proposta... faa a sua prpria soluo).
-- este o cdigo da estrutura principal do mux serial...
----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Display_8dig_7seg_serial - Structural + Behavioral + Dataflow
--
-- Descrio:
-- Additional Comments:
-- Este arquivo a ESTRUTURA principal do contador de 8 dgitos, com 7 seg serial
-- clk deve ser ligado nos X MHz da placa e reset deve ser um PINO de entrada na placa
-- saem apenas 3 sinais:
-- DIO: o dado serial que ser enviado para os shift-registers 74HC595
-- SCK: o sinal de clock usado para serializar dados para os SRs
-- RCK: o sinal que copia os dados serializados para a sada do 74HC595
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Display_8dig_7seg_serial is
Port (clk, reset : in STD_LOGIC;
DIO : out STD_LOGIC;
SCK : out STD_LOGIC;
RCK : out STD_LOGIC);
end Display_8dig_7seg_serial;

architecture st_Display_8dig_7seg_serial of Display_8dig_7seg_serial is


-- sinais internos dessa architeture
signal clk_cont : STD_LOGIC; -- clock para 1o. contador
signal mx1,mx2,mx3,mx4,
mx5,mx6,mx7,mx8 : STD_LOGIC; -- val max = clk p/ mdulos seguintes
signal c1,c2,c3,c4,
c5,c6,c7,c8 : STD_LOGIC_VECTOR (3 downto 0); -- nums BCD de 4 bits Unid Dez Cen
Milhar
-- comeo da architecture
begin
-- instanciar o componente divisor de frequncia para 100 Hz...
divclk_contador : entity work.clk_div(bh_clk_div)
generic map(N => 160000) --(p/ 100 Hz em 32MHz N= 160.000)
port map(CLKin => clk,
reset => reset,
CLKout => clk_cont);

-- instanciar 1o. contador de mdulo N1 (unidade)


conta_N1 : entity work.conta_mod_M(bhv_conta_mod_M)
port map(CLKin => clk_cont,
reset => reset,
max => mx1,
q => c1);
-- instanciar 2o. contador de mdulo N2 (dezena)
conta_N2 : entity work.conta_mod_M(bhv_conta_mod_M)
port map(CLKin => mx1,
reset => reset,
max => mx2,
q => c2);
-- instanciar 3o. contador de mdulo N3 (mil)
conta_N3 : entity work.conta_mod_M(bhv_conta_mod_M)
port map(CLKin => mx2,
reset => reset,
max => mx3,
q => c3);
-- instanciar 4o. contador de mdulo N4 (dzmil)
conta_N4 : entity work.conta_mod_M(bhv_conta_mod_M)
port map(CLKin => mx3,
reset => reset,
max => mx4,
q => c4);
-- instanciar 5o. contador de mdulo N5 (centmil)
conta_N5 : entity work.conta_mod_M(bhv_conta_mod_M)
port map(CLKin => mx4,
reset => reset,
max => mx5,
q => c5);
-- instanciar 6o. contador de mdulo N6 (milho)
conta_N6 : entity work.conta_mod_M(bhv_conta_mod_M)
Dispositivos Lgicos Programveis Joo Ranhel 61
port map(CLKin => mx5,
reset => reset,
max => mx6,
q => c6);
-- instanciar 7o. contador de mdulo N7 (dzmilho)
conta_N7 : entity work.conta_mod_M(bhv_conta_mod_M)
port map(CLKin => mx6,
reset => reset,
max => mx7,
q => c7);
-- instanciar 8o. contador de mdulo N8 (centmilho)
conta_N8 : entity work.conta_mod_M(bhv_conta_mod_M)
port map(CLKin => mx7,
reset => reset,
max => mx8,
q => c8);

-- instanciar o multiplex nesta estrutura


mux_8x_7s: entity work.Mux_8dig_7seg(bh_Mux_8dig_7seg)
port map(clk => clk,
reset => reset,
n1 => c1,
n2 => c2,
n3 => c3,
n4 => c4,
n5 => c5,
n6 => c6,
n7 => c7,
n8 => c8,
sck => SCK,
rck => RCK,
dout => DIO);
end st_Display_8dig_7seg_serial;
-- FIM da estrutura principal --

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: MDULO MUX e FSM para - Structural + Behavioral + Dataflow
--
-- Descrio:
-- (este apenas o mdulo MUX que multiplexa e serializa dados para o 74HC595)
-- Este mdulo pode ser utilizado em vrios projetos que utilizem 8 nums c/ display 7 seg
-- entra 8 nums em n1...n8, sai o sinal de dados e um pulso de clock para serializa-lo.
-- O circuito apaga os leds zerados esquerda (blanking em dgitos no significativos)
-- A frequencia de varredura conseguida instanciando o clk_div p/ 2 KHz...
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- este componente um multiplex de 8 digitos serial...


entity Mux_8dig_7seg is
Port ( clk, reset : in STD_LOGIC; -- sinal de clock e reset
n1,n2,n3,n4,n5,n6,n7,n8 : in STD_LOGIC_VECTOR (3 downto 0); -- nums BCD de 4 bits
sck, rck, dout : out STD_LOGIC); -- sadas seriais
end Mux_8dig_7seg;

architecture bh_Mux_8dig_7seg of Mux_8dig_7seg is

-- define uma varivel do tipo vars de estado (usando type) com 35 estados E00...E34
type tipo_estado is (E00,E01,E02,E03,E04,E05,E06,E07,E08,E09,E10,E11,E12,E13,E14,E15,E16,
E17,E18,E19,E20,E21,E22,E23,E24,E25,E26,E27,E28,E29,E30,E31,E32,E33,E34);
-- define sinais internos da arquitetura
signal EsA, EsF : tipo_estado;
-- declara o uso do componente divisor de clock do sistema (usa 120 Hz para varredura)
signal clk_varre: STD_LOGIC; -- clock varredura (=4KHz, 500 vezes/display)
signal proxdig : STD_LOGIC_VECTOR (7 downto 0); -- sinaliza o prox dgito
signal sseg : STD_LOGIC_VECTOR (7 downto 0); -- valor do dado a ser serializado
signal val_aux : STD_LOGIC_VECTOR (3 downto 0); -- valor aux para converso BCD-7seg
signal Reg_Out : STD_LOGIC_VECTOR (15 downto 0);-- reg p/ armazenar concatenao sseg &
proxdig

begin -- comeo da arquitetura


-- instanciar o componente divisor de frequncia para Freq_Varredura 4 KHz...
div_clk_varre : entity work.clk_div(bh_clk_div)
generic map(N => 8000) -- para freq 2KHz (~250 Hz em cada dgito)
Dispositivos Lgicos Programveis Joo Ranhel 62
port map(CLKin => clk,
reset => reset,
CLKout => clk_varre);

-- a cada pulso de clk_varre o circ seleciona e memoriza O PROXIMO dgito (display 7 seg)
prox_digito: process(clk_varre, reset)
begin
if (reset='0') then
proxdig <= "00000000";
elsif rising_edge(clk_varre) then
proxdig <= "00000001"; -- por default varre o dgito 1 apenas
val_aux <= n1; -- e mostra o nmero da unidade!
if proxdig = "00000001" then
-- blanking: se varre dig N1 e algum dos dgitos seguintes > 0, varre tambm N2
if (n8>"0000" or n7>"0000" or n6>"0000" or n5>"0000" or n4>"0000" or n3>"0000" or n2>"0000") then
proxdig <= "00000010"; -- passa a varrer o segundo dgito e memoriza proxdig
val_aux <= n2;
end if;
elsif proxdig = "00000010" then
-- blanking: se varre dig N2 e algum dos seguintes > 0, varre tambm N3
if (n8>"0000" or n7>"0000" or n6>"0000" or n5>"0000" or n4>"0000" or n3>"0000") then
proxdig <= "00000100"; -- passa a varrer o 3o dgito
val_aux <= n3;
end if;
elsif proxdig = "00000100" then
-- blanking: se varre dig N3 e algum dos seguintes > 0, varre tambm N4
if (n8>"0000" or n7>"0000" or n6>"0000" or n5>"0000" or n4>"0000") then
proxdig <= "00001000"; -- passa a varrer o 4o dgito
val_aux <= n4;
end if;
elsif proxdig = "00001000" then
-- blanking: se varre dig N4 e algum dos seguintes > 0, varre tambm N5
if (n8>"0000" or n7>"0000" or n6>"0000" or n5>"0000") then
proxdig <= "00010000"; -- passa a varrer o 5o dgito
val_aux <= n5;
end if;
elsif proxdig = "00010000" then
-- blanking: se varre dig N5 e algum dos seguintes > 0, varre tambm N6
if (n8>"0000" or n7>"0000" or n6>"0000") then
proxdig <= "00100000"; -- passa a varrer o 6o dgito
val_aux <= n6;
end if;
elsif proxdig = "00100000" then
-- blanking: se varre dig N6 e algum dos seguintes > 0, varre tambm N7
if (n8>"0000" or n7>"0000") then
proxdig <= "01000000"; -- passa a varrer o 7o dgito
val_aux <= n7;
end if;
elsif proxdig = "01000000" then
-- blanking: se varre dig N7 e algum dos seguintes > 0, varre tambm N8
if (n8>"0000") then
proxdig <= "10000000"; -- passa a varrer o 8o dgito
val_aux <= n8;
end if;
elsif proxdig = "10000000" then
proxdig <= "00000001"; -- inicia mostrando apenas o digito 1
val_aux <= n1;
end if;
end if;
end process prox_digito;

-- converso para sete segmentos (ANODO COMUM dataflow)


with val_aux select
sseg(7 downto 1) <= "0000001" when "0000", -- alg 0, anodo comum = 1000000 c/ a=MSBit
"1001111" when "0001", -- 1 ac = 1111001
"0010010" when "0010", -- 2 = 0100100
"0000110" when "0011", -- 3 = 0110000
"1001100" when "0100", -- 4 = 0011001
"0100100" when "0101", -- 5 = 0010010
"0100000" when "0110", -- 6 = 0000010
"0001111" when "0111", -- 7 = 1111000
"0000000" when "1000", -- 8 = 0000000
"0000100" when "1001", -- 9 = 0010000
"0001000" when "1010", -- A(hx)= 0001000
"1100000" when "1011", -- B = 0000011
"0110001" when "1100", -- C = 1000110
"1000010" when "1101", -- D = 0100001
"0110000" when "1110", -- E = 0000110
"0111000" when "1111", -- F = 0001110
"1111111" when others;
Dispositivos Lgicos Programveis Joo Ranhel 63
-- considerar uma lgica para controle do posicionamento do ponto decimal...
sseg(0) <= '1'; -- aqui, ponto fixo em nenhuma casa dp = LSBit

-- uma mquina de estados para enviar os dados serialmente para o 74HC595 da placa
sync_FSM_serial: process(clk, EsF, clk_varre)
begin
-- aqui acontece o processo sncrono, sada = prox estado (no clock) ou reset...
if (clk_varre = '0') then -- clk_varre faz o papel de RESET (='0' faz voltar para
E00)
EsA <= E00;
elsif (rising_edge(clk)) then -- SE clk_varre='1', CADA subida de clk
EsA <= EsF; -- assume prox estado
end if;
end process sync_FSM_serial;

comb_FSM_serial: process(EsA)
begin
rck <= '0'; -- STCP #12 HC595 storage register clk input
sck <= '0'; -- default sck='0' SHCP #11 HC595 shift register clk input
dout <= '0'; -- dout = '1'

case EsA is
-- no estado zero do contador cria o contador Reg_Out (concatena sseg & proxdig)
when E00 =>
Reg_Out <= sseg & proxdig; -- concatena os 16 bits do 'Reg_Out' a serem
enviados
EsF <= E01; -- ajusta o prox estado para E01
rck <= '1'; -- STCP #12 HC595 storage register clk input
when E01 =>
rck <= '0'; -- STCP #12 HC595 storage register clk input
EsF <= E02; -- prox estado
when E02 =>
dout <= Reg_Out(0); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E03; -- prox estado
when E03 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E04; -- prox estado
when E04 =>
dout <= Reg_Out(1); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E05; -- prox estado
when E05 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E06; -- prox estado
when E06 =>
dout <= Reg_Out(2); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E07; -- prox estado
when E07 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E08; -- prox estado
when E08 =>
dout <= Reg_Out(3); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E09; -- prox estado
when E09 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E10; -- prox estado
when E10 =>
dout <= Reg_Out(4); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E11; -- prox estado
when E11 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E12; -- prox estado
when E12 =>
dout <= Reg_Out(5); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E13; -- prox estado
when E13 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E14; -- prox estado
when E14 =>
dout <= Reg_Out(6); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E15; -- prox estado
when E15 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E16; -- prox estado
Dispositivos Lgicos Programveis Joo Ranhel 64

when E16 =>


dout <= Reg_Out(7); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E17; -- prox estado
when E17 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E18; -- prox estado
when E18 =>
dout <= Reg_Out(8); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E19; -- prox estado
when E19 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E20; -- prox estado
when E20 =>
dout <= Reg_Out(9); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E21; -- prox estado
when E21 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E22; -- prox estado
when E22 =>
dout <= Reg_Out(10); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E23; -- prox estado
when E23 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E24; -- prox estado
when E24 =>
dout <= Reg_Out(11); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E25; -- prox estado
when E25 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E26; -- prox estado
when E26 =>
dout <= Reg_Out(12); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E27; -- prox estado
when E27 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E28; -- prox estado
when E28 =>
dout <= Reg_Out(13); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E29; -- prox estado
when E29 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E30; -- prox estado
when E30 =>
dout <= Reg_Out(14); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E31; -- prox estado
when E31 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E32; -- prox estado
when E32 =>
dout <= Reg_Out(15); -- coloca o bit de dado na sada
sck <= '1'; -- levanta o pulso de clock p. HC595 copiar bit
EsF <= E33; -- prox estado
when E33 =>
sck <= '0'; -- baixa o pulso de clock p. HC595
EsF <= E34; -- prox estado
when others =>
rck <= '1'; -- STCP #12 HC595 storage register clk input
EsF <= E34; -- prox estado: FICA EM STATE 34 com rck = '1'
end case;
end process comb_FSM_serial;
end bh_Mux_8dig_7seg;

-- FIM do multiplexado de 8 dgitos --


Dispositivos Lgicos Programveis Joo Ranhel 65

----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais - PR_04B
-- Module Name: Contador de Mdulo M - Behavioral
--
-- Descrio:
-- Este circuito um contador de N bits de mdulo M, ou seja
-- o contador conta de 0 at M (M tem que ser representvel em N bits)
-- Os valores de N e M podem ser ajustados no GENERIC ou em GENERIC MAP...
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- aqui comea a descrio da entidade (interface)


entity Conta_Mod_M is
generic(N : integer := 4; -- num de bits desse contador
M : integer := 10); -- mdulo do contador (conta at M)
Port (clk : in STD_LOGIC;
reset : in STD_LOGIC;
max : out STD_LOGIC;
Q : out STD_LOGIC_VECTOR (N-1 downto 0));
end Conta_Mod_M;

-- aqui comea a descrio da arquitetura (comportamento do circuito)


architecture bhv_Conta_Mod_M of Conta_Mod_M is
signal r_conta: unsigned(N-1 downto 0); -- sinal p/ registrar contagem
signal r_proxi: unsigned(N-1 downto 0); -- sinal p/ proximo valor

begin -- da architecture

-- este processo conta pulsos e memoriza em r_conta


mem_conta: process(clk,reset)
begin
if (reset='0') then -- reset assncrono em ZERO
r_conta <= (others => '0'); -- zera todos os bits de r_conta
elsif rising_edge(clk) then -- sem reset, na subida de clk
r_conta <= r_proxi; -- memoriza proximo valor
end if;
end process mem_conta;

-- prximo estado lgico


r_proxi <= (others=>'0') when r_conta>=(M-1) else r_conta+1;

-- gera o pulso max se chegou no maior valor do mdulo M


pulso_out: process(r_conta)
begin
if r_conta=(M-1) then max <= '1'; else max <= '0'; end if;
end process pulso_out;

-- conecta os sinais do contador r_conta com as sadas Q da interface


Q <= STD_LOGIC_VECTOR (r_conta);
end bhv_Conta_Mod_M;

-- FIM do contador de mdulo M --


Dispositivos Lgicos Programveis Joo Ranhel 66
----------------------------------------------------------------------------------
-- Company: UFPE
-- Engineer: Joo Ranhel
--
-- Create Date: 08/17/2013
-- Design Name: Prticas de Tcnicas Digitais
-- Module Name: Divisor de clock - Behavioral
--
-- Descrio:
-- Mdulo DIVISOR DE CLOCK por um valor N inteiro (CLKin dividido por N).
-- (duty cycle=50%: a sada CLKout='1' por N/2 pulsos de CLKin; CLKout='0' durante N/2 pulsos)
-- Ajuste os generics N_varre e N_10Hz no incio do mdulo (na entity) p/ mudar f_varre e
timer
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- esta a entidade do divisor de clock


entity clk_div is
generic ( N : integer := 16000000); -- default: este nm gera 1Hz => (32M/16.000.000)/2
port ( CLKin : in std_logic; -- entra o clock a ser dividido
reset : in std_logic; -- entra o reset
CLKout: out std_logic); -- sai clock out dividido por N (duty cicle ~50%)
end clk_div;

-- aqui a arch que descreve o comportamento do divisor de clock


architecture bh_clk_div of clk_div is
signal r_conta: integer; -- sinal (vetor inteiro de N bits,) p/ r_conta
signal f_clk : std_logic; -- flag que indica se clkout est em 1 ou 0
begin -- comeo da descrio do comportamento
divide_clock: process(CLKin) -- processo (devido a lgica seq do r_conta)
begin
if (reset='0') then -- reset assncrono em ZERO
r_conta <= 0; -- zera o contador
elsif rising_edge(CLKin) then -- se acontecer a subida de clock
if (r_conta = N) then -- se r_conta j contou at N
f_clk <= NOT(f_clk); -- inverte o f_clk (1-> 0; ou 0 -> 1)
r_conta <= 0; -- e zera o contador
else -- caso contrrio,
r_conta <= r_conta+1; -- incrementa o r_conta
end if;
end if;
end process divide_clock;
CLKout <= f_clk; -- fazer o clock de sada igual ao valor do f_clk
end bh_clk_div;

-- FIM do circuito divisor de clock ----------------------------------------