Доделываю этот проект: http://electronix.ru/forum/index.php?showt...126809&st=0
Суть в следующем, есть частота 40МГц (разрешение 800/600 60Гц), вертикальные и горизонтальные синхроимпульсы от AD9984А. Использую эту частоту для записи в SRAM, т.е. открываю буфер, OE, CE, LB и UB подтянуты к земле.
Регистрирую нажатие кнопки, определяющей будет ли производится запись в буфер или чтение. Записываю состояние во время смены кадра, когда Vsync = 0.
Далее, если кнопка отпущена, в следующем цикле поднимаю OE в 1, закрываю буфер (режим чтения). В каждом такте меняю адрес.
Но по факту данные то ли не пишутся или же не читаются из памяти, экран просто черный.
Память 100Мгц (IS61WV51216EDBLL), пробовал меньшее разрешение, все то же самое.
p.s. Есть некоторое непонимание по поводу валидности данных на выходе AD9984. Судя по таймингу, валидные данные появляются через 6 циклов после регенерированного HSOUT:
Нажмите для просмотра прикрепленного файла
В таком случае непонятно, куда делся передний порог в N пикселей:
Нажмите для просмотра прикрепленного файла
Однако это не объясняет проблем с памятью. Пересмотрел тайминги по 10 раз, чувствую, будто на поверхности ответ. Буду рад любому совету.
Код на verilog:
Код
module Capture_Logic
(
input wire pclk,
input wire rst,
input wire hsync,
input wire vsync,
input wire pb_state, // '1' as long as PB is down
output wire [18:0] sram_addr,
output wire sram2_nWE,
output wire sram2_nOE,
output wire buffer2_nOE
);
//
localparam TOTAL_PXL_IN_A_ROW = 800;
reg pb_saved;
reg [9:0] row_pxl_cntr;
reg [18:0] address;
reg vback_dis;
reg pixel_cntr_en;
wire sram2_rw;
//
assign sram2_rw = pb_saved ? 1 : pclk;
assign sram2_nWE = pixel_cntr_en ? sram2_rw : 1;
assign sram2_nOE = pb_saved ? 0 : 1;
assign buffer2_nOE = pb_saved ? 1 : 0;
assign sram_addr = address;
// latch pushbutton state during vertical sync period
always @ (negedge pclk or posedge rst) begin
if (rst) begin
pb_saved <= 1;
end
else if (vsync == 0) begin
pb_saved <= !pb_state;
end
end
// framebuffer address counter
always @ (negedge pclk or posedge rst) begin
if (rst) begin
address <= 0;
end else begin
if (vsync == 0) begin
address <= 0;
end else if (pixel_cntr_en) begin
address <= address + 1;
end
end
end
// enable pixel counter
always @ (negedge pclk or posedge rst) begin
if (rst) begin
pixel_cntr_en <= 0;
end else if (hsync == 0) begin
pixel_cntr_en <= 0;
end else begin
if ((row_pxl_cntr > 3'b110) && (row_pxl_cntr < 10'h320)) begin
pixel_cntr_en <= 1;
end else begin
pixel_cntr_en <= 0;
end
end
end
// input data delay counter
always @ (negedge pclk or posedge rst) begin
if (rst) begin
row_pxl_cntr <= 0;
end else begin
if (hsync == 0) begin
row_pxl_cntr <= 0;
end else begin
if (vback_dis == 0) begin
row_pxl_cntr <= row_pxl_cntr + 1;
end else begin
row_pxl_cntr <= 0;
end
end
end
end
// vsync bakc porch data disable check
always @ (negedge pclk or posedge rst) begin
if (rst) begin
vback_dis <= 1;
end else begin
if (vsync == 0) begin
vback_dis <= 1;
end else if (hsync == 0) begin
vback_dis <= 0;
end
end
end
endmodule
(
input wire pclk,
input wire rst,
input wire hsync,
input wire vsync,
input wire pb_state, // '1' as long as PB is down
output wire [18:0] sram_addr,
output wire sram2_nWE,
output wire sram2_nOE,
output wire buffer2_nOE
);
//
localparam TOTAL_PXL_IN_A_ROW = 800;
reg pb_saved;
reg [9:0] row_pxl_cntr;
reg [18:0] address;
reg vback_dis;
reg pixel_cntr_en;
wire sram2_rw;
//
assign sram2_rw = pb_saved ? 1 : pclk;
assign sram2_nWE = pixel_cntr_en ? sram2_rw : 1;
assign sram2_nOE = pb_saved ? 0 : 1;
assign buffer2_nOE = pb_saved ? 1 : 0;
assign sram_addr = address;
// latch pushbutton state during vertical sync period
always @ (negedge pclk or posedge rst) begin
if (rst) begin
pb_saved <= 1;
end
else if (vsync == 0) begin
pb_saved <= !pb_state;
end
end
// framebuffer address counter
always @ (negedge pclk or posedge rst) begin
if (rst) begin
address <= 0;
end else begin
if (vsync == 0) begin
address <= 0;
end else if (pixel_cntr_en) begin
address <= address + 1;
end
end
end
// enable pixel counter
always @ (negedge pclk or posedge rst) begin
if (rst) begin
pixel_cntr_en <= 0;
end else if (hsync == 0) begin
pixel_cntr_en <= 0;
end else begin
if ((row_pxl_cntr > 3'b110) && (row_pxl_cntr < 10'h320)) begin
pixel_cntr_en <= 1;
end else begin
pixel_cntr_en <= 0;
end
end
end
// input data delay counter
always @ (negedge pclk or posedge rst) begin
if (rst) begin
row_pxl_cntr <= 0;
end else begin
if (hsync == 0) begin
row_pxl_cntr <= 0;
end else begin
if (vback_dis == 0) begin
row_pxl_cntr <= row_pxl_cntr + 1;
end else begin
row_pxl_cntr <= 0;
end
end
end
end
// vsync bakc porch data disable check
always @ (negedge pclk or posedge rst) begin
if (rst) begin
vback_dis <= 1;
end else begin
if (vsync == 0) begin
vback_dis <= 1;
end else if (hsync == 0) begin
vback_dis <= 0;
end
end
end
endmodule