реклама на сайте
подробности

 
 
> Счетчик не справляется, или генератор адреса...
torik
сообщение Apr 15 2008, 06:50
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



quartus7.2, циклон 2, скорость 7...

Мне необходимо состряпать счетчик адреса, для чтения данных из памяти. Частота - 133МГц. Предварительно на симуляторе проверяю, для чего пишем такой код:

Код
input                ddr_sdram_phy_clk_out;

output        [23:0]    address_0_r;
output        [22:0]    address_0_r_x;

input                read_n;
input                waitrequest;
input                HC_VD;

assign address_0_r[23:1] = address_0_r_x;

count_adr c1        (
                    .clock(ddr_sdram_phy_clk_out),
                    .cnt_en((~read_n)&(~waitrequest)),
                    .data(24'd0),
                    .sload(~HC_VD),
                    .q(address_0_r_x)
                    );


address_0_r просто для того чтобы считать по +2. count_adr - это обычный lpm_count из мегавизарда.

Так вот, когда частота ddr_sdram_phy_clk_out до 100 МГц - все кое-как работает. Это на первом рисунке видать. А вот если ставим частоту 133МГц - уже, судя по всему не справляется - рисунок 2.

Что делать, как по-другому, "правильно", сделать генератор адреса? Да и почему счетчику такая частота не дается?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
torik
сообщение Apr 17 2008, 09:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Цитата
Если Вам без разницы, на какой частоте счетчик работает, моделируйте функционально. И 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



А то что-то застопорился на этом. Можно конечно сделать отдельные мастеры на чтение первого и второго поля и переключать строки уже после фифо, но это как-то коряво получается...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- torik   Счетчик не справляется   Apr 15 2008, 06:50
- - mse   Может чего не понял, но постарайтесь быть проще Ко...   Apr 15 2008, 07:21
- - sazh   С ассигнованиями как то странно. C lpm наверно ли...   Apr 15 2008, 08:07
- - torik   Да, этот LPM я попробовал потому что уже ничего не...   Apr 15 2008, 09:15
|- - mse   Цитата(torik @ Apr 15 2008, 13:15) Да, эт...   Apr 15 2008, 09:38
- - torik   Блин, выкладываю сам этот простейший проект. Если ...   Apr 15 2008, 09:45
|- - mse   Не понял хохмы, но вроде всё пучком... Квартус(71)...   Apr 15 2008, 10:09
|- - sazh   Цитата(torik @ Apr 15 2008, 13:45) Блин, ...   Apr 15 2008, 11:36
- - torik   Ну во-первых смотрим - почему первый фронт пропуск...   Apr 15 2008, 10:42
|- - mse   Цитата(torik @ Apr 15 2008, 14:42) Ну во-...   Apr 15 2008, 10:57
- - torik   Хм... сейчас осмыслю все, попробую в железе - скаж...   Apr 15 2008, 11:32
- - torik   Грид поправил, но это же не принципиально. О какой...   Apr 15 2008, 11:44
|- - sazh   Цитата(torik @ Apr 15 2008, 15:44) Грид п...   Apr 15 2008, 12:11
- - mse   Короче, разбираться лень, просто кину идею, шоб по...   Apr 17 2008, 10:27
- - torik   Это неоптимальная растрата памяти. Да и суммирован...   Apr 17 2008, 11:42
|- - mse   Цитата(torik @ Apr 17 2008, 15:42) Это не...   Apr 17 2008, 12:50
- - torik   Проблема решилась (еще в четверг), дело оказалось ...   Apr 20 2008, 13:32
|- - sazh   Цитата(torik @ Apr 20 2008, 17:32) Пробле...   Apr 20 2008, 14:39
- - torik   А, ну простите, сразу не понял... Но та ошибка все...   Apr 21 2008, 04:50
- - Евгений Николаев   torik, идея насчёт строки из 1024 слов, да и вообщ...   Apr 24 2008, 04:22
- - torik   Спасибо, буду иметь ввиду. К счастью пока не приде...   Apr 24 2008, 09:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 21:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016