原创 TFT板子+Verilog代码+显示图片(纯逻辑) 好奇妙!!!

2013-4-28 08:31 3449 21 21 分类: FPGA/CPLD 文集: FPGA

 液晶显示图片:

 

20121213183.jpg
 
好奇妙的图片,这个图片是怎么来的,奥秘就在下面:
 
module TFT_HVGen(CLK,DCLK,LCDHS,LCDVS,LCDUD,LCDLR,LCDDITHB,LCDPWM,LCDR,LCDG,LCDB);
    input CLK54;
    output DCLK;
    output LCDHS;
    output LCDVS;
    output LCDUD;
    output LCDLR;
    output LCDDITHB;
    output LCDPWM;
    output[4:0] LCDR;
    output[5:0] LCDG;
    output[4:0] LCDB;
    
    reg DCLK;
    reg LCDHS;
    reg LCDVS;
    reg[9:0] hcnt;
    reg[8:0] vcnt;
    wire[18:0] LCDDATA;
    assign LCDDITHB = 1'b0;
    assign LCDPWM = 1'b0;
    assign LCDUD = 1'b0;
    assign LCDLR = 1'b1;
    
    always@(posedge CLK)
     begin
        DCLK <= ~DCLK ;
     end
    
     always@(posedge DCLK)
       begin
         if(hcnt == 10'd861)
               hcnt <= 10'd1;
         else
                hcnt <= hcnt + 1'b1;
                
         if(hcnt == 10'd815)
            begin
                if(vcnt < 9'd509)
                    vcnt <= vcnt + 9'd1;
                else
                    vcnt <= 9'd0;
            end
        end
        
      always@(posedge DCLK)
        begin
            if(hcnt == 10'd815)
                LCDHS <= 1'b0;
            if(hcnt == 10'd818)
                LCDHS <= 1'b1;
            if(vcnt == 9'd486)
                LCDVS <= 1'b0;
            if(vcnt == 9'd487)
                LCDVS <= 1'b1;
        end
        
    reg Hactive;
    reg Vactive;
    wire DE= Hactive&&Vactive;
    
        always@*
         begin
            if(hcnt <= 10'd799)
                Hactive <= 1'b1;
            else
                Hactive <= 1'b0;
         end
        
        always@*
         begin
            if(vcnt <= 10'd479)
                Vactive <= 1'b1;
            else
                Vactive <= 1'b0;
         end
        assign LCDDATA = hcnt*vcnt;
        assign {LCDR,LCDG,LCDB} = DE? LCDDATA[17:2] : 16'b0;
endmodule
   
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
上面一个问题被修正了Hactive Vactive 原来用时序DCLK逻辑判断,改成组合逻辑
要不然点会对不上,与2012/12/15日18:28分修正,之前下载代码的朋友请注意。
不过还有个问题大家兴趣可以自己试下,我就不说了,很多东西多要自己发现,手册也
不一定全对。
 
上面的  hcnt*vcnt  就是奥秘,吧 hcnt*vcnt 乘积赋值给像素点 就得到奇妙的图片,电子世界真是奇妙无穷啊,另外通过改变LCDDATA[16:1],LCDDATA[15:0]  会看到更细的。
 
 
20121214188.jpg
 
 
 
 
 
 
 
20121214189.jpg
 
 
 
20121214202.jpg
 
 
20121214200.jpg
 
 
20121214205.jpg
 
 
 
20121214194.jpg
 
 
 
 
 
20121214206.jpg
 
 
20121214208.jpg
 
20121214209.jpg
 
 
20121214211.jpg
 
 
20121214213.jpg
 
 
 
20121214214.jpg
 
 
 
20121214215.jpg
 
 
 
20121214216.jpg
 
 
 
 
20121213182.jpg
 
 
 
 
20121215218.jpg
 
 
 
 
最后来一张rotozoom 图片,算法是参考 fpga4fun网站上的
 
parameter ScreenWidth = 10'd800;
parameter ScreenHeight = 9'd480;
wire CounterXmaxed = (hcnt==ScreenWidth-1);
wire CounterYmaxed = (vcnt==ScreenHeight-1);

reg HSync, VSync;
always @(posedge DCLK)
begin
  HSync <= CounterXmaxed;
  VSync <= CounterYmaxed;
end

reg [15:0] X0, Y0, X1, Y1;

always @(posedge DCLK)
if(VSync)
begin
    X0 <= 0;
    Y0 <= 0;
    X1 <= 0;
    Y1 <= 0;
end
else
if(HSync)
begin
    X0 <= X1 - 100;
    Y0 <= Y1 + 400;
    X1 <= X1 - 100;
    Y1 <= Y1 + 400;
end
else
begin
    X0 <= X0 + 400;
    Y0 <= Y0 + 100;
end
 

 
20121217223.jpg
 
assign {LCDR,LCDG,LCDB} = (X0[15] ^ Y0[15]) ? 16'h5aab:16'h9534;
 
20121217225.jpg

     assign {LCDR,LCDG,LCDB} = (X0[15] ^ Y0[15]) ? 16'hffff:16'h0000;  
 
 
 
 
 

文章评论0条评论)

登录后参与讨论
我要评论
0
21
关闭 站长推荐上一条 /2 下一条