A leitura do bitstream é realizada pelo decodificador 1 bit por vez no caso do de- codificador de entropia e de 1 a 16 bits por vez para o caso do parser. Considerando que a entrada de dados pode vir da leitura de um arquivo em disco, em memória ou de uma transmissão direta, estes dados normalmente virão agrupados em um ou mais bytes tornando necessário um mecanismo para leitura com maior granularidade.
A primeira versão do Stream Buffer foi feita direcionada especificamente para o De- codificador de Entropia permitindo apenas a leitura de 1 bit por vez diretamente em hardware. Depois, observamos que o parser sendo executado pelo processador também poderia se beneficiar deste módulo já que o processador gasta alguns ciclos para poder realizar as operações de shift e concatenação e mascaramento para obter a quantidade requerida de bits.
A versão mais simples de 1 bit foi criada baseada em um buffer circular contendo ao todo 64 bits separados em dois registradores de 32 bits. Neste caso, optou-se pelos 32
bits para aproveitar a largura de palavras do barramento Avalon que transmite em uma só comunicação o máximo de bits possível. O módulo é controlado por duas máquinas de estado, uma para atender às solicitações de leitura dos bits e realizar a operação de deslocamento e a outra para realizar a recarga dos registradores. A existência dos dois registradores garante que a operação de leitura não será interrompida já que a recarga é realizada em paralelo.
A segunda versão inclui a possibilidade de leitura de qualquer valor entre 1 e 16 bits e foi implementada com o mesmo princípio dos dois registradores de 32 bits, porém com adaptações. Neste caso três máquinas de estado atuam em conjunto. A primeira controla as requisições de leitura do buffer, a segunda controla o procedimento de recarga do buffer enquanto uma terceira atua como intermediária para sincronizar os sinais de buffer vazio e buffer recarregado.
A Figura 3.4 apresenta a arquitetura do Stream Buffer enquanto as Figuras 3.5 e 3.6 apresentam os diagramas com o funcionamento das duas principais máquinas de estado. Note que os 16 bits iniciais do registrador 1 são replicados ao final para que a leitura de bits acima de 48 possam ser realizadas com até 16 bits de largura já contando com a próxima recarga do registrador 1.
Stream Buffer Reg 1 Reg 2 0 3132 63 64 80 Mux avs_address avs_write avs_writedata avs_read avs_readdata Interface Avalon Demux Controle bits_out (16 bits) bits_out_ready (1 bit) bits_request (5 bits) Figura 3.4: Diagrama da arquitetura do Stream Buffer
A Máquina de Estados 1 possui 5 estados sendo o primeiro, s0, o estado inicial no qual se aguarda a recarga caso os registradores estejam vazios. O controle de consumo dos bits é feito através de um ponteiro que é incrementado com o número de bits lidos a cada operação de leitura. Conforme pode ser observado na Figura 3.5, são 4 os casos em que a máquina permanece em s0 aguardando a recarda do buffer. Caso o buffer 1 esteja vazio, não se pode ler bits nas posições abaixo de 16, obviamente, e também não é possível acima de 47, pois caso a requisição seja de 16 bits para leitura, estes não estarão atualizados. Da mesma maneira, caso o buffer 2 não tenha sido carregado, não se podem ler bits entre 32 e 63 ou acima de 15 pelo mesmo motivo anterior. Portanto, o estado s0 verifica se o buffer está pronto para ser lido de acordo com o estado de recarga dos registradores e a posição do ponteiro.
A operação de leitura é realizada normalmente pelos estados s1 e s2. Em s1, o sinal de saída bit_ready é colocado em ’1’ e aguarda-se a requisição pelo sinal bit_request que
s0
buffer_1_vazio = '1' & ponteiro < 16 buffer_2_vazio = '1' & 15 < ponteiro < 32 buffer_2_vazio = '1' & 31 < ponteiro < 48 buffer_1_vazio = '1' & 47 < ponteiro < 64
ou, ou, ou, s1 s2 s3a s3b ponteiro > 31 buffer_2_vazio = '0' &, &, flag_side = '0'
{
{
ponteiro > 63 bit_request = 0 bit_request ≠ 0Máquina de Estados 1 - Controle das Requisições de Leitura
reset = '1'
Figura 3.5: Diagrama da Máquina de Estados 1 do Stream Buffer
indica inclusive quantos bits serão lidos. Em seguida passa-se para o estado s2 que aguarda o sinal de leitura, ou seja, bit_request = 0. Neste momento o ponteiro é incrementado e se retorna ao estado s0.
Os estados s3a e s3b são ativados quando o ponteiro atinge o final de um registrador. Um flag de recarga do mesmo é acionado.
s1a s1b s2 s3a s3b byte_avaliable = '0' buffer_2_vazio = '0' &,
{
byte_avaliable = '0' buffer_2_vazio = '0' &,}
buffer_1_vazio = '0' buffer_2_vazio = '0' byte_avaliable = '0' current_reg = '0' current_reg = '1'Máquina de Estados 2 - Controle das Recargas dos Registradores
reset = '1'
A Máquina de Estados 2 opera em paralelo verificando os flags de buffer vazio de cada registrador. O processo se inicia pelo estado s1a em que se aguarda a solicitação de recarga do registrador 1. Em seguida, entra-se no estado s2 no qual o pedido de recarga é feito e aguarda-se o retorno com os novos 32 bits do bitstream. De s2 se vai para s3b no caso do registrador 1 ter sido recarregado. O processo então se repete para o ciclo do registrador 2 em s1b, s2 e s3a.
A recarga dos registradores nesta implementação é feita pelo processador através do barramento uma vez que o arquivo de áudio está sendo lido da memória flash controlada pelo mesmo. Porém, a arquitetura está pronta caso outro mecanismo específico em hard- ware, por exemplo o Demux na arquitetura da TV Digital esteja pronto para fornecer o bitstream.
O controle de sincronia entre as Máquinas 1 e 2 é realizado por duas outras máqui- nas simples com 2 estados cada. O papel destas é acionar os flags buffer_1_vazio e buffer_2_vazio logo após a passagem da Máquina 1 pelos estados s3a ou s3b respectiva- mente. Em seguida, ao receber o sinal de buffer_recarregado 1 ou 2, o flag do registrador respectivo é colocado em 0.
A Tabela 3.8 apresenta os resultados da síntese em FPGA com o uso de hardware do Módulo.
Tabela 3.8: Utilização de Hardware do Stream Buffer
Versão Elementos Lógicos Memória (bits) Multiplicadores Dedicados (9x9-bit) 1 bit 112 0 - 1 a 16 bits 509 0 -