arhiv6 14 14 ноября, 2014 Опубликовано 14 ноября, 2014 · Жалоба Потребовалось реализовать следующую схему: Входов 9 штук: clk + a1,a2,a3,a4,b1,b2,b3,b4. Выходов 5 штук c1,c2,c3,c4,c5. Всегда только один из выходов находится в лог 1 (после подачи питания по умолчанию это выход с1). По фронту на входе clk состояние на выходе меняется по следующему алгоритму (перечислены все возможные состояния на входах): - на на всех входах лог 0 - состояние на выходе не меняется. - a1 в лог 1 - на выходе произойдёт сдвиг на +1. - a1,a2 в лог 1 - на выходе произойдёт сдвиг на +2. - a1,a2,a3 в лог 1 - на выходе произойдёт сдвиг на +3. - a1,a2,a3,a4 в лог 1 - на выходе произойдёт сдвиг на +4. - b1 в лог 1 - на выходе произойдёт сдвиг на -1. - b1,b2 в лог 1 - на выходе произойдёт сдвиг на -2. - b1,b2,b3 в лог 1 - на выходе произойдёт сдвиг на -3. - b1,b2,b3,b4 в лог 1 - на выходе произойдёт сдвиг на -4. Сдвиг на +1 означает, что , например, если лог 1 было на выходе с3, то по фронту на clk на выходе с3 станет лог 0, а на выходе с4 - лог1. Сдвиг нужен без переноса - если, например, лог 1 было на выходе с5, любой сдвиг в + ничего на выходе не изменит. Вопрос: на каких логически микросхемах (сдвиговые регистры, счётчики и т.п.) можно реализовать такую схему? (микроконтроллер не предлагать :) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
saab 2 14 ноября, 2014 Опубликовано 14 ноября, 2014 · Жалоба ПЛИС батенька ПЛИС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 14 14 ноября, 2014 Опубликовано 14 ноября, 2014 (изменено) · Жалоба Ради 12 ножек? + её программировать ещё надо, а для плис ни разу не писал прошивок. Хочется всё-таки на логике попытаться собрать. Изменено 14 ноября, 2014 пользователем arhiv6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость TSerg 14 ноября, 2014 Опубликовано 14 ноября, 2014 · Жалоба Ради 12 ножек? + её программировать ещё надо, а для плис ни разу не писал прошивок. Хочется всё-таки на логике попытаться собрать. Конечный автомат + карты Карно, для примера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 ноября, 2014 Опубликовано 14 ноября, 2014 · Жалоба Приветствую! Хотите горячую TTL логику - пзу 2k x8 типа 573РФ5 и регистр 155ир35 :) Ну или штук 20-30 155ла3 и 3 штуки 155тм2 вообще полный oldstyle Успехов! Rob. P.S. на 155ЛА3 можно сделать все! даже логику core i7 8-() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 15 ноября, 2014 Опубликовано 15 ноября, 2014 · Жалоба cpld Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lemorus 0 15 ноября, 2014 Опубликовано 15 ноября, 2014 · Жалоба Ради 12 ножек? + её программировать ещё надо, а для плис ни разу не писал прошивок. Хочется всё-таки на логике попытаться собрать. Правильно написали CPLD, это маленькая ПЛИС, схему можно просто нарисовать, прямо как ЛЕГО набрать из логических элементов. Потом нажимаете кнопку и схема прошивается в CPLD. Как в том анекдоте "а кто должен кнопку нажимать". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 14 15 ноября, 2014 Опубликовано 15 ноября, 2014 · Жалоба Похоже CPLD придётся использовать. На verilog алгоритм написал (оказывается, это не сложно). В симуляторе (iverilog+vvp) проверил - работает. module mod_logic( input wire clock, input wire [3:0]in_a, input wire [3:0]in_b, output reg [3:0]out_c ); integer i=0,shift=0,position=0; initial out_c = 4'b0001; always @(posedge clock ) begin shift=0; // проверка if((in_a != 4'b0000) & (in_b != 4'b0000)) out_c <= 4'b1000; // обработка ошибок else begin // определяем позицию на выходе for(i=0; i<4; i=i+1) begin if(out_c[i]) position=i+1; end // считаем сдвиг в +, если это возможно if((in_a != 4'b0000) & (out_c != 4'b1000)) begin for(i=0; i<4; i=i+1) begin if(in_a[i]) shift=shift+1; end // сдвигаем if (shift > (4-position)) out_c <= 4'b1000; else out_c <= out_c << shift; end // считаем сдвиг в -, если это возможно if((in_b != 4'b0000) & (out_c != 4'b0001)) begin for(i=0; i<4; i=i+1) begin if(in_b[i]) shift=shift+1; end // сдвигаем if (shift > (position-1)) out_c <= 4'b0001; else out_c <= out_c >> shift; end end //$display("position %d",position); //$display("shift %d",shift); end endmodule Один только минус - для симулирования всей схемы (в основном аналоговые компоненты), в которой эта CPLD будет стоять, нужен какой-то mixed-mode симулятор (spice+HDL(Verilog)). Обычную логику многие spice симуляторы умеют моделировать, а вот которые умеют файлы verilog подключать - не видел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 15 ноября, 2014 Опубликовано 15 ноября, 2014 · Жалоба Похоже CPLD придётся использовать. На verilog алгоритм написал (оказывается, это не сложно). В симуляторе (iverilog+vvp) проверил - работает. module mod_logic( input wire clock, input wire [3:0]in_a, input wire [3:0]in_b, output reg [3:0]out_c ); integer i=0,shift=0,position=0; initial out_c = 4'b0001; always @(posedge clock ) begin shift=0; // проверка if((in_a != 4'b0000) & (in_b != 4'b0000)) out_c <= 4'b1000; // обработка ошибок else begin // определяем позицию на выходе for(i=0; i<4; i=i+1) begin if(out_c[i]) position=i+1; end // считаем сдвиг в +, если это возможно if((in_a != 4'b0000) & (out_c != 4'b1000)) begin for(i=0; i<4; i=i+1) begin if(in_a[i]) shift=shift+1; end // сдвигаем if (shift > (4-position)) out_c <= 4'b1000; else out_c <= out_c << shift; end // считаем сдвиг в -, если это возможно if((in_b != 4'b0000) & (out_c != 4'b0001)) begin for(i=0; i<4; i=i+1) begin if(in_b[i]) shift=shift+1; end // сдвигаем if (shift > (position-1)) out_c <= 4'b0001; else out_c <= out_c >> shift; end end //$display("position %d",position); //$display("shift %d",shift); end endmodule Один только минус - для симулирования всей схемы (в основном аналоговые компоненты), в которой эта CPLD будет стоять, нужен какой-то mixed-mode симулятор (spice+HDL(Verilog)). Обычную логику многие spice симуляторы умеют моделировать, а вот которые умеют файлы verilog подключать - не видел. Вот: shift=0; .... out_c <= 4'b1000; // обработка ошибок блокирующие и неблокирующие под одним клоком не делают... И все вот такие for(i=0; i<4; i=i+1) begin if(in_b) shift=shift+1; end это что? Это же не Си, это должно работать в железе. А там, в железе никто не знает, что такое "i"... вам надо прочесть о синтезируемых и несинтезируемых конструкциях... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Siluan 0 18 ноября, 2014 Опубликовано 18 ноября, 2014 · Жалоба Правильно написали CPLD, это маленькая ПЛИС, схему можно просто нарисовать, прямо как ЛЕГО набрать из логических элементов. Потом нажимаете кнопку и схема прошивается в CPLD. Как в том анекдоте "а кто должен кнопку нажимать". Очень интересно. Применительно к конечным автоматам, какой продукт можете порекомендовать? Возможна ли реализация параллельной работы участков схемы, как в жесткой логике. Есть ли время инициализации, или работает сразу после включения? Есть ли продукты с числом элементов типа и-не, Д-триггеров общим числом не более 200. И самое главное, есть ли среда программирования без написания текста программ, а типа как в Микрокапе собирается схема из готовых деталей. Можно дать ответ в личную почту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба у каждого производителя есть небольшие отличия. возьмем например древний xilinx 9500... время включения 200мксек с момента подачи питания. питание 3,3в, совместимость входов с 5в, 3,3в и 2,5в частота работы логики до 200 МГц. от 34 до 192 пользовательских ножек от 36 до 288 макроячеек. каждая макроячейка это многовходовая логика (любая) плюс триггер. логикой можно объединить до 90+ сигналов. и да, можно не изучать никакие языки и тупо нарисовать все в знакомой 74 логике. но это контрпродуктивно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Применительно к конечным автоматам, какой продукт можете порекомендовать? EPM3064 и компанию, MaxPlus и вот эти статьи: http://www.epos.ua/view.php/about_pubs_arc...amp;ucat=3& http://www.epos.ua/view.php/about_pubs_arc...amp;ucat=3& Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 ноября, 2014 Опубликовано 24 ноября, 2014 · Жалоба EPM3064 и компанию, MaxPlus и вот эти статьи: С ПЛИС согласен, а вот MaxPlus однозначно рекомендовать не стоит, он устарел и морально, и физически, еще лет 10 назад. В том числе, толком не поддерживает verilog, на котором ТС работает. Для TC: Я бы рекомендовал, параллельно с этой серией, еще Lattice http://www.latticesemi.com/en/Products/FPG...MACH4000ZE.aspx Серия аналогична, но имеет пару малозаметных плюсиков - околонулевое потребление в статике, на пару пинов больше для I/O, и среда разработки куда менее монстроидальная, и цена чуток поменьше. Вдогонку - несложная mixed-signal симуляция имеется вот у них - http://www.tina.com/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 ноября, 2014 Опубликовано 24 ноября, 2014 · Жалоба блокирующие и неблокирующие под одним клоком не делают... Это да, безоговорочно. И все вот такие for(i=0; i<4; i=i+1) begin if(in_b) shift=shift+1; end А вот это полностью синтезируемо, и нормально. Для информации (для ТС, разумеется) - это синтезируется в 5 последовательно соединенных условных инкременторов (сумматоров, выполняющих функцию A+1/A+0 по условию). Также как и сдвиг "x >> shift" отлично синтезируется в баррелевский сдвигатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 24 ноября, 2014 Опубликовано 24 ноября, 2014 · Жалоба А вот это полностью синтезируемо, и нормально. Для информации (для ТС, разумеется) - это синтезируется в 5 последовательно соединенных условных инкременторов (сумматоров, выполняющих функцию A+1/A+0 по условию). Также как и сдвиг "x >> shift" отлично синтезируется в баррелевский сдвигатель. Это значит, что я не правильно выразил идею... Обычно когда пишется "действие" на Си, то берется слово, накладывается маска, сдвигается и т.д. При этом сдвигается столько раз, сколько указано в команде. А когда делается описание на Верилоге, то все циклы действительно разворачиваются в соответствующее "количество железа". И если в одной команде на Си надо сдвинуть 3 раза, а в другой - 5 раз, то процессор так и сделает. А Верилог сделает совершенно две разные цепи, первая из них будет состоять из 3-х "сдвигателей", а вторая - из 5-ти. Вот что я хотел сказать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться