芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 7506|回复: 3

【设计实例】可配置的VGA通用驱动控制器,适配多种分辨率

[复制链接]
  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 422

    主题

    780

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    15848
    QQ
    发表于 2019-4-10 20:57:15 | 显示全部楼层 |阅读模式
    如果您还没有注册本论坛,将无法下载论坛中附件,但是注册论坛非常简单,使用微   信 扫码即可注册。
    也可以在小梅哥任意一个Q群内直接索取邀请码使用邀请码注册,小梅哥创建的任意一个群都可以。


    以前自己写过单独的VGA控制器和TFT屏控制器,那些都是分开写的,每个设备(4.3寸显示屏、5寸显示屏、VGA输出等),甚至每个分辨率都要单独写一个驱动模块,那样实用不方便,也不利于工程版本的管理,给自己的例程发布和更新带来了非常大的麻烦,因此小梅哥今天痛定思痛,采用条件编译的方式,设计了一个通用的驱动模块,该模块只需要在代码中选择不同的编译参数,就能够实现不同分辨率的时序输出。用起来非常方便。

    注意,每个分辨率对应的像素时钟频率是不一样的,因此需要针对不同的分辨率,给ClkDisp提供不同频率的时钟。每个分辨率对应的参数已经在条件编译的代码部分通过注释的方式提示了。
    ac620_vga_ctrl_gm7123.rar (79.79 KB, 下载次数: 616)


    1. module VGA_CTRL_test(
    2.         Clk,         //50MHZ时钟
    3.         Rst_n,
    4.         VGA_RGB,//TFT数据输出
    5.         VGA_HS,        //TFT行同步信号
    6.         VGA_VS,        //TFT场同步信号
    7.         VGA_BLK,                //VGA 场消隐信号
    8.         VGA_CLK                //VGA DAC输出时钟
    9. );

    10.         input Clk;
    11.         input Rst_n;
    12.         output [23:0]VGA_RGB;
    13.         output VGA_HS;
    14.         output VGA_VS;
    15.         output VGA_BLK;                //VGA 场消隐信号
    16.         output VGA_CLK;                //VGA DAC输出时钟
    17.         
    18.         reg [23:0]disp_data;
    19.         wire [11:0]hcount;
    20.         wire [11:0]vcount;
    21.         wire ClkDisp;
    22.         
    23.         vga_test_pll vga_test_pll(
    24.                 .inclk0(Clk),
    25.                 .c0(ClkDisp)
    26.         );
    27.         
    28.         disp_driver disp_driver(
    29.                 .ClkDisp(ClkDisp),
    30.                 .Rst_n(Rst_n),
    31.                 .Data(disp_data),
    32.                 .DataReq(),
    33.                 .H_Addr(hcount),
    34.                 .V_Addr(vcount),
    35.                 .Disp_HS(VGA_HS),
    36.                 .Disp_VS(VGA_VS),
    37.                 .Disp_Red(VGA_RGB[23:16]),
    38.                 .Disp_Green(VGA_RGB[15:8]),
    39.                 .Disp_Blue(VGA_RGB[7:0]),
    40.                 .Disp_DE(VGA_BLK),
    41.                 .Disp_PCLK(VGA_CLK)
    42.         );

    43. /*        
    44.         VGA_CTRL VGA_CTRL(
    45.                 .Clk25M(ClkDisp),        //系统输入时钟25MHZ
    46.                 .Rst_n(Rst_n),
    47.                 .data_in(disp_data),        //待显示数据
    48.                 .hcount(hcount),                //VGA行扫描计数器
    49.                 .vcount(vcount),                //VGA场扫描计数器
    50.                 .VGA_RGB(VGA_RGB),        //VGA数据输出
    51.                 .VGA_HS(VGA_HS),                //VGA行同步信号
    52.                 .VGA_VS(VGA_VS),                //VGA场同步信号
    53.                 .VGA_BLK(VGA_BLK),                //VGA 场消隐信号
    54.                 .VGA_CLK(VGA_CLK)        //VGA DAC输出时钟
    55.         );
    56. */
    57.         
    58. //定义颜色编码
    59. localparam
    60.         BLACK                = 24'h000000, //黑色
    61.         BLUE                = 24'h0000FF, //蓝色
    62.         RED                = 24'hFF0000, //红色
    63.         PURPPLE        = 24'hFF00FF, //紫色
    64.         GREEN                = 24'h00FF00, //绿色
    65.         CYAN                = 24'h00FFFF, //青色
    66.         YELLOW        = 24'hFFFF00, //黄色
    67.         WHITE                = 24'hFFFFFF; //白色
    68.         
    69. //定义每个像素块的默认显示颜色值
    70. localparam
    71.         R0_C0 = BLACK,        //第0行0列像素块
    72.         R0_C1 = BLUE,        //第0行1列像素块
    73.         R1_C0 = RED,        //第1行0列像素块
    74.         R1_C1 = PURPPLE,//第1行1列像素块
    75.         R2_C0 = GREEN,        //第2行0列像素块
    76.         R2_C1 = CYAN,        //第2行1列像素块
    77.         R3_C0 = YELLOW,        //第3行0列像素块
    78.         R3_C1 = WHITE;        //第3行1列像素块

    79.         wire R0_act = vcount >= 0 && vcount < 120;        //正在扫描第0行
    80.         wire R1_act = vcount >= 120 && vcount < 240;//正在扫描第1行
    81.         wire R2_act = vcount >= 240 && vcount < 360;//正在扫描第2行
    82.         wire R3_act = vcount >= 360 && vcount < 480;//正在扫描第3行
    83.         
    84.         wire C0_act = hcount >= 0 && hcount < 320; //正在扫描第0列
    85.         wire C1_act = hcount >= 320 && hcount < 640;//正在扫描第1列
    86.         
    87.         wire R0_C0_act = R0_act & C0_act;        //第0行0列像素块处于被扫描中标志信号
    88.         wire R0_C1_act = R0_act & C1_act;        //第0行1列像素块处于被扫描中标志信号
    89.         wire R1_C0_act = R1_act & C0_act;        //第1行0列像素块处于被扫描中标志信号
    90.         wire R1_C1_act = R1_act & C1_act;        //第1行1列像素块处于被扫描中标志信号
    91.         wire R2_C0_act = R2_act & C0_act;        //第2行0列像素块处于被扫描中标志信号
    92.         wire R2_C1_act = R2_act & C1_act;        //第2行1列像素块处于被扫描中标志信号
    93.         wire R3_C0_act = R3_act & C0_act;        //第3行0列像素块处于被扫描中标志信号
    94.         wire R3_C1_act = R3_act & C1_act;        //第3行1列像素块处于被扫描中标志信号
    95.         
    96.         always@(*)
    97.                 case({R3_C1_act,R3_C0_act,R2_C1_act,R2_C0_act,
    98.                                 R1_C1_act,R1_C0_act,R0_C1_act,R0_C0_act})
    99.                         8'b0000_0001:disp_data = R0_C0;
    100.                         8'b0000_0010:disp_data = R0_C1;
    101.                         8'b0000_0100:disp_data = R1_C0;
    102.                         8'b0000_1000:disp_data = R1_C1;
    103.                         8'b0001_0000:disp_data = R2_C0;
    104.                         8'b0010_0000:disp_data = R2_C1;
    105.                         8'b0100_0000:disp_data = R3_C0;
    106.                         8'b1000_0000:disp_data = R3_C1;
    107.                         default:disp_data = R1_C0;
    108.                 endcase
    109.                
    110. endmodule



    复制代码
    1. /*============================================================================
    2. *
    3. *  LOGIC CORE:          显示设备驱动模块               
    4. *  MODULE NAME:         disp_driver()
    5. *  COMPANY:             武汉芯路恒科技有限公司
    6. *                       [url]http://xiaomeige.taobao.com[/url]
    7. *        author:                                        小梅哥
    8. *        Website:                                        www.corecourse.cn
    9. *  REVISION HISTORY:  
    10. *
    11. *    Revision 1.0  04/10/2019     Description: Initial Release.
    12. *
    13. *  FUNCTIONAL DESCRIPTION:
    14. ===========================================================================*/
    15. `include "disp_parameter_cfg.v"

    16. module disp_driver(
    17.         ClkDisp,
    18.         Rst_n,
    19.         
    20.         Data,
    21.         DataReq,
    22.         
    23.         H_Addr,
    24.         V_Addr,
    25.         
    26.         Disp_HS,
    27.         Disp_VS,
    28.         Disp_Red,
    29.         Disp_Green,
    30.         Disp_Blue,
    31.         Disp_DE,
    32.         Disp_PCLK
    33. );

    34.         input ClkDisp;
    35.         input Rst_n;
    36.         input [`Red_Bits + `Green_Bits + `Blue_Bits - 1:0] Data;
    37.         output DataReq;
    38.         
    39.         output [11:0] H_Addr;
    40.         output [11:0] V_Addr;
    41.         
    42.         output reg Disp_HS;
    43.         output reg Disp_VS;

    44.         output reg [`Red_Bits - 1 :0]Disp_Red;
    45.         output reg [`Green_Bits - 1 :0]Disp_Green;
    46.         output reg [`Blue_Bits - 1 :0]Disp_Blue;
    47.         
    48.         output reg Disp_DE;
    49.         output Disp_PCLK;
    50.         
    51.         wire hcount_ov;
    52.         wire vcount_ov;
    53.                
    54.         //----------------内部寄存器定义----------------
    55.         reg [11:0] hcount_r;     //行扫描计数器
    56.         reg [11:0] vcount_r;     //场扫描计数器
    57.         
    58.         assign Disp_PCLK = ~ClkDisp;
    59.         assign DataReq = Disp_DE;
    60.         
    61.         parameter hdat_begin = `H_Sync_Time + `H_Back_Porch + `H_Left_Border - 1'b1;
    62.         parameter hdat_end = `H_Total_Time - `H_Right_Border - `H_Front_Porch - 1'b1;
    63.         
    64.         parameter vdat_begin        = `V_Sync_Time + `V_Back_Porch + `V_Top_Border - 1'b1;
    65.         parameter vdat_end = `V_Total_Time - `V_Bottom_Border - `V_Front_Porch - 1'b1;        
    66.         
    67.         assign H_Addr = Disp_DE?(hcount_r - hdat_begin):12'd0;
    68.         assign V_Addr = Disp_DE?(vcount_r - vdat_begin):12'd0;

    69.         //行扫描
    70.         assign hcount_ov = (hcount_r >= `H_Total_Time - 1);
    71.         
    72.         always@(posedge ClkDisp or negedge Rst_n)
    73.         if(!Rst_n)
    74.                 hcount_r <= 0;
    75.         else if(hcount_ov)
    76.                 hcount_r <= 0;
    77.         else
    78.                 hcount_r <= hcount_r + 1'b1;

    79.         //场扫描
    80.         assign vcount_ov = (vcount_r >= `V_Total_Time - 1);

    81.         always@(posedge ClkDisp or negedge Rst_n)
    82.         if(!Rst_n)
    83.                 vcount_r <= 0;
    84.         else if(hcount_ov) begin
    85.                 if(vcount_ov)
    86.                         vcount_r <= 0;
    87.                 else
    88.                         vcount_r <= vcount_r + 1'd1;
    89.         end
    90.         else
    91.                 vcount_r <= vcount_r;
    92.                
    93.         always@(posedge ClkDisp)
    94.                 Disp_DE <= ((hcount_r >= hdat_begin)&&(hcount_r < hdat_end))
    95.                                         &&((vcount_r >= vdat_begin)&&(vcount_r < vdat_end));
    96.         
    97.         always@(posedge ClkDisp)        begin                        
    98.                 Disp_HS <= (hcount_r > `H_Sync_Time - 1);
    99.                 Disp_VS <= (vcount_r > `V_Sync_Time - 1);
    100.                 {Disp_Red,Disp_Green,Disp_Blue} <= (Disp_DE)?Data:1'd0;
    101.         end
    102.                
    103. endmodule



    复制代码


    1. /*============================================================================
    2. *
    3. *  LOGIC CORE:          显示设备驱动硬件配置头文件        
    4. *  MODULE NAME:         disp_parameter_cfg()
    5. *  COMPANY:             武汉芯路恒科技有限公司
    6. *                       [url]http://xiaomeige.taobao.com[/url]
    7. *        author:                                        小梅哥
    8. *        Website:                                        www.corecourse.cn
    9. *  REVISION HISTORY:  
    10. *
    11. *    Revision 1.0  04/10/2019     Description: Initial Release.
    12. *
    13. *  FUNCTIONAL DESCRIPTION:
    14. ===========================================================================*/

    15. /*
    16. 使用时根据实际工作需求选择几个预定义参数就可以

    17. MODE_RGB888和MODE_RGB565两个参数二选一,用来决定驱动工作在16位模式还是24位模式
    18. 针对小梅哥提供的一系列显示设备,各个设备参数如下所述
    19.         4.3寸屏:16位色RGB565模式
    20.         5寸屏:16位色RGB565模式
    21.         GM7123模块使用24位色RGB888模式,

    22. Resolution_xxxx预定义用来决定显示设备分辨率,常见设备分辨率如下所述

    23. 4.3寸TFT显示屏:Resolution_480x272
    24. 5寸TFT显示屏:Resolution_800x480

    25. VGA常见分辨率:
    26.         Resolution_640x480
    27.         Resolution_800x600
    28.         Resolution_1024x768
    29.         Resolution_1280x720
    30.         Resolution_1920x1080
    31. */

    32. //以下两行预定义根据实际使用的模式,选择一个使能,另外一个使用注释的方式屏蔽

    33. `define MODE_RGB888
    34. //`define MODE_RGB565

    35. //以下7行预定义根据实际使用的分辨率,选择一个使能,另外6个使用注释的方式屏蔽

    36. //`define Resolution_480x272 1        //时钟为9MHz
    37. `define Resolution_640x480 1        //时钟为25.175MHz
    38. //`define Resolution_800x480 1        //时钟为33MHz
    39. //`define Resolution_800x600 1        //时钟为40MHz
    40. //`define Resolution_1024x768 1        //时钟为65MHz
    41. //`define Resolution_1280x720 1        //时钟为74.25MHz
    42. //`define Resolution_1920x1080 1        //时钟为148.5MHz

    43. //定义不同的颜色深度
    44. `ifdef MODE_RGB888
    45.         `define Red_Bits 8
    46.         `define Green_Bits 8
    47.         `define Blue_Bits 8
    48.         
    49. `elsif MODE_RGB565
    50.         `define Red_Bits 5
    51.         `define Green_Bits 6
    52.         `define Blue_Bits 5
    53. `endif

    54. //定义不同分辨率的时序参数
    55. `ifdef Resolution_480x272
    56.         `define H_Total_Time  12'd525
    57.         `define H_Right_Border  12'd0
    58.         `define H_Front_Porch  12'd2
    59.         `define H_Sync_Time  12'd41
    60.         `define H_Back_Porch  12'd2
    61.         `define H_Left_Border  12'd0

    62.         `define V_Total_Time  12'd286
    63.         `define V_Bottom_Border  12'd0
    64.         `define V_Front_Porch  12'd2
    65.         `define V_Sync_Time  12'd10
    66.         `define V_Back_Porch  12'd2
    67.         `define V_Top_Border  12'd0
    68.         
    69. `elsif Resolution_640x480
    70.         `define H_Total_Time  12'd800
    71.         `define H_Right_Border  12'd8
    72.         `define H_Front_Porch  12'd8
    73.         `define H_Sync_Time  12'd96
    74.         `define H_Back_Porch  12'd40
    75.         `define H_Left_Border  12'd8

    76.         `define V_Total_Time  12'd525
    77.         `define V_Bottom_Border  12'd8
    78.         `define V_Front_Porch  12'd2
    79.         `define V_Sync_Time  12'd2
    80.         `define V_Back_Porch  12'd25
    81.         `define V_Top_Border  12'd8

    82. `elsif Resolution_800x480
    83.         `define H_Total_Time 12'd1056
    84.         `define H_Right_Border 12'd0
    85.         `define H_Front_Porch 12'd40
    86.         `define H_Sync_Time 12'd128
    87.         `define H_Back_Porch 12'd88
    88.         `define H_Left_Border 12'd0

    89.         `define V_Total_Time 12'd525
    90.         `define V_Bottom_Border 12'd8
    91.         `define V_Front_Porch 12'd2
    92.         `define V_Sync_Time 12'd2
    93.         `define V_Back_Porch 12'd25
    94.         `define V_Top_Border 12'd8

    95. `elsif Resolution_800x600
    96.         `define H_Total_Time 12'd1056
    97.         `define H_Right_Border 12'd0
    98.         `define H_Front_Porch 12'd40
    99.         `define H_Sync_Time 12'd128
    100.         `define H_Back_Porch 12'd88
    101.         `define H_Left_Border 12'd0

    102.         `define V_Total_Time 12'd628
    103.         `define V_Bottom_Border 12'd0
    104.         `define V_Front_Porch 12'd1
    105.         `define V_Sync_Time 12'd4
    106.         `define V_Back_Porch 12'd23
    107.         `define V_Top_Border 12'd0

    108. `elsif Resolution_1024x768
    109.         `define H_Total_Time 12'd1344
    110.         `define H_Right_Border 12'd0
    111.         `define H_Front_Porch 12'd24
    112.         `define H_Sync_Time 12'd136
    113.         `define H_Back_Porch 12'd160
    114.         `define H_Left_Border 12'd0

    115.         `define V_Total_Time 12'd806
    116.         `define V_Bottom_Border 12'd0
    117.         `define V_Front_Porch 12'd3
    118.         `define V_Sync_Time 12'd6
    119.         `define V_Back_Porch 12'd29
    120.         `define V_Top_Border 12'd0

    121. `elsif Resolution_1280x720
    122.         `define H_Total_Time 12'd1650
    123.         `define H_Right_Border 12'd0
    124.         `define H_Front_Porch 12'd110
    125.         `define H_Sync_Time 12'd40
    126.         `define H_Back_Porch 12'd220
    127.         `define H_Left_Border 12'd0

    128.         `define V_Total_Time 12'd750
    129.         `define V_Bottom_Border 12'd0
    130.         `define V_Front_Porch 12'd5
    131.         `define V_Sync_Time 12'd5
    132.         `define V_Back_Porch 12'd20
    133.         `define V_Top_Border 12'd0
    134.                
    135. `elsif Resolution_1920x1080
    136.         `define H_Total_Time 12'd2200
    137.         `define H_Right_Border 12'd0
    138.         `define H_Front_Porch 12'd88
    139.         `define H_Sync_Time 12'd44
    140.         `define H_Back_Porch 12'd148
    141.         `define H_Left_Border 12'd0

    142.         `define V_Total_Time 12'd1125
    143.         `define V_Bottom_Border 12'd0
    144.         `define V_Front_Porch 12'd4
    145.         `define V_Sync_Time 12'd5
    146.         `define V_Back_Porch 12'd36
    147.         `define V_Top_Border 12'd0        
    148.         
    149. `endif


    复制代码




    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-12-27 12:38
  • 0

    主题

    3

    帖子

    23

    积分

    新手上路

    Rank: 2

    积分
    23
    发表于 2019-4-15 10:03:26 | 显示全部楼层
    很好,最近正在学这个,项目上正要使用
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    7

    积分

    新手入门

    Rank: 1

    积分
    7
    发表于 2019-10-11 13:45:59 | 显示全部楼层
    请问安装VGA控制器后,就能跑桌面系统了吗,可以运行QT界面吧,谢谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-7-19 10:26
  • 0

    主题

    3

    帖子

    25

    积分

    新手上路

    Rank: 2

    积分
    25
    发表于 2020-3-15 13:48:02 | 显示全部楼层
    给梅哥点赞在做摄像头相关实验
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-4-20 13:57 , Processed in 0.122356 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表