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

Как Quartus дооптимизировал

а че с dcfifo не так? имхо, самое оно для задачи.

у меня похожая фигня была, данные с АЦП быстро заливались в фифо, потом внешний проц

запрещал запись и потихоньку вычитывал. делал на dcfifo. тактовая АЦП была около 150МГц,

для циклона с градацией -C8 вполне прилично.

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


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

Понимаете - у меня тут как раз вопрос касательно

потихоньку вычитывал

Не могли бы вы привести вашу реализацию единичного (тихенького :) ) чтения?

:help:

Я просто не могу понять отчего такая кака квартусом генерится - вроде ж всё правильно описал :crying:

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


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

Я просто не могу понять отчего такая кака квартусом генерится - вроде ж всё правильно описал :crying:

Ну где ж правильно???

Кривее, чем у Вас в исходнике придумать сложно.

Первым делом - постулат (типа "имею мнение - хрен опровергнеш" ;) ) - ПЛИСы, и особенно FPGA, предназанчены для реализации синхронных устройств.

Что у Вас :

 

process (tmp_imp, signal_to_start)

begin

if (signal_to_start='0') then

data_prepared <='0';

elsif (falling_edge(tmp_imp)) then

data_prepared <='1';

end if;

end process;

 

На тактовый вход триггера Вы подаете сигнал, генерируемый логикой - gated clock - это не есть гуд.

Да и использовать латчи в синхронных схемах вообще-то не рекомендуется.

Далее :

 

process (delay_chain, clock)

begin

if (delay_chain(0)='1' and delay_chain(1)='0') then

tmp_imp <='1';

else

tmp_imp <='0';

end if;

end process;

 

У Вас процесс будет запускаться по каждому изменению клока, хотя он в формировании выходного сигнала не участвует. С точки зрения синтеза это, может быть, это и не так страшно, но стиля описания не украшает :)

Далее:

 

process (tmp_imp,rst_signal)

begin

if (rst_signal='1') then

imp_mux <= '0';

elsif (falling_edge(tmp_imp)) then

imp_mux <='1';

end if;

end process;

 

Опять махровая асинхронщина - сигнал сброса (асинхронный) участвует в формировании выходного сигнала. Такой сброс хорошо использовать только для общего сброса или начальной установки всей системы.

 

В общем, как в старом анекдоте : "Если думаешь, говоришь, пишешь, и подписываешь - то не удивляйся !" :lol:

 

И еще, хочется процитировать уважаемого yes (хоть и про варнинги было сказано, но и тут в тему) :

 

если квартус варнинг выдал

побыстрее болт забейте

что за глупая софтина

человек умней его

 

ну и подробнее там : http://www.telesys.ru/wwwboards/vhdl/61/messages/37364.shtml

 

Ну а насчет LUT на входе - ну добавил и добавил, никакой логики там нет. Это уж Вы так констрейны задали (или не задали ;) )

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


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

2 Stewart Little - спасибо за критику - критика всегда полезна :)

А касательно ваших замечаний

1) на тактовый вход триггера я подаю сигнал, генерируемый логикой - ну так , а если мне нужно его "защёлкнуть" так сказать - как мне поступать ?

2) касательно использования латчей в синхронных схемах - а где вообсче про это можно почитать ?

3) process (delay_chain, clock) - а как бы вы поступили в этом случае ?

4) ну и касательно вашего последнего замечания про "махроваю асинхронщину" - сигнал сброса (асинхронный) участвует в формировании выходного сигнала, а общий сброс ситемы не есть ли тоже частью формирования выходного сигнала ?

 

Да и на счёт варнингов - когда синтезирую данную конструкцию - их не наблюдается

 

А вообсче я так понял надо прочитать Recommended coding style от Altera. Наверно печерпну полезного...

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


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

2 Stewart Little - спасибо за критику - критика всегда полезна :)

А касательно ваших замечаний

1) на тактовый вход триггера я подаю сигнал, генерируемый логикой - ну так , а если мне нужно его "защёлкнуть" так сказать - как мне поступать ?

2) касательно использования латчей в синхронных схемах - а где вообсче про это можно почитать ?

3) process (delay_chain, clock) - а как бы вы поступили в этом случае ?

4) ну и касательно вашего последнего замечания про "махроваю асинхронщину" - сигнал сброса (асинхронный) участвует в формировании выходного сигнала, а общий сброс ситемы не есть ли тоже частью формирования выходного сигнала ?

 

Да и на счёт варнингов - когда синтезирую данную конструкцию - их не наблюдается

 

А вообсче я так понял надо прочитать Recommended coding style от Altera. Наверно печерпну полезного...

 

Дополнительно можешь почитать

 

http://electronix.ru/forum/index.php?showt...18207&st=45

 

и

 

http://electronix.ru/forum/index.php?showt...48792&st=30

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


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

2 Maverick - почитаемс, может поменяется подход..

Хотя мне всё же кажется , что реализация с 2-х лутов и 4-х тригеров (как я привёл) - наименьшая разумная...

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


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

Да и на счёт варнингов - когда синтезирую данную конструкцию - их не наблюдается

Наблюдается. Один клок skew чего стоит.

Чего проще - работать на одной системной частоте. Тогда clk_enable сам самбой получается.

Вот пример. Он базовый для любой разработки для перехода из одного клокового домена в другой.

именно на нем реализованы интерфейсы для декодирования несущего клока, замешанного в потоке приемных данных. Фактически это Ваше фифо для связи с процессором.

Почаще смотрите не на луты, а в RTL просомтрщик.

 

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

 

entity in_out_data is

port(

global_clk, in_clk_a, in_clk_b : in std_logic;

input_data : in std_logic_vector(7 downto 0);

out_data : out std_logic_vector(7 downto 0);

out_clk : out std_logic);

end in_out_data;

 

architecture archi of in_out_data is

signal data_rg : std_logic_vector(7 downto 0);

signal sdvig_in_rg, sdvig_out_rg : std_logic_vector(2 downto 0);

signal e_wr_rg, e_rd_rg : std_logic;

begin

process (global_clk)

begin

if rising_edge(global_clk) then

sdvig_in_rg <= sdvig_in_rg(1 downto 0) & in_clk_a;

sdvig_out_rg <= sdvig_out_rg(1 downto 0) & in_clk_b;

if (e_wr_rg = '1') then

data_rg <= input_data;

end if;

if (e_rd_rg = '1') then

out_data <= data_rg;

end if;

end if;

end process;

out_clk <= in_clk_b;

e_wr_rg <= sdvig_in_rg(1) and not sdvig_in_rg(2);

e_rd_rg <= not sdvig_out_rg(1) and sdvig_out_rg(2);

end archi;

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


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

2 sazh - спасибо за примерчик.

Вроде всё ясно - дискретизируем данные согласно клока.

Поробую переработать под такую логику.

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


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

Понимаете - у меня тут как раз вопрос касательно

 

Не могли бы вы привести вашу реализацию единичного (тихенького :) ) чтения?

:help:

Я просто не могу понять отчего такая кака квартусом генерится - вроде ж всё правильно описал :crying:

эмм.. а чего пример? как контроллером ножкой мигнуть? ну диаграмки посмотрите в ug_fifo.

если внешнее устройство плис-то лучше с одним клоком, как уже неоднокоатно отмечалось.

если клоки принципиально разные, то dc_fifo. и все операции чтения синхронизировать с клоком чтения

(sazh пример привел), и чтоб никаких латчей ). если внешнее устройство - контроллер, то там автоматически

все мигания ножками синхронные ;)

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


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

2 vadimuzzz - та ужо сам разобрался - сделал синхронный дизайн - ничего так получился.И квартус его кушает по человечески(без всяких skew). Осталось только нормально сделать пропускание 1-го импульса.

 

А на счёт skew - может мне кто нибудь объяснить - чем он так плох в той реализации?

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


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

1) на тактовый вход триггера я подаю сигнал, генерируемый логикой - ну так , а если мне нужно его "защёлкнуть" так сказать - как мне поступать ?

Ну вот, уже все растолковали :)

По данному конкретному вопросу "что делать" - подавать такой сигнал на вход разрешения триггера.

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


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

И всё таки - может мне кто нибудь объяснить - почему так плохо подавать сигнал с лута на клоковый вход тригера ? Что такого страшного получается ?

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


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

И всё таки - может мне кто нибудь объяснить - почему так плохо подавать сигнал с лута на клоковый вход тригера ? Что такого страшного получается ?

Потому, что специальные клоковые пути специально выровнены по задержкам, т.ч. фронт клока приходит на триггеры одновременно, где бы на кристалле триггер не находился. Если же брать сигнал с выхода LUT, то этот сигнал по отношению к глобальному клоку будет сдвинут по фазе на неопределенную величину. В этом случае у вас появится еще один клоковый домен и вылезут все традиционные проблемы с этим связанные - если ничего не предпринимать, то метастабильность и сбои в работе.

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


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

Я же не замешиваю это сигнал с клоковым??

Хотя асинхронность и разные клоки в принципе наблюдается..

А где можно почитать про эти самые проблемы и что нужно предпринимать по этому поводу?

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


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

Вроде разгрёбся немного и закончил примитивненький компонент.

Имеем такой генератор разрешающих импульсов:

post-25329-1216799420_thumb.jpg

Прицепил его

single_imp_generator.vhd

Вот временная диаграмка поведения:

post-25329-1216799982_thumb.jpg

То есть то что надо как раз.

Однако если встраивать в периферию (её я тож кстати подредактировал - убрал как было с клоковых входов и поставил на enable входы сигналы) - то получаю каку - по ходу задом на перёд сабака работать начинает :07:

post-25329-1216800353_thumb.jpg

Периферию специально сделал примитивную. Вот прицепил слэйв компонент для авалона

mp.zip

там и CVWF - поведение сразу.

Там всё просто - должно ж отрабатываться - а тут так. И уже вроде и не асинхронно - клокирую всё тактовым(запрос на чтение забиваю по тактовой в сдвиговый регистр и далее логика, выдача флага готовности тоже с клоком синхронизировано)...

Не могу понять - что опять он там наоптимизировал ? :wacko:

Уже вроде и skew отсутствует...

:help:

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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