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

Синтезатор минимизирует лишнего

я не очень искушен в квартусе, но сейчас в последних версиях там есть какие-то интерактивные отчеты, которые не файлы, а в среде открываются какие-то вкладочки, закладочки, и там все это написано, там есть прям закладка FSM и в ней все автоматы собраны.
Так это оно и есть, он из этих файлов в GUI и выводит.

 

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


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

У Альтеры нет примитива startup?

Я вот тоже задавался этим вопросом, но не нашел ничего. Сделал вот такой модуль для генерации сброса после загрузки (см. приложение).

Входной сигнал tick - это тики от таймера, он по всему проекту разведен чтоб таймауты считать.

 

internal_reset.v

 

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


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

так че он ваще не увидел в этом месте автомата?

Ну получается так.

 

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


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

так че он ваще не увидел в этом месте автомата?

Ну получается так.

у вас состояние автомата выходит наружу в явном виде

output reg [1:0]State;

т.е. именно в той кодировке, в которой вы это явно описали.

 

в этом случае quartus никакого преобразования в safe-state machine типа one-hot encoding произвести не может.

да, в отчетах это выглядит будто автомат не распознан.

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


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

т.е. именно в той кодировке, в которой вы это явно описали.

А как можно иначе?

 

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


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

вывести не сам автомат а производные от его состояний

output state_is_init;

reg [2:0] FSM;
localparam FSM_INIT=0;
localparam FSM_IDLE=1;
localparam FSM_RAM_RD_WAIT_1=2;
localparam FSM_RAM_RD_WAIT_2=3;
localparam FSM_DO_SOMETHING=4;
localparam FSM_RAM_WRITE=5;

always @(posedge clk or negedge nreset) begin
if (!nreset) begin
  FSM <=  FSM_INIT;
end
else begin
  case (FSM)
     FSM_INIT: begin
         FSM <=  FSM_IDLE;
     end
     FSM_IDLE: begin
       <-------------- ну и так далее ------------------>
     end
  endcase
end
end

assign state_is_init = (FSM == FSM_INIT);

 

надеюсь смысл ясен.

и ещё, допустимы только строгие равенства или неравенства, т.е. если напишете

 

assign state_is_init = (FSM < FSM_IDLE);

то тоже как автомат не распознает

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


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

Можно написать и как у вас, только наружу выдавать не состояние а численное значение

схематично

case(State)
   0:
        out <= 00;
   1:
        out <= 01;
   2: 
        out <= 10;

 

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

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


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

Ага, интересно.

Спасибо, попробую.

Можно еще сделать через enum (только для SystemVerilog'а):

enum int unsigned {
    FSM_INIT,
    FSM_IDLE,
    FSM_RAM_RD_WAIT_1,
    FSM_RAM_RD_WAIT_2,
    FSM_DO_SOMETHING,
    FSM_RAM_WRITE
} state;

Получаются такие абстрактные названия состояний без привязки к номеру. И само собой получается, что сравнивать можно только на равенство (если забыть, как они по-умолчанию нумеруются) и выводить наружу опосредованно через case или if.

 

Квартус распознает только беззнаковый enum для кодирования fsm

 

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


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

Можно еще сделать через enum (только для SystemVerilog'а):

enum int unsigned {
    FSM_INIT,
    FSM_IDLE,
    FSM_RAM_RD_WAIT_1,
    FSM_RAM_RD_WAIT_2,
    FSM_DO_SOMETHING,
    FSM_RAM_WRITE
} state;

Получаются такие абстрактные названия состояний без привязки к номеру. И само собой получается, что сравнивать можно только на равенство (если забыть, как они по-умолчанию нумеруются) и выводить наружу опосредованно через case или if.

 

Квартус распознает только беззнаковый enum для кодирования fsm

Лучше делать без неопределённостей:

enum logic [2:0] {
    FSM_INIT = 3'd0,
    FSM_IDLE = 3'd1,
    FSM_RAM_RD_WAIT_1 = 3'd2,
    FSM_RAM_RD_WAIT_2 = 3'd3,
    FSM_DO_SOMETHING = 3'd4,
    FSM_RAM_WRITE = 3'd5
} state;

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


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

Лучше делать без неопределённостей:

enum logic [2:0] {
    FSM_INIT = 3'd0,
    FSM_IDLE = 3'd1,
    FSM_RAM_RD_WAIT_1 = 3'd2,
    FSM_RAM_RD_WAIT_2 = 3'd3,
    FSM_DO_SOMETHING = 3'd4,
    FSM_RAM_WRITE = 3'd5
} state;

Чем лучше? Это по сути не отличается от определения через localparam, и снова лишает абстрактности, не позволяющей сравнивать "больше/меньше" и выводить за пределы модуля.

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


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

Чем лучше? Это по сути не отличается от определения через localparam, и снова лишает абстрактности, не позволяющей сравнивать "больше/меньше" и выводить за пределы модуля.

1. Абстрактность в state machine - это нонсенс.

2. Использование enum очень облегчает разработку и уменьшает вероятность ошибок.

3. Никто не запрещает выводить состояние наружу (хотя я не совсем представляю зачем).

4. Сравнение состояний?

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


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

1. Абстрактность в state machine - это нонсенс.

2. Использование enum очень облегчает разработку и уменьшает вероятность ошибок.

3. Никто не запрещает выводить состояние наружу (хотя я не совсем представляю зачем).

4. Сравнение состояний?

"Абстрактность - это нонсенс"? Давайте тогда делать на триггерах и базовой логике, зачем лишняя абстракция?

Про вывод и сравнение речь была выше. В вашем варианте более вероятно попытаться сравнить (больше/меньше) и вывести наружу состояния, чем в абстрактном варианте без нумерации.

 

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


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

"Абстрактность - это нонсенс"? Давайте тогда делать на триггерах и базовой логике, зачем лишняя абстракция?

Про вывод и сравнение речь была выше. В вашем варианте более вероятно попытаться сравнить (больше/меньше) и вывести наружу состояния, чем в абстрактном варианте без нумерации.

Я неправильно выразился. Моя ошибка. Под "абстрактностью" подразумевалось состояния, описанные как в начальном посте.

Я все-равно считаю, что надо использовать enum/localparam для состояний.

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


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

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

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

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

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

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

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

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

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

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