Jump to content

    

iiv

Свой
  • Content Count

    2271
  • Joined

  • Last visited

Everything posted by iiv


  1. Благодарю Вас за ответы и советы! и так по минимуму :) Будьте любезны, разъясните, пожалуйста, как это делается. Вот получил я, например, fmax=330MHz вместо ожидаемых 400МГц. И как я это исправлю, куда смотреть? Спасибо
  2. один в один как у меня было, пока я в проект памяти не напихал, а сейчас и это не помогает.
  3. С Вашим советом я полностью согласен, но, и модуль два умножения плюс сложение - это системная процедура altmult_add, и на входе по два регистра, и на выходе по два... Проверял - больше двух - уже не помогает. Это я уже прошел. Иначе 490МГц я бы не получал!!! И даже если у меня только умножительный модуль, но забитый под 70-80%, то я тоже получаю необходимые мне 400МГц, и ОТДЕЛЬНО, модуль с памятью, тоже нормально работает. Кстати, у меня память работает только на 1/6 от основного клока, то есть мне достаточно клока в 66МГц на запись, а на чтение и того меньше - всего-то 15МГц. Основная проблема возникает только при объединении двух модулей - такое чувство, что квартус не в сосотянии решить такую сложную задачу по размещению - фиттер висит по 5 часов а иногда падает с системной ошибкой. Как Вы думаете, на что еще кроме логик лок стоит обратить внимание (я уже начал разбираться с логик лок, но пока не помогает...) Спасибо И Спасибо Вам большое, разбираюсь в этом направлении, надеюсь поможет!
  4. Всем привет, есть незадачка - мой системверилог проект очень долго компилится (2-5 часов) и не всегда его fmax бывает приемлим. Сам проект - всего-то около 600 строк без ниоса и наворотов, используется только мегафункции памяти (M9K, M144), altpll и altmult_add. В самом проекте есть два параметра, назову из K и M, где K - это объем кольцевого буффера памяти, M - число использующихся умножителей. Если K примерно 70% от всей доступной памяти, M - 10% от всех доступных умножителей, fmax на основной клок получается хороший (490МГц). Компилится все около часу на хорошем i5. Если 1) K примерно 10-20% от всей доступной памяти, M - любое, или 2) K и M примерно по 30%, fmax получается еще приемлимый, окло 400МГц (мне не меньше надо) но компилится уже около 2-5 часов. Если я пытаюсь задействовать почти все умножители и хотя бы 70% памяти, то обычно квартус через 1-2 часа падает со своей какой-то внутренней ошибкой или через 5-7 часов все-таки заканчивает работу, но fmax получается очень маленьким - около 300МГц. Алгоритмически все упирается в одну простую конструкцию: ... parameter N=42; input Clk; input [13:0] In[0:2]; ... reg signed [13:0] D[0:2][0:1]; reg signed [13:0] Data[0:2][0:N]; wire signed [31:0] ScalY[0:8][0:N-1]; ... // Generating modules generate genvar i, j, k; for(i=0; i<N; i+=2) begin : aaa for(j=0; j<3; j++) begin : bbb for(k=0; k<3; k++) begin : ccc MultOne MultOne_Module(Clk, D[j][0], D[j][1], Data[k][i], Data[k][i+1], Clk2, ScalY[j+3*k][i], ScalY[j+3*k][i+1]); end end end endgenerate ... module MultOne(Clk, A1, A2, B1, B2, Clk2, Res1, Res2); parameter SHR=18; input Clk, Clk2; input signed [13:0] A1, A2, B1, B2; output reg signed [31:0] Res1, Res2; reg signed [13:0] P1, P2, Q1, Q2; reg signed [28:0] Sum; reg signed [28:0] SumR0, SumR1, SumR2, SumDM0, SumDM1; reg signed [28+SHR:0] ScalX1, ScalX2; reg signed [31:0] Z_Res1, Z_Res2; // Sum<=P1*Q1+P2*Q2; my_madd my_madd_module(Clk, P1, Q1, P2, Q2, Sum); always @(posedge Clk) begin P1<=A1; P2<=A2; Q1<=B1; Q2<=B2; SumR0<=Sum; SumR1<=SumR0; SumR2<=SumR1; end always @(posedge Clk2) // этот клок в два раза медленнее Clk begin SumDM0<=SumR1; SumDM1<=SumR2; ScalX1<=ScalX1+SumDM0-(ScalX1>>>SHR); ScalX2<=ScalX2+SumDM1-(ScalX2>>>SHR); Z_Res1<=ScalX1[28+SHR:SHR-3]; Z_Res2<=ScalX2[28+SHR:SHR-3]; Res1<=Z_Res1; Res2<=Z_Res2; end endmodule Как я понимаю, основная загвоздка у Квартуса возникает тогда, когда я пытаюсь поместить сотни дублей моего MultOne модуля (в мой кристал влазит 384) мне очень хочется вычислять при N=42, то есть когда задействовано 378 умножителей. Теперь мой вопрос... Могу ли я как-то помочь квартусу, чтобы он стал быстрее компилировать, например, можно ли скомпилить сколько-то этих модулей и физически куда-то в кристалле разместить? Шаманил вокруг LogicLock Regions and Design Partitions Window, но, кажется так запутался, что ничего не могу поделать сам, поэтому прошу помощи у Вас! Пожалуйста, посоветуйте, что мне сделать, чтобы увеличить fmax и не ждать по 5 часов на компиляцию этих нескольких строк кода! ЗЫ: при компиляции в квартусе стоят все опции, которые ускоряют fmaxна основе адвизора! Если их отключать, компиляция конечно за пол часа заканчивается но и fmax даже до 200МГц не дотягивает! Спасибо И
  5. Добрый день, Андрей! очень Вам благодарен за ответ! Мне этот путь как-то более понятен! Именно это у меня уже есть для 10МБитного интерфейса, и, тьфу-тьфу, функционирует! повидимому мне это и надо было справивать в первом моем топике! В доках про RGMII слова есть :) Я правильно понимаю, что вот например такой документ http://www.hp.com/rnd/pdfs/RGMIIv2_0_final_hp.pdf должен решить мою задачу? Спасибо!
  6. Добрый день, Вадим, благодарю Вас за ответ. Я сам бы очень не против влится в стройные ряды ниосопользователей, но, пока есть только негативный опыт, поэтому, пожалуйста, тыкните пальцем что я делал не так: 1. демо примеры Терасика на ниосе на схожей борде (работа с ДДР2 памятью) отожрали почти 50тыс лютов, что, как мне кажется, очень много, мне критично, чтобы весь интерфейс (ниос+етернет) не отожрал бы больше 5К лютов и не более 10 умножителей и не более 5-10 к9м блоков памяти. Если будет больше, то, скорей всего, у меня поплывут констрейны в самом проекте (он на 200 мгц клоке, поэтому маленькое его ухудшение приводит к падению допустимой частоты). 2. можно ли как-то организовать все так, что кроме стоимости борды я не заплачу ничего за ИП корки, то есть если такой ниос, который бы и бесплатный был бы, и 1ГБит етернет бы поддерживал, или это сказки? Если сказки, то сколько надо еще вбить в бюджет денег? 2. с чего начать... Есть ли, например, пример перекачивания небольших 1-10КБайт массивов на фиксированный мак номер из плиски через ниос через гигабитный етернет, а именно для этой борды? Если да, где это для начинающих можно было бы посмотреть. Пожалуйста, посоветуйте! Спасибо ИИВ
  7. Всем привет, Пожалуйста, посоветуйте, как мне правильнее подступиться к моей незадаче. Коротко о моей задаче: На плиске непрерывно получаются данные (около 50МБайт в секунду), которые я хочу посредством 1ГБитного етернета посылать на компьютер. На компьютере стоит линукс, команду tcpdump уже изучил. С самого компьютера мне надо изредка посылать на плиску некоторые управляющие команды (около 1000 раз в секунду по несколько байт). По задаче хватает жирной плиски типа 4-того циклона с 200 умножителями и более. Опыт программирования альтеровских плисок - имеется, но только на уровне чистого верилога и системверилога. Сам алгоритм для плиски уже есть, на схожей борде я его уже запускал, работает, проблема в выборе борды и программировании быстрого интерфейса с компьютером. Есть желание для этого проекта купить такую борду: http://www.terasic.com.tw/cgi-bin/page/arc...=139&No=502 так как и цена низкая, и в этот циклон все влезает, и два коннектора на гигабит имеются. Скачал я с терасика конфигурационные файлы для борды, засунул туда свой проект, все компилится, но не знаю как мне данные качать по этому гигабитному етернету. Во входе главного модуля етернет выглядит для меня так: //////////// Ethernet 0 ////////// output ENET0_GTX_CLK; input ENET0_INT_N; input ENET0_LINK100; output ENET0_MDC; inout ENET0_MDIO; output ENET0_RST_N; input ENET0_RX_CLK; input ENET0_RX_COL; input ENET0_RX_CRS; input [3:0] ENET0_RX_DATA; input ENET0_RX_DV; input ENET0_RX_ER; input ENET0_TX_CLK; output [3:0] ENET0_TX_DATA; output ENET0_TX_EN; output ENET0_TX_ER; input ENETCLK_25; и точно такое же на второй етернет коннектор. От того что я в мегавизарде сгенерил PHY и получил около сотни входов и выходов, как Вы догадываетесь, мне тоже легче не стало. У меня сейчас получается несколько альтернатив: 1) освоить ниос (ни разу не пользовал и так до сих пор не понимаю как оно функционгирует хотя и пытался как-то разобраться), прикрутить через него и авалон то, что мне надо, возможно потом платить за всякие мегакорки дополнительные деньги, 2) разобраться с тем, что есть, и заслать UDP пакет, его устройство я немного представляю, по крайней мере я повторял то, что описано в http://www.fpga4fun.com/10BASE-T0.html и на 10 мбит у меня все работало. Посоветуйте, пожалуйста, самый простой и короткий путь для освоения такого гигибитного етернета! ЗЫ: если я в чем-то глообально прокололся, тыкните носом, я еще эту борду не заказал, еще есть время переиграть! Спасибо ИИВ
  8. Уважаемы Метан, благодарю Вас за ту помощь, которую Вы оказываете мне для того, чтобы разобраться с моей задачей! ////////// USB ////////// output [17:1] OTG_A; output OTG_CS_n; inout [31:0] OTG_D; output OTG_DC_DACK; input OTG_DC_DREQ; input OTG_DC_IRQ; output OTG_HC_DACK; input OTG_HC_DREQ; input OTG_HC_IRQ; output OTG_OE_n; output OTG_V1ET_n; output OTG_WE_n; мне, к сожалению, эта информация ни о чем не говорит, и, очень надеюсь, что Вам она действительно поможет быстро объяснить мне что же делать. Читая мануалы к Квартусу и смотря примеры к борде, я нашел, что ниос как-то сам хорошо эти ноги использует, и, если ниосу залубенить на авалон что-то, и как-то правильно его об этом предупредить, то он пошлет эти данные в OTG, а тот, в сою очередь, по усб протоколу на линукс компьютер. Я, к сожалению, совсем пока не понимаю как это все происходит, поэтому очень интенсивно гуглю и читаю мануалы. Простите меня, я не понял что Вы сказали. Мои подключения, а, также, как я читать данные из /dev/ttyUSB0 буду, я уже описывал. очень надеюсь, что здесь я смог Вас правильно понять, подразумевая, что Вы меня спросили про скорость. Как я говорил, мне хотелось бы иметь скорость качания данных с плиски на линукс около 40МБайт в секунду. Используя СПИ я уже смог получить 1.2МБайт в секунду (это уже чистой скорости на моих даннных), но мне, к сожалению, не хватает. Наверное и 100МБайт в секунду - было бы хорошо, но я даже боюсь задумываться через какой интерфейс это вообще принципиально возможно. Спасибо
  9. Действительно, с терминами не дружу, я конечно имел ввиду хай спид :( Уважаемый Метан, благодарю Вас за отзыв. Действительно, я не совсем разбираюсь в терминах, поэтому наверное Вы меня не поняли. Задача у меня простая, я примерно описал: есть плиска - стратикс 3, несколько ног которых воткнуты в USB-OTG. Далее подключение USB воткнуто в линукс компьютер. Моя задача - качать большые массивы данных с плиски на компьютер с максимально большой скоростью, и получать от компьютера в плиску управляющую информацию, которой примерно на 5-6 порядков меньше. Вот думаю как это реализовать, в верилоге вроде чуток разбираюсь, особенно когда мне здесь советуют :)))) а вот про ниос только слышал и несколько примеров запустил, правда не совсем еще разобрался как эти примеры работают. Вот и думаю как мне решить поставленную задачу. За любой конструктивный совет, в том числе совет как мне правильно сформулировать вышеописанную задачу, буду примного благодарен. Спасибо Иван
  10. Доброй ночи, есть у меня USB-OTG фулл спид, который одим концом воткнут в плиску, а другим - в линукс компьютер. На последнем, я, повидимому его могу открыть чем-то типа open (из С) из соответствующего /dev/ttyUSB0. Хочу понять какой интерфейс мне надо реализовать на ниосе, чтобы я смог из авалоновской шины или локального фифо таскать по USB-OTG данные на мой линукс компьютер. Интересует максимально быстрый интерфейс. Реально ли при пике 480МБитс получить хотя бы 40МБайтс, скажите, пожалуйста! Спасибо Иван
  11. Уважаемый Роман, огромное Вам спасибо! Ваш ответ помог мне найти баг, я забыл написать derive pll clock, вернее до Вашего ответа не знал о ее существовании!!! Кстати, в топикстарте я кажется ошибся с количеством используемых PLL - действительно, на 200, 250, 300, 350МГц используется только 2 штуки, в то время как я пробовал и еще один дизайн с 250, 300, 350, 400МГц, где их уже было больше (не 4, а 3 получается). По поводу слаков - борюсь с этим другими методами, после переключения частоты я могу почти милисекунду нечего не делать, поэтому меня это не сильно тревожит. На более низких частотах у меня схема почти в 2 раза меньше энергии потребляет, поэтому мне это очень сподручно, но, бывает, что данных много и надо включить вентилятор и пустить максимальную частоту :) Кстати у меня слаки до 30 микросекунд доходят, так как сам модуль довольно заумный. Добрый день, Евгений, большое спасибо за идею! Она также разумна для моего другого проекта, но именно в этом проекте все у меня завязанно на то, что мне надо этот клок отдавать и внешнему потребителю, а потом синхронизоваться с его ответом, а внешний потребитель скорее всего будет глючить при пропусках. Кстати, возможно таким образом, если мне не будет хватать пллек, я, например, мог бы самопально реализовать делитель, то есть работать, например, на частотах 300, 200, 150, 120, 100 МГц, имея исходную в 600МГц.
  12. Добрый день, Роман, благодярю Вас за то, что разбираетесь с моей проблемой! SW у меня входная переменная, на входе то, что на включателях борды. Работает, проверял. а как мультиплексить частоты, или это принципиально невозможно? извиняюсь, что сразу не написал, в sdc есть констрейны на все клоки и на результат мультиплексирования, везде для всех клоков одна и та же строка: create_clock -name {Clk} -period 2.400 -waveform { 0.000 1.200 } [get_ports { Clk }] может быть как-то по-другому надо было писать? квартус ругается и не дает. Кристалл Стратикс 3, второй спидгрейд. не до конца понял, сейчас буду задавать уточняющие вопросы, вдруг сможете прояснить! Добрый день, tAmega, спасибо что откликнулись и помогаете разобраться с моей проблемой! правильно ли я понимаю, что Вы предлагаете менять частоту в самом ALTPLL? Если да, то, боюсь, что не получится, так как с 50МГц я не смог получить даже два клока, не говоря уж о всвех четырех. Если я Вас не правильно понял, пожалуйста, не обижайтесь на меня, и помогите, пожалуйста, мне Вас понять! Есть еще один маленький ньюанс, возможно он поможет как-то разобраться в причинах этой незадачки. Я потестироваться с одним pll, то есть с одной частотой. Там тоже есть проблема. Пусть я написал так: module test(OSC1_50, SW, InData, ClkOut, CLK_OUT) //... input OSC1_50; // входной клок 50МHz input [13:0] InData[0:3]; input ClkOut; output Res; output CLK_OUT; // сюда мне также надо выдать этот клок //... wire Clk; DATA_Aq DATA_Aq_module(Clk, InData, ClkOut, Res); my_pll4 my_pll_module4(OSC1_50, Clk300); // с помощью ALTPLL я здесь получаю необходимые клоки assign Clk=Clk300; assign CLK_OUT=Clk300; endmodule то на выходе с борды по осциллографу все в порядке, а вот на вход модуля DATA_Aq клок не передается. Если я соединяю проводком CLK_OUT и EXT_CLK и присваиваю assign Clk=EXT_CLK; то модуль начинает функционировать. Но если в выходе CLK_OUT поставить разветвитель и запитать клок внешней борды и EXT_CLK, то в EXT_CLK уже клока нет, типа борда все на себя тянет. Мне критично подать тот же клок, что и внутри плиски, на внешнюю борду, так как входные данные должны быть синхронизованы. Против этого я нашел кривое, но рабочее решение: module test(OSC1_50, SW, InData, ClkOut, CLK_OUT, EXT_CLK) //... input OSC1_50; // входной клок 50МHz input [1:0] SW; input [13:0] InData[0:3]; input ClkOut, EXT_CLK; output Res; output CLK_OUT; // сюда мне также надо выдать этот клок //... wire Clk300, Clk600; reg Counter300; DATA_Aq DATA_Aq_module(Counter300, InData, ClkOut, Res); my_pll4 my_pll_module4(OSC1_50, Clk300); // на выходе 300 МГц my_pll8 my_pll_module8(OSC1_50, Clk600); // на выходе 600 МГц always @(posedge Clk600) Counter300<=~Counter300; endmodule но что-то мне подсказывает, что это какое-то кривое решение. А надо мне именно 4 разных клока, то есть то, что у меня совсем не работает. Вдруг кто сможет мне посоветовать что же тут я делаю не правильного, и как правильно будет! Спасибо
  13. Добрый день, позвольте познакомиться с Вами, меня зовут Иван, я сейчас разбираюсь с Квартусом, что-то уже на СВерилоге научился, но далеко не все. Сейчас конкретно уперся в одну незадачку, которую не знаю как решить, помогите, пожалуйста, кто знает. Как мне кажется, должно быть все тривиально, но, я, кажется чего-то недогоняю. У меня есть самопально написанный простенький модуль на верилоге, с такими аргументами module DATA_Aq(Clk, In, ClkOut, Res); input Clk, ClkOut; input [13:0] In[0:3]; output reg Res; мне хочется гонять его на разных частотах входного клока (Clk), а именно 150,200,250,300МГц. На самой борде у меня есть клок в 50МГц, то есть с помощью 4 PLL (а может и 3-х, если 150 и 300 совместить) я могу получить на wire Clk150, Clk200, Clk250, Clk300; все мне необходимые клоки. Дальше я хотел с помошью входной переменной SW[1:0] принять решение какой клок мне нужен: module test(OSC1_50, SW, InData, ClkOut, CLK_OUT) //... input OSC1_50; // входной клок 50МHz input [1:0] SW; input [13:0] InData[0:3]; input ClkOut; output Res; output CLK_OUT; // сюда мне также надо выдать этот клок //... wire Clk150, Clk200, Clk250, Clk300; wire Clk; DATA_Aq DATA_Aq_module(Clk, InData, ClkOut, Res); my_pll1 my_pll_module1(OSC1_50, Clk150); // с помощью ALTPLL я здесь получаю необходимые клоки my_pll2 my_pll_module2(OSC1_50, Clk200); my_pll3 my_pll_module3(OSC1_50, Clk250); my_pll4 my_pll_module4(OSC1_50, Clk300); // вот тут я пытаюсь объединить клоки, но, кажется, чего-то не понимаю, и у меня ничего не работает, // помогите, пожалуйста, понять что я делаю не правильно! assign Clk=(SW[1])?((SW[0])?Clk300:Clk250):((SW[0])?Clk200:Clk150); assign CLK_OUT=(SW[1])?((SW[0])?Clk300:Clk250):((SW[0])?Clk200:Clk150); endmodule Что получается: в Clk приходит всегда один и тот же клок, точно его частоту я понять не смог, но она получается порядка 100МГц... Также Квартус не дает информации о максимально допустимом FMax для Clk, хотя есть компилить только модуль test, то Квартус показывает FMax(85C)=280MHz, FMax(0C)=310MHz. Подскажите, пожалуйста, что же я делаю не правильно? Спасибо Иван