sevareva 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба Под StratixII применяю самописный компонент-декодер BT.656-потока с платы АЦП видеокамеры. Его полный код: module test_BT_decoder (clk,address,writedata,write,read,chipselect,readdata,bt_clk,avid,Y,leds,rst, irq); parameter BUF_BITS = 11; parameter BUF_SIZE = 1450; input clk; // avalon (dma) input [BUF_BITS-1:0] address; input chipselect; input read; input write; input [31:0] writedata; output reg [31:0] readdata; // BT_decoder input bt_clk; input avid; input [ 9:0] Y; output wire irq; input rst; // data reg [BUF_BITS-1:0] ptr2; reg [ 9:0] buffer0 [0:BUF_SIZE]; reg [ 9:0] buffer1 [0:BUF_SIZE]; reg ptr1; wire cli; reg chngptr1; assign irq = (ptr2 == 'd1449 && !cli) ? 1:0; assign cli = (read && chipselect) ? 1:0; //передача по DMA always @(posedge clk) begin if (read && chipselect) begin if (!ptr1) readdata = buffer1[address]; else readdata = buffer0[address]; end end //чтение BT always @(posedge bt_clk or posedge rst) begin if (rst) begin ptr1 <= 0; ptr2 <= 'd10; chngptr1 <= 0; end else if (avid) begin if (!chngptr1) begin ptr2 <= 'd10; chngptr1 <= 1; end if (!ptr1) buffer0[ptr2] <= Y; else buffer1[ptr2] <= Y; ptr2 <= ptr2 + 1; end else if (chngptr1) begin chngptr1 <= 0; //ptr1 <= ~ptr1; //if (ptr1==1) ptr1<=0; else ptr1<=1; end end endmodule В данном варианте компиляция длится ок. 8 мин. В действительности же в конце второго блока always мне необходимо менять значение ptr1 на противоположное, раскомментировав одну из двух строк. Если это сделать, то время компиляции резко увеличивается до 40 мин. Причем, даже если ptr1 не будет использоваться нигде в коде, проблема остается. Настройки компиляции стандартные (неизмененные). Списки warning'ов обеих компиляций прикрепил. Возможно, кто-либо увидит явную проблему или сможет что-нибудь посоветовать? Спасибо. code_copy.v Warnings__fast_compilation_.txt Warnings__slow_compilation_.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба Причем, даже если ptr1 не будет использоваться нигде в коде, проблема остается. А Вы напишите, как выглядит Ваш код, когда та строчка раскомментирована, а prt1 больше нигде не используется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sevareva 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 (изменено) · Жалоба А Вы напишите, как выглядит Ваш код, когда та строчка раскомментирована, а prt1 больше нигде не используется. code_copy.v Изменено 7 сентября, 2010 пользователем Veg@ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба Сорри, пример оказался рабочим. Жестко Вы с буферами. Они же не влезут сами в блоки памяти. А по времени компиляции, думается, он в первом случае выкидывал весь Ваш декодер (так как указатель не менялся) и компилировал проект системы на кристалле, а во втором старательно рассовывал ~30 тысяч триггеров по кристаллу в дополнение к этому. И еще я на всякий случай хотел уточнить. Вот это: //ptr1 <= ~ptr1; //if (ptr1==1) ptr1<=0; else ptr1<=1; Это же разные вещи... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sevareva 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 (изменено) · Жалоба Жестко Вы с буферами. Они же не влезут сами в блоки памяти.Т.е. такого размера буфер не реализуют на ПЛИС? Как тогда поступают в случае, если очень надо? А по времени компиляции, думается, он в первом случае выкидывал весь Ваш декодер (так как указатель не менялся), а во втором старательно рассовывал ~30 тысяч триггеров по кристаллу.По крайней мере, результат работы в обоих случаях одинаков. Это же разные вещи... :blink: Изменено 7 сентября, 2010 пользователем Veg@ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба Я думаю в данном случае мегавизард+2х-портовка спасут отца русской демократии :laughing: На счёт первого случая и второго - думаю под первым нужно понимать ваш код приведённый с 1-м посте, а вторым - выложенный позднее с раскомментированными строчками :rolleyes: в сообщении номер 3 Для не 1 битного регистра, это //ptr1 <= ~ptr1; //if (ptr1==1) ptr1<=0; else ptr1<=1; действительно разные вещи Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба По крайней мере, результат работы в обоих случаях одинаков. В смысле результат одинаков? Без модификации ptr1 и с ней? И он правильный? И объем проекта тоже одинаков? Буфера ложатся в блочную память или реализуются в регистрах? По ptr1 - да, перепутал с ptr2. :rolleyes: Если я хочу что-то положить в блочную память, я делаю мастером модуль памяти. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sevareva 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба Я думаю в данном случае мегавизард+2х-портовка спасут отца русской демократииЧто это? действительно разные вещиЯ не сомневаюсь, что это так. Как будет верно? Похоже, я ошибался в первом посте на счет медленной компиляции при неиспользуемом ptr1. Но ptr1 необходимо менять - проблема остается. В смысле результат одинаков? Без модификации ptr1 и с ней? И он правильный? И объем проекта тоже одинаков? Буфера ложатся в блочную память или реализуются в регистрах?Результат работы с изменением ptr1, но разным временем компиляции. Как определить способ реализации памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба Я не сомневаюсь, что это так. Как будет верно? Верно что? :) Вы сделайте "мысленную трасировку" возьмите, например, ptr равным и примените операторы из одного куска Вашего кода, а потом из другого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба Что это? Имелось ввиду вот это: Идея в общих чертах заключается в том чтобы рулить адресами и WR/RD сигналами 2-х портовой памятим. Потому что у вас сейчас вся ваша кухня реализуется на тригерах и лутах, отого и час колбасит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 7 сентября, 2010 Опубликовано 7 сентября, 2010 · Жалоба Как будет верно? Для однобитной переменной, конечно, без разницы, как. IMHO, ptr1=~ptr1 как-то понятнее, так как в случае с if Вы присваиваете однобитной переменной 32-х разрядное целое число. Оно обрезается до 1 бита. В обоих случаях получается 0-1-0-.... Я при беглом просмотре кода подумал, что и ptr1, и ptr2 многоразрядные. Там, естественно, получается по разному. Кстати, в плане читаемости не стоило так называть два указателя с разной разрядностью и объявлять их в разных местах. Замечу, что если оно не работает как надо, то проблема не в том, на каких ресурсах реализуется память, а в том, что манипуляция адресами происходит как-то неправильно. Прогоните в симуляции процесс записи - все сразу станет видно. Как определить способ реализации памяти? Посмотреть отчет компилятора или в навигаторе проекта в иерархии. Вы делаете два буфера, которые пишете/читаете пинг-понгом. Один, насколько понимаю, выводите на шину системы на кристалле как avalon slave. Вам правильно посоветовали запустить мегавизард и настроить RAM, dual-port. В данном модуле останется только адресация и создание экземпляра модуля памяти. Но так как сейчас у Вас описана асинхронная память, а в StratixII это сделать не получится, то логику управления адресами придется переработать на чтение/запись памяти с синхронными входами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 сентября, 2010 Опубликовано 8 сентября, 2010 · Жалоба Жестко Вы с буферами. Они же не влезут сами в блоки памяти. влезли бы, если бы не вот этот мультиплексор на выходе if (!ptr1) readdata = buffer1[address]; else readdata = buffer0[address]; 2 Veg@ хороший, поведенческий способ лечения это сделать так reg [ 9:0] buffer0 [0:BUF_SIZE*2]; .... readdata <= buffer[{~ptr1,address}]; .... buffer1[{ptr1,ptr2}] <= Y; т.е. заменить мультиплексирование блоков памяти, на расширенную адресацию (что логически правильно). и ничего не надо генерить %) ЗЫ. квартус же вас предупреждает что вы сделали не так Info: Found 2 instances of uninferred RAM logic Info: RAM logic "buffer0" is uninferred due to asynchronous read logic Info: RAM logic "buffer1" is uninferred due to asynchronous read logic ЗЗЫ. В посте, в исходном коде порт leds не объявлен ЗЗЫ. Ваша система будет работать без сбоев только в случае если проц будет читать много быстрее чем данные будут писаться. Тормоза проца могут выйти боком %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться