`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2023/03/07 11:18:29
// Design Name: 
// Module Name: PAL_colour
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


  module PAL_colour 
    (
        input           rst_n,    
        input           en_clk,
        output  [7:0]   en_d,
        output          en_vs,
        output          en_hs
        // output [10:0]   colp,
        // output [9:0]    rowp        
     );

reg [10:0] cols = 0; //0---1727
reg [9:0] row = 0;  //0---624

reg [7:0] data;          //8位数据
//                     y      cb     cr
 reg [23:0] white = {8'heb, 8'h80, 8'h80};//{8'd235, 8'd128, 8'd128};
 reg [23:0] yellow = {8'hd2, 8'h10, 8'h92};//{8'd162, 8'd44, 8'd142};
 reg [23:0] cyan = {8'haa, 8'ha6, 8'h10};//{8'd131, 8'd156, 8'd44};
 reg [23:0] green = {8'h91, 8'h36, 8'h22};//{8'd112, 8'd72, 8'd58};
 reg [23:0] magenta = {8'h6a, 8'hca, 8'hde};//{8'd84, 8'd184, 8'd198};
 reg [23:0] red = {8'h51, 8'h5a, 8'hf0};//{8'd65, 8'd100, 8'd212};
 reg [23:0] blue = {8'h29, 8'hf0, 8'h6e};//{8'd35, 8'd212, 8'd114};
 reg [23:0] black = {8'h10, 8'h80, 8'h80};//{8'd16, 8'd128, 8'd128}; 
 
reg [23:0] cur_color;//产生图像数据,数据 8 个 8 个出
function [7:0] colorValue;
input [10:0] cols;  //col = 288~1727
   begin
        if(452 > cols)
            cur_color = black;
        else if(652 >cols)
            cur_color = blue;
        else if(812 > cols)
            cur_color = red;
        else if(992 > cols)
            cur_color = magenta;
        else if(1172 > cols)
            cur_color = green;
        else if(1352 > cols)
            cur_color = cyan;
        else if(1532 > cols)
            cur_color = yellow;
        else
            cur_color = white;
        //* Y
        if(cols[0] == 1'b1)   //288 = 120h  
            colorValue = cur_color[23:16];// y
        //* Cr and Cb
        else if(cols[1] == 1'b0)
            colorValue = cur_color[15:8]; //* cb
        else
            colorValue = cur_color[7:0]; //* Cr
    end
endfunction

function [7:0] EAV;
    input [9:0] row;
    begin
        if (row <= 311) begin
            if (row < 22) 
                EAV = 8'hb6; 
            else if (row < 310)
                EAV = 8'h9d;
            else
                EAV = 8'hb6;
        end else begin
           if (row < 335) 
                EAV = 8'hf1; 
            else if (row < 623)
                EAV = 8'hda;
            else
                EAV = 8'hf1;            
        end
    end
endfunction
function [7:0] SAV;
    input [9:0] row;
    begin
        if (row <= 311) begin
            if (row < 22) 
                SAV = 8'hab; 
            else if (row < 310)
                SAV = 8'h80;
            else
                SAV = 8'hab;
        end else begin
           if (row < 335) 
                SAV = 8'hec; 
            else if (row < 623)
                SAV = 8'hc7;
            else
                SAV = 8'hec;            
        end
    end
endfunction
reg hsvs;
 always@(negedge en_clk)  //仿真用
    begin 
         if ((rst_n==0))begin
            cols = 11'd0;
            row = 10'd0;
            data = 8'd0;
            hsvs = 0;
         end else begin
            hsvs = ~hsvs;
//           0  1 2 3     4 <= col <= 283   284 285 286 287   288 <= col <=1727
//0~21行     FF 0 0 B6    0x80和0x10交替    FF  0   0   AB    0x80和0x10交替 
//22~309行   FF 0 0 9d    0x80和0x10交替    FF  0   0   80    视频数据 
//310~311行  FF 0 0 b6    0x80和0x10交替    FF  0   0   ab    0x80和0x10交替 
//312~334行  FF 0 0 f1    0x80和0x10交替    FF  0   0   ec    0x80和0x10交替 
//335~622行  FF 0 0 da    0x80和0x10交替    FF  0   0   c7    视频数据 
//623~624行  FF 0 0 f1    0x80和0x10交替    FF  0   0   ec    0x80和0x10交替 
                 if (cols <= 11'd283) begin
                    if (cols < 11'd3) begin
                        case (cols) 
                            0:data = 8'hff;                        //0
                            1:data = 8'h00;                        //1
                            2:data = 8'h00;                        //2
                        endcase
                    end else begin
                        if (cols==11'd3) begin
                            data = EAV(row);                       //3
                        end else begin
                            data = (cols[0] == 0) ? 8'h80 : 8'h10;  //4~283
                        end
                    end
                 end else begin
                    if (cols < 11'd287) begin
                        case (cols) 
                            284:data = 8'hff;                        //284
                            285:data = 8'h00;                        //285
                            286:data = 8'h00;                        //286
                        endcase
                    end else begin
                        if (cols==11'd287) begin
                            data = SAV(row);                         //287
                        end else begin
                            if ((row >= 22 && row <= 309) || (row >= 335 && row <= 622)) 
                                data = colorValue(cols);                //288~1727
                            else
                                data = (cols[0] == 0) ? 8'h80 : 8'h10;  //288~1727
                        end
                    end
                 end 
                 if (cols < 11'd1727) 
                    cols = cols + 1'b1;
                 else begin 
                    cols = 11'd0; 
                    hsvs = 0;
                    if (row < 10'd624) 
                        row = row + 1'b1;
                    else row = 10'd0;
                 end
         end 
    end    
assign en_d = data;
assign en_vs = hsvs;
assign en_hs = ~hsvs;
// assign colp = cols;
// assign rowp = row;


endmodule

对于有效数据行,其格式如下图所示。EAV和SAV为嵌入式控制字,分别表示有效视频的终点和起点。EAV和SAV均为4个字节构成,前3个字节FF、00、00为固定头,“XY”为控制字。“XY”的8个bit含义如下:

Bit7(Const),常数,总为1。

Bit6(F),场同步信号,表示该行数据处于奇场还是偶场。

Bit5(V),垂直同步信号,表示处于场消隐区间还是正程区间(有效数据行)。

Bit4(H),水平同步信号,表示是“SAV”还是“EAV”。

Bit3-0(P3P2P1P0),纠错位。P3=V(XOR)H;P2=F(XOR)H;P1=F(XOR)V;P0=F(XOR)V(XOR)H。

更多推荐