Цитата
Если Вам без разницы, на какой частоте счетчик работает, моделируйте функционально. И XXX тоже не будет.
Нет смысла рассматривать диаграмму с некорректным grid size.
В среде временного моделирования есть опция setup and hold time ........
для анализа времени установления и удержания данных относительно клока.
Если времена не корректны, будут xxxxxx.
В вашем частном случает, если входные управляющие сигналы через регистры пропустить, xxxx пропадут. Или корректно входные воздействия рисуйте.
Если в основном проекте при временном моделировании получаете xxxx, а при функциональном все хорошо, значит с проектом облом. (При наличии галочки и реально выставленном периоде клока)
Итак, на счет некорректного grid size - результат симуляции от него не зависит, но согласен - должен быть порядок, откорректировал...
Промоделировал функционально - все нормально. Теперь временной анализ. Тоже все впорядке! На самом деле "ХХХ" появились не из-за проблем с частотами, а из-за того что при синтезе и оптимизаци компилятор упростил схему и часть выходов регистра была заменена на "провода". "ХХХ" я убрал, т.к. стал прибавлять на 1, а не на 2...
Но все равно получаю облом. Задача в целом такая:
- все сделано на основе отладки "Nios II Embedded Evaluation Kit, Cyclone III Edition"
- с камеры картинка пишется в DDR память. Общее разрешение 576*800, по 16 бит на цвет (565). Т.к. развертка черезстрочная, в памяти получаем поле1 по адресам 0...(288*800*2-2), поле2 по адресам 288*800*2...(576*800*2-2). Запись происходит нормально, это точно.
- контроллер DDR памяти в SOPS Builder, для чтения/записи использую простейший мастер (выводы шины авалон на верхний уровень, уже обсуждал здесь на форуме, применяется успешно)
- для вывода на экран просто генерируем адрес чтения 0...(576*800*2-2). При этом на экране наблюдаем поле1 и поле2 раздельно, как бы два сжатых по вертикали кадра. Все стабильно работает, никаких сбоев...
-
остается сделать деинтерлейсер. Для этого по идее надо читать в следующем порядке:
Код
(0*800*2)...(1*800*2-2), (288*800*2)...(289*800*2-2), (1*800*2)...(2*800*2-2)...
Вот тут-то и начинаются проблемы - второе поле вообще куда-то теряется, если два раза повторять каждую строчку одного поля - видим словно пропадание строк. Такое впечатление, что адрес некорректно задается, но на симуляторе (естественно при меньших цифрах) смотрел - все в норме вроде. Кроме того если вывод на монитор выполнять с помощью SGDMA и других приблкд в сопсбилдере, тоже все идет нормально (но этот вариант не подходит).
Поглядите, может я где-то принципиально, в алгоритме или коде делаю ошибку?
Код
wire [23:0] address_0_r;
wire [22:0] address_0_rx;
assign address_0_r[23:0] = {address_0_rx,1'b0};
sdfgsdfg dddd1 (
.iclk(ddr_sdram_phy_clk_out),
.irst_n(HC_VD),
.ena((~read_n)&(~waitrequest)),
.iadr_add(adr_add),
.oadr(address_0_rx)
);
wire [22:0] adr_add;
adr_add dddd2 (
.iclk(ddr_sdram_phy_clk_out),
.irst_n(HC_VD),
.ena((~read_n)&(~waitrequest)),
.oadr_add(adr_add)
);
module sdfgsdfg (
iclk,
irst_n,
ena,
iadr_add,
oadr
);
input iclk;
input irst_n;
input ena;
input [22:0] iadr_add;
output [22:0] oadr;
reg [22:0] oadrx;
assign oadr = oadrx;
always @(posedge iclk or negedge irst_n) begin
if (!irst_n) begin
oadrx <= 23'd0;
end else begin
if (ena == 1'b0)
oadrx <= oadrx;
else
oadrx <= oadrx + iadr_add;
end
end
endmodule
module adr_add (
iclk,
irst_n,
ena,
oadr_add
);
input iclk;
input irst_n;
input ena;
output reg [22:0] oadr_add;
reg [22:0] sta_dop;
always @(posedge iclk or negedge irst_n) begin
if (!irst_n) begin
sta_dop <= 23'd0;
end else begin
if (sta_dop < /*23'd9*/23'd1599) begin
if (ena == 1'b1) //4*pix-2 (4*800-2 = 3198)
sta_dop <= sta_dop + 23'd1;
else
sta_dop <= sta_dop;
end else
sta_dop <= 0;
end
end
always @(posedge iclk or negedge irst_n) begin
if (!irst_n)
oadr_add <= 23'd1;
else begin
oadr_add <= (sta_dop == 23'd798) ? 23'd229601 :
((sta_dop == 23'd1598) ? 23'h7c7c01 : 23'd1);
end
end
endmodule
А то что-то застопорился на этом. Можно конечно сделать отдельные мастеры на чтение первого и второго поля и переключать строки уже после фифо, но это как-то коряво получается...