// Генератор развёрток для TFT зкрана 800х480 точек
module TFT_800x480
(
input wire cnt_clock, //Вход тактовой
output reg Den = 0, //Data Enable
output reg h_sinc = 1, // Horizontal syncronization
output reg v_sinc = 1, // Vertical syncronization
output wire [9:0] x_addr, // Column address (адрес столбца)
output wire [8:0] y_addr // Row address - ScreenY/8 (адрес строки)
);
//*********************************************
parameter ScreenX = 800; // Размер полезной области экрана по X
parameter ScreenY = 480; // Размер полезной области экрана по Y
parameter FrontPorchX = 210;// Задержка от синхроимпульса до начала строки(16-210-354)40
parameter FrontPorchY = 22; // Задержка от синхроимпульса до начала кадра(7-22-147)13
parameter PulseX = 10; // Длина строчного синхроимпульса(1---40)48
parameter PulseY = 10; // Длина кадрового синхроимпульса(1---20)3
parameter BlankX = 46; // Задержка от конца строки до синхроимпульса по X(46-46-46)
parameter BlankY = 23; // Задержка от конца кадра до синхроимпульса по Y(23-23-23)
//*********************************************
assign x_addr[9:0] = hcnt[9:0]; assign y_addr[8:0] = vcnt[8:0]; // Подключение шины адреса
//*********************************************
/*---------------------------------------------
Видеокарта и синхросигналы
---------------------------------------------*/
reg [10:0] hcnt = 0; reg [9:0] vcnt = 0;
reg h_blank = 0; reg v_blank = 0;
wire D_en = ~(h_blank | v_blank);
//=============================================
reg [1:0] clk_div = 0;
always @(posedge cnt_clock) begin // Задержка на 1.5 такта
{Den, clk_div} <= {clk_div, D_en};
end //always
//=============================================
wire wh_sc1 = (hcnt == ScreenX); // Размер экрана по горизонтали
wire wh_sc4 = (hcnt == ScreenX+FrontPorchX+BlankX); // Конец строки // Конец импульса гашения
wire wv_sc1 = (vcnt == ScreenY); // Размер экрана по вертикали
wire wv_sc4 = (vcnt == ScreenY+FrontPorchY+BlankY); // Конец импульса гашения
//=============================================
always @(posedge cnt_clock) begin
hcnt <= hcnt + 1; // Инкремент счётчика точек в строке
if (wh_sc4) begin // Конец строки
vcnt <= vcnt + 1; // Инкремент счётчика строк
hcnt <= 0;
if (wv_sc4) vcnt <= 0;
end //if
end //always
//=============================================
always @(negedge cnt_clock) begin
if (wh_sc1) begin // Определяем размер экрана по горизонтали
h_blank <= 1; // Установка флага гашения
end else if (wh_sc4) begin // Конец строки
h_blank <= 0; // Конец импульса гашения
if (wv_sc1) begin // Определяем размер экрана по вертикали
v_blank <= 1; // Начало импульса гашения
end else if (wv_sc4) begin
v_blank <= 0; // Конец импульса гашения
end
end //if
end //always
//=============================================
endmodule
//*********************************************
[свернуть]