여전히 화면은 안나오지만 일단 modelsim에서 패턴은 대충 확인했으니

이제 맞춰나가면 될 듯..

module vga640x480(

input clk,

input rst,

output [7:0] LED,

output hsync,

output vsync,

output [3:0] r,

output [3:0] g,

output [3:0] b

);


parameter HSYNC = 190;

parameter HBP = (190 + 96);

parameter HVID = (190 + 96 + 1271);

parameter HFP = (190 + 96 + 1271 + 32);

parameter HTOTAL = 1589;


parameter VSYNC = 3200;

parameter VBP = (3200 + 52400);

parameter VVID = (3200 + 52400 + 762650);

parameter VFP = (3200 + 52400 + 762650 + 15900);

parameter VTOTAL = 834150;


reg [19:0] cnt;


always @ (posedge clk or negedge rst)

begin

if (~rst)

cnt <= 0;

else

begin

if(cnt < VTOTAL) cnt <= cnt + 1;

else cnt <= 0;

end

end


assign LED[0] = ~vsync;

assign LED[1] = ~hsync;

assign r[3:0] = (((VBP < cnt) && (cnt < VVID)) && ((HBP < (cnt % HTOTAL)) && ((cnt % HTOTAL) < HVID))) ? 4'b1111 : 4'b0000;

assign g[3:0] = (((VBP < cnt) && (cnt < VVID)) && ((HBP < (cnt % HTOTAL)) && ((cnt % HTOTAL) < HVID))) ? 4'b1111 : 4'b0000;

assign b[3:0] = (((VBP < cnt) && (cnt < VVID)) && ((HBP < (cnt % HTOTAL)) && ((cnt % HTOTAL) < HVID))) ? 4'b1111 : 4'b0000;

assign hsync = ((cnt % HTOTAL) < HSYNC)? 0 : 1;

assign vsync = ((cnt         ) < VSYNC)? 0 : 1;


endmodule 


다시 보니.. 비디오 출력 하는 부분에서 &&대신 & 쓰지 않나

조건식 비교 범위를 반대로 하지 않나(그러니 계속 0이지) 완전 난리 부르스. ㄷㄷ


타이밍이 잘못되었나.. 왜 안나올까...


Posted by 구차니

usec 단위로 했었는데.. Hysnc의 길이가 왜.. 3.77usec?

아무튼.. 다시 아래 문서대로 계산을 해보니 값이 좀 많이 다르게 나온다.

vga_640x480.xlsx

2018/06/05 - [모종의 음모/DE0-Nano VGA] - vga 640x480 실패중 그리고 800x600x60


---

VESA DMT 문서에 의하면(공식인지 모르겠지만)



흐음.. 여전히 안되네...

module vga640x480(

input clk,

input rst,

output [7:0] LED,

output hsync,

output vsync,

output [3:0] r,

output [3:0] g,

output [3:0] b

);


parameter HSYNC = 190;

parameter HBP = (190 + 96);

parameter HVID = (190 + 96 + 1271);

parameter HFP = (190 + 96 + 1271 + 32);

parameter HTOTAL = 1589;


parameter VSYNC = 3200;

parameter VBP = (3200 + 52400);

parameter VVID = (3200 + 52400 + 762650);

parameter VFP = (3200 + 52400 + 762650 + 15900);

parameter VTOTAL = 834150;


reg [19:0] cnt;


always @ (posedge clk or negedge rst)

begin

if (~rst)

begin

cnt <= 0;

end

else

begin

if(cnt < VTOTAL)

begin

cnt <= cnt + 1;

/*

if((cnt % HTOTAL) < HSYNC)

hsync <= 0;

else hsync <= 1;

if(cnt < VSYNC)

vsync <= 0;

else vsync <= 1;


if(vsync & hsync)

begin

r <= 4'b1111;

g <= 4'b1111;

b <= 4'b1111;

end

else

begin

r <= 4'b0000;

g <= 4'b0000;

b <= 4'b0000;

end

*/

end

else

cnt <= 0;

end

end


assign LED[0] = ~vsync;

assign LED[1] = ~hsync;

assign r[3:0] = ((VVID < cnt & VFP < cnt) & (HVID < (cnt % HTOTAL) && (cnt % HTOTAL) < HFP)) ? 4'b1111 : 4'b0000;

assign g[3:0] = ((VVID < cnt & VFP < cnt) & (HVID < (cnt % HTOTAL) && (cnt % HTOTAL) < HFP)) ? 4'b1111 : 4'b0000;

assign b[3:0] = ((VVID < cnt & VFP < cnt) & (HVID < (cnt % HTOTAL) && (cnt % HTOTAL) < HFP)) ? 4'b1111 : 4'b0000;

assign hsync = ((cnt % HTOTAL) < HSYNC)? 0 : 1;

assign vsync = ((cnt         ) < VSYNC)? 0 : 1;


endmodule 




Posted by 구차니

DE0-nano에 LemonLite RGB 보드 사용

모니터 마다 해상도 출력이 좀 다른데 머가 문제일까..

일단 눈을 띄우는데는 성공했으니 뭐가 문제인지는 좀 찾아 봐야 할 듯..



vga640x480 vga(

CLOCK_50,

KEY[0],

LED,

GP0[6],

GP0[5],

{GP0[16],GP0[19],GP0[18],GP0[21]},

{GP0[12],GP0[15],GP0[14],GP0[17]},

{GP0[8],GP0[9],GP0[10],GP0[13]}

); 


module vga640x480(

input clk,

input rst,

output [7:0] LED,

output reg hsync,

output reg vsync,

output [3:0] r,

output [3:0] g,

output [3:0] b

);


reg clk25;

reg [9:0] horizontal_counter;

reg [9:0] vertical_counter;


reg [9:0] X;

reg [9:0] Y;


wire [7:0] red;

wire [7:0] green;

wire [7:0] blue;


assign r[3:0] = ((horizontal_counter >= 144) 

&& (horizontal_counter < 784) 

&& (vertical_counter >=39)

&& (vertical_counter < 519)) ? red : 4'b000; 

assign g[3:0] = ((horizontal_counter >= 144) 

&& (horizontal_counter < 784) 

&& (vertical_counter >=39)

&& (vertical_counter < 519)) ? green : 4'b000; 

assign b[3:0] = ((horizontal_counter >= 144) 

&& (horizontal_counter < 784) 

&& (vertical_counter >=39)

&& (vertical_counter < 519)) ? blue : 4'b000; 

assign red =   ((horizontal_counter >= 144)&&(horizontal_counter < 344) ) ? 4'b1111 : 4'b0000;

assign green = ((horizontal_counter >= 344)&&(horizontal_counter < 544) ) ? 4'b1111 : 4'b0000;

assign blue =  ((horizontal_counter >= 544)&&(horizontal_counter < 784) ) ? 4'b1111 : 4'b0000;


always @(posedge clk)

begin


if (clk25 == 0)

begin

   clk25 <= 1;

end   

else

begin

clk25 <= 0;

   end

end



always @(posedge clk25)

begin

if ((horizontal_counter > 0) && (horizontal_counter < 97))// -- 96+1

begin

hsync <= 0;

end

else

begin

hsync <= 1;

end 

if ((vertical_counter > 0 ) && (vertical_counter < 3 )) //-- 2+1

begin

vsync <= 0;

end

else

begin

vsync <= 1;

end

horizontal_counter <= horizontal_counter+1;

    

if (horizontal_counter == 800) 

begin

vertical_counter <= vertical_counter+1;

horizontal_counter <= 0;

end

    

if (vertical_counter == 521)

begin

vertical_counter <= 0;

end

end



endmodule  

[링크 : https://github.com/pmezydlo/DE0-Nano-SOC-VGA/blob/master/vgaram.v]

Posted by 구차니

소스 코드 수정중인데 안나오네

vga640x480 vga(

CLOCK_50,

KEY[0],

LED,

GP0[6],

GP0[5],

{GP0[16],GP0[19],GP0[18],GP0[21]},

{GP0[12],GP0[15],GP0[14],GP0[17]},

{GP0[8],GP0[9],GP0[10],GP0[13]}

); 


module vga640x480(

input clk,

input rst,

output [7:0] LED,

output hsync,

output vsync,

output [3:0] r,

output [3:0] g,

output [3:0] b

);


parameter HSYNC = 189;

parameter HBP = (HSYNC + 95);

parameter HVID = (HBP + 1260);

parameter HFP = (HVID + 47);


parameter VSYNC = 3000;

parameter VBP = (VSYNC + 51000);

parameter VVID = (VBP + 762500);

parameter VFP = (VVID + 17500);


reg [19:0] cnt;


always @ (posedge clk or negedge rst)

begin

if (!rst)

begin

cnt <= 0;

end

else

begin

cnt <= cnt + 1;

if(cnt > 834000)

cnt <= 0;

end

end


assign hsync = ((cnt % 1590) < 189) ? 0 : 1;

assign vsync = (cnt < 3000) ? 0 : 1;

assign r = ((hsync & vsync) == 1 ? 4'b1111 : 4'b0000);

assign g = ((hsync & vsync) == 1 ? 4'b1111 : 4'b0000);

assign b = ((hsync & vsync) == 1 ? 4'b1111 : 4'b0000);

assign LED[0] = ~vsync;

assign LED[1] = ~hsync;


endmodule 


V sync는 59.95

H sync는 31.31kHz 이고


sync 길이도 파형도 맞는거 같은데..

Vsync 60us 근처

Hsync 4us 근처


왜 안될까...



+

module vga800x600x60(

input clk,

input rst,

output [7:0] LED,

output hsync,

output vsync,

output [3:0] r,

output [3:0] g,

output [3:0] b

);


parameter HSYNC = 160;

parameter HBP = (HSYNC + 95);

parameter HVID = (HBP + 1260);

parameter HFP = (HVID + 47);


parameter VSYNC = 5300;

parameter VBP = (VSYNC + 51000);

parameter VVID = (VBP + 762500);

parameter VFP = (VVID + 17500);


reg [19:0] cnt;


always @ (posedge clk or negedge rst)

begin

if (!rst)

begin

cnt <= 0;

end

else

begin

cnt <= cnt + 1;

if(cnt > 828950)

cnt <= 0;

end

end


assign hsync = ((cnt % 1320) < 160) ? 0 : 1;

assign vsync = (cnt < 5300) ? 0 : 1;

assign r = ((hsync & vsync) == 1 ? 4'b1111 : 4'b0000);

assign g = ((hsync & vsync) == 1 ? 4'b1111 : 4'b0000);

assign b = ((hsync & vsync) == 1 ? 4'b1111 : 4'b0000);

assign LED[0] = ~vsync;

assign LED[1] = ~hsync;


endmodule  



For VESA 800*600 @ 60Hz: 

Fh (kHz) :37.88 

A (us) :26.4 

B (us) :3.2 

C (us) :2.2 

D (us) :20.0 

E (us) :1.0 


Fv (Hz) :60.32 

O (ms) :16.579 

P (ms) :0.106 

Q (ms) :0.607 

R (ms) :15.84 

S (ms) :0.026 

[링크 : http://www.epanorama.net/documents/pc/vga_timing.html]


+

640x480x60 에 빨간화면 확인

vga640x480 vga(

CLOCK_50,

KEY[0],

LED,

GP0[6],

GP0[5],

{GP0[16],GP0[19],GP0[18],GP0[21]},

{GP0[12],GP0[15],GP0[14],GP0[17]},

{GP0[8],GP0[9],GP0[10],GP0[13]}

); 


모니터에 따라 인식이 느리거나 안되기도 하네..

848x640x60 으로 인식... 머야(요즘 24인치 FHD LCD 모니터)

module vga640x480(

input clk,

input rst,

output [7:0] LED,

output reg hsync,

output reg vsync,

output [3:0] r,

output [3:0] g,

output [3:0] b

);


reg clk25;

reg [9:0] horizontal_counter;

reg [9:0] vertical_counter;


reg [9:0] X;

reg [9:0] Y;


wire [7:0] red;

wire [7:0] green;

wire [7:0] blue;


assign r[3:0] = ((horizontal_counter >= 144) 

&& (horizontal_counter < 784) 

&& (vertical_counter >=39)

&& (vertical_counter < 519)) ? 4'b1111 : 4'b000; 

assign g[1:0] = ((horizontal_counter >= 144) 

&& (horizontal_counter < 784) 

&& (vertical_counter >=39)

&& (vertical_counter < 519)) ? 4'b1111 : 4'b000; 

assign b[2:0] = ((horizontal_counter >= 144) 

&& (horizontal_counter < 784) 

&& (vertical_counter >=39)

&& (vertical_counter < 519)) ? 4'b1111 : 4'b000; 

assign red =   ((horizontal_counter >= 144)&&(horizontal_counter < 344) ) ? 4'b1111 : 4'b0000;

assign green = ((horizontal_counter >= 344)&&(horizontal_counter < 544) ) ? 4'b1111 : 4'b0000;

assign blue =  ((horizontal_counter >= 544)&&(horizontal_counter < 784) ) ? 4'b1111 : 4'b0000;


always @(posedge clk)

begin


if (clk25 == 0)

begin

   clk25 <= 1;

end   

else

begin

clk25 <= 0;

   end

end



always @(posedge clk25)

begin

if ((horizontal_counter > 0) && (horizontal_counter < 97))// -- 96+1

begin

hsync <= 0;

end

else

begin

hsync <= 1;

end 

if ((vertical_counter > 0 ) && (vertical_counter < 3 )) //-- 2+1

begin

vsync <= 0;

end

else

begin

vsync <= 1;

end

horizontal_counter <= horizontal_counter+1;

    

if (horizontal_counter == 800) 

begin

vertical_counter <= vertical_counter+1;

horizontal_counter <= 0;

end

    

if (vertical_counter == 521)

begin

vertical_counter <= 0;

end

end

endmodule  


[링크 : https://github.com/pmezydlo/DE0-Nano-SOC-VGA/blob/master/vgaram.v]

Posted by 구차니

reset키(key[0])를 누르고있는 동안에는 영상이 나온다.

단순하게 posedge를 negedge로 바꾸려고 하는데 에러나네.. ㅠㅠ


빨강이 옆에 번지는건 왜일까..


800x600 72Hz 라고 출력된다.



vga_demo vga(

CLOCK_50,

KEY[0],

GP0[16],

GP0[12],

GP0[8],

GP0[6],

GP0[5],

); 


/*

VGA Demo 800x600 at 72Hz

http://www-mtl.mit.edu/Courses/6.111/labkit/vga.shtml

800x600, 72Hz 50.000 800 56 120 64 600 37 6 23

Pixel Clock (MHz): 50.000 

Horizontal (in Pixels)

    Active Video: 800 (16us)

    Front Porch:   56 (1.12us)

    Sync Pulse:   120 (2.4us)

    Back Porch:    64 (1.28us)

        Total pixel clock ticks: 1040 (20.8us)

Vertical (in Lines, so x20.8us)

    Active Video: 600 (12480us)

    Front Porch:   37 (769.6us)

    Sync Pulse:     6 (124.8us)

    Back Porch:    23 (478.4us)

        Total pixel clock ticks: 666 (13.32us)

Total pixel clock ticks: 692,640

50,000,000 / 692,640 = 72.187572188 = 72Hz

1 pixel clock = 1/50Mhz = 20ns = 0.02us

*/


module vga_demo

    (

        CLOCK_50,

        RESET,

        VGA_RED,

        VGA_GREEN,

        VGA_BLUE,

        VGA_HS,

        VGA_VS

    );

    input CLOCK_50;

    input RESET;

    output VGA_RED;

    output VGA_GREEN;

    output VGA_BLUE;

    output VGA_HS;

    output VGA_VS;


    /* Internal registers for horizontal signal timing */

    reg [10:0] hor_reg; // to count 1040 different values up to 1039

    reg hor_sync;

    wire hor_max = (hor_reg == 1039); // to tell when a line is full


    /* Internal registers for vertical signal timing */

    reg [9:0] ver_reg; // to count 666 different values up to 665

    reg ver_sync;

    reg red, green, blue;

    wire ver_max = (ver_reg == 665); // to tell when a line is full


    // Code


    

    /* Running through line */

    always @ (posedge CLOCK_50 or posedge RESET) begin


        if (RESET) begin 

            hor_reg <= 0;

            ver_reg <= 0;

        end

        else if (hor_max) begin

            hor_reg <= 0;


            /* Running through frame */

            if (ver_max)

                ver_reg <= 0;

            else

            ver_reg <= ver_reg + 1;


        end else

            hor_reg <= hor_reg + 1;


    end

    

    always @ (posedge CLOCK_50 or posedge RESET) begin

    

        if (RESET) begin 

            hor_sync <= 0;

            ver_sync <= 0;

        end

        else begin


            /* Generating the horizontal sync signal */

            if (hor_reg == 856)      // video (800) + front porch (56)

                hor_sync <= 1;       // turn on horizontal sync pulse

            else if (hor_reg == 976) // video (800) + front porch (56) + Sync Pulse (120)

                hor_sync <= 0;       // turn off horizontal sync pulse


            /* Generating the vertical sync signal */

            if (ver_reg == 637)      // LINES: video (600) +  front porch (37)

                ver_sync <= 1;       // turn on vertical sync pulse

            else if (ver_reg == 643) // LINES: video (600) + front porch (37) + Sync Pulse (6)

                ver_sync <= 0;       // turn off vertical sync pulse


                

            // Draw a single square.

            if (hor_reg >= 100 && hor_reg <= 200 && ver_reg >= 100 && ver_reg <= 200) begin

                red <= 1;

                green <= 0;

                blue <= 0;

            end 

            else begin

                red <= 1;

                green <= 1;

                blue <= 1;

            end

                

        end

    end


    // Send the sync signals to the output, inverted as the sync pulse is low.

    // Maybe wrong as this doc says pulse id positive http://tinyvga.com/vga-timing/800x600@72Hz

    assign VGA_HS = ~hor_sync;

    assign VGA_VS = ~ver_sync;

    

    // Send a pattern of colours (based on the registry bits) but do not output anything during the synchronization periods

    //assign VGA_RED = (!hor_reg[0] && !ver_reg[0] && ver_reg < 600 && hor_reg < 800);

    //assign VGA_GREEN = (!hor_reg[1] && !ver_reg[1] && ver_reg < 600 && hor_reg < 800);

    //assign VGA_BLUE = (!hor_reg[2] && !ver_reg[2] && ver_reg < 600 && hor_reg < 800);

    

    assign VGA_RED =  red && ver_reg < 600 && hor_reg < 800;

    assign VGA_GREEN = green && ver_reg < 600 && hor_reg < 800;

    assign VGA_BLUE = blue && ver_reg < 600 && hor_reg < 800;    

    

    // http://gerfficient.com/2013/02/11/fpga-to-vga-using-de0-nano/

    

endmodule 

[링크 : https://github.com/theapi/de0-nano/blob/master/vga/experiment/vga_demo.v]

Posted by 구차니

하다 보면 언젠간 언어도 익히고 작동도 하겠지머..

일단 sync만 인식을 하는지 절전모드였던 모니터가 살아나기는 하는데 해상도 정보까진 못 띄우네

DE0-nano에 시도중

vga640x480 vga(

CLOCK_50,

KEY[0],

LED,

GP0[6],

GP0[5],

{GP0[16],GP0[19],GP0[18],GP0[21]},

{GP0[12],GP0[15],GP0[14],GP0[17]},

{GP0[8],GP0[9],GP0[10],GP0[13]}

); 


module vga640x480(

input clk,

input rst,

output [7:0] LED,

output reg hsync,

output reg vsync,

output [3:0] r,

output [3:0] g,

output [3:0] b

);


parameter HSYNC = 189;

parameter HBP = (HSYNC + 95);

parameter HVID = (HBP + 1260);

parameter HFP = (HVID + 47);


parameter VSYNC = 3000;

parameter VBP = (VSYNC + 51000);

parameter VVID = (VBP + 762500);

parameter VFP = (VVID + 17500);


reg [19:0] cnt;


always @ (posedge clk or negedge rst)

begin

if (~rst)

cnt <= 0;

else

begin

if(cnt < 834000)

begin

cnt <= cnt + 1;

if((cnt % 1590) < HSYNC)

hsync <= 1;

else hsync <= 0;

if(cnt < VSYNC)

vsync <= 1;

else vsync <= 0;

end

else

cnt <= 0;

end

end


assign LED[0] = vsync;

assign LED[1] = hsync;


endmodule 


위의 수치는 아래의 계산에 의해서 나온 것 임.

vga_640x480.xlsx


+

parameter는 이전 값을 더해서 쓸수는 없는건가..

HFP를 이용해서 % 연산을 하면 정상적으로 작동하지 않는 것으로 보이네..



+

sync 구간에만 0이고 나머지는 1로 vsync/hsync 출력해야 하네?

[링크 : https://ws0.org/how-to-generate-a-vga-signal-with-a-fpga/]

[링크 : http://www.cs.ucr.edu/~jtarango/cs122a_lab4.html]

[링크 : https://www.nandland.com/goboard/vga-introduction-test-patterns.html]


+

단순하게 데이터만 출력한다고 나오는게 아닌가?

아무튼.. modelsim 쓰는법 배워서 출력 시그널 확인을 할 필요가 있을 듯...

module vga640x480(

input clk,

input rst,

output [7:0] LED,

output reg hsync,

output reg vsync,

output reg [3:0] r,

output reg [3:0] g,

output reg [3:0] b

);


parameter HSYNC = 189;

parameter HBP = (HSYNC + 95);

parameter HVID = (HBP + 1260);

parameter HFP = (HVID + 47);


parameter VSYNC = 3000;

parameter VBP = (VSYNC + 51000);

parameter VVID = (VBP + 762500);

parameter VFP = (VVID + 17500);


reg [19:0] cnt;


always @ (posedge clk or negedge rst)

begin

if (~rst)

begin

cnt <= 0;

hsync <= 1;

vsync <= 1;

end

else

begin

if(cnt < 834000)

begin

cnt <= cnt + 1;

if((cnt % 1590) < HSYNC)

hsync <= 0;

else hsync <= 1;

if(cnt < VSYNC)

vsync <= 0;

else vsync <= 1;

if(vsync & hsync)

begin

r <= 4'b1111;

g <= 4'b1111;

b <= 4'b1111;

end

else

begin

r <= 4'b0000;

g <= 4'b0000;

b <= 4'b0000;

end

end

else

cnt <= 0;

end

end


assign LED[0] = ~vsync;

assign LED[1] = ~hsync;


endmodule 


+

2018.06.04

하드웨어 구조는 모르겠지만 동일 셋트 예제 발견

[링크 : https://github.com/theapi/de0-nano/blob/master/vga/experiment/vga_demo.v]

Posted by 구차니

VGA Test Pattern Generator 만들기 준비중

일단 핀배열은 다음과 같고..


핀 배열상 어쩔수 없으니 Blue3는 포기(회로도 확인하니 두번째로 작은 비트)

그래서 GPIO1 번의 왼쪽에서 첫 핀은 빼고 연결하도록 일단 구상 중


회로는 공개할 수 없으니 비슷한거 검색해서 걸기!

[링크 : https://electronics.stackexchange.com/...-pattern-to-generate-vga-signal-with-micro-controller]

Posted by 구차니