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
仿真结果