rcakto escreveu:em resumo nao entendi nada, entao so vou precisar ter 3 DAC de 10bits para funcionar?? mais nada???
entao pq todo mundo fala que é um porre trabalhar com video?? e o tal do buffer??
depende do que vc vai querer.
pode ser simples o suficiente para fazer com um AVR e pode ser complexo o suficiente para precisar de uma FPGA. se vc quiser algo simples, entao um AVR resolve o seu problema:
http://www.atmel.com/dyn/resources/prod ... 3_3_04.pdf
mas eh uma resolucao pequena.
na verdade as especificacoes do VGA indicam que a resolucao minima seria de 640x480 pixels e isso jah requer um pixel clock de 25MHz. se vc estiver pensando em 256 cores, entao estamos falando em 25MB/s de bandwidth e um buffer de 307KB, o que tira praticamente todos os microcontroladores com memoria ram interna da jogada.
partindo entao do pressuposto que vc tem memoria externa, um canal de DMA atende bem estes requisitos minimos. porem pensar em resolucoes mais altas eh complicado, pq o video vai roubar bandwidth do processador. no caso de 1280x1024 em 85Hz, vc precisaria de 135MB/s de bandwidth para o video. mas vamos supor que 640x480 tah bom para vc hehehe
bom, o controlador de DMA pode transferir os dados, porem vc precisa gerar a temporizacao e processar os dados. para gerar temporizacao vc pode usar essa modeline do X11:
ModeLine "640x480" 25.175 640 656 752 800 480 490 492 525 -hsync -vsync
isso ae indica um pixel clock de 25.175MHz e a temporizacao derivada eh de 800 pixels por linha e 525 linhas por frame, o que resulta em varredura horizontal de 31.5kHz e varredura vertical de 60Hz.
vc teria dois timers com diversas tomadas de tempo. se o microcontrolador tiver circuito de video, vc jah tem essa funcionalidade disponivel, senao precisaria usar timers. mas eh complicado pensar nisso em termos de timer de microcontrolador e uma CPLD ou FPGA seria melhor. chutando ae um codigo em verilog, acho que seria algo como:
- Código: Selecionar todos
always@(posedge PXCLK)
begin
if(HCNT==799)
HCNT <= 0;
else
HCNT <= HCNT+1;
case(HCNT)
0: HDMARQ <= 1;
639: HDMARQ <=0;
655: HSYNC<=1;
751: HSYNC<=0;
endcase
end
always@(posedge HSYNC)
begin
if(VCNT==524)
HCNT <= 0;
else
VCNT <= VCNT+1;
case(VCNT)
0: VDMARQ <= 1;
479: VDMARQ <=0;
489: VSYNC<=1;
491: VSYNC<=0;
endcase
end
assign DMARQ = HDMARQ && VDMARQ;
assign BLANK = HSYNC&&VSYNC;
assim vc tem DMARQ ativo na area de 640x480 do frame e sinais de BLANK, HSYNC e VSYNC. feito isso, ainda precisa tratar os dados. provavelmente o DMA vai entregar uma largura de 16 ou 32 bits, o que precisa compensar nos timers acima. nisso estou pensando em DMA por edge, o que significa que a cada pulso ele transfere 640 pixels para um buffer. no caso de uma FPGA, vc teria uma FIFO de 640 pixels que entram com largura de 16 ou 32 bits e saem cadenciados byte a byte a 25MHz.
se nao tiver uma FPGA, tem que dar uma melhorada nisso e puxar 16 ou 32 bits para 2 ou 4 latches e sequenciar no braco. e daih entao vai para o DAC de video. como eh 256 cores, provavelmente vc vai passar por uma paleta de 8 para 18 bits e daih para DACs separados de 6 bits cada. ou vc pode usar um padrao RGB332, onde tem DACs de 3, 3 e 2 bits diretamente.
bom, se o microcontrolador tiver controlador de video integrado e suporte para memoria externa, os problemas praticamente desaparecem. mas daih pode faltar flexibilidade, por exemplo, para trabalhar com multiplos planos, janelamento, aceleracao grafica, etc.