VGA协议及VGA显示

一、VGA

1. 外部接口

在这里插入图片描述VGA并没有特殊的外部芯片,我们需要关注的其实只有5个信号:HS行同步信号,VS场同步信号,R红基色,G绿基色,B蓝基色
在这里插入图片描述

2. 色彩原理

在这里插入图片描述

  1. 设计RGB信号时,既可以R信号、G信号和B信号独立的赋值,最后连到端口上,也可以直接用RGB当做一个整体信号,RGB信号在使用时的位宽有三种常见格式,以你的VGA解码芯片的配置有关。
    1. RGB_8,R:G:B = 3:3:2,即RGB332
    2. RGB_16,R:G:B = 5:6:5,即RGB565
    3. RGB_24,R:G:B = 8:8:8,即RGB888

3. 扫描方式

在这里插入图片描述
  VGA显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。一般都采用逐行扫描的方式

  1. 逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;
  2. 当扫描完所有的行,形成一帧后,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。
    以下是vs 和 hs的时序简图。
    在这里插入图片描述
    管脚定义:
    在这里插入图片描述

二、彩色条纹显示

  1. VGA时钟使用,采用25.2M时钟进行操作,需要先进行时钟生成操作,通过Pll锁相环获取所需频率时钟25M
    1. 时钟设定
      在这里插入图片描述
    2. 存储位置修改
      在这里插入图片描述
    3. 设定基准时钟频率
      在这里插入图片描述
    4. lock out所存输出,可以勾选关闭
      在这里插入图片描述
    5. 保持默认操作,设定时钟输出,clk0,clk1,一基准50MHz,clk1输出为25MHz
      在这里插入图片描述
      在这里插入图片描述
    6. 默认操作,后勾选实例化模块,顶层进行时钟实例化,后续操作都需要25M时钟,不重复操作
      在这里插入图片描述
  2. 屏幕分辨率设定 640×480 与1920×720
`define vga_640_480

`ifdef vga_640_480
    `define H_Right_Border   8
    `define H_Front_Porch    8
    `define H_Sync_Time      96
    `define H_Back_Porch     40
    `define H_Left_Border    8
    `define H_Data_Time      640
    `define H_Total_Time     800

    `define V_Bottom_Border   8
    `define V_Front_Porch    2
    `define V_Sync_Time      2
    `define V_Back_Porch     25
    `define V_Top_Border     8
    `define V_Data_Time      480
    `define V_Total_Time     525


`elsif vga_1920_1080
    `define H_Right_Border    0
    `define H_Front_Porch    88
    `define H_Sync_Time      44
    `define H_Back_Porch     148
    `define H_Left_Border    0
    `define H_Data_Time      1920
    `define H_Total_Time     2200

    `define V_Bottom_Border   0
    `define V_Front_Porch    4
    `define V_Sync_Time      5
    `define V_Back_Porch     36
    `define V_Top_Border     0
    `define V_Data_Time      1080
    `define V_Total_Time     1125    
`endif
  1. VGA控制模块

`include "vga_param.v"
// `define vga_640_480
// `define vga_1920_1080
/**
 *
 * VGA控制模块
*/
module vga_ctrl(
    input   wire            clk         ,
    input   wire            rst_n       ,
    input   wire [23:0]     data_display,   // 要显示的数据

    output  reg [10:0]      h_addr      ,   // 行地址--数据有效显示区域行地址
    output  reg [10:0]      v_addr      ,   // 场地址--数据有效显示区域场地址
    
    output  reg             hsync       ,
    output  reg             vsync       ,
    output  reg [7:0]       vga_r       ,    // R
    output  reg [7:0]       vga_g       ,    // G
    output  reg [7:0]       vga_b       ,    // B
    // output  wire            vga_sync_n  ,
    output  reg             vga_black   ,
    output  wire            vga_clk          // 时钟
); 
    parameter           H_SYNC_START = 1;                        // 行同步开始
    parameter           H_SYNC_STOP  = `H_Sync_Time;         // 行同步结束
    parameter           H_DATA_START = `H_Sync_Time + `H_Back_Porch + `H_Left_Border; 
    parameter           H_DATA_STOP  = `H_Sync_Time + `H_Back_Porch + `H_Left_Border + `H_Data_Time;
    
    parameter           V_SYNC_START = 1;                        // 场同步开始
    parameter           V_SYNC_STOP  = `V_Sync_Time;         // 场同步结束
    parameter           V_DATA_START = `V_Sync_Time + `V_Back_Porch + `V_Top_Border; 
    parameter           V_DATA_STOP  = `V_Sync_Time + `V_Back_Porch + `V_Top_Border + `V_Data_Time;

    // parameter           V_BLANK      = `V_Total_Time;        //场空白信号总周期长
    // parameter           H_BLANK      = `H_Total_Time;        //场空白信号总周期长

    reg     [11:0]      cnt_h_addr;   // 行地址计数器
    wire                add_h_addr;
    wire                end_h_addr;

    reg     [11:0]      cnt_v_addr;   // 场地址计数器
    wire                add_v_addr;
    wire                end_v_addr;

// 行地址计数
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt_h_addr <= 12'd0;
        end

        else if (add_h_addr) begin
            if (end_h_addr)
                cnt_h_addr <= 12'd0;
            else
                cnt_h_addr <= cnt_h_addr + 1'b1;
        end
        else begin
            cnt_h_addr <= 12'd0;
        end
    end
    assign add_h_addr = 1'b1;
    assign end_h_addr = ((cnt_h_addr>=`H_Total_Time-1) && add_h_addr);


// 场地址计数
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt_v_addr <= 12'd0;
        end

        else if (add_v_addr) begin
            if (end_v_addr)
                cnt_v_addr <= 12'd0;
            else
                cnt_v_addr <= cnt_v_addr + 1'b1;
        end

        else begin
            cnt_v_addr <= cnt_v_addr;
        end
    end
    assign add_v_addr = end_h_addr;
    assign end_v_addr = ((cnt_v_addr>=`V_Total_Time-1) && add_v_addr);


    // always @(posedge clk or negedge rst_n) begin
    //     if (!rst_n) begin
    //     end
    //
    //     else if (add_v_addr) begin
    //     end
    //
    //     else begin
    //     end
    // end


    // assign vga_sync_n = 1'b0; //符合同步控制信号      行时序和场时序都要产生同步脉冲
    //assign vga_black  = ~((cnt_h_addr < H_BLANK) || (cnt_v_addr < V_BLANK));  //当行计数器小于行空白总长或场计数器小于场空白总长时,空白信号低电平


// 行同步信号  低有效
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            hsync <= 1'b1;
        end
    
        else if (cnt_h_addr == H_SYNC_START - 1) begin  // 行同步开始
            hsync <= 1'b0;
        end

        else if (cnt_h_addr == H_SYNC_STOP - 1) begin   // 行同步结束
            hsync <= 1'b1;
        end
    
        else begin
            hsync <= hsync;
        end
    end


// 场同步信号  低有效
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            vsync <= 1'b1;
        end
    
        else if (cnt_v_addr == V_SYNC_START - 1) begin
            vsync <= 1'b0;
        end

        else if (cnt_v_addr == V_SYNC_STOP - 1) begin
            vsync <= 1'b1;
        end
    
        else begin
            vsync <= vsync;
        end
    end
    assign vga_clk = clk;
// 数据有效显示区域定义
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            h_addr <= 11'd0;
        end
        else if ((cnt_h_addr >= (H_DATA_START - 1)) && (cnt_h_addr <= H_DATA_STOP)) begin
            h_addr <= cnt_h_addr - H_DATA_START - 1;  // 总的 减去 前面的多余部分
        end
    
        else begin
            h_addr <= 11'd0;
        end
    end
// 数据有效显示区域定义
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            v_addr <= 11'd0;
        end    
        else if ((cnt_v_addr >= (V_DATA_START - 1)) && (cnt_v_addr <= V_DATA_STOP)) begin
            v_addr <= cnt_v_addr - V_DATA_START - 1;
        end
    
        else begin
            v_addr <= 11'd0;
        end
    end

// 显示数据
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            vga_r <= 8'd0;
            vga_g <= 8'd0;
            vga_b <= 8'd0;
        end
    
        // 在显示数据范围内
        else if (  ((cnt_h_addr >= (H_DATA_START - 1)) && (cnt_h_addr <= H_DATA_STOP)) && 
                    ((cnt_v_addr >= (V_DATA_START - 1)) && (cnt_v_addr <= V_DATA_STOP))  ) begin
            vga_r <= data_display[23:16];
            vga_g <= data_display[15:8];
            vga_b <= data_display[7:0];
            vga_black <= 1'b1;
        end
    
        else begin
            vga_r <= 8'd0;
            vga_g <= 8'd0; 
            vga_b <= 8'd0;
            vga_black <= 1'b0;
        end
    end
endmodule
  1. 彩带生成
module data_generate(
    input   wire            clk         ,
    input   wire            rst_n       ,

    input   wire [10:0]     h_addr      ,   // 行地址--数据有效显示区域行地址
    input   wire [10:0]     v_addr      ,   // 场地址--数据有效显示区域场地址

    output  reg [23:0]      data_display   // 要显示的数据
);

    parameter 
        BLACK    = 24'h000000,
        RED      = 24'hFF0000,
        GREEN    = 24'h00FF00,
        BLUE     = 24'h0000FF,
        YELLOW   = 24'hFFFF00,
        CYANRAY  = 24'h00FFFF,
        PURPLE   = 24'hFF00FF,
        GRAY     = 24'hC0C0C0,
        WHITE    = 24'hFFFFFF;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            data_display <= WHITE;
        end

        else begin
            case (h_addr)
                0:          data_display <= BLACK  ;
                80:         data_display <= RED    ;
                160:        data_display <= GREEN  ;
                240:        data_display <= BLUE   ;
                320:        data_display <= YELLOW ;
                400:        data_display <= CYANRAY;
                480:        data_display <= PURPLE ;
                560:        data_display <= GRAY   ;
                default:    data_display <= data_display;
            endcase
        end
    end
endmodule

  1. 运行效果
    在这里插入图片描述

三、字符显示

module VGA_test(
OSC_50,     //原CLK2_50时钟信号
VGA_CLK,    //VGA自时钟
VGA_HS,     //行同步信号
VGA_VS,     //场同步信号
VGA_BLANK,  //复合空白信号控制信号  当BLANK为低电平时模拟视频输出消隐电平,此时从R9~R0,G9~G0,B9~B0输入的所有数据被忽略
VGA_SYNC,   //符合同步控制信号      行时序和场时序都要产生同步脉冲
VGA_R,      //VGA绿色
VGA_B,      //VGA蓝色
VGA_G);     //VGA绿色
 input OSC_50;     //外部时钟信号CLK2_50
 output VGA_CLK,VGA_HS,VGA_VS,VGA_BLANK,VGA_SYNC;
 output [7:0] VGA_R,VGA_B,VGA_G;
 parameter H_FRONT = 16;     //行同步前沿信号周期长
 parameter H_SYNC = 96;      //行同步信号周期长
 parameter H_BACK = 48;      //行同步后沿信号周期长
 parameter H_ACT = 640;      //行显示周期长
 parameter H_BLANK = H_FRONT+H_SYNC+H_BACK;        //行空白信号总周期长
 parameter H_TOTAL = H_FRONT+H_SYNC+H_BACK+H_ACT;  //行总周期长耗时
 parameter V_FRONT = 11;     //场同步前沿信号周期长
 parameter V_SYNC = 2;       //场同步信号周期长
 parameter V_BACK = 31;      //场同步后沿信号周期长
 parameter V_ACT = 480;      //场显示周期长
 parameter V_BLANK = V_FRONT+V_SYNC+V_BACK;        //场空白信号总周期长
 parameter V_TOTAL = V_FRONT+V_SYNC+V_BACK+V_ACT;  //场总周期长耗时
 reg [10:0] H_Cont;        //行周期计数器
 reg [10:0] V_Cont;        //场周期计数器
 wire [7:0] VGA_R;         //VGA红色控制线
 wire [7:0] VGA_G;         //VGA绿色控制线
 wire [7:0] VGA_B;         //VGA蓝色控制线
 reg VGA_HS;
 reg VGA_VS;
 reg [10:0] X;             //当前行第几个像素点
 reg [10:0] Y;             //当前场第几行
 reg CLK_25;
 always@(posedge OSC_50)
    begin 
      CLK_25=~CLK_25;         //时钟
    end 
    assign VGA_SYNC = 1'b0;   //同步信号低电平
    assign VGA_BLANK = ~((H_Cont<H_BLANK)||(V_Cont<V_BLANK));  //当行计数器小于行空白总长或场计数器小于场空白总长时,空白信号低电平
    assign VGA_CLK = ~CLK_to_DAC;  //VGA时钟等于CLK_25取反
    assign CLK_to_DAC = CLK_25;
 always@(posedge CLK_to_DAC)
    begin
        if(H_Cont<H_TOTAL)           //如果行计数器小于行总时长
            H_Cont<=H_Cont+1'b1;      //行计数器+1
        else H_Cont<=0;              //否则行计数器清零
        if(H_Cont==H_FRONT-1)        //如果行计数器等于行前沿空白时间-1
            VGA_HS<=1'b0;             //行同步信号置0
        if(H_Cont==H_FRONT+H_SYNC-1) //如果行计数器等于行前沿+行同步-1
            VGA_HS<=1'b1;             //行同步信号置1
        if(H_Cont>=H_BLANK)          //如果行计数器大于等于行空白总时长
            X<=H_Cont-H_BLANK;        //X等于行计数器-行空白总时长   (X为当前行第几个像素点)
        else X<=0;                   //否则X为0
    end
 always@(posedge VGA_HS)
    begin
        if(V_Cont<V_TOTAL)           //如果场计数器小于行总时长
            V_Cont<=V_Cont+1'b1;      //场计数器+1
        else V_Cont<=0;              //否则场计数器清零
        if(V_Cont==V_FRONT-1)       //如果场计数器等于场前沿空白时间-1
            VGA_VS<=1'b0;             //场同步信号置0
        if(V_Cont==V_FRONT+V_SYNC-1) //如果场计数器等于行前沿+场同步-1
            VGA_VS<=1'b1;             //场同步信号置1
        if(V_Cont>=V_BLANK)          //如果场计数器大于等于场空白总时长
            Y<=V_Cont-V_BLANK;        //Y等于场计数器-场空白总时长    (Y为当前场第几行)  
        else Y<=0;                   //否则Y为0
    end
    reg valid_yr;
 always@(posedge CLK_to_DAC)
    if(V_Cont == 10'd32)         //场计数器=32时
        valid_yr<=1'b1;           //行输入激活
    else if(V_Cont==10'd512)     //场计数器=512时
        valid_yr<=1'b0;           //行输入冻结
    wire valid_y=valid_yr;       //连线   
    reg valid_r;            
 always@(posedge CLK_to_DAC)   
    if((H_Cont == 10'd32)&&valid_y)     //行计数器=32时
        valid_r<=1'b1;                   //像素输入激活
    else if((H_Cont==10'd512)&&valid_y) //行计数器=512时 
        valid_r<=1'b0;                   //像素输入冻结
    wire valid = valid_r;               //连线
    wire[10:0] x_dis;     //像素显示控制信号
    wire[10:0] y_dis;     //行显示控制信号
    assign x_dis=X;       //连线X
    assign y_dis=Y;       //连线Y
        parameter  //点阵字模:每一行char_lineXX是显示的一行,共272列
    char_line00=272'h000000801FF0,  //第1行
    char_line01=272'h7FFC00801010,  //第2行
    char_line02=272'h010078BC1FF0,  //第3行
    char_line03=272'h01004BC01010,  //第4行
    char_line04=272'h010048501FF0,  //第5行
    char_line05=272'h010048240000,  //第6行
    char_line06=272'h010048D43FFC,  //第7行
    char_line07=272'h3FF87B0C2000,  //第8行
    char_line08=272'h010048002FF8,  //第9行
    char_line09=272'h01004BFE2000,  //第10行
    char_line0a=272'h010048903FFE,  //第11行
    char_line0b=272'h010048902908,  //第12行
    char_line0c=272'h010079122890,  //第13行
    char_line0d=272'h010049124860,  //第14行
    char_line0e=272'hFFFE020E4A18,  //第15行
    char_line0f=272'h000004008C06;  //第16行

    reg[8:0] char_bit;
    always@(posedge CLK_to_DAC)
        if(X==10'd144)char_bit<=9'd272;   //当显示到144像素时准备开始输出图像数据
        else if(X>10'd144&&X<10'd416)     //左边距屏幕144像素到416像素时    416=144+272(图像宽度)
            char_bit<=char_bit-1'b1;       //倒着输出图像信息 
        reg[29:0] vga_rgb;                //定义颜色缓存
    always@(posedge CLK_to_DAC) 
        if(X>10'd144&&X<10'd416)    //X控制图像的横向显示边界:左边距屏幕左边144像素  右边界距屏幕左边界416像素
            begin case(Y)            //Y控制图像的纵向显示边界:从距离屏幕顶部160像素开始显示第一行数据
                10'd160:
                if(char_line00[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;  //如果该行有数据 则颜色为红色
                else vga_rgb<=30'b0000000000_0000000000_0000000000;                      //否则为黑色
                10'd162:
                if(char_line01[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd163:
                if(char_line02[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd164:
                if(char_line03[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd165:
                if(char_line04[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000; 
                10'd166:
                if(char_line05[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd167:
                if(char_line06[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000; 
                10'd168:
                if(char_line07[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd169:
                if(char_line08[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000; 
                10'd170:
                if(char_line09[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd171:
                if(char_line0a[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd172:
                if(char_line0b[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd173:
                if(char_line0c[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd174:
                if(char_line0d[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd175:
                if(char_line0e[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
                10'd176:
                if(char_line0f[char_bit])vga_rgb<=30'b1111111111_0000000000_0000000000;
                else vga_rgb<=30'b0000000000_0000000000_0000000000;
            endcase 
        end
    else vga_rgb<=30'h000000000;             //否则黑色
    assign VGA_R=vga_rgb[23:16];
    assign VGA_G=vga_rgb[15:8];
    assign VGA_B=vga_rgb[7:0];
endmodule

  1. 效果
    在这里插入图片描述

四、图片显示

  1. 图像转换
    1. bmp 24位深图片转换为hex文件或mif文件,方便存入到rom中,图片不宜过大,超出rom存储发生错误
      在这里插入图片描述
  2. IP核ROM调用
    1. ROM选择
      在这里插入图片描述
    2. ROM的位宽度为16位,深度的设置一定要大于图片的大小就行 在这里插入图片描述
    3. 剩下保持默认,继续执行操作,取消Q输出端口
      在这里插入图片描述
    4. 导入转换文件 在这里插入图片描述
    5. 默认操作执行,勾选模块实例化,并在顶层实例化 在这里插入图片描述
  3. 图片数据处理
module data_drive (
    input			wire						vga_clk,
    input			wire						rst_n,
    input			wire		[ 10:0 ]		addr_h,
    input			wire		[ 10:0 ]		addr_v,
    output			reg		    [ 15:0 ]		rgb_data
);

localparam	black  = 16'd0;

parameter	height = 60; // 图片高度
parameter	width  = 96; // 图片宽度

reg			[ 20:0 ]		rom_address				; // ROM地址
wire		[ 20:0 ]		rom_data				; // 图片数据

wire						flag_enable_out2			; // 图片有效区域
wire						flag_clear_rom_address		; // 地址清零
wire						flag_begin_h			    ; // 图片显示行
wire						flag_begin_v			    ; // 图片显示列

always @( posedge vga_clk or negedge rst_n) begin
    if(!rst_n)begin
        rgb_data = black;
    end
    else if ( flag_enable_out2 ) begin
        rgb_data = rom_data;
    end
    else begin
        rgb_data = black;
    end
end

//ROM地址计数器
always @( posedge vga_clk or negedge rst_n ) begin
    if ( !rst_n ) begin
        rom_address <= 0;
    end
    else if ( flag_clear_rom_address ) begin //计数满清零
        rom_address <= 0;
    end
        else if ( flag_enable_out2 ) begin  //在有效区域内+1
        rom_address <= rom_address + 1;
        end
    else begin  //无效区域保持
        rom_address <= rom_address;
    end
end
assign flag_clear_rom_address = rom_address == height * width - 1;
assign flag_begin_h     = addr_h > ( ( 640 - width ) / 2 ) && addr_h < ( ( 640 - width ) / 2 ) + width + 1;
assign flag_begin_v     = addr_v > ( ( 480 - height )/2 ) && addr_v <( ( 480 - height )/2 ) + height + 1;
assign flag_enable_out2 = flag_begin_h && flag_begin_v;

//实例化ROM
rom_mif	rom_inst (
.address    ( rom_address   ),
.clock      ( vga_clk       ),
.q          ( rom_data      )
);

endmodule
  1. 演示效果
    在这里插入图片描述

五、总结

  1. VAG显示原理,将显示屏看为N*M大小的一个坐标系,每个坐标分配一个RGB三通道的值,也就是每个像素,行场信号扫描的速度很快,就能连成一副完整的图像。
  2. 通过像素连续行场扫描,图片存储到rom中,通过对rom数据读取通道值恢复就可以在屏幕上显示图片

参考

  1. 尝试用Verilog驱动VGA
  2. 基于DE2-115 FPGA开发板的VGA显示
  3. 基于FPGA的VGA显示,简单的历程和注释(DE2-115
  4. 【FPGA实验】基于DE2-115平台的VGA显示
  5. 咸鱼FPGA
  6. 基于FPGA的VGA协议实现
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值