Перейти к содержанию
    

ПЛИС xilinx

Машина состояний для xilinx

 

задайте пожайлуста вопрос по конкретнее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

задайте пожайлуста вопрос по конкретнее

Есть 10 сигналов, которые идут втечении 10мс(половина кадра). Полкадра разделено на интервалы: запись, адресиция, начало индикации, индикация и стирание. В каждом интервале сигналы описывобтс по-разному. Нужно корректно организовать переключение между интервалами.

P.S. Цикл адресиция- начало индикации-индикация - стирание повторяется 7 раз. В каждом периоде длительность индикации разная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть 10 сигналов, которые идут втечении 10мс(половина кадра). Полкадра разделено на интервалы: запись, адресиция, начало индикации, индикация и стирание. В каждом интервале сигналы описывобтс по-разному. Нужно корректно организовать переключение между интервалами.

P.S. Цикл адресиция- начало индикации-индикация - стирание повторяется 7 раз. В каждом периоде длительность индикации разная.

 

На сайте xilinx документ xst.pdf. Там есть машина состояний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сайте xilinx документ xst.pdf. Там есть машина состояний.

Структура машины состояний ясна. Проблема заключается в следующем. Указатели на то или иное состояние машины переходят в 1, в 0 не возвращаются. Также для того, чтобы перейти в следующее состояние приходится проверять слишком большое условие. Т. е. осуществляется привязка к конкретному времени, которое пришлось пересчитать, т. к. длительность периода индикации в каждом цикле разная. Без пересчета времени никак нельзя? Кажется проблема именно в этом.

post-40488-1222426664_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Структура машины состояний ясна. Проблема заключается в следующем. Указатели на то или иное состояние машины переходят в 1, в 0 не возвращаются. Также для того, чтобы перейти в следующее состояние приходится проверять слишком большое условие. Т. е. осуществляется привязка к конкретному времени, которое пришлось пересчитать, т. к. длительность периода индикации в каждом цикле разная. Без пересчета времени никак нельзя? Кажется проблема именно в этом.

 

Причем тут слишком большое условие. У Вас дискрет 0.5 мкс. За это время можно перейти в другое состояние за один такт.

Можно по старинке. Поставьте ПЗУ. (Старшие разряды ПЗУ Ваши субполя и повторы).

Или табличный метод. (if - (case (case)) - else if(case (case)) - else (case (case))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не вдаваться в детали, то общее решение таково:

Автомат + таймер.

таймер - загружаемый счетчик, который декрементирует до нуля. Этот сигнал идет в автомат и по нему автомат делает загрузку счетчика новым значением и переходит в след. состояние, где опять ждет заданное время...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Причем тут слишком большое условие. У Вас дискрет 0.5 мкс. За это время можно перейти в другое состояние за один такт.

Можно по старинке. Поставьте ПЗУ. (Старшие разряды ПЗУ Ваши субполя и повторы).

Или табличный метод. (if - (case (case)) - else if(case (case)) - else (case (case))

Простите мне мою настойчивость и не понимание. Мне кажется я примерно так и сделала , но почему не работает никак не пойму.

MS.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простите мне мою настойчивость и не понимание. Мне кажется я примерно так и сделала , но почему не работает никак не пойму.
Вместо next_state <= state; должно быть state <= next_state;

 

И тут:

 

if (pol_kadr_count >= 0 and pol_kadr_count < 447 ) then
                 state <= st_write;
             end if;

 

аналогично

 

if (pol_kadr_count >= 0 and pol_kadr_count < 447 ) then
     next_state <= st_write;
end if;

Кстати, из за этого куска кода конечный автомат может не распознаться (и не синтезироваться)

Изменено пользователем XVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется я примерно так и сделала , но почему не работает никак не пойму.

 

Проект не рабочий с точки зрения синтезатора. Нет состояния next и списков чувствительности в процессе.

Или добейтесь хоть какого нибудь автомата при синтезе. Или вообще окожитесь от автомата и работайте в case. Но опять таки за Вас вряд ли кто сделает синтезируемую конструкцию.

(Для анализа выкладывают проект без ошибок с точки зрения синтезатора).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вместо next_state <= state; должно быть state <= next_state;

 

И тут:

 

if (pol_kadr_count >= 0 and pol_kadr_count < 447 ) then
                 state <= st_write;
             end if;

 

аналогично

 

if (pol_kadr_count >= 0 and pol_kadr_count < 447 ) then
     next_state <= st_write;
end if;

Кстати, из за этого куска кода конечный автомат может не распознаться (и не синтезироваться)

Спасибо большое. Мне это помогло. Машина состояний работает!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описание автомата, основанное на Вашем исходнике.

Спасибо. Я только месяц после института работаю, поэтому очень благодарна за помощь!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описание автомата, основанное на Вашем исходнике.

Я не очень поняла вашу машину состояний. Она выдает по одному импульсу(запись, адресация и т.д.) в соответствующее время, а мне нужно по 7 импульсов (адресации, начала индикации , индикации и стирания) за половину кадра. Может я чего-то не понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а мне нужно по 7 импульсов

 

Вам ничего не мешает поставить еще один счетчик.

а счетчик который pol_kadr_count инкременировать только тогда когда subpole_count = 7

 

тогда значение автомата будет меняться раз в 7 clock'ов.

 

    process(CLK)
    begin
        if (CLK'event and CLK = '1') then    
            
            if (subpole_count < 7) then
                subpole_count <= subpole_count + 1;
            else
                subpole_count <= (others => '0');
                if (pol_kadr_count < 20030) then
                    pol_kadr_count <= pol_kadr_count + 1; 
                    state<=next_state;
                else
                    pol_kadr_count <= (others => '0');
                    state <= st_write;
                end if;     
            end if;    
        end if;
    end process;

Изменено пользователем SFx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...