Dissecando a ULA do TK90X - Parte 3



HBlank, Hsync e Burstgate


Como vimos rapidamente na parte 1 deste artigo, cada linha da tela é formada por 456 pulsos de clock a 7Mhz no contador horizontal.


Apesar da imagem ser formada por 40 pixels da borda esquerda, 256 pixels de miolo e 64 pixels da borda direita, o que daria apenas 360 pulsos, temos 96 pulsos "extras" que seriam o tempo que os aparelhos de tvs antigos de CRT precisavam para reposicionar o canhão de elétrons para o começo da nova linha, o HBlank (Horizontal Blanking). Dentro do período de HBlank também ocorre o sinal de sincronismo horizontal, o HSync que avisa a TV que aquela linha chegou ao fim. O último sinal que deste bloco é o Burstgate que ocorre logo após o HSync e marca o inicio e o fim do color burst. Esse sinal é necessário para o correto funcionamento do LM1886, externo à ULA, que é responsável por mixar as cores e gerar o sinal de video analógico.

A "pegadinha" da formação da imagem é que o contador horizontal tem como "zero" o primeixo pixel do "miolo", não a borda esquerda. Para fins didáticos os contadores formam a tela como na imagem abaixo, mas na prática o que vemos é uma imagem contínua, então do ponto de vista do usuário em frente a uma tv, não importa de onde ela começou.


No momento vocês devem estar se perguntando: - Se o contador começa já dentro do miolo, por que eu não vejo a imagem deslocada na tela?
A imagem sempre vai estar perfeita na tela, porque os sinais de sincronismo são emitidos dentro do ciclo de cada contador, nos tempos corretos. Desse modo o monitor sabe onde começa a linha "física" na tela, apesar da linha "lógica" já ter começado a muito tempo. Utilizei a imagem abaixo para exemplificar o que acontece.


Colocando as informações numa pequena tabela, temos os seguintes ciclos no contador horizontal:

DescriçãoInícioFim
Miolo0255
Borda Direita256319
HBlank320415
HSync340371
Burstgate372403
Borda Esquerda416455
Reset do contador455456


Então, o que precisamos para essa parte toda é de selecionar três faixas de valores a partir do contador horizontal. Isso em VHDL, é simplíssimo:

     
    -- HBlank - Periodo entre uma linha e outra. Nas TVs antigas era o tempo necessario para reposicionar o feixe de eletrons no começo da nova linha.
    -- Tem duracao de 96 ciclos de clock (13,2us)
    process( clk7 )
    begin        
        if falling_edge( clk7 ) then

            if ( hc = 320 ) then
            
                HBlank_n <= '0';
                
            elsif ( hc = 416 ) then
            
                HBlank_n <= '1';
                
            end if;

        end if;
    end process;

    -- HSync - Ocorre dentro do HBlank e informa o comeco de uma nova linha
    -- Tem duracao de 32 ciclos (4,4us)
    process( clk7 )
    begin
        if falling_edge( clk7 ) then

            if ( hc = 340 ) then
            
                HSync_n <= '0';
                
            elsif ( hc = 372 ) then
            
                HSync_n <= '1';
                
            end if;

        end if;
    end process;

    -- Burstgate - Ocorre logo após o HSync
    -- Tem duracao de 32 ciclos (4,4us)
    process( clk7 )
    begin        
        if falling_edge( clk7 ) then

            if ( hc = 372 ) then
            
                burst <= '1';
                
            elsif ( hc = 404 ) then
            
                burst <= '0';
                
            end if;

        end if;
    end process;

Não poderia ser mais fácil, certo? HBlank começa no pulso 320 e vai até o 416 (os 96 pulsos que falamos anteriormente). Dentro disso temos o HSync de 340 a 372 e o Burstgate de 372 a 404.

No esquema apesar de ser exatamente igual, temos uma lógica um pouco mais complicada.


Os valores que precisamos testar estão todos na faixa de 320 (101000000b) a 416 (110100000b). Note que neste caso precisamos testar SOMENTE os bits de 8 a 5, já que os bits 4 a 0 são zerados e, indo além, o bit 8 do contador precisa estar setado. Então, em U5 temos um demultiplexador três para oito, o que significa que com três entradas (hc7 a hc5) selecionamos uma das oito saídas.

Logo, as portas A, B e C do NAND U12, um 74hc00, selecionam justamente qualquer valor entre a segunda até a quinta saída de U5, quando o hc8 for um. Traduzindo em binário, 101000000b (320) a 11010000b (416), e dai temos o HBlank.

Já para o HSync, temos o primeiro flip-flop (daqui pra frente chamarei de FF) de U8, um 74hc74, onde hc8 vai na porta set. Em termos práticos, um FF funciona como uma memória de um bit, guardando o estado das saídas até a próxima mudança nas suas entradas. Como hc8 está no set e ele sendo zero, a saída invertida do FF, onde está ligado o HSync, fica em nível baixo, independente do que está na entrada. Se hc8 for um e hc4 e hc2 combinados pela NAND U4 forem um, o FF pega e armazena o estado da segunda saída de U5. Ela fica em nivel baixo quando hc7 a hc5 forem "010", então, trocando em miúdos quando temos o contador horizontal com 101010100b (340) armazenaremos o nivel baixo até quando que as mesmas condições sejam atendidadas, o que ocorre quando hc7 a hc5 mudam para "011", logo 101110100b (372), selecionando a terceira entrada em nivel baixo, fazendo com que a segunda entrada passe para nivel alto novamente. O resumão da coisa toda é que teremos "1" no HSync quando o contador estiver de 340 a 371 e "0" a qualquer outro valor do contador horizontal.

Analogamente, o Burstgate tem exatamente a mesma explicação acima, porém levando em conta a saída três do demultiplexador. Então, 101110100b (372) para o começo do Burstgate e 110010100b (404) para o fim.

Voltar para o índice




Dúvidas, sugestões? Use o espaço abaixo.


Voltar - Home


Comente



COMENTÁRIOS DESABILITADOS NO MOMENTO! RETORNAM EM BREVE
É expressamente proibido a reprodução total ou parcial deste texto sem a minha devida autorização por escrito.