关于VGA的编程接口可参考

https://blog.csdn.net/qq_39148922/article/details/85005271

本代码驱动屏幕显示红绿蓝三道条纹,具体的代码解释可参考注释

module vgaTest(
    clk,horSync,verSync,rForOut,gForOut,bForOut,reset
);
    input clk;//输入的系统时钟,50MHz
    input reset;//复位信号
    output horSync;//横向的同步脉冲信号
    output verSync;//纵向的同步脉冲信号
    output [2:0]rForOut;//输出的红色电平
    output [2:0]gForOut;//输出的绿色电平
    output [2:0]bForOut;//输出的蓝色电平
    
    //下面是输出信号的寄存器
    reg horSyncReg;//横向同步信号脉冲寄存器
    reg verSyncReg;//纵向同步信号脉冲寄存器
    reg [2:0]rReg;//红色寄存器
    reg [2:0]gReg;//绿色寄存器
    reg [2:0]bReg;//蓝色寄存器
    //让输出变量跟随寄存器
    assign horSync=horSyncReg;
    assign verSync=verSyncReg;
    assign rForOut=rReg;
    assign gForOut=gReg;
    assign bForOut=bReg;
    
    //下面是扫描周期每个阶段的截止时间点
    parameter horSyncTime=120;//横向同步脉冲时间点
    parameter horFrontTime=56+horSyncTime;//横向扫描的前肩时间点
    parameter horVisibleTime=800+horFrontTime;//横向扫描的可见时间点
    parameter horBackTime=64+horVisibleTime;//横向扫描的后肩时间点,即一个周期的结束点
    
    //因为纵向的变化都是在每一行结束的时候触发,所以下面用line表示时间
    parameter verSyncLine=6;//纵向扫描同步脉冲时间点
    parameter verFrontLine=37+verSyncLine;//纵向扫描前肩时间点
    parameter verVisibleLine=600+verFrontLine;//纵向扫描可见时间点
    parameter verBackLine=23+verVisibleLine;//纵向扫描后肩时间点,即一个纵向周期的结束点
    
    //下面是三个彩条的宽度
    parameter redHeight=200+verVisibleLine;//0~199为红色
    parameter greenHeight=200+redHeight;//200~399为绿色
    parameter blueHeight=200+greenHeight;//400~599为蓝色
    
    reg [11:0]horCount;//横向计数器
    reg [11:0]verCount;//纵向计数器
    always @ (posedge clk or negedge reset)
    begin
        if(~reset)//复位信号,对计数器清零
        begin
            horCount<=0;
            verCount<=0;
        end
        else//对时钟的响应
        begin
            if(horCount==horBackTime-1)//横向时钟计数到周期的结束时
            begin
                horCount<=0;//计数器置零
                
                //横向时钟计数满一次,纵向时钟才响应一次
                if(verCount==verBackLine-1)//判断纵向时钟是否计数潢
                begin
                    verCount<=0;//清零
                end
                else
                begin
                    verCount<=verCount+1;//计数+1
                end
            end
            else
            begin
                horCount<=horCount+1;//计数+1
            end
        end
    end
    
    //下面判断横向同步脉冲的产生时间
    //这里也可以直接用   horSyncReg=horCount>=horSyncTime;
    always @ (posedge clk)
    begin
        if(horCount<horSyncTime)
            horSyncReg<=0;//产生脉冲的时候为0
        else
        horSyncReg<=1;//平常为1
    end
    
    //下面判断纵向脉冲的产生时间
    always @ (posedge clk)
    begin
        if(verCount<verSyncLine)
            verSyncReg<=0;//产生脉冲的时候为0
        else
            verSyncReg<=1;//产生的脉冲为1
    end
    
    //下面维护颜色的变化过程
    always @ (posedge clk)
    begin
        if((horCount>=horFrontTime)&&(horCount<horVisibleTime)&&(verCount>=verFrontLine)&&(verCount<verVisibleLine))//同步脉冲时间和消隐时间不能显示
        begin
            if(verCount<redHeight)//红色
            begin
                rReg<=7;
                gReg<=0;
                bReg<=0;
            end
            else if(verCount<greenHeight)//绿色
            begin
                rReg<=0;
                gReg<=7;
                bReg<=0;
            end
            else if(verCount<blueHeight)//蓝色
            begin
                rReg<=0;
                gReg<=0;
                bReg<=7;
            end
        end
        else//非显示时间
        begin
            rReg<=0;
            gReg<=0;
            bReg<=0;
        end
    end
endmodule
 
-02-Xilinx的SerDes接口介绍【Xilinx-LVDS读写功能实现】 https://blog.csdn.net/vacajk/article/details/54409789

09-10 15:31