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

Как реализовывать FSM.

Упорно не получается сделать FSM так что бы работало :). Я наверное что-то не понимаю :cranky: .

 

После первых экспериментов, воспользовался smf файлом, и нарисовал что нужно.

Смотрю симулятором и в железе EP2C5T144C8 @ 100Мгц.

 

Quartus генерирует код вида:

 

    
always @(posedge clock)
    begin
        if (clock) begin
            fstate <= reg_fstate;
        end
    end

    always @(fstate or reset or tx_busy or f_smpl_rdy or f_all_reg)
    begin
        if (reset) begin
                   ...
        end
        else begin
            case (fstate)
                WAIT: begin
                    if (f_smpl_rdy)
                        reg_fstate <= START_PACKET;
                    // Having else block to avoid latch inference
                    else
                        reg_fstate <= WAIT;
                   ...
                end

 

На это квартус говорит:

Warning (10240): Verilog HDL Always Construct warning at bsc.v(56): inferring latch(es) for variable "f_adrrst", which holds its previous value in one or more paths through the always construct

 

В симуляторе работает, в железе виснет. Мне сначала показалось, что разумным было бы внести все в один блок always @(posedge clock) и это естественно устраняет варнинг, но получается бред если посмотреть в RTL Viewer и в симуляторе.

 

Когда убираю регистр fstate и вношу все в один блок always @(posedge clock) и делаю case (reg_fstate), вроде все начинает работать но только в симуляторе.

 

 

Направте не путь истинный, как реализовать FSM, почему код генерируемый стандартными стредствами IDE приводит к защелкиванию схемы?

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


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

Защелкивает у вас переменню "f_addrrst". Вот на ее логику и смотрите.

Машина состояний на двух always-блоках - это нормально.

подробнее про FSM читайте на sunburst-design

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


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

подробнее про FSM читайте на sunburst-design

 

Читал Synthesizable Finite State Machine Design Techniques от туда, понимаю что нормально, но почему Квартус валит ошибку. Защелкивание он валит по всем выходам КА. В проекте только один КА и больше ничего. В железе проверял уже подключая к остальной схеме, на сколько я понял защелкивается.

 

Не совсем понимаю куда девается reg_fstate в случае с двумя блоками always.

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


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

Не совсем понимаю куда девается reg_fstate в случае с двумя блоками always.
reg_fstate в этом случае - это комбинаторная логика, при синтезе она размазывается. Триггера в описании второго always блока нет.

Как избавится от латчей - это даже в хелпе квартуса написано. встаете на сообщение, жмете на Ф1 - и там все будет.

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


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

Как избавится от латчей - это даже в хелпе квартуса написано. встаете на сообщение, жмете на Ф1 - и там все будет.

 

Спасибо помогло :). Понял как оно работет.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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