Скрытый текст
Profi 6.2 Rev.B / 1024
Profi v5.02 /1024/палитра/FDD3,5"/FDD5,25"/HDD130/XT-Keyb/Covox
Profi v4.00 /1024
АТМ Turbo /512/ - собран но еще не запускался
ATM Turbo 2+ v7.10 - собран на 80%
Pentagon 128 - в планах восстановить (раскуроченная плата)
ZXMC20/NemoIDE/AT-Keyb (by Caro)
Revers U8EP3C
Speccy2010, r2
[свернуть]
Работаю с ПЛИСами Xilinx XC2C64A, постоянно. В месяц приходится прошивать по 30 штук. Покупал для этих целей китайские программаторы, от USB. Первый купил, года 3 назад, за 5 тыс. с копейками - он сгорел. Купил второй, тоже китайский, но уже подешевле и тоже сгорел. Может мне просто так везло, что они горели. До этого использовал самодельный, по схеме от Xilinx, от LPT порта. И сейчас им пользуюсь и никаких проблем нет. Поставил себе второй комп с Вин_ХР и установил ISE WebPACK 14.7, но не полностью, а только iMPACT для прошивки ПЛИС. Так как комп для прошивки слабый, то весь проект делаю на другом, более мощном компе, а файлы для прошивки переношу через флешку. Может не очень удобно, но зато никаких проблем с прошивкой нет. Да и второй комп с Вин_ХР удобно использовать для прошивки ПЗУ УФ, да и для других целей, где нужен LPT или для старого софта.
Опять же, если сравнивать по производительности, на старом компе с ХР, сборка проекта может идти 2-3 часа и больше (дальше не проверял, останавливал, терпения не хватало), а на мощном компе сборка идет от 2 мин и до 40 мин, в зависимости от схемы и сможет ли ПЛИС "проглотить" эту схему.
Для прошивки использую вот такой разъем https://youtu.be/mGUD3MEP1JM иголки с пружинами, скорее всего их используют для электротеста печатных плат, тоже покупал на Али.
Оживлю немного темку))).
Всем известно, что для CPLD нужен генератор и хорошо, если Вы страдаете плюшкинизмом и у Вас их как у дедушки с гуталиновой фабрики.
А если нет?
Да ещё и на какую-нибудь "экзотическую" частоту?
А кварцы - вот они...
Предлагаю ещё один вариант генератора без генератора. Схема проста - 1 инвертор и несколько пассивных резисторов/конденсаторов и собственно сам кварц.
В случае кварца с параллельным резонансом (в основном импортные кварцы) частота подбирается конденсаторами С1 и С2, а в случае отечественного кварца с ним последовательно включается дополнительный конденсатор(на схеме не показан).
Возможно в сложных схемах заработает не сразу и придётся править констрейты чтоб разместить элемент поближе к IO, но в тесте Квартус написал 300+ МГц...
Реально больше 25МГц не проверял.
Верилог код:
Осталось выход подключить на тактовый вход ПЛИС.Код:module osc ( // Секция генератора input wire in_clk, output wire out_clk, ); /* Собственно генератор */ assign out_clk = ~in_clk; endmodule
omercury, часто пользовался замкнутым инвертором. На Arria2GX он дает почти 1ГГц, но эта частота не юзабельна. Ее надо поделить на 2 ближним триггером, и уже можно подавать на счетчик-делить дальше. Иначе схема не успевает. На CycloneV частота получалась порядка 400-450МГц. Но, эта частота не стабильна. Она плывет в зависимости от изменений в проекте. Она сильно плывет во время работы (от нагрева, помех и фазы луны). Так что все равно я не рекомендую так делать. Лучше попытаться вывести инвертор наружу и подвесить кварц, как это сделано у тех же АТМег.
Дело было вечером, делать было нечего... (с)
Проглядывал тематические форумы и в очередной раз наткнулся на тему 28МГц для спекки.
Многие рекомендуют использовать PLL от старой материнки, но вот беда - не у всех они есть.
Можно конечно купить, но это явно не наш метод.
Итак:
28МГЦ?
Легко!
За основу взят классический ГУН.
Можно конечно собрать и на рассыпухе, но на дворе 21 век всё-таки. Заюзаем мелкую CPLD, а также генератор из предыдущего поста.
Кварц попался на 7,2МГц (лучше использовать "круглые" частоты, делители получатся проще), значит для "неизменно превосходного результата" нам нужно поделить опорную частоту на 9 и умножить на 35 - 7,2/9*35=28.
Собственно схема во вложении, пояснения в Верилог-коде, результат на фотке.
По факту получилось 7200122ГЦ, что в результате должно дать 7200122/9*35=28000474,44Гц.
Следует уточнить, что ГУН требует подбора конденсаторов/резисторов. Методика проста: с подключенным к питанию левым выводом R1 частота ГУН должна быть выше требуемой на 20-30%, с неподключенным R1 частота должна быть немного ниже требуемой, с заземлённым левым выводом - у меня вообще генерация срывается. Кстати у на моей макетке хватило ёмкости входов и монтажа, вместо конденсаторов напаян кусочек фольгированного текстолита ~2х3мм с надрезанной с одной стороны фольгой.
Таким образом делал генератор чуть выше 60МГЦ, для дальнейшего увеличения частоты на контакт, подписанный на схеме "3v3" надо подать ещё более высокое напряжение, ускорив тем самым заряд конденсаторов C1 и С2.
- - - Добавлено - - -Код:module PLL_28 ( // Секция генератора input wire in_clk, output wire out_clk, // Секция PLL inout wire in1, //RC-цепь 1 inout wire in2, //RC-цепь 2 output wire out, //Выход PLL (28.00MHz) output wire error //Выход ошибки ); // Секция генератора //********************************************* wire clk = out_clk; /* Собственно генератор */ assign out_clk = ~in_clk; //********************************************* // Секция PLL // ============================================================ parameter mul = 35; // Для 12MHz - 7 parameter div = 9; // Для 12MHz - 3 parameter wmul = $clog2(mul); //Ширина счётчика умножителя, вычисляемое parameter wdiv = $clog2(div); //Ширина счётчика делителя, вычисляемое // ============================================================ wire di1; //Внутренняя шина генератора прям wire di2; //Внутренняя шина генератора инв // ============================================================ assign out = di1; //Подключаем выход //Организуем диоды, закрытые на заряд, и открытые на разряд assign in1 = (di1) ? 1'bZ : di1; assign in2 = (di2) ? 1'bZ : di2; //Собственно генератор assign di1 = ~((in1) | (di2)); assign di2 = ~((in2) | (di1)); // ============================================================ //Делитель тактовой (делитель) // ============================================================ reg[wdiv - 1:0] kDiv_ref = 0; //Делитель тактовой always @(posedge clk) begin kDiv_ref <= kDiv_ref + 1; //increment cnt if (kDiv_ref == (div - 1)) begin //2//12МГц/3/2=2,0MHz kDiv_ref <=0; end end //always // ============================================================ //Делитель частоты генератора PLL (умножитель) // ============================================================ reg[wmul - 1:0] kDiv_osc = 0; always @(posedge di1) begin kDiv_osc <= kDiv_osc + 1; //increment cnt if (kDiv_osc == (mul - 1)) begin //6//28.00МГц/7/2=2,0MHz kDiv_osc <=0; end end //always // ============================================================ // Делители на 2 (получаем меандр) // ============================================================ reg rf = 0; always @(posedge kDiv_ref[wdiv - 1]) begin // Делим пополам rf <= ~rf; end // ============================================================ reg of = 0; always @(posedge kDiv_osc[wmul - 1]) begin // Делим пополам of <= ~of; end // ============================================================ assign error = ~(rf ^ of); //assign error = 1'b1; // max 36MHz / 43 //assign error = 1'bz; // mid 24MHz / 34 //assign error = 1'b0; // min 0MHz / 0 // ============================================================ endmodule //*********************************************
Дык так оно и сделано... на следующей фотке.
Нестабилизированные кварцем генераторы конечно же непредсказуемы))).
- - - Добавлено - - -
Кстати, PLL EP2C5 со спидгрейдом 8 даёт вполне юзабельные полгигагерца.
P.S.
Немного параметризовал счётчики и убрал пару лишних регистров.
Последний раз редактировалось omercury; 05.01.2017 в 15:48.
Теперь есть и программатор для Xilinx!)))
Получилось у меня прошить XC9536, XC9536XL. Не получилось несколько XC9536 - пишет, что они "unsupported". Порылся в гугле и понял, что они либо очень старые, либо заказные. Жаль. Теперь вопрос про спартана и виртекса. Есть ли здесь люди, которые работали с этими сериями? Вопрос вот в чем: эти FPGA не на флеше, значит их можно прошивать бесконечное число раз. Это очень хорошо для опытов. С другой стороны, они заливают конфигурацию из внешней флешки, которая имеет ограниченные ресурсы. Уже хуже. Далее я не нашел про второй спартан информации о типе внешней флешки, кроме стандартных Xilinx, которые опять ждать из Китая, т.к. поблизости нет. Возможно ли кабелем непосредственно из IMPACT сконфигурить FPGA? На третий спартан, как я видел, Атмеловскую SPI Flash цепляют. Про Virtex вообще мало информации( Я понимаю, что это старье, но у меня еще и 16V8 во всю трудятся.
В общем, подскажите, если не трудно, как мне этих монстров попробовать запустить. Может быть внешний МК с памятью, SD картой или еще как. Всё, что находил было про третий спартан и шестой.
1) Практически все фпга имеют внешнюю ппзу для загрузки (справедливо как минимум со 2 по 7 семейство). исключение спартан-3А (те что с буквой А имеют внутри ппзу)
2) саму фпга можно загружать бесконечное число раз по jtag-интерфейсу (фпга - по сути озу в данном вопросе)
3) начиная с какого-то семейства тип внешней ппзу может быть spi/bpi/(и др. виды). для "старых" в основном только фирменные ппзу (достаточно дорогие по сравнению с spi)
4) насколь я помню спартан-3 (примерно) это последнее семейство которое не "взрывалось" от подачи 5в на выводы.
импактом можно прошить любую фпга и (или) ппзу из числа поддерживаемых.
5) есть семейства по названию - спартан, кинтекс, вёртекс. внутри семейств есть нумерация. к примеру спартан-3 и спартан-6 и спартан-7. вёртекс-2 -5 -7.
вёртексы "круче" чем спартаны. а -7 круче -3.
6) поскольку различные фпга сняты с производства то и поддержка в ise-vivade тоже сворачивается. к примеру в исе14.7 нет точно спартана-2. все современные фпга только в виваде.
7) любую фпга можно "загрузить" внешним МК при наличии у фпга режима загрузки через spi или параллельный интерфейс (как пример). SD насколь я помню "популярна" у современных фпга (ни разу не практиковал - без нужды).
по хорошему что 3 что 6 что 7 итд все фпга практически одинаковы с точки зрения загрузки.
- - - Добавлено - - -
все можно найти на офф. сайте.
Комрады! Поясните, пожалуйста, бестолковому...
Есть код модуля, нормально компиллируется в составе проекта.
Скрытый текст
Код:module HVSync ( input wire PixClock, output reg HSync, output reg VSync, output reg [2:0] R, output reg [2:0] G, output reg [2:0] B); parameter HVA = 1024; // Visible Area parameter HFP = 24; // Front Porch parameter HST = 136; // Sync Time parameter HBP = 160; // Back Porch parameter VVA = 768; // Visible Area parameter VFP = 3; // Front Porch parameter VST = 6; // Sync Time parameter VBP = 29; // Back Porch //variables reg [10:0] PC = 0; // Pixel Counter (Column, X) reg [9:0] LC = 0; // Line Counter (Row, Y) reg VA; // Visible Area on screen always @(posedge PixClock) begin VA <= ((PC < HVA) | (PC == HVA+HFP+HST+HBP-1)) & ((LC < VVA) | (LC == VVA+VFP+VST+VBP-1)); HSync <= (PC >= HVA+HFP-1) & (PC < HVA+HFP+HST-1); if (PC < (HVA+HFP+HST+HBP-1)) PC <= PC + 1'b1; else begin PC <= 0; VSync <= (LC >= VVA+VFP-1) & (LC < VVA+VFP+VST-1); if (LC < (VVA+VFP+VST+VBP-1)) LC <= LC + 1'b1; else LC <= 0; end end // Color Image always @(posedge PixClock) begin if (VA) begin if ((PC[7:0]==0) | (PC[7:0]==255) | (LC[7:0]==0) | (LC[7:0]==255)) begin R <= 7; G <= 7; B <= 7; end else begin if (LC[7:6]==0) begin R <= ~PC[9:7]; G <= 0; B <= 0; end if (LC[7:6]==1) begin R <= 0; G <= PC[8:6]; B <= 0; end if (LC[7:6]==2) begin R <= 0; G <= 0; B <= ~PC[7:5]; end if (LC[7:6]==3) begin R <= PC[6:4]; G <= PC[6:4]; B <= PC[6:4]; end end end else begin R <= 0; G <= 0; B <= 0; end end endmodule[свернуть]
Выношу отдельно проверку ~VA.
Скрытый текст
Код:module HVSync ( input wire PixClock, output reg HSync, output reg VSync, output reg [2:0] R, output reg [2:0] G, output reg [2:0] B); parameter HVA = 1024; // Visible Area parameter HFP = 24; // Front Porch parameter HST = 136; // Sync Time parameter HBP = 160; // Back Porch parameter VVA = 768; // Visible Area parameter VFP = 3; // Front Porch parameter VST = 6; // Sync Time parameter VBP = 29; // Back Porch //variables reg [10:0] PC = 0; // Pixel Counter (Column, X) reg [9:0] LC = 0; // Line Counter (Row, Y) reg VA; // Visible Area on screen always @(posedge PixClock) begin VA <= ((PC < HVA) | (PC == HVA+HFP+HST+HBP-1)) & ((LC < VVA) | (LC == VVA+VFP+VST+VBP-1)); HSync <= (PC >= HVA+HFP-1) & (PC < HVA+HFP+HST-1); if (PC < (HVA+HFP+HST+HBP-1)) PC <= PC + 1'b1; else begin PC <= 0; VSync <= (LC >= VVA+VFP-1) & (LC < VVA+VFP+VST-1); if (LC < (VVA+VFP+VST+VBP-1)) LC <= LC + 1'b1; else LC <= 0; end end // Blanking always @(posedge PixClock) begin if (~VA) begin R <= 0; G <= 0; B <= 0; end end // Color Image always @(posedge PixClock) begin if (VA) begin if ((PC[7:0]==0) | (PC[7:0]==255) | (LC[7:0]==0) | (LC[7:0]==255)) begin R <= 7; G <= 7; B <= 7; end else begin if (LC[7:6]==0) begin R <= ~PC[9:7]; G <= 0; B <= 0; end if (LC[7:6]==1) begin R <= 0; G <= PC[8:6]; B <= 0; end if (LC[7:6]==2) begin R <= 0; G <= 0; B <= ~PC[7:5]; end if (LC[7:6]==3) begin R <= PC[6:4]; G <= PC[6:4]; B <= PC[6:4]; end end end end endmodule[свернуть]
Посыпались ошибки - https://yadi.sk/i/83kyjVf_3GZ5f5
Ругается на заголовки описания событий (60 и 47 строки). Не вкуриваю...
Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).
Как ты умудрился работать с одним регистром в разных always блоках?
Я новичок в Verilog, еще учусь.
HardWareMan, дай более развертнутый ответ/подсказку, пожалуйста.
Последний раз редактировалось LeoN65816; 02.04.2017 в 11:57.
Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)