`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。
