Jump to content

    

pavlovconst

Свой
  • Content Count

    91
  • Joined

  • Last visited

Everything posted by pavlovconst


  1. Здравствуйте, необычный у вас вопрос. Скажите, а вас действительно интересует PALы из 80-x с какой-то практической целью, или вы их выбрали, так сказать, для "начала пути"? Дело в том, что технологии, которые использовались тогда в программируемой логике были предельно простыми, высокоуровневые примитивы и IP ядра не использовались. Логики в устройстве было крайне мало, поэтому программа состояла, в общем-то, из горстки ANDов и ORов и писалась от руки. Я к тому, что если у вас нет конкретной задачи под конкретный чип из прошлого, пропустите этот этап вообще, полезного опыта он вам не принесет. В наши дни хорошим началом будет что-то на чипе EPM240T100. Для функционального моделирования VHDL кода отлично подойдет Modelsim. Вы увидите как воздействия на входных портах преобразуются вашей схемой и выдаются на выход. Но привязки к конкретному корпусу и модели чипа там не будет. После моделирования можно будет экспортировать временную диаграмму с выходов схемы в текстовый файл, и его уже скормить какой-то другой программе. Возможно, вам такой способ подойдет...
  2. Kostochkin, Посмотрите компонент PARALLEL_ADD в IP каталоге Квартуса. Множественные сложения он сделает оптимальнее. Наверняка, у Ксайлинкса есть аналогичный IP.
  3. RobFPGA, Есть вот такие настройки оптимизации. Указываются независимо для каждой design partiton
  4. Чем больше площадь прямоугольников, тем большая полоса памяти нужна для чтения-записи (если оставить в стороне особенности использования берст-режимов). Самый худший случай, с самыми высокими требованиями к полосе памяти - это когда размер прямоугольников будет равен размеру экранного буфера. Такой случай может и маловероятен, но, наверняка, возможен. И память должна такую полосу обеспечивать. Я предлагаю на таком режиме и остановиться, раз его в любом случае нужно будет поддержать. Возможно, при вычитке только части экранного буфера - вы сэкономите "несколько" тактов.Но этот выигрыш будет различным от кадра к кадру. Алгоритм усложнится, количество ресрсов ПЛИС , занятых под задачу, увеличится. А преимущества чтения буфера по частям какие? Я не понимаю. Поэтому и предложил не усложнять =)
  5. В худшем случае все равно нужно уметь раз за разом вычитывать буфер целиком. Так зачем усложнять алгоритм попытками читать частями?
  6. des00, Спасибо за "красивый" вариант, но в целевом проекте все несколько сложнее устроено. Поэтому я и пытаюсь дожать вариант с блокирующими. Порядок обработки событий планировщиком симулятора, описанный в стандарте, поменяется наврядли =)
  7. Почитал, и мне даже удалось заставить симулятор сделать задержку в два такта. Но такой код, с перемешанными блокирующими и неблокирующими присваиваниями, оставлять в проекте мне было бы стыдно. =( module main( input clk, input nrst, input [7:0] in_data, output [7:0] out_data ); reg [3:0] brd_err2 = 0; reg [7:0] brd_err2_cntr = 0; always @(posedge clk) begin if( ~nrst ) begin brd_err2_cntr[7:0] <= 0; brd_err2[3:0] = 0; end else begin brd_err2_cntr[7:0] <= brd_err2_cntr[7:0] + brd_err2[3] + brd_err2[2] + brd_err2[1] + brd_err2[0]; brd_err2[3] = in_data[3] || in_data[2] || in_data[1] || in_data[0]; brd_err2[2] = in_data[4] || in_data[2] || in_data[1] || in_data[0]; brd_err2[1] = in_data[5] || in_data[2] || in_data[1] || in_data[0]; brd_err2[0] = in_data[3] || in_data[1]; end end assign out_data[7:0] = brd_err2_cntr[7:0]; endmodule
  8. Пока что получается, что синтезатор имплементирует код именно так, как задумал разработчик. А симуляторы, для того, чтобы воспроизвести тот же результат, что и в реальности - требуют переписать код и соблюсти много дополнительных условий. Видите ли, у них там "сложная временная модель"... =)
  9. По каким правилам он "адаптирует"? И как разработчик должен быть уверен, что при очередной перекомпиляции эта адаптация не приведет к другому результату? Не заметил. Изначально этот код был написан на SV
  10. one_eight_seven, RobFPGA, Nick_K Я понимаю, что основной совет - это сделать все присваивания неблокирующими. Всегда тоже так делал. Но вот сейчас столкнулся с ситуацией, когда мне действительно удобнее использовать блокирующее. В стандарте есть блокирующие присваивания, так почему я, как разработчик, должен ограничиваться и не использовать максимум выразительных средств языка? Больше всего я не понимаю, как могут симуляторы и синтезаторы давать различные результаты, если и те, и другие - опираются на один стандарт? Кто виноват в расхождении? Стандарт плохой? Или его имплементации? Конечная цель разработчика - получить верную синтезированную схему. И симуляцией мы занимаемся опосредованно, чтобы отладить синтез. А если результаты не совпадают, то зачем вообще заниматься симуляцией?
  11. Здравствуйте! Пишу в проекте примерно такой код. В одном блоке вычисляю несколько типов аварий. Намеренно использую при этом блокирующее присваивание, так код получается коротким и хорошо читаемым. Во втором блоке накапливаю полученные аварии. module main( input clk, input nrst, input [7:0] in_data, output [7:0] out_data ); reg [3:0] brd_err2 = 0; reg [7:0] brd_err2_cntr = 0; always @(posedge clk) begin if( ~nrst ) begin brd_err2_cntr[7:0] <= 0; end else begin brd_err2_cntr[7:0] <= brd_err2_cntr[7:0] + brd_err2[3] + brd_err2[2] + brd_err2[1] + brd_err2[0]; end end always @(posedge clk) begin if( ~nrst ) begin brd_err2[3:0] = 0; end else begin brd_err2[3] = in_data[3] || in_data[2] || in_data[1] || in_data[0]; brd_err2[2] = in_data[4] || in_data[2] || in_data[1] || in_data[0]; brd_err2[1] = in_data[5] || in_data[2] || in_data[1] || in_data[0]; brd_err2[0] = in_data[3] || in_data[1]; end end assign out_data[7:0] = brd_err2_cntr[7:0]; endmodule При синтезе и для brd_err2, и для brd_err2_cntr создаются регистры, выходы задержаны относительно входов на 2 такта. А вот на симуляции получаю очень странные результаты, которые, к тому же, меняются при изменении порядка always`ов. Что можно сделать, чтобы поправить симуляцию?
  12. Скорее всего, подразумевается размах сигналов в дифф. паре. Для LVDS он как раз +-350mV. Синфазное напряжение (common mode voltage) в вашем случае получается около 200mV, это допустимо по стандарту. LVDS как раз и отличается от других дифференциальных стандартов тем, что синфазное напряжение может меняться в широких пределах. Картинка из "LVDS Owner’s Manual" от Texas - http://www.ti.com/lit/ug/snla187/snla187.pdf Если так, то прописываете set_property IOSTANDARD LVDS [get_ports SYSCLK_N] set_property IOSTANDARD LVDS [get_ports SYSCLK_P] или set_property IOSTANDARD LVDS_25 [get_ports SYSCLOCK_N] set_property IOSTANDARD LVDS_25 [get_ports SYSCLOCK_P] в зависимости от выбранного банка
  13. В систем консоли открывается встроенный интерпретатор TCL. Поэтому эксперименты с GUI я бы начинал без квартуса, на чистом TCL. https://www.tutorialspoint.com/tcl-tk/tk_environment.htm
  14. QIP обычно описывает исходники стандартных IP из каталога. Подпроекты я бы объединял с помощью дочерних QSF-ов. Это, по крайней мере, более логично. set_global_assignment -name SOURCE_TCL_SCRIPT_FILE my_subproject_1_settings.qsf set_global_assignment -name SOURCE_TCL_SCRIPT_FILE my_subproject_2_settings.qsf
  15. Кто ж спорит. Всего три томика прочитал - и дело в шляпе =)
  16. Flip-fl0p, Burenkov Спасибо за советы! Я разобрался. У контроллера памяти есть статусные выходы .status_local_init_done .status_local_cal_success .status_local_cal_fail Начинать чтение нужно только после того, как память инициализирована и успешно откалибрована
  17. Возможно, сигнал waitrequest не инвертированнный на самом деле (хотя суффикс "_n" намекает об обратном), и мне стоит ждать 6 тактов после первого запроса?
  18. Здравствуйте! Делаю аппаратный контроллер (HMC) памяти DDR3 на CycloneV. Создал два порта Avalon-MM по 32 бит - один для JTAG Debug Master, второй - для штатного (моего) контроллера. Через JTAG Debug Master память пишется и читается, из чего делаю вывод, что временнЫе настройки чипов памяти я поставил правильные. Через штатный контроллер могу питать в память, и единичные записи и берсты проходят. Но вот чтение поднять никак не получается. Контроллер принимает 2 первых запроса по 8 слов, а на третьем поднимает waitrequest и больше его не опускает. Никогда. Сигнал readdatawalid вижу где-то вдалеке и только один. Может кто-то сталкивался с таким? Что я делаю не так? Обязательно ли логику мастера описывать в виде компонента QSYS, сейчас весь авалон у меня экспортирован из QSYS...
  19. Подтверждаю. Я тоже попробовал менять настройки PLL в проекте с непроходящими таймингами. Я ожидал, что при увеличении джиттера на входе тайминг станет еще хуже. Но получил точно такие же знеачения TNS. Странно...
  20. Расскажите, как вы выяснили, что не влияет? Когда мастер генерирует исходники PLL, он также создает файл с констрейнами для выходных сигналов. Величина заявленной вами нестабильности на входе PLL повлияет на расчетную нестабильность выходов, а это, в свою очередь, повлияет на расчет времянки всех блоков, затактированных через PLL.
  21. Еще не продано. Предлагайте вашу цену