首页->【FPGA入门】

962 5

首先感谢aet和木头先生(以下简称木头老大)的活动,让我们以一个较低的价格买到这款板子。

//////~~~~~~~~~~~~华丽丽的灰割线~~~~~~~~~~//////

板子图片:


还有一个充电器没有照全,板子整体供电5V


 

 

//第一次写这种东西,不对之处还请指出。

 

今天收到板子,想迅速的测试一下,LZ苦逼的发现没有光盘,又跟木头老大要的tcl脚本,首先测试VGA,新手最喜欢的东西吧。神马流水灯自行八度解决吧。

这款板子的原理图:


         这部分介绍详见Crazybingo的《VGA接口电阻网络匹配》一文。讲的比我好。

 

         最基本的驱动原理目前请详见特权同学《深入浅出玩转fpga》一书中有关介绍,或进入

FPGA/CPLD助学小组http://group.chinaaet.com/273  查看。

 

到这里就有好多童鞋问了,要你干么。、、、、由于LZ最近比较忙,以后打算写一篇高质量的VGA驱动博文,讲各种原理和代码。还在构思中,故还请大家期待。

 

代码:

由于没有7123等芯片驱动,故移植LZ手中的DE0板子的代码,显示效果是特权的矩形框。现将代码附在下面

module VGA

(

    input CLOCK_50,

    input rst_n,

    output VGA_HS,

    output VGA_VS,

    output reg  VGA_R,

    output reg  VGA_G,

    output reg  VGA_B

);

/////////////////////////////////////////////////////////////////800*600@72Hz  50MHz

//===========================================================================

// PARAMETER declarations

//===========================================================================

//Horizontal    Parameter

parameter    H_FRONT    =    56;   //前沿

parameter    H_SYNC    =    120;  // 帧同步脉冲

parameter    H_BACK    =    160;  //后沿

parameter    H_ACT    =    800;  // 显示脉冲

parameter    H_VALID    =    H_FRONT+H_SYNC;  //

parameter    H_TOTAL    =    H_FRONT+H_SYNC+H_BACK+H_ACT;  //帧长

//    Vertical Parameter

parameter    V_FRONT    =    37;

parameter    V_SYNC    =    6;

parameter    V_BACK    =    23;

parameter    V_ACT    =    600;

parameter    V_VALID    =    V_FRONT+V_SYNC;

parameter    V_TOTAL    =    V_FRONT+V_SYNC+V_BACK+V_ACT;

//===============================================================================

/* 

/////////////////////////////////////////////////////////////////800*600@72Hz  50MHz

//===========================================================================

// PARAMETER declarations

//===========================================================================

//Horizontal    Parameter

parameter    H_FRONT    =    56;   //qian yan

parameter    H_SYNC    =    120;  // tong bu mai chong

parameter    H_BACK    =    160;  //hou yan

parameter    H_ACT    =    800;  // xian shi mai chong

parameter    H_VALID    =    H_FRONT+H_SYNC;  //

parameter    H_TOTAL    =    H_FRONT+H_SYNC+H_BACK+H_ACT;  //zhen chang

 

//    Vertical Parameter

parameter    V_FRONT    =    37;

parameter    V_SYNC    =    6;

parameter    V_BACK    =    23;

parameter    V_ACT    =    600;

parameter    V_VALID    =    V_FRONT+V_SYNC;

parameter    V_TOTAL    =    V_FRONT+V_SYNC+V_BACK+V_ACT;

//===============================================================================

 

wire CLK_65;

 

PLL    PLL_inst (

    .inclk0 ( CLOCK_50 ),

    .c0 ( CLK_65 )

    );

 

assign clk = CLK_65;

*/

assign clk = CLOCK_50;

//--------------------------------------------------

reg[10:0] x_cnt;    //行坐标

reg[10:0] y_cnt;   

 

always @ (posedge clk or negedge rst_n)

    if(!rst_n) x_cnt <= 11'd0;

    else if(x_cnt == H_TOTAL-1) x_cnt <= 11'd0;

    else x_cnt <= x_cnt+1'b1;

 

always @ (posedge clk or negedge rst_n)

    if(!rst_n) y_cnt <= 10'd0;

    else if(y_cnt == V_TOTAL-1) y_cnt <= 10'd0;

    else if(x_cnt == H_TOTAL-1) y_cnt <= y_cnt+1'b1;

 

//--------------------------------------------------

wire valid;    //youxiao xianshiqu biaozhi

 

assign valid = (x_cnt >= H_VALID) && (x_cnt <= H_VALID+H_ACT)

            && (y_cnt >= V_VALID) && (y_cnt <= V_VALID+V_ACT);

 

wire[9:0] xpos,ypos;    //you xiao xian shi qu zuo biao

 

assign xpos = x_cnt-H_VALID;

assign ypos = y_cnt-V_VALID;

 

//--------------------------------------------------

reg hsync_r,vsync_r;    //tong bu xin hao chansheng

 

always @ (posedge clk or negedge rst_n)

    if(!rst_n) hsync_r <= 1'b1;

    else if(x_cnt == 0) hsync_r <= 1'b0;    //产生 hsync

    else if(x_cnt == H_SYNC-1) hsync_r <= 1'b1;

 

always @ (posedge clk or negedge rst_n)

    if(!rst_n) vsync_r <= 1'b1;

    else if(y_cnt == 0) vsync_r <= 1'b0;    //产生 vsync

    else if(y_cnt == V_SYNC-1) vsync_r <= 1'b1;

 

assign VGA_HS = hsync_r;

assign VGA_VS = vsync_r;

 

//--------------------------------------------------

    //显示部分

wire a_dis,b_dis,c_dis,d_dis;  

 

assign a_dis = ( (xpos>=200) && (xpos<=220) )

                &&    ( (ypos>=140) && (ypos<=460) );

               

assign b_dis = ( (xpos>=580) && (xpos<=600) )

                && ( (ypos>=140) && (ypos<=460) );

 

assign c_dis = ( (xpos>=220) && (xpos<=580) )

                &&    ( (ypos>140)  && (ypos<=160) );

               

assign d_dis = ( (xpos>=220) && (xpos<=580) )

                && ( (ypos>=440) && (ypos<=460) );

 

    //xianjuxing

wire e_rdy;    //xiaojuxing youxiaoquyu

 

assign e_rdy =(xpos>=385)&&(xpos<=415)&&(ypos>=285)&&(ypos<=315);

 

 

//--------------------------------------------------

 

always @ (posedge clk or negedge rst_n)

    if(!rst_n)

        {VGA_R,VGA_G,VGA_B} <= 12'd0;

    else if(valid)

        begin

            VGA_R <= {4{e_rdy}};

            VGA_G <= {4{(a_dis | b_dis | c_dis | d_dis)}};

            VGA_B <= ~{4{(a_dis | b_dis | c_dis | d_dis)}};

 

        end

    else

        {VGA_R,VGA_G,VGA_B} <= 12'd0;

 

endmodule

 

最终图片:800*600@72Hz 50MHZ显示图片

 

 

 

1368*768@60Hz85,85.86MHZ(使用PLL)显示图片

 

不好意思,移植出错。Error: Can't implement PLL "PLL:PLL_inst|altpll:altpll_component|pll" as Cyclone II PLL type

         Error: Can't implement clock multiplication and clock division parameter values for PLL "PLL:PLL_inst|altpll:altpll_component|pll"

                   Error: Can't implement PLL because Division and Multiplication cannot be achieved

         Warning: Can't achieve requested value multiplication of 10647 for clock output PLL:PLL_inst|altpll:altpll_component|_clk0 of parameter multiplication factor -- achieved value of multiplication of 32

         Warning: Can't achieve requested value division of 5000 for clock output PLL:PLL_inst|altpll:altpll_component|_clk0 of parameter division factor -- achieved value of division of 15

         Info: Implementing clock multiplication of 32, clock division of 15, and phase shift of 0 degrees (0 ps) for PLL:PLL_inst|altpll:altpll_component|_clk0 port

 

修改为1024*768@60Hz  75Mhz没有错误 在更换了另一款III主芯片后没有报错,datasheet还没查看,查看后会给大家在说明一下。

 

 

 

由于显示器采用硬件刷新频率,不能自行修改,会出现右边缺少一部分。这部分大家有疑问咱再共同,我目前只能这么解释这个情况。欢迎交流

 

DE0 1440×900@60Hz 106.47MHZ显示图片



DE0 1024×768@70Hz 75MHZ显示图片


PS:由于代码简单,没有分模块编写。如果需要可以移植板子自带代码。由于板子只有两个PLL资源,中间注释部分是给那些需要更改显示频率的亲们用的,可以直接修改PLL和定义。

关于时序逻辑,可参考网址http://tinyvga.com/vga-timing 很详细,由于篇幅问题没有详细付出。 需要彩带或者其他显示可以直接修改显示部分。

Pin planer


Compilation repor


 

别忘了把不用的引脚配置三态。在LZ更改后D8灯仍然亮由于没有原理图还不能解释,等有了原理图再解释。

板子预留了SRAM焊接口,后期可根据需要焊接。

 

 

转载请注明出处:http://www.chinaaet.com/

 

谢谢大家,再次感谢aet和木头老大。


楼主可见

  1. 普莱斯队长 5#
    @木头同学

    ///////////////800*600@72Hz  50MHz

    代码注释里写了

  2. 普莱斯队长 4#
    @月光
    嗯,拿到手就开始测试了。
  3. 米客-显示驱动专家 3#
    引用:普莱斯队长 2013-04-28 22:55:49

     VGA的测试在小组里面有程序的哦,请看


    http://group.chinaaet.com/311/75114


    多多交流,互相学习,不错的初学者,


    由于显示器采用硬件刷新频率,不能自行修改,会出现右边缺少一部分。这个不知道你的信号驱动分辨率多大,与代码和硬件支持的主频有关


  4. 月光 2#
    都玩上啦
  5. 普莱斯队长 1#
    再次测试CII pll,确定不能输出输出83.46M