Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сброс конечного автомата фронтом reset. [Решено за 30 мин.]
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
flammmable
Код
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?
Flip-fl0p
Цитата(flammmable @ Jun 5 2018, 15:16) *
Когда мы зажмем reset - конечный автомат переинициализируется (state сбросится в ноль по фронту reset-а). Но заработает автомат по первому фронту clk после того, как мы отпустим reset.
Подскажите пожалуйста, возможно ли сделать так, что бы автомат сбросился по фронту reset-а и заработал бы по следующему фронту clk?

Так Вы сами себе противоречите.
Т.е мы сбрасываем автомат по фронту, и начинаем работать когда кнопка отпущена. А зачем тогда фронт ?
novikovfb
Может, лучше сделать определение фронта reset по фронтам clk и при получении фронта (был 0 стало 1) сбрасывать автомат и признак наличия фронта?
flammmable
Перефразирую.
Приведенный в первом посте код работает так:
1) нажимаем кнопку - автомат сбрасывается по фронту reset-а
2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется
3) отпускаем кнопку - ничего не происходит
4) следующий фронт clk запускает автомат т.к. работает условие по ветви else

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

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

Хотелось бы:
1) нажимаем кнопку - автомат сбрасывается по фронту reset-а
2) по следующему фронту clk автомат начинает работу

Но я пока не пойму как такое реализовать. И возможно ли.
Flip-fl0p
Цитата(flammmable @ Jun 5 2018, 15:32) *
Перефразирую.
Приведенный в первом посте код работает так:
1) нажимаем кнопку - автомат сбрасывается по фронту reset-а
2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется
3) отпускаем кнопку - ничего не происходит
4) следующий фронт clk запускает автомат т.к. работает условие по ветви else

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

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

Хотелось бы:
1) нажимаем кнопку - автомат сбрасывается по фронту reset-а
2) по следующему фронту clk автомат начинает работу

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

Тогда, как было сказано, выше - на частоте clk детектируете необходимый фронт схемой, называемой детектор фронта (первая ссылка в гугле по запросу "детектор фронта FPGA"), и по этому событию синхронно сбрасываете автомат. Но перед этим необходимо поставить андидребезг на кнопку, ведь сброс то с кнопки подается.
P.S. А какими руководствами Вы пользуетесь ? Просто любопытно.
iosifk
Цитата(flammmable @ Jun 5 2018, 15:32) *
Но я пока не пойму как такое реализовать. И возможно ли.

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

flammmable
Цитата(novikovfb @ Jun 5 2018, 15:28) *
Может, лучше сделать определение фронта 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;
Но видимо они все сработают одинаково.
Tausinov
Цитата(flammmable @ Jun 5 2018, 15:32) *
Перефразирую.
Приведенный в первом посте код работает так:
1) нажимаем кнопку - автомат сбрасывается по фронту reset-а
2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется
3) отпускаем кнопку - ничего не происходит
4) следующий фронт clk запускает автомат т.к. работает условие по ветви else


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

Цитата(flammmable)
Хотелось бы:
1) нажимаем кнопку - автомат сбрасывается по фронту reset-а
2) по следующему фронту clk автомат начинает работу

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


Выделите фронт reset'а и подайте в качестве сброса на автомат выход этого детектора.
flammmable
Всем огромное спасибо! Интересно, как здесь поддерживается такой порядок, что участники обращаются на "Вы" и столь стремительно спешат на помощь по не слишком серьезному поводу?
iosifk
Цитата(flammmable @ Jun 5 2018, 15:40) *
Но видимо они все сработают одинаково.

Конечно нет...
Tausinov
Цитата(flammmable @ Jun 5 2018, 15:40) *
В смысле, я надеялся что будет различие между кодом
Код
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 при заднем фронте сброса.
Третий вариант - синхронный сброс, без присутствия клока он работать не будет вообще.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.