|
|
  |
Сброс конечного автомата фронтом reset. [Решено за 30 мин.], Как сбросить именно фронтом ресета, а не лог.1 ресета? |
|
|
|
Jun 5 2018, 12:16
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 4-06-18
Пользователь №: 104 848

|
Код 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 - Jun 5 2018, 16:23
|
|
|
|
|
Jun 5 2018, 12:32
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 4-06-18
Пользователь №: 104 848

|
Перефразирую. Приведенный в первом посте код работает так: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется 3) отпускаем кнопку - ничего не происходит 4) следующий фронт clk запускает автомат т.к. работает условие по ветви else
Почему я его привел? Потому, что таков пример сброса конечного автомата в руководствах, до которых я пока дотянулся - таков.
Данный пример меня не устраивает.
Хотелось бы: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) по следующему фронту clk автомат начинает работу
Но я пока не пойму как такое реализовать. И возможно ли.
|
|
|
|
|
Jun 5 2018, 12:38
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(flammmable @ Jun 5 2018, 15:32)  Перефразирую. Приведенный в первом посте код работает так: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется 3) отпускаем кнопку - ничего не происходит 4) следующий фронт clk запускает автомат т.к. работает условие по ветви else
Почему я его привел? Потому, что таков пример сброса конечного автомата в руководствах, до которых я пока дотянулся - таков.
Данный пример меня не устраивает.
Хотелось бы: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) по следующему фронту clk автомат начинает работу
Но я пока не пойму как такое реализовать. И возможно ли. Тогда, как было сказано, выше - на частоте clk детектируете необходимый фронт схемой, называемой детектор фронта (первая ссылка в гугле по запросу "детектор фронта FPGA"), и по этому событию синхронно сбрасываете автомат. Но перед этим необходимо поставить андидребезг на кнопку, ведь сброс то с кнопки подается. P.S. А какими руководствами Вы пользуетесь ? Просто любопытно.
|
|
|
|
|
Jun 5 2018, 12:40
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 4-06-18
Пользователь №: 104 848

|
Цитата(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; Но видимо они все сработают одинаково.
|
|
|
|
|
Jun 5 2018, 12:42
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(flammmable @ Jun 5 2018, 15:32)  Перефразирую. Приведенный в первом посте код работает так: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется 3) отпускаем кнопку - ничего не происходит 4) следующий фронт clk запускает автомат т.к. работает условие по ветви else В приведенном вами коде описан асинхронный сброс, он работает не по фронту, а по уровню. Posedge в описании используется для корректной симуляции. Цитата(flammmable) Хотелось бы: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) по следующему фронту clk автомат начинает работу
Но я пока не пойму как такое реализовать. И возможно ли. Выделите фронт reset'а и подайте в качестве сброса на автомат выход этого детектора.
Сообщение отредактировал Tausinov - Jun 5 2018, 12:44
|
|
|
|
|
Jun 5 2018, 12:48
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 4-06-18
Пользователь №: 104 848

|
Всем огромное спасибо! Интересно, как здесь поддерживается такой порядок, что участники обращаются на "Вы" и столь стремительно спешат на помощь по не слишком серьезному поводу?
|
|
|
|
|
Jun 5 2018, 12:49
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(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 при заднем фронте сброса. Третий вариант - синхронный сброс, без присутствия клока он работать не будет вообще.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|