Jump to content

    

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

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

 

Share this post


Link to post
Share on other sites
У Альтеры нет примитива startup?

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

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

 

internal_reset.v

 

Share this post


Link to post
Share on other sites
так че он ваще не увидел в этом месте автомата?

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

 

Share this post


Link to post
Share on other sites
так че он ваще не увидел в этом месте автомата?

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

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

output reg [1:0]State;

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

 

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

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

Share this post


Link to post
Share on other sites
т.е. именно в той кодировке, в которой вы это явно описали.

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

 

Share this post


Link to post
Share on other sites

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

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);

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

Share this post


Link to post
Share on other sites
надеюсь смысл ясен.
Ага, интересно.

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

 

Share this post


Link to post
Share on other sites

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

схематично

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

 

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

Share this post


Link to post
Share on other sites
Ага, интересно.

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

Можно еще сделать через 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

 

Share this post


Link to post
Share on other sites
Можно еще сделать через 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;

Share this post


Link to post
Share on other sites
Лучше делать без неопределённостей:

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, и снова лишает абстрактности, не позволяющей сравнивать "больше/меньше" и выводить за пределы модуля.

Share this post


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

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

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

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

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

Share this post


Link to post
Share on other sites
1. Абстрактность в state machine - это нонсенс.

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

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

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

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

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

 

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this