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

Сброс конечного автомата фронтом reset. [Решено за 30 мин.]

input clk;
input reset;
reg [2:0]state;

initial
begin
state <= 3;
end

always @(posedge clock or posedge reset) begin
if (reset) begin
  state <= 0;
end 
else begin
  case (state)
   0:
    begin
     state <= 1;
    end
   1:
    begin
     state <= 2;
    end
   2:
    begin
     state <= 3;
    end
   3:
    begin
     //Остановиться
    end
end
end

 

Когда мы зажмем reset - конечный автомат переинициализируется (state сбросится в ноль по фронту reset-а). Но заработает автомат по первому фронту clk после того, как мы отпустим reset.

Подскажите пожалуйста, возможно ли сделать так, что бы автомат сбросился по фронту reset-а и заработал бы по следующему фронту clk?

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

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


Ссылка на сообщение
Поделиться на другие сайты
Когда мы зажмем reset - конечный автомат переинициализируется (state сбросится в ноль по фронту reset-а). Но заработает автомат по первому фронту clk после того, как мы отпустим reset.

Подскажите пожалуйста, возможно ли сделать так, что бы автомат сбросился по фронту reset-а и заработал бы по следующему фронту clk?

Так Вы сами себе противоречите.

Т.е мы сбрасываем автомат по фронту, и начинаем работать когда кнопка отпущена. А зачем тогда фронт ?

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


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

Может, лучше сделать определение фронта reset по фронтам clk и при получении фронта (был 0 стало 1) сбрасывать автомат и признак наличия фронта?

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


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

Перефразирую.

Приведенный в первом посте код работает так:

1) нажимаем кнопку - автомат сбрасывается по фронту reset-а

2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется

3) отпускаем кнопку - ничего не происходит

4) следующий фронт clk запускает автомат т.к. работает условие по ветви else

 

Почему я его привел? Потому, что таков пример сброса конечного автомата в руководствах, до которых я пока дотянулся - таков.

 

Данный пример меня не устраивает.

 

Хотелось бы:

1) нажимаем кнопку - автомат сбрасывается по фронту reset-а

2) по следующему фронту clk автомат начинает работу

 

Но я пока не пойму как такое реализовать. И возможно ли.

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


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

Приведенный в первом посте код работает так:

1) нажимаем кнопку - автомат сбрасывается по фронту reset-а

2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется

3) отпускаем кнопку - ничего не происходит

4) следующий фронт clk запускает автомат т.к. работает условие по ветви else

 

Почему я его привел? Потому, что таков пример сброса конечного автомата в руководствах, до которых я пока дотянулся - таков.

 

Данный пример меня не устраивает.

 

Хотелось бы:

1) нажимаем кнопку - автомат сбрасывается по фронту reset-а

2) по следующему фронту clk автомат начинает работу

 

Но я пока не пойму как такое реализовать. И возможно ли.

Тогда, как было сказано, выше - на частоте clk детектируете необходимый фронт схемой, называемой детектор фронта (первая ссылка в гугле по запросу "детектор фронта FPGA"), и по этому событию синхронно сбрасываете автомат. Но перед этим необходимо поставить андидребезг на кнопку, ведь сброс то с кнопки подается.

P.S. А какими руководствами Вы пользуетесь ? Просто любопытно.

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


Ссылка на сообщение
Поделиться на другие сайты
Но я пока не пойму как такое реализовать. И возможно ли.

До сих пор Вы говорили об Асинхронном Сбросе, а Вам нужен Синхронный Сброс.

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
Может, лучше сделать определение фронта reset по фронтам clk и при получении фронта (был 0 стало 1) сбрасывать автомат и признак наличия фронта?

О, спасибо! Хорошая идея.

 

Я, правда, надеялся, что есть способ элегантнее.

В смысле, я надеялся что будет различие между кодом

always @(posedge clock or posedge reset) begin
if (reset) begin
  state <= 0;

и кодом

always @(posedge clock or reset) begin
if (reset) begin
  state <= 0;

а так же кодом

always @(posedge clock) begin
if (reset) begin
  state <= 0;

Но видимо они все сработают одинаково.

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


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

Приведенный в первом посте код работает так:

1) нажимаем кнопку - автомат сбрасывается по фронту reset-а

2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется

3) отпускаем кнопку - ничего не происходит

4) следующий фронт clk запускает автомат т.к. работает условие по ветви else

 

В приведенном вами коде описан асинхронный сброс, он работает не по фронту, а по уровню. Posedge в описании используется для корректной симуляции.

 

Хотелось бы:

1) нажимаем кнопку - автомат сбрасывается по фронту reset-а

2) по следующему фронту clk автомат начинает работу

 

Но я пока не пойму как такое реализовать. И возможно ли.

 

Выделите фронт reset'а и подайте в качестве сброса на автомат выход этого детектора.

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

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


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

Всем огромное спасибо! Интересно, как здесь поддерживается такой порядок, что участники обращаются на "Вы" и столь стремительно спешат на помощь по не слишком серьезному поводу?

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


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

Конечно нет...

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


Ссылка на сообщение
Поделиться на другие сайты
В смысле, я надеялся что будет различие между кодом
always @(posedge clock or posedge reset) begin
if (reset) begin
  state <= 0;

и кодом

always @(posedge clock or reset) begin
if (reset) begin
  state <= 0;

а так же кодом

always @(posedge clock) begin
if (reset) begin
  state <= 0;

Но видимо они все сработают одинаково.

 

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

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

к лишнему срабатыванию ветки else при заднем фронте сброса.

Третий вариант - синхронный сброс, без присутствия клока он работать не будет вообще.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация