Перейти к содержанию
    

Время компиляции

Под 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 Причем, даже если ptr1 не будет использоваться нигде в коде, проблема остается. 

А Вы напишите, как выглядит Ваш код, когда та строчка раскомментирована, а prt1 больше нигде не используется.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Вы напишите, как выглядит Ваш код, когда та строчка раскомментирована, а prt1 больше нигде не используется.

code_copy.v

Изменено пользователем Veg@

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сорри, пример оказался рабочим.

Жестко Вы с буферами. Они же не влезут сами в блоки памяти. А по времени компиляции, думается, он в первом случае выкидывал весь Ваш декодер (так как указатель не менялся) и компилировал проект системы на кристалле, а во втором старательно рассовывал ~30 тысяч триггеров по кристаллу в дополнение к этому.

 

И еще я на всякий случай хотел уточнить. Вот это:

//ptr1 <= ~ptr1;

//if (ptr1==1) ptr1<=0; else ptr1<=1;

Это же разные вещи...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жестко Вы с буферами. Они же не влезут сами в блоки памяти.
Т.е. такого размера буфер не реализуют на ПЛИС? Как тогда поступают в случае, если очень надо?

А по времени компиляции, думается, он в первом случае выкидывал весь Ваш декодер (так как указатель не менялся), а во втором старательно рассовывал ~30 тысяч триггеров по кристаллу.
По крайней мере, результат работы в обоих случаях одинаков.

Это же разные вещи...
:blink:
Изменено пользователем Veg@

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я думаю в данном случае мегавизард+2х-портовка спасут отца русской демократии :laughing:

 

На счёт первого случая и второго - думаю под первым нужно понимать ваш код приведённый с 1-м посте, а вторым - выложенный позднее с раскомментированными строчками :rolleyes: в сообщении номер 3

 

Для не 1 битного регистра, это

//ptr1 <= ~ptr1;
//if (ptr1==1) ptr1<=0; else ptr1<=1;

действительно разные вещи

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По крайней мере, результат работы в обоих случаях одинаков.

В смысле результат одинаков? Без модификации ptr1 и с ней? И он правильный? И объем проекта тоже одинаков? Буфера ложатся в блочную память или реализуются в регистрах?

По ptr1 - да, перепутал с ptr2. :rolleyes:

Если я хочу что-то положить в блочную память, я делаю мастером модуль памяти. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я думаю в данном случае мегавизард+2х-портовка спасут отца русской демократии
Что это?

действительно разные вещи
Я не сомневаюсь, что это так. Как будет верно?

 

Похоже, я ошибался в первом посте на счет медленной компиляции при неиспользуемом ptr1. Но ptr1 необходимо менять - проблема остается.

 

В смысле результат одинаков? Без модификации ptr1 и с ней? И он правильный? И объем проекта тоже одинаков? Буфера ложатся в блочную память или реализуются в регистрах?
Результат работы с изменением ptr1, но разным временем компиляции. Как определить способ реализации памяти?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не сомневаюсь, что это так. Как будет верно?

Верно что?  :)

 

Вы сделайте "мысленную трасировку" возьмите, например, ptr равным и примените операторы из одного куска Вашего кода, а потом из другого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что это?

Имелось ввиду вот это:

post-25329-1283897776_thumb.png

Идея в общих чертах заключается в том чтобы рулить адресами и WR/RD сигналами 2-х портовой памятим. Потому что у вас сейчас вся ваша кухня реализуется на тригерах и лутах, отого и час колбасит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как будет верно?

Для однобитной переменной, конечно, без разницы, как. IMHO, ptr1=~ptr1 как-то понятнее, так как в случае с if Вы присваиваете однобитной переменной 32-х разрядное целое число. Оно обрезается до 1 бита. В обоих случаях получается 0-1-0-.... Я при беглом просмотре кода подумал, что и ptr1, и ptr2 многоразрядные. Там, естественно, получается по разному. Кстати, в плане читаемости не стоило так называть два указателя с разной разрядностью и объявлять их в разных местах.

 

Замечу, что если оно не работает как надо, то проблема не в том, на каких ресурсах реализуется память, а в том, что манипуляция адресами происходит как-то неправильно. Прогоните в симуляции процесс записи - все сразу станет видно.

 

Как определить способ реализации памяти?

Посмотреть отчет компилятора или в навигаторе проекта в иерархии.

 

Вы делаете два буфера, которые пишете/читаете пинг-понгом. Один, насколько понимаю, выводите на шину системы на кристалле как avalon slave. Вам правильно посоветовали запустить мегавизард и настроить RAM, dual-port. В данном модуле останется только адресация и создание экземпляра модуля памяти.

 

Но так как сейчас у Вас описана асинхронная память, а в StratixII это сделать не получится, то логику управления адресами придется переработать на чтение/запись памяти с синхронными входами.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жестко Вы с буферами. Они же не влезут сами в блоки памяти.

влезли бы, если бы не вот этот мультиплексор на выходе

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 не объявлен

 

ЗЗЫ. Ваша система будет работать без сбоев только в случае если проц будет читать много быстрее чем данные будут писаться. Тормоза проца могут выйти боком %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...