2. Dada a tabela de estados abaixo, faça o diagrama de estados correspondente como uma
FSM de Mealy. Considere A = 1 e B = 0 como estado inicial.
3. Assinale quais das seguintes afirmações são boas práticas de codificação em Verilog:
( ) Identação do código.
( ) Uso de parâmetros.
( ) Escrita de atribuições default dentro de blocos always @ (*).
( ) Uso de atribuições bloqueantes com não-bloqueantes num mesmo bloco procedural.
( ) Implementação de lógica sequencial com reset assíncrono.
a) b)
c) d)
9. Usando um waveform, exemplifique porque deve-se ter cuidado com reset assíncrono.
10. A figura abaixo mostra a interseção de uma via preferencial com outra secundária. Vários
sensores de detecção de veículos estão colocados ao longo das mãos de direção C e D (via
principal) e A e B (via secundária). A saída de tais sensores será nível lógico BAIXO quando
nenhum veículo for detectado, e será nível lógico ALTO em caso de detecção. O sinal de
tráfego no cruzamento deve ser controlado como se segue:
• O sinal leste-oeste (L-O) estará verde sempre que existirem veículos em ambas as vias
de direção C e D;
• O sinal leste-oeste (L-O) estará verde sempre que existirem veículos ou em C ou em D,
estando as outras duas vias, A e B, sem nenhum veículo detectado.
• O sinal norte-sul (N-S) estará verde sempre que existirem veículos em A e em B,
estando C e D vazias.
• O sinal norte-sul (N-S) estará verde quando ou A ou B estiverem ocupadas, enquanto C
e D estiverem vazias.
• O sinal leste-oeste (L-O) estará verde quando nenhum veículo tiver sido detectado
pelos sensores.
11. Deseja-se construir um dado eletrônico, conforme figura abaixo. A entrada B é utilizada
para "lançar" o dado. Quando B = 1, o dado está sendo "lançado" e os 7 LEDs {a, b, c, d,
e, f, g} devem ficar apagados. Quando B = 0, o valor do dado obtido é exposto através dos
7 LEDs. Faça a síntese da FSM representante do módulo XISTO em Verilog.
12. O código de Hamming é um código de detecção, isto é, permite não apenas detectar erro
de um bit, mas também a localização do bit errado. Parte-se da observação de que, dados
dois bits A e B, a operação ou exclusivo C = A ⊕ B calcula o bit paridade (no caso, par) dos
bits dados.
A esse dado de 8 bits vamos acrescentar 4 bits adicionais, formando o código de Hamming
de 12 bits, o qual é numerado da seguinte forma:
onde:
x10 = m8
x8 = m7
x7 = m6
x6 = m5
x4 = m4
x3 = m3
x2 = m2
x1 = m1
x12 = x10 ⊕ x8 ⊕ x6 ⊕ x4 ⊕ x2
x11 = x10 ⊕ x7 ⊕ x6 ⊕ x3 ⊕ x2
x9 = x8 ⊕ x7 ⊕ x6 ⊕ x1
x5 = x4 ⊕ x3 ⊕ x2 ⊕ x1
Se houver erro em um bit apenas, é possível detectar tal erro e corrigi-lo. Para isso
fazemos o seguinte cálculo de 4 bits, denominados k1, k2, k3 e k4:
k1 = y12 ⊕ y10 ⊕ y8 ⊕ y6 ⊕ y4 ⊕ y2
k2 = y11 ⊕ y10 ⊕ y7 ⊕ y6 ⊕ y3 ⊕ y2
k3 = y9 ⊕ y8 ⊕ y7 ⊕ y6 ⊕ y1
k4 = y5 ⊕ y4 ⊕ y3 ⊕ y2 ⊕ y1
Se k1 = k2 = k3 = k4 = 0, então não há erro. Senão, o número binário codificado por tais bits
determinará a posição do bit errado. Isto é, se k4k3k2k1 = 0111, então o bit y7 está errado.
Questão: Usando código Verilog, faça um circuito ECC (Error Correcting Code) de
detecção simples, correção simples, usando código de Hamming, considerando palavras
de memória de 8 bits. Uma das entradas do circuito deverá ser R/W: caso R/W = R, o
circuito deverá detectar e corrigir um eventual erro na palavra de entrada, gerando a
palavra correta na saída; caso R/W = W, o circuito deverá gerar na saída o código de
Hamming da palavra de entrada.
13. Considere a figura abaixo. A bomba d'água B1 leva água de um riacho até o tanque
inferior, e a bomba B2 leva água do tanque inferior para o superior. A bomba B1 deve
ligar com o objetivo de encher o tanque inferior, sendo desligada quando a água atingir o
nível máximo (S2), e assim permanecendo (desligada) até que a água fique abaixo do nível
de mínimo (S1). A bomba B2 funciona da mesma forma, baseada nos níveis S3 e S4, mas
não poderá funcionar caso o nível do tanque inferior esteja abaixo de S1. Se qualquer
combinação que os sensores enviarem for impossível de ocorrer na prática, as duas
bombas devem ser imediatamente desligadas, independente de qualquer outra situação.
Faça a síntese da FSM correspondente em Verilog, fazendo as convenções necessárias.
Dica: faça reuso do exemplo do tanque, dado em aula (material sobre FSMs).
14. Dado o diagrama de estados seguinte, referente a uma máquina de refrigerantes que
libera a latinha após a inserção de três moedas de R$ 1,00 (com possibilidade de
desistência), obtenha o circuito correspondente em Verilog. Faça as convenções
necessárias.
15. O circuito abaixo permite a realização de somatórios, a partir de dados provenientes de
uma Memória Externa:
Externamente, TOP faz interface com dois blocos: uma Memória Externa e um
Controlador. O Controlador deverá enviar sinais de controle Clock e Reset para TOP,
recebendo deste o sinal Ready (explicado adiante). A Memória Externa é uma SRAM, com
profundidade de 32 endereços e largura de 16 bits, portas de entrada DataIN, Address,
ReadEnable e WriteEnable, e porta de saída DataOut.
Obs.: Controlador é um módulo externo, o qual não é de interesse para o problema aqui
tratado, exceto pelos sinais de interfaceamento.
c) Faça um módulo em Verilog denominado FSM, o qual envie sinais de controle para uma
instância do módulo Acumulador e para a Memória Externa.
17. Faça em Verilog um módulo para calcular a expressão matricial C = A x B, onde A é uma
matriz 2x3 e B é uma matriz 3x2, usando no máximo 3 multiplicadores. Considere que
este módulo obtém e grava dados numa memória SRAM, a qual tem como portas de
entrada DataIN, Address, ReadEnable, WriteEnable e Clock e, como porta de saída,
DataOut. Após a habilitação da operação (leitura ou escrita), a memória consumirá 1
pulso de clock para realização da mesma – no caso de leitura, a porta de saída irá para
alta impedância tão logo o sinal de ativação correspondente seja retirado. Deixe indicado
o esboço da arquitetura de tal circuito, com convenções utilizadas.
18. A cidade de Curitiba possui um sistema de ônibus urbano bem construído. Em avenidas
amplas, há corredores de ônibus que usam estações-tubo. O usuário entra na estação e
aguarda o ônibus, em frente a portas de acesso. Ao estacionar, o motorista aciona um
comando que executa duas etapas, em ordem: 1) bloqueia a ação do acelerador e desce
as rampas de acesso, as quais se encaixam nos vãos da estação-tubo; e 2) abre as portas
do ônibus. Por questões de segurança, tal comando somente é aceito quando o ônibus
está totalmente parado. Ao sair, o motorista desativa o comando, o que executa as
seguintes etapas, em ordem: 1) fechas as portas; 2) recolhe as rampas; e 3) desabilita o
bloqueio da ação do acelerador. O diagrama abaixo representa a FSM desse circuito.
Obtenha o circuito correspondente em Verilog.
X1 / 000
19. Considere um robô que deve acompanhar um muro. A figura abaixo ilustra o problema.
Na parte a) da figura, o mundo do robô é uma matriz de células, na qual cada
componente é livre (células brancas) ou ocupado por um muro (células escuras). O robô,
mostrado como um triângulo, é colocado em qualquer célula livre, respeitando uma das
direções paralelas ao gradeado da matriz (horizontal ou vertical), com sua frente voltada
para qualquer um dos 4 sentidos possíveis (para cima, para baixo, para a direita ou para a
esquerda).
O robô possui 2 sensores binários: head (sensor situado na frente do robô, que retorna 1
quando a célula situada à frente do robô está ocupada por um muro – caso contrário,
retorna 0) e left (sensor situado na lateral esquerda do robô, que retorna 1 quando a
célula do lado esquerdo do robô é ocupada por um muro - caso contrário, retorna 0).
Ao ligar o robô, 4 casos são possíveis, os quais deverão ser tratados como segue:
Caso 1: robô em uma área livre (ambos sensores retornando 0). Neste caso, o robô
deverá avançar até o encontro de um muro e acompanhá-lo, dando-lhe o lado
esquerdo;
Caso 2: robô com muro à frente e do lado esquerdo (ambos sensores retornando 1).
Neste caso, o robô deverá rotacionar até encontrar um muro à sua esquerda
que possa ser acompanhado;
Caso 3: robô com muro somente à frente (head = 1, left = 0). Mesmo comportamento
do caso 2;
Caso 4: robô com muro somente à esquerda (head = 0, left = 1). Neste caso, o robô
deverá acompanhar o muro.
Em qualquer dos casos citados, o robô deverá acompanhar o muro até que um novo muro
seja encontrado ou até que o muro dobre à esquerda, como na parte b) da figura, fazendo
com que o robô também dobre à esquerda e prossiga. Como regra prioritária, após cada
rotação, se houver um muro à esquerda do robô, este deverá ser acompanhado.