verilog实现colorbar

verilog实现colorbar##
colorbar.v模块

module colorbar #(
    parameter                           H_SYNC   =  'd128        ,//行同步
    parameter                           H_BACK   =  'd88         ,//行显示后沿
    parameter                           H_DISP   =  'd800        ,//行有效数据
    parameter                           H_FRONT  =  'd40         ,//行显示前沿
    parameter                           H_TOTAL  =  'd1056       ,//行扫描周期
    parameter                           V_SYNC   =  'd2          ,//场同步
    parameter                           V_BACK   =  'd33         ,//场显示后沿
    parameter                           V_DISP   =  'd480        ,//场有效数据
    parameter                           V_FRONT  =  'd10         ,//场显示前沿
    parameter                           V_TOTAL  =  'd525        //场扫描周期  

)(
    input                               pclk                       ,//时钟
    input                               rst_n                      ,//复位,低电平有效
    input              [31:0]           frame_size                 ,
    //RGB LCD接口
    output                              o_vde                      ,//数据使能信号
    output                              o_hs                       ,//行同步信号
    output                              o_vs                       ,//场同步信号
    output             [  23:0]         o_dat                       //RGB888颜色数据
);

    //1920 * 1080 @25fps || 50fps
    parameter                           H_SYNC_1920x1080_25hz_50hz   =  'd44;       //行同步
    parameter                           H_BACK_1920x1080_25hz_50hz   =  'd148;      //行显示后沿
    parameter                           H_DISP_1920x1080_25hz_50hz   =  'd1920;     //行有效数据
    parameter                           H_FRONT_1920x1080_25hz_50hz  =  'd528;      //行显示前沿
    parameter                           H_TOTAL_1920x1080_25hz_50hz  =  'd2640;     //行扫描周期
    parameter                           V_SYNC_1920x1080_25hz_50hz   =  'd5;        //场同步
    parameter                           V_BACK_1920x1080_25hz_50hz   =  'd36;       //场显示后沿
    parameter                           V_DISP_1920x1080_25hz_50hz   =  'd1080;     //场有效数据
    parameter                           V_FRONT_1920x1080_25hz_50hz  =  'd4;        //场显示前沿
    parameter                           V_TOTAL_1920x1080_25hz_50hz  =  'd1125;      //场扫描周期 

    //1920 * 1080 @30fps || 6fps
    parameter                           H_SYNC_1920x1080_30hz_60hz   =  'd44;       //行同步
    parameter                           H_BACK_1920x1080_30hz_60hz   =  'd148;      //行显示后沿
    parameter                           H_DISP_1920x1080_30hz_60hz   =  'd1920;     //行有效数据
    parameter                           H_FRONT_1920x1080_30hz_60hz  =  'd88;       //行显示前沿
    parameter                           H_TOTAL_1920x1080_30hz_60hz  =  'd2200;     //行扫描周期
    parameter                           V_SYNC_1920x1080_30hz_60hz   =  'd5;        //场同步
    parameter                           V_BACK_1920x1080_30hz_60hz   =  'd36;       //场显示后沿
    parameter                           V_DISP_1920x1080_30hz_60hz   =  'd1080;     //场有效数据
    parameter                           V_FRONT_1920x1080_30hz_60hz  =  'd4;        //场显示前沿
    parameter                           V_TOTAL_1920x1080_30hz_60hz  =  'd1125;      //场扫描周期 

    //1280 * 720 @25fps
    parameter                           H_SYNC_1280x720_25hz   =  'd40;         //行同步
    parameter                           H_BACK_1280x720_25hz   =  'd220;        //行显示后沿
    parameter                           H_DISP_1280x720_25hz   =  'd1280;       //行有效数据
    parameter                           H_FRONT_1280x720_25hz  =  'd2420;       //行显示前沿
    parameter                           H_TOTAL_1280x720_25hz  =  'd3960;       //行扫描周期
    parameter                           V_SYNC_1280x720_25hz   =  'd5;          //场同步
    parameter                           V_BACK_1280x720_25hz   =  'd20;         //场显示后沿
    parameter                           V_DISP_1280x720_25hz   =  'd720;        //场有效数据
    parameter                           V_FRONT_1280x720_25hz  =  'd5;          //场显示前沿
    parameter                           V_TOTAL_1280x720_25hz  =  'd750;         //场扫描周期 

    //1280 * 720 @30fps
    parameter                           H_SYNC_1280x720_30hz   =  'd40;         //行同步
    parameter                           H_BACK_1280x720_30hz   =  'd220;        //行显示后沿
    parameter                           H_DISP_1280x720_30hz   =  'd1280;       //行有效数据
    parameter                           H_FRONT_1280x720_30hz  =  'd1760;       //行显示前沿
    parameter                           H_TOTAL_1280x720_30hz  =  'd3300;       //行扫描周期
    parameter                           V_SYNC_1280x720_30hz   =  'd5;          //场同步
    parameter                           V_BACK_1280x720_30hz   =  'd20;         //场显示后沿
    parameter                           V_DISP_1280x720_30hz   =  'd720;        //场有效数据
    parameter                           V_FRONT_1280x720_30hz  =  'd5;          //场显示前沿
    parameter                           V_TOTAL_1280x720_30hz  =  'd750;        //场扫描周期 

    //1280 * 720 @50fps
    parameter                           H_SYNC_1280x720_50hz   =  'd40;         //行同步
    parameter                           H_BACK_1280x720_50hz   =  'd220;        //行显示后沿
    parameter                           H_DISP_1280x720_50hz   =  'd1280;       //行有效数据
    parameter                           H_FRONT_1280x720_50hz  =  'd440;       //行显示前沿
    parameter                           H_TOTAL_1280x720_50hz  =  'd1980;       //行扫描周期
    parameter                           V_SYNC_1280x720_50hz   =  'd5;          //场同步
    parameter                           V_BACK_1280x720_50hz   =  'd20;         //场显示后沿
    parameter                           V_DISP_1280x720_50hz   =  'd720;        //场有效数据
    parameter                           V_FRONT_1280x720_50hz  =  'd5;          //场显示前沿
    parameter                           V_TOTAL_1280x720_50hz  =  'd750;         //场扫描周期 

    //1280 * 720 @60fps
    parameter                           H_SYNC_1280x720_60hz   =  'd40;         //行同步
    parameter                           H_BACK_1280x720_60hz   =  'd220;        //行显示后沿
    parameter                           H_DISP_1280x720_60hz   =  'd1280;       //行有效数据
    parameter                           H_FRONT_1280x720_60hz  =  'd110;        //行显示前沿
    parameter                           H_TOTAL_1280x720_60hz  =  'd1650;       //行扫描周期
    parameter                           V_SYNC_1280x720_60hz   =  'd5;          //场同步
    parameter                           V_BACK_1280x720_60hz   =  'd20;         //场显示后沿
    parameter                           V_DISP_1280x720_60hz   =  'd720;        //场有效数据
    parameter                           V_FRONT_1280x720_60hz  =  'd5;          //场显示前沿
    parameter                           V_TOTAL_1280x720_60hz  =  'd750;         //场扫描周期 

//reg define
reg  [12:0] h_front;
reg  [12:0] h_sync ;
reg  [12:0] h_back ;
reg  [12:0] h_disp ;
reg  [12:0] h_total;
reg  [12:0] v_sync ;
reg  [12:0] v_back ;
reg  [12:0] v_disp ;
reg  [12:0] v_front;
reg  [12:0] v_total;
reg  [12:0] h_cnt  ;
reg  [12:0] v_cnt  ;
reg  [23:0] pixel_data  ;

//wire define    
wire        dat_en;
wire        data_req;
wire [12:0] pixel_xpos;
wire [12:0] pixel_ypos;
//*****************************************************
//**                    main code
//*****************************************************

assign  o_vde = dat_en;         

//使能RGB888数据输出
assign  dat_en = ((h_cnt >= h_front + h_sync + h_back) && (h_cnt < h_front + h_sync + h_back + h_disp)
                  && (v_cnt >= v_front + v_sync + v_back) && (v_cnt < v_front + v_sync + v_back + v_disp)) 
                  ? 1'b1 : 1'b0;
//
assign o_vs = ((v_cnt > v_front) && (v_cnt <= v_sync + v_front)) ? 1'b1 : 1'b0;

//
assign o_hs = ((h_cnt >= h_front + h_sync + h_back) && (h_cnt < h_front + h_sync + h_back + h_disp)) ? 1'b1 : 1'b0;

//请求像素点颜色数据输入  
assign data_req = ((h_cnt >= h_front + h_sync + h_back - 1'b1) && (h_cnt < h_front + h_sync + h_back + h_disp - 1'b1)
                  && (v_cnt >= v_front + v_sync + v_back) && (v_cnt < v_front + v_sync + v_back + v_disp)) 
                  ? 1'b1 : 1'b0;

//像素点坐标  
assign pixel_xpos = data_req ? (h_cnt - (h_front + h_sync + h_back - 1'b1)) : 'd0;
assign pixel_ypos = data_req ? (v_cnt - (v_front + v_sync + v_back - 1'b1)) : 'd0;

//RGB888数据输出
assign o_dat = dat_en ? pixel_data : 24'd0;

//行场时序参数
always @(posedge pclk) begin
    case(frame_size)
        32'd1920108025 : begin
            h_front <= H_FRONT_1920x1080_25hz_50hz;  //h_front
            h_sync  <= H_SYNC_1920x1080_25hz_50hz;   //h_sync
            h_back  <= H_BACK_1920x1080_25hz_50hz;   //h_back
            h_disp  <= H_DISP_1920x1080_25hz_50hz;   //h_disp
            h_total <= H_TOTAL_1920x1080_25hz_50hz;  //h_total

            v_front <= V_FRONT_1920x1080_25hz_50hz;  //v_front
            v_sync  <= V_SYNC_1920x1080_25hz_50hz;   //v_sync
            v_back  <= V_BACK_1920x1080_25hz_50hz;   //v_back
            v_disp  <= V_DISP_1920x1080_25hz_50hz;   //v_disp
            v_total <= V_TOTAL_1920x1080_25hz_50hz;  //v_total          
        end
        32'd1920108050 : begin
            h_front <= H_FRONT_1920x1080_25hz_50hz;  //h_front
            h_sync  <= H_SYNC_1920x1080_25hz_50hz;   //h_sync
            h_back  <= H_BACK_1920x1080_25hz_50hz;   //h_back
            h_disp  <= H_DISP_1920x1080_25hz_50hz;   //h_disp
            h_total <= H_TOTAL_1920x1080_25hz_50hz;  //h_total

            v_front <= V_FRONT_1920x1080_25hz_50hz;  //v_front
            v_sync  <= V_SYNC_1920x1080_25hz_50hz;   //v_sync
            v_back  <= V_BACK_1920x1080_25hz_50hz;   //v_back
            v_disp  <= V_DISP_1920x1080_25hz_50hz;   //v_disp
            v_total <= V_TOTAL_1920x1080_25hz_50hz;  //v_total         
        end
        32'd1920108030 : begin
            h_front <= H_FRONT_1920x1080_30hz_60hz;  //h_front
            h_sync  <= H_SYNC_1920x1080_30hz_60hz;   //h_sync
            h_back  <= H_BACK_1920x1080_30hz_60hz;   //h_back
            h_disp  <= H_DISP_1920x1080_30hz_60hz;   //h_disp
            h_total <= H_TOTAL_1920x1080_30hz_60hz;  //h_total

            v_front <= V_FRONT_1920x1080_30hz_60hz;  //v_front
            v_sync  <= V_SYNC_1920x1080_30hz_60hz;   //v_sync
            v_back  <= V_BACK_1920x1080_30hz_60hz;   //v_back
            v_disp  <= V_DISP_1920x1080_30hz_60hz;   //v_disp
            v_total <= V_TOTAL_1920x1080_30hz_60hz;  //v_total          
        end
        32'd1920108060 : begin
            h_front <= H_FRONT_1920x1080_30hz_60hz;  //h_front
            h_sync  <= H_SYNC_1920x1080_30hz_60hz;   //h_sync
            h_back  <= H_BACK_1920x1080_30hz_60hz;   //h_back
            h_disp  <= H_DISP_1920x1080_30hz_60hz;   //h_disp
            h_total <= H_TOTAL_1920x1080_30hz_60hz;  //h_total

            v_front <= V_FRONT_1920x1080_30hz_60hz;  //v_front
            v_sync  <= V_SYNC_1920x1080_30hz_60hz;   //v_sync
            v_back  <= V_BACK_1920x1080_30hz_60hz;   //v_back
            v_disp  <= V_DISP_1920x1080_30hz_60hz;   //v_disp
            v_total <= V_TOTAL_1920x1080_30hz_60hz;  //v_total           
        end
        32'd128072025 : begin
            h_front <= H_FRONT_1280x720_25hz;  //h_front
            h_sync  <= H_SYNC_1280x720_25hz;   //h_sync
            h_back  <= H_BACK_1280x720_25hz;   //h_back
            h_disp  <= H_DISP_1280x720_25hz;   //h_disp
            h_total <= H_TOTAL_1280x720_25hz;  //h_total

            v_front <= V_FRONT_1280x720_25hz;  //v_front
            v_sync  <= V_SYNC_1280x720_25hz;   //v_sync
            v_back  <= V_BACK_1280x720_25hz;   //v_back
            v_disp  <= V_DISP_1280x720_25hz;   //v_disp
            v_total <= V_TOTAL_1280x720_25hz;  //v_total           
        end
        32'd128072030 : begin
            h_front <= H_FRONT_1280x720_30hz;  //h_front
            h_sync  <= H_SYNC_1280x720_30hz;   //h_sync
            h_back  <= H_BACK_1280x720_30hz;   //h_back
            h_disp  <= H_DISP_1280x720_30hz;   //h_disp
            h_total <= H_TOTAL_1280x720_30hz;  //h_total

            v_front <= V_FRONT_1280x720_30hz;  //v_front
            v_sync  <= V_SYNC_1280x720_30hz;   //v_sync
            v_back  <= V_BACK_1280x720_30hz;   //v_back
            v_disp  <= V_DISP_1280x720_30hz;   //v_disp
            v_total <= V_TOTAL_1280x720_30hz;  //v_total           
        end
        32'd128072050 : begin
            h_front <= H_FRONT_1280x720_50hz;  //h_front
            h_sync  <= H_SYNC_1280x720_50hz;   //h_sync
            h_back  <= H_BACK_1280x720_50hz;   //h_back
            h_disp  <= H_DISP_1280x720_50hz;   //h_disp
            h_total <= H_TOTAL_1280x720_50hz;  //h_total

            v_front <= V_FRONT_1280x720_50hz;                       //v_front
            v_sync  <= V_SYNC_1280x720_50hz;                        //v_sync
            v_back  <= V_BACK_1280x720_50hz;                        //v_back
            v_disp  <= V_DISP_1280x720_50hz;                        //v_disp
            v_total <= V_TOTAL_1280x720_50hz;                       //v_total            
        end
        32'd128072060 : begin
            h_front <= H_FRONT_1280x720_60hz;                       //h_front
            h_sync  <= H_SYNC_1280x720_60hz;                        //h_sync
            h_back  <= H_BACK_1280x720_60hz;                        //h_back
            h_disp  <= H_DISP_1280x720_60hz;                        //h_disp
            h_total <= H_TOTAL_1280x720_60hz;                       //h_total

            v_front <= V_FRONT_1280x720_60hz;                       //v_front
            v_sync  <= V_SYNC_1280x720_60hz;                        //v_sync
            v_back  <= V_BACK_1280x720_60hz;                        //v_back
            v_disp  <= V_DISP_1280x720_60hz;                        //v_disp
            v_total <= V_TOTAL_1280x720_60hz;                       //v_total           
        end
        32'd0 : begin
            h_front <= H_FRONT;                                     //h_front
            h_sync  <= H_SYNC;                                      //h_sync
            h_back  <= H_BACK;                                      //h_back
            h_disp  <= H_DISP;                                      //h_disp
            h_total <= H_TOTAL;                                     //h_total

            v_front <= V_FRONT;                                     //v_front
            v_sync  <= V_SYNC;                                      //v_sync
            v_back  <= V_BACK;                                      //v_back
            v_disp  <= V_DISP;                                      //v_disp
            v_total <= V_TOTAL;                                     //v_total
        end
        default : begin
            h_front <= H_FRONT_1920x1080_30hz_60hz;                 //h_front
            h_sync  <= H_SYNC_1920x1080_30hz_60hz;                  //h_sync
            h_back  <= H_BACK_1920x1080_30hz_60hz;                  //h_back
            h_disp  <= H_DISP_1920x1080_30hz_60hz;                  //h_disp
            h_total <= H_TOTAL_1920x1080_30hz_60hz;                 //h_total

            v_front <= V_FRONT_1920x1080_30hz_60hz;                 //v_front
            v_sync  <= V_SYNC_1920x1080_30hz_60hz;                  //v_sync
            v_back  <= V_BACK_1920x1080_30hz_60hz;                  //v_back
            v_disp  <= V_DISP_1920x1080_30hz_60hz;                  //v_disp
            v_total <= V_TOTAL_1920x1080_30hz_60hz;                 //v_total

        end
    endcase
end

//行计数器对像素时钟计数
always@ (posedge pclk or negedge rst_n) begin
    if(!rst_n) 
        h_cnt <= 'd0;
    else begin
        if(h_cnt == h_total - 1'b1)
            h_cnt <= 'd0;
        else
            h_cnt <= h_cnt + 1'b1;           
    end
end

//场计数器对行计数
always@ (posedge pclk or negedge rst_n) begin
    if(!rst_n) 
        v_cnt <= 'd0;
    else begin
        if(h_cnt == h_total - 1'b1) begin
            if(v_cnt == v_total - 1'b1)
                v_cnt <= 'd0;
            else
                v_cnt <= v_cnt + 1'b1;    
        end
    end    
end

//parameter define  
parameter WHITE = 24'hFFFFFF;  //白色
parameter BLACK = 24'h000000;  //黑色
parameter RED   = 24'hFF0000;  //红色
parameter GREEN = 24'h00FF00;  //绿色
parameter BLUE  = 24'h0000FF;  //蓝色

//根据当前像素点坐标指定当前像素点颜色数据,在屏幕上显示彩条
always @(posedge pclk or negedge rst_n) begin
    if(!rst_n)
        pixel_data <= BLACK;
    else begin
        if((pixel_xpos >= 'd0) && (pixel_xpos < h_disp/5*1))
            pixel_data <= WHITE;
        else if((pixel_xpos >= h_disp/5*1) && (pixel_xpos < h_disp/5*2))    
            pixel_data <= BLACK;
        else if((pixel_xpos >= h_disp/5*2) && (pixel_xpos < h_disp/5*3))    
            pixel_data <= RED;   
        else if((pixel_xpos >= h_disp/5*3) && (pixel_xpos < h_disp/5*4))    
            pixel_data <= GREEN;                
        else 
            pixel_data <= BLUE;      
    end    
end

endmodule

testbench.v文件

`timescale  1ps/1ps
module a_tb_FifoSim();

reg                                     clk_50m                    ;
reg                                     clk_100m                   ;
reg                                     clk_200m                   ;
reg                                     clk_400m                   ;
reg                                     clk_74p25m                 ;
reg                                     clk_148p5m                 ;
reg                                     rst_n                      ;

initial begin
    clk_50m     = 0;
    clk_100m    = 0;
    clk_200m    = 0;
    clk_400m    = 0;
    clk_74p25m  = 0;
    clk_148p5m  = 0;
    rst_n       = 0;
    #200000
    rst_n       = 1;
end

always  #10000 clk_50m      = ~clk_50m;
always  #5000  clk_100m     = ~clk_100m;
always  #2500  clk_200m     = ~clk_200m;
always  #1250  clk_400m     = ~clk_400m;
always  #6734  clk_74p25m   = ~clk_74p25m;  
always  #3367  clk_148p5m   = ~clk_148p5m;

wire                                    o_vde                      ;
wire                                    o_vs                       ;
wire                                    o_hs                       ;
wire                   [  23:0]         o_dat                      ;
colorbar colorbar (
    .pclk                              (clk_100m                  ),//时钟
    .rst_n                             (rst_n                     ),//复位,低电平有效
    .frame_size                        (32'd1920108030            ),
    .o_vde                             (o_vde                     ),//数据使能信号
    .o_hs                              (o_hs                      ),//行同步信号
    .o_vs                              (o_vs                      ),//场同步信号
    .o_dat                             (o_dat                     ) //RGB888颜色数据
);

endmodule

仿真结果
在这里插入图片描述

FPGA设计LCD屏幕显示彩条Verilog设计Quartus工程源码文件,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module lcd_rgb_colorbar( input sys_clk, //系统时钟 input sys_rst_n, //系统复位 //RGB LCD接口 output lcd_de, //LCD 数据使能信号 output lcd_hs, //LCD 行同步信号 output lcd_vs, //LCD 场同步信号 output lcd_clk, //LCD 像素时钟 inout [15:0] lcd_rgb, //LCD RGB565颜色数据 output lcd_rst, output lcd_bl ); wire [15:0] lcd_id ; //LCD屏ID wire lcd_pclk ; //LCD像素时钟 wire [10:0] pixel_xpos; //当前像素点横坐标 wire [10:0] pixel_ypos; //当前像素点纵坐标 wire [10:0] h_disp ; //LCD屏水平分辨率 wire [10:0] v_disp ; //LCD屏垂直分辨率 wire [15:0] pixel_data; //像素数据 wire [15:0] lcd_rgb_o ; //输出的像素数据 wire [15:0] lcd_rgb_i ; //输入的像素数据 //***************************************************** //** main code //***************************************************** //像素数据方向切换 assign lcd_rgb = lcd_de ? lcd_rgb_o : {16{1'bz}}; assign lcd_rgb_i = lcd_rgb; //读LCD ID模块 rd_id u_rd_id( .clk (sys_clk ), .rst_n (sys_rst_n), .lcd_rgb (lcd_rgb_i), .lcd_id (lcd_id ) ); //时钟分频模块 clk_div u_clk_div( .clk (sys_clk ), .rst_n (sys_rst_n), .lcd_id (lcd_id ), .lcd_pclk (lcd_pclk ) ); //LCD显示模块 lcd_display u_lcd_display( .lcd_pclk (lcd_pclk ), .rst_n (sys_rst_n ), .pixel_xpos (pixel_xpos), .pixel_ypos (pixel_ypos), .h_disp (h_disp ), .v_disp (v_disp ), .pixel_data (pixel_data) ); //LCD驱动模块 lcd_driver u_lcd_driver( .lcd_pclk (lcd_pclk ), .rst_n (sys_rst_n ), .lcd_id (lcd_id ), .pixel_data (pixel_data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值