top of page

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