赞
踩
生成测试彩条图像可以有两种方式
这里可以直接看超级大电工开源的代码,写的很好详细,我就不再班门弄斧了(下面是链接)
EBAZ4205 第二十四个工程 用VDMA模块来缓存图像并在HDMI上显示(一)800X600分辨率测试
采用的是纯PL端的方案,PS只是用来点灯和uart打印了
下面是block design
时钟和复位,我用的都是片外的,实测用PS端生成的也可以,甚至那个clock wizard不用,时钟全都由PS生成也可以。
clock wizard的设置如下
这里根据800X600的分辨率设置了PCLK和PCLKX5。
在写这个项目之前,我有过疑惑,为啥他们都用的是800X600这种“远古”分辨率,老子要上1080P,但是实际写下来发现,clock wizard确实可以倍频到那么高的频率,但是生成的不准,timing约束时会报错。
所以我就老老实实的改成生成800X600分辨率了。
其他的就是HDMI_test模块了,它还包含了hdmi_timming_generator和hdmi_color_bar_generator模块,分别负责生成图像的行场同步信号和色彩数据。
`timescale 1ns / 1ps `define UD #1 module hdmi_test( input wire rstn , input pclk , output vs_out , output hs_out , output de_out , output [23:0] rgb_out ); parameter X_WIDTH = 4'd12; parameter Y_WIDTH = 4'd12; //600p parameter H_TOTAL = 12'd1056; parameter H_ACT = 12'd800; parameter H_FP = 12'd40; parameter H_SYNC = 12'd128; parameter H_BP = 12'd88; parameter HV_OFFSET = 12'd0; parameter V_TOTAL = 12'd628; parameter V_ACT = 12'd600; parameter V_FP = 12'd1; parameter V_SYNC = 12'd4; parameter V_BP = 12'd23; wire [X_WIDTH - 1'b1:0] act_x ; wire [Y_WIDTH - 1'b1:0] act_y ; wire hs ; wire vs ; wire de ; reg [3:0] reset_delay_cnt; wire [7:0] r_out; wire [7:0] g_out; wire [7:0] b_out; assign rgb_out = {r_out,g_out,b_out}; hdmi_timming_generator #( .X_BITS ( X_WIDTH ), .Y_BITS ( Y_WIDTH ), .V_TOTAL ( V_TOTAL ), .V_FP ( V_FP ), .V_BP ( V_BP ), .V_SYNC ( V_SYNC ), .V_ACT ( V_ACT ), .H_TOTAL ( H_TOTAL ), .H_FP ( H_FP ), .H_BP ( H_BP ), .H_SYNC ( H_SYNC ), .H_ACT ( H_ACT ) ) hdmi_timming_generator1 ( .clk ( pclk ), .rstn ( rstn ), .vs_out ( vs ), .hs_out ( hs ), .de_out ( de ), .x_act ( act_x ), .y_act ( act_y ) ); hdmi_color_bar_generator #( .COCLOR_DEPP ( 8 ), .X_BITS ( X_WIDTH ), .Y_BITS ( Y_WIDTH ), .H_ACT ( H_ACT ), .V_ACT ( V_ACT ) ) // Number of fractional bits for ramp pattern hdmi_color_bar_generator1 ( .rstn ( rstn_out ), .pix_clk ( pclk ), .act_x ( act_x ), // input video timing .vs_in ( vs ), .hs_in ( hs ), .de_in ( de ), // test pattern image output .vs_out ( vs_out ), .hs_out ( hs_out ), .de_out ( de_out ), .r_out ( r_out ), .g_out ( g_out ), .b_out ( b_out ) ); endmodule
`timescale 1ns / 1ps `define UD #1 module hdmi_timming_generator # ( parameter X_BITS=4'd12, parameter Y_BITS=4'd12, parameter V_TOTAL = 12'd750, parameter V_FP = 12'd5, parameter V_BP = 12'd20, parameter V_SYNC = 12'd5, parameter V_ACT = 12'd720, parameter H_TOTAL = 12'd1650, parameter H_FP = 12'd110, parameter H_BP = 12'd220, parameter H_SYNC = 12'd40, parameter H_ACT = 12'd1280 )( input clk, input rstn, output reg vs_out, output reg hs_out, output reg de_out, output reg [X_BITS-1:0] x_act, output reg [Y_BITS-1:0] y_act ); // parameter HV_OFFSET = 12'd0 ; reg [X_BITS-1:0] h_count = 'd0; reg [Y_BITS-1:0] v_count = 'd0; always @(posedge clk) begin if (!rstn) h_count <= `UD 0; else begin if (h_count < H_TOTAL - 1) h_count <= `UD h_count + 1; else h_count <= `UD 0; end end always @(posedge clk) begin if (!rstn) v_count <= `UD 0; else if (h_count == H_TOTAL - 1) begin if (v_count == V_TOTAL - 1) v_count <= `UD 0; else v_count <= `UD v_count + 1; end end always @(posedge clk) begin if (!rstn) hs_out <= `UD 4'b0; else hs_out <= `UD ((h_count < H_SYNC)); end always @(posedge clk) begin if (!rstn) vs_out <= `UD 4'b0; else begin if (v_count == 0) vs_out <= `UD 1'b1; else if (v_count == V_SYNC) vs_out <= `UD 1'b0; else vs_out <= `UD vs_out; end end always @(posedge clk) begin if (!rstn) de_out <= `UD 4'b0; else de_out <= (((v_count >= V_SYNC + V_BP) && (v_count <= V_TOTAL - V_FP - 1)) && ((h_count >= H_SYNC + H_BP) && (h_count <= H_TOTAL - H_FP - 1))); end always @(posedge clk) begin if (!rstn) x_act <= `UD 'd0; else begin if(h_count > (H_SYNC + H_BP - 1'b1)) x_act <= `UD (h_count - (H_SYNC + H_BP)); else x_act <= `UD 'd0; end end always @(posedge clk) begin if (!rstn) y_act <= `UD 'd0; else begin if(v_count > (V_SYNC + V_BP - 1'b1)) y_act <= `UD (v_count - (V_SYNC + V_BP)); else y_act <= `UD 'd0; end end endmodule
`timescale 1ns / 1ps `define UD #1 module hdmi_color_bar_generator # ( parameter COCLOR_DEPP=8, parameter X_BITS=13, parameter Y_BITS=13, parameter H_ACT = 12'd1280, parameter V_ACT = 12'd720 )( input rstn, input pix_clk, input [X_BITS-1:0] act_x, input vs_in, input hs_in, input de_in, output reg vs_out, output reg hs_out, output reg de_out, output reg [COCLOR_DEPP-1:0] r_out, output reg [COCLOR_DEPP-1:0] g_out, output reg [COCLOR_DEPP-1:0] b_out ); localparam H_ACT_ARRAY_0 = H_ACT/8; localparam H_ACT_ARRAY_1 = 2* (H_ACT/8); localparam H_ACT_ARRAY_2 = 3* (H_ACT/8); localparam H_ACT_ARRAY_3 = 4* (H_ACT/8); localparam H_ACT_ARRAY_4 = 5* (H_ACT/8); localparam H_ACT_ARRAY_5 = 6* (H_ACT/8); localparam H_ACT_ARRAY_6 = 7* (H_ACT/8); localparam H_ACT_ARRAY_7 = 8* (H_ACT/8); always @(posedge pix_clk) begin vs_out <= `UD vs_in; hs_out <= `UD hs_in; de_out <= `UD de_in; end always @(posedge pix_clk) begin if (de_in) begin if(act_x < H_ACT_ARRAY_0) begin r_out <= 8'hff; g_out <= 8'hff; b_out <= 8'hff; end else if(act_x < H_ACT_ARRAY_1) begin r_out <= 8'hff; g_out <= 8'hff; b_out <= 8'h00; end else if(act_x < H_ACT_ARRAY_2) begin r_out <= 8'h00; g_out <= 8'hff; b_out <= 8'hff; end else if(act_x < H_ACT_ARRAY_3) begin r_out <= 8'h00; g_out <= 8'hff; b_out <= 8'h00; end else if(act_x < H_ACT_ARRAY_4) begin r_out <= 8'hff; g_out <= 8'h00; b_out <= 8'hff; end else if(act_x < H_ACT_ARRAY_5) begin r_out <= 8'hff; g_out <= 8'h00; b_out <= 8'h00; end else if(act_x < H_ACT_ARRAY_6) begin r_out <= 8'h00; g_out <= 8'h00; b_out <= 8'hff; end else begin r_out <= 8'h0; g_out <= 8'h0; b_out <= 8'h0; end end else begin r_out <= 8'h00; g_out <= 8'h00; b_out <= 8'h00; end end endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。