
Como projetar registradores de deslocamento em Verilog
Atualizado: 8 de nov. de 2022
A rede de dados da sua casa está conectada à Internet por meio de um cabo de fibra ótica. É apenas um cabo, e todos os equipamentos de sua casa (celulares, computadores, tablets) estão conectados a este cabo por intermédio de um roteador. Como é possível tantos equipamentos utilizarem o mesmo cabo? A resposta está na serialização e desserialização de dados. A animação abaixo apresenta este conceito através da transmissão de uma palavra de 8 bits de um computador em sua casa (Dispositivo A) para um computador remoto (Dispositivo B).

A trasmissão pelo dispositivo A é realizada pelo registrador reg_tx que faz a serialização da palavra de 8 bits no reg_a. De forma análoga, o dispositivo B desserializa os dados recebidos pelo canal de 1 bit através do registrador reg_rx e transfere para o registrador reg_b. Apesar de terem finalidades distintas, ambos os circuitos serializador e desserializador utilizam um circuito semelhante, que desloca os bits a medida que estes são capturados. Este circito é conhecido pelo nome de registrador de deslocamento (ou shift register, em inglês).
Neste tutorial, você vai aprender a:
instanciar e usar o flip-flop DFFRSE do chip virtual Pitanga
projetar um registrador de 8 bits utilizando o flip-flop DFFRSE
implementar o projeto de um registrador de deslocamento de 10 bits
mapear, compilar e prototipar o projeto na placa Community
interagir com o projeto na placa Community
Antes de prosseguir, recomendamos os seguintes tutoriais:
O que é um flip-flop?

Um flip-flop é um dispositivo de armazenamento de 1-bit utilizado no projeto de circuitos sequenciais. Existe uma variade de tipos de flip-flop, cada um com características distintas, sendo o mais comum o flip-flop do tipo D. No flip-flop do tipo D a entrada é armazenada nas transições do relógio do sistema (ou bordas de clock).
O chip virtual Pitanga possui em sua biblioteca de componentes um flip-flop do tipo D, com controle de escrita, chamado de DFFRSE. Este flip-flop está descrito na tabela abaixo, onde a X indica '0' ou '1' (don't care). Note que os pinos do DFFRSE possuem prioridades, caso ativados ao mesmo tempo.
reset | set | enable | d | clk | q | Descrição |
1 | X | X | X | X | 0 | Reset assíncrono |
0 | 1 | X | X | X | 1 | Set assíncrono |
0 | 0 | 0 | X | X | q | Flip-flop desabilitado. Retém estado anterior. |
0 | 0 | 1 | 0 | ↑ | 0 | Flip-flop habilitado. Armazena entrada d na borda de subida do relógio. |
0 | 0 | 1 | 1 | ↑ | 1 | Flip-flop habilitado. Armazena entrada d na borda de subida do relógio. |
DFFRSE significa D-type Flip-Flop with asynchronous Reset, Set and clock Enable
Nas próximas seções, iremos utilizar este flip-flop para projetar um registrador de 8 bits a m registrador de deslocamento(shift register). Para isso, será necessário instanciar o DFFRSE usando a seguinte sintaxe:
DFFRSE nome_da_instancia(
.q(sinal_de_saida),
.d(sinal_de_entrada),
.clk(clock_do_sistema),
.reset(reset_do_sistema),
.set(set_do_sistema),
.enable(sinal_de_controle));
Projetando um registrador de 8-bits
Um registrador é um conjunto de flip-flops do tipo D controlado pelo mesmo sinal de clock, reset/set e enable. Registradores armazenam e transferem dados, em forma de vetores de bits, de maneira sincronizada com o relógio do sistema (sinal de clock).
A figura abaixo apresenta o esquemático de um registrador de 8-bits. Este registrador armazena o vetor de 8-bits din a cada borda de subida de clk quando habilitado (cen = '1'). Note que, excetuando os sinais de dados din e dout, todos os flip-flops do registrador de 8 bits são controlados pelos mesmos sinais de clk, set/reset e enable.

Nota: Para facilitar o entendimento do esquemático, os fios que conectam as entradas set e reset do DFFRSE foram eliminados da figura.
Descrevendo o registrador acima em Verilog, obtemos o seguinte código:
module reg8b(
input rst, // reset assincrono
input set, // set assincrono
input cen, // habilita relogio (clock enable)
input clk, // relogio do sistema (clock)
input[7:0] din, // entrada de dados (data in)
output clk_out,// saida do sinal de clock
output[7:0] dout); // saida de dados (data out)
// registrador de 8 bits
DFFRSE dff0(.q(dout[0]), .d(din[0]), .clk