flammmable 0 5 июня, 2018 Опубликовано 5 июня, 2018 (изменено) · Жалоба 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? Изменено 5 июня, 2018 пользователем flammmable Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Когда мы зажмем reset - конечный автомат переинициализируется (state сбросится в ноль по фронту reset-а). Но заработает автомат по первому фронту clk после того, как мы отпустим reset. Подскажите пожалуйста, возможно ли сделать так, что бы автомат сбросился по фронту reset-а и заработал бы по следующему фронту clk? Так Вы сами себе противоречите. Т.е мы сбрасываем автомат по фронту, и начинаем работать когда кнопка отпущена. А зачем тогда фронт ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Может, лучше сделать определение фронта reset по фронтам clk и при получении фронта (был 0 стало 1) сбрасывать автомат и признак наличия фронта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Перефразирую. Приведенный в первом посте код работает так: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется 3) отпускаем кнопку - ничего не происходит 4) следующий фронт clk запускает автомат т.к. работает условие по ветви else Почему я его привел? Потому, что таков пример сброса конечного автомата в руководствах, до которых я пока дотянулся - таков. Данный пример меня не устраивает. Хотелось бы: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) по следующему фронту clk автомат начинает работу Но я пока не пойму как такое реализовать. И возможно ли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Перефразирую. Приведенный в первом посте код работает так: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется 3) отпускаем кнопку - ничего не происходит 4) следующий фронт clk запускает автомат т.к. работает условие по ветви else Почему я его привел? Потому, что таков пример сброса конечного автомата в руководствах, до которых я пока дотянулся - таков. Данный пример меня не устраивает. Хотелось бы: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) по следующему фронту clk автомат начинает работу Но я пока не пойму как такое реализовать. И возможно ли. Тогда, как было сказано, выше - на частоте clk детектируете необходимый фронт схемой, называемой детектор фронта (первая ссылка в гугле по запросу "детектор фронта FPGA"), и по этому событию синхронно сбрасываете автомат. Но перед этим необходимо поставить андидребезг на кнопку, ведь сброс то с кнопки подается. P.S. А какими руководствами Вы пользуетесь ? Просто любопытно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Но я пока не пойму как такое реализовать. И возможно ли. До сих пор Вы говорили об Асинхронном Сбросе, а Вам нужен Синхронный Сброс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Может, лучше сделать определение фронта 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 0 5 июня, 2018 Опубликовано 5 июня, 2018 (изменено) · Жалоба Перефразирую. Приведенный в первом посте код работает так: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) держим кнопку - автомат сбрасывается по каждому фронту clk, т.к. условие if(reset) выполняется 3) отпускаем кнопку - ничего не происходит 4) следующий фронт clk запускает автомат т.к. работает условие по ветви else В приведенном вами коде описан асинхронный сброс, он работает не по фронту, а по уровню. Posedge в описании используется для корректной симуляции. Хотелось бы: 1) нажимаем кнопку - автомат сбрасывается по фронту reset-а 2) по следующему фронту clk автомат начинает работу Но я пока не пойму как такое реализовать. И возможно ли. Выделите фронт reset'а и подайте в качестве сброса на автомат выход этого детектора. Изменено 5 июня, 2018 пользователем Tausinov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Всем огромное спасибо! Интересно, как здесь поддерживается такой порядок, что участники обращаются на "Вы" и столь стремительно спешат на помощь по не слишком серьезному поводу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба Но видимо они все сработают одинаково. Конечно нет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба В смысле, я надеялся что будет различие между кодом 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 при заднем фронте сброса. Третий вариант - синхронный сброс, без присутствия клока он работать не будет вообще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться