Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Lattice MachXO2 (Diamond 3.5)
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
sonycman
Доброго времени суток!

Недавно начал разбираться с ПЛИС, осваиваю потихоньку семейство небольших CPLD MachXO2.

Возник вопрос к сообществу - как принято устанавливать дефолтные значения регистров данных внутри модулей (не массивов памяти)?
Может, кто подскажет из тех, кто знаком с кристаллами от Лэттиса.

К примеру, простой модуль:
Код
module counter_test(
                    input CLK,
                    input RESET_N,
                    output reg [7:0] LEDS
                    );
    
    reg [20:0] counter;
    
    reg [7:0] leds = 8'd64;
    
    initial
        begin
        leds = 8'd64;
        end
    
    always @ (posedge CLK)
        begin
        counter <= counter + 21'd1;
        LEDS <= leds;
        end
    
    always @ (posedge counter[19] or negedge RESET_N)
        begin
        if (!RESET_N)
            begin
            leds <= 8'd64;
            end
        else
            begin
            leds <= leds + 8'd1;
            end
        end
        
endmodule

Строка с инициализацией: reg [7:0] leds = 8'd64; и блок initial не синтезируются, к сожалению sad.gif

Остаётся вариант со сбросом на начальные значения по внешнему сигналу RESET_N, если вывести его на ножку чипа.
Но всё же хотелось бы использовать внутренние ресурсы, мне сброс не нужен как таковой, нужна только начальная установка после подачи питания.

Хотел использовать внутренние сигналы GSR и PUR, но не пойму, как их задействовать, чтобы сработала ветка модуля по входу RESET_N?
qwa
Цитата(sonycman @ Oct 24 2015, 17:44) *
Строка с инициализацией: reg [7:0] leds = 8'd64; и блок initial не синтезируются, к сожалению sad.gif

Вообще,подобные конструкции нужны только для симуляции....
sonycman
Цитата(qwa @ Oct 24 2015, 18:57) *
Вообще,подобные конструкции нужны только для симуляции....

Я уже понял, однако в Квартусе, говорят, синтезируются?
qwa
Цитата(sonycman @ Oct 24 2015, 18:00) *
Я уже понял, однако в Квартусе, говорят, синтезируются?

Синтезируется. И в ISE тоже. Это или их особая фишка, или нововведение какое-то - в книжке 2004 года по VHDL сказано,что такая конструкция не синтезируется laughing.gif
sonycman
В общем, насколько я понял, в случае MachXO2 для установки всех ненулевых регистров придётся выделять отдельный пин на корпусе, вешать на него кондёр и подтяжку резистором.
И уже с него заводить внутрь сигнал сброса.
Это при том, что мне нафиг не нужен внешний сброс... Вот шняга то sad.gif

Получается определить входной сигнал сброса в топ модуле, и синтезатор вешает на него глобальный сброс GSR.
Но роутер выводит этот сигнал на пин на корпусе кристалла, даже когда он не задан в .lpf файле - на первый попавшийся свободный пин.

Можно ли как-то запретить роутеру выводить этот сигнал наружу?
Timmy
Цитата(sonycman @ Oct 24 2015, 20:11) *
В общем, насколько я понял, в случае MachXO2 для установки всех ненулевых регистров придётся выделять отдельный пин на корпусе, вешать на него кондёр и подтяжку резистором.
И уже с него заводить внутрь сигнал сброса.
Это при том, что мне нафиг не нужен внешний сброс... Вот шняга то sad.gif

Получается определить входной сигнал сброса в топ модуле, и синтезатор вешает на него глобальный сброс GSR.
Но роутер выводит этот сигнал на пин на корпусе кристалла, даже когда он не задан в .lpf файле - на первый попавшийся свободный пин.

Можно ли как-то запретить роутеру выводить этот сигнал наружу?

Можно создать сдвиговый регистр, который после конфигурирования устанавливается в ноль, и к старшему биту этого регистра подключить инверсный сброс. После загрузки конфигурации в регистр задвигаются единицы, после чего сброс завершится. Ведь клок для сдвигового регистра какой-то у вас будет, хотя бы внутренний осциллятор. Триггеры можно в крайнем случае задать с помощью примитивов из стандартной библиотеки Lattice, и, кстати, насчёт MachXO не уверен, а для ECP можно создавать триггеры, которые стартуют с единицы.
sonycman
Цитата(Timmy @ Oct 25 2015, 11:59) *
Можно создать сдвиговый регистр, который после конфигурирования устанавливается в ноль, и к старшему биту этого регистра подключить инверсный сброс.

Ага, спасибо, сегодня уже делал похожий блок сброса, на счётчике, правда.
Работает, но тогда надо отключать фишку под именем GSR, что не очень хорошо, как я понимаю.

Вот почему бы примитив под этот внутренний сброс GSR лэтисовцам не сделать с назначаемым выходом?
А то вход сделали, который не всегда нужен, а выхода сброса почему то нет, надо надеятся на автоматику, которая сама должна найти в схеме асинхронный сброс и подсоединиться к нему, что она делает не всегда так, как хотелось бы...

ЗЫ: посмотрел в квартусе, как альтера реализует в синтезе начальную установку - дополнительной логикой, ставятся инверторы для битов, установленных как бы в единички.
Наворочено!
Смотрится всё потом весьма громоздко, конечно.

ЗЗЫ: никто не знает, есть ли в мире форум по Лэттисам, подобие альтеровского?
На офф. сайте вроде нет, хотя раньше что-то было, как я понимаю?
Timmy
Цитата(sonycman @ Oct 25 2015, 12:44) *
Ага, спасибо, сегодня уже делал похожий блок сброса, на счётчике, правда.
Работает, но тогда надо отключать фишку под именем GSR, что не очень хорошо, как я понимаю.

Вот почему бы примитив под этот внутренний сброс GSR лэтисовцам не сделать с назначаемым выходом?
А то вход сделали, который не всегда нужен, а выхода сброса почему то нет, надо надеятся на автоматику, которая сама должна найти в схеме асинхронный сброс и подсоединиться к нему, что она делает не всегда так, как хотелось бы...

Для генератора сброса можно индивидуально отключить GSR, либо атрибутом, либо использовав для него примитивы без GSR.
А реализован GSR действительно очень извращённо. На самом деле вы можете сами присоединить вход примитива GSR к своему сигналу управляющему общим сбросом, тогда точно именно он будет работать через GSR, однако при этом в настройках симплифая GSR всё равно должен быть включён.
m_m
Цитата(qwa @ Oct 24 2015, 18:11) *
Синтезируется. И в ISE тоже. Это или их особая фишка, или нововведение какое-то - в книжке 2004 года по VHDL сказано,что такая конструкция не синтезируется laughing.gif


В Даймонде для XO2 синтезируется начиная с версии 3.5 (для VHDL проверено и работает).
sonycman
Цитата(m_m @ Oct 26 2015, 18:50) *
В Даймонде для XO2 синтезируется начиная с версии 3.5 (для VHDL проверено и работает).

Ну а для Verilog нифига не синтезируется sad.gif

Каким синтезатором пользуетесь? LSE или Synplify?
qwa
Цитата(m_m @ Oct 26 2015, 17:50) *
В Даймонде для XO2 синтезируется начиная с версии 3.5 (для VHDL проверено и работает).

С Латтисами не работал - только с Xilinx и Альтера. laughing.gif

Кстати, позволю небольшой оффтоп - какой сегмент рынка держат Латтисы? Ну для каких задач в основном ПЛИСки делают.
_Sam_
Попробуйте
Код
PUR PUR_INST (.PUR (<powerup reset sig>));

Описание.

Возможно будет полезна дока от Lattice.
sonycman
Цитата(_Sam_ @ Oct 27 2015, 16:59) *
Попробуйте
Код
PUR PUR_INST (.PUR (<powerup reset sig>));


Спасибо, но тут такая же ситуация, как и с GSR: powerup reset sig - это входной сигнал для блока PUR, а не выходной.
Маразм, конечно - какой ещё входной сигнал нужен для сброса при подаче питания?
Разве что для симуляции (о чём и пишут в доках).

Я уже стал привыкать к отдельному входному пину, выделенному для сброса, как у микроконтроллеров.
Заодно при таком "внешнем" стартовом сбросе можно установить внутренние регистры в состояния, зависящие от уровней на других входных пинах.
Используя блоки initial такого эффекта не получить, как мне кажется...
_Sam_
Да я ерунду написал так краем глаза увидел и не разобрался что к чему )) PUR только для симуляции годится.

Ответ на вопрос тута страница 333. biggrin.gif

т.е. должна прокатывать инициализация при объявлении:
Код
reg tst = 1'b1;

однако блок initial по прежнему несинтезируемый.


попробовал, работает для инициализации использует LUTы
sonycman
Благодарю, потом обязательно попробую сравнить синтез LSE и Синплифай для XO2.
Последний, очевидно, более продвинутый.

ЗЫ: сначала пробую работать на Verilog, но уже посматриваю в сторону SystemVerilog. А может сразу стоило осваивать SV?
olefil
А чем сброс от PLL не нравится, частоту в любом случае заводите.
sonycman
Цитата(olefil @ Oct 29 2015, 09:02) *
А чем сброс от PLL не нравится, частоту в любом случае заводите.

В том то и дело - не завожу.
Использую встроенный генератор.
Похоже, что CPLD Лэттиса в этом случае уникальны sm.gif
Мур
Цитата(olefil @ Oct 29 2015, 08:02) *
А чем сброс от PLL не нравится, частоту в любом случае заводите.

Так сам PLL требует сброса!!!
Установкой атрибута играться?.. Синтезатор поймет? Кто проверял, мужики?
Мур


Это пример для Lattice iCE40
sonycman
Да, PLL при слёте сигнала LOCK рекомендуется принудительно сбрасывать, чтобы она правильно перезапустилась.

GSR, как я понимаю, это просто сеть соединений, которая оптимально подходит для разводки глобальных распределённых сигналов.
Поэтому эта сеть (в виде примитива GSR) имеет только вход, и не имеет выхода.

Оставил её подключение в настройках чисто по умолчанию, автомат сам подключает её к сигналу с наибольшим fanout, и чаще всего это как раз RESET sm.gif

Я пока просто на макетке завёл сигнал сброса с RC цепочки на ПЛИС, а потом в готовом устройстве, как уже подсказывали, просто сделаю небольшой счётчик или регистр сдвига, который после подачи питания будет отсчитывать от нуля до некоторого значения, удерживая при этом линию RESET в активном состоянии.
Мур
Error: Module PUR is not a valid primitive....
PUR library element description in the FPGA Libraries Help system. Кто знает, что это за библиотека?

How to Use the Global Set/Reset (GSR) Signal в поисковике набрать...
sonycman
PUR это Power Up Reset - начальный сброс при подаче питания.
Только для симуляции.
Эффект - на MachXO2, к примеру, все регистры после подачи питания сброшены в ноль.
Мур
Цитата(sonycman @ Dec 16 2015, 00:04) *
Только для симуляции.


Мне интересно по iCE40 как обеспечить "на железе" сигнал Сброса для своих нужд?
Полные примеры мне не известны... Компилятор iceCube2 требует библиотеку для применения конструкций, указанных в документе (How to Use the Global Set/Reset (GSR) Signal) . Кто подскажет. Симуляция мне не интересна...
sonycman
Цитата(Мур @ Dec 16 2015, 11:24) *
Мне интересно по iCE40 как обеспечить "на железе" сигнал Сброса для своих нужд?
Полные примеры мне не известны... Компилятор iceCube2 требует библиотеку для применения конструкций, указанных в документе (How to Use the Global Set/Reset (GSR) Signal) . Кто подскажет. Симуляция мне не интересна...

Ну я сам только месяц как изучаю ПЛИС, так что не сильно пока ещё "в теме".
Но, как уже упоминал, есть два простых способа.

1.Внешний сброс. То есть выделяете пин, подключаете к нему подтягивающий к VCC резистор (PULLUP, обычно есть встроенные в чип), а снаружи вешаете конденсатор на 0.1-1 мкФ, в зависимости от нужной длительности сброса. И ещё не забудьте включить в ПЛИС триггер шмитта на этом пине.
Получается сигнал Reset с активным низким уровнем.

2. Внутренний сброс на регистре.
Например:
Код
module    reset_gen    (
            input CLK,
            output RESET
            );
                    
    reg [2:0] shift;
    
    always @(posedge CLK) shift <= {shift[1:0], 1'b1};
    
    assign RESET = ~&shift;
    
endmodule

Первые несколько тактов после подачи питания выход RESET будет удерживаться в активном состоянии.
Мур
Это из iCE40FamilyHandbook

Все красиво, ...но пока не доступно. Ткните носом!
sonycman
Ну что тут недоступного-то?
Это схема внутреннего сброса ПЛИС перед загрузкой конфигурации.

Вам этот сброс не нужен, да он и не доступен для синтеза.

Сделайте, как я посоветовал выше.
Либо внешний пин RESET, либо внутренняя генерация.

Не вижу проблемы.
Мур
Цитата(sonycman @ Dec 17 2015, 02:13) *
Ну что тут недоступного-то?
Это схема внутреннего сброса ПЛИС перед загрузкой конфигурации.

Вам этот сброс не нужен, да он и не доступен для синтеза.

Сделайте, как я посоветовал выше.
Либо внешний пин RESET, либо внутренняя генерация.

Не вижу проблемы.

Вчера уже реализовал. Работает нормально... Если считать 30 включений достаточно.

Тут просто хотелось штатного(зарезервированного хелезом) решения
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.