Jump to content

    

pavlovconst

Участник
  • Content Count

    42
  • Joined

  • Last visited

Community Reputation

0 Обычный

About pavlovconst

  • Rank
    Участник
  • Birthday January 2

Контакты

  • Сайт
    https://github.com/pConst
  • ICQ
    0

Информация

  • Город
    Санкт-Петербург

Recent Profile Visitors

428 profile views
  1. Kostochkin, У меня куплена именно такая плата, как в верхнем посте. Неработающих или сбоящих элементов не нашел. 10G через оптику поднимал. Схему и example projects по запросу выслали до покупки.
  2. Здравствуйте, необычный у вас вопрос. Скажите, а вас действительно интересует PALы из 80-x с какой-то практической целью, или вы их выбрали, так сказать, для "начала пути"? Дело в том, что технологии, которые использовались тогда в программируемой логике были предельно простыми, высокоуровневые примитивы и IP ядра не использовались. Логики в устройстве было крайне мало, поэтому программа состояла, в общем-то, из горстки ANDов и ORов и писалась от руки. Я к тому, что если у вас нет конкретной задачи под конкретный чип из прошлого, пропустите этот этап вообще, полезного опыта он вам не принесет. В наши дни хорошим началом будет что-то на чипе EPM240T100. Для функционального моделирования VHDL кода отлично подойдет Modelsim. Вы увидите как воздействия на входных портах преобразуются вашей схемой и выдаются на выход. Но привязки к конкретному корпусу и модели чипа там не будет. После моделирования можно будет экспортировать временную диаграмму с выходов схемы в текстовый файл, и его уже скормить какой-то другой программе. Возможно, вам такой способ подойдет...
  3. Kostochkin, Посмотрите компонент PARALLEL_ADD в IP каталоге Квартуса. Множественные сложения он сделает оптимальнее. Наверняка, у Ксайлинкса есть аналогичный IP.
  4. RobFPGA, Есть вот такие настройки оптимизации. Указываются независимо для каждой design partiton
  5. Чем больше площадь прямоугольников, тем большая полоса памяти нужна для чтения-записи (если оставить в стороне особенности использования берст-режимов). Самый худший случай, с самыми высокими требованиями к полосе памяти - это когда размер прямоугольников будет равен размеру экранного буфера. Такой случай может и маловероятен, но, наверняка, возможен. И память должна такую полосу обеспечивать. Я предлагаю на таком режиме и остановиться, раз его в любом случае нужно будет поддержать. Возможно, при вычитке только части экранного буфера - вы сэкономите "несколько" тактов.Но этот выигрыш будет различным от кадра к кадру. Алгоритм усложнится, количество ресрсов ПЛИС , занятых под задачу, увеличится. А преимущества чтения буфера по частям какие? Я не понимаю. Поэтому и предложил не усложнять =)
  6. В худшем случае все равно нужно уметь раз за разом вычитывать буфер целиком. Так зачем усложнять алгоритм попытками читать частями?
  7. des00, Спасибо за "красивый" вариант, но в целевом проекте все несколько сложнее устроено. Поэтому я и пытаюсь дожать вариант с блокирующими. Порядок обработки событий планировщиком симулятора, описанный в стандарте, поменяется наврядли =)
  8. Почитал, и мне даже удалось заставить симулятор сделать задержку в два такта. Но такой код, с перемешанными блокирующими и неблокирующими присваиваниями, оставлять в проекте мне было бы стыдно. =( 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
  9. Пока что получается, что синтезатор имплементирует код именно так, как задумал разработчик. А симуляторы, для того, чтобы воспроизвести тот же результат, что и в реальности - требуют переписать код и соблюсти много дополнительных условий. Видите ли, у них там "сложная временная модель"... =)
  10. По каким правилам он "адаптирует"? И как разработчик должен быть уверен, что при очередной перекомпиляции эта адаптация не приведет к другому результату? Не заметил. Изначально этот код был написан на SV
  11. one_eight_seven, RobFPGA, Nick_K Я понимаю, что основной совет - это сделать все присваивания неблокирующими. Всегда тоже так делал. Но вот сейчас столкнулся с ситуацией, когда мне действительно удобнее использовать блокирующее. В стандарте есть блокирующие присваивания, так почему я, как разработчик, должен ограничиваться и не использовать максимум выразительных средств языка? Больше всего я не понимаю, как могут симуляторы и синтезаторы давать различные результаты, если и те, и другие - опираются на один стандарт? Кто виноват в расхождении? Стандарт плохой? Или его имплементации? Конечная цель разработчика - получить верную синтезированную схему. И симуляцией мы занимаемся опосредованно, чтобы отладить синтез. А если результаты не совпадают, то зачем вообще заниматься симуляцией?
  12. Здравствуйте! Пишу в проекте примерно такой код. В одном блоке вычисляю несколько типов аварий. Намеренно использую при этом блокирующее присваивание, так код получается коротким и хорошо читаемым. Во втором блоке накапливаю полученные аварии. 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`ов. Что можно сделать, чтобы поправить симуляцию?
  13. В меню Edit -> Set color