реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Асинхронка в verilog
Lutovid
сообщение Jul 2 2017, 16:43
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Всем привет!
Написал FSM разделив синхронку и асинхронку; то есть в одном always блоке синхронный процесс, во втором в списке чувствительности занесены все входные сигналы; Vivado 16.3 и 17.1 развели написанное мной ядро так, что сигналы из списка чувствительности воспринимаются как не законстрэйнченые клоки... Вопрос - это нормално и можно на это забить? Или где-то в коде косяк и такого не должно быть?
Что бы было понятнее про что я - я прикрепляю фотку (принсткрин сделать не могу сейчас, прошу прощения за качество)
Go to the top of the page
 
+Quote Post
Timmy
сообщение Jul 2 2017, 17:07
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 808
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Асинхронные сигналы в FSM использовать вообще нельзя, надо их синхронизировать.
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jul 2 2017, 17:13
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(Timmy @ Jul 2 2017, 20:07) *
Асинхронные сигналы в FSM использовать вообще нельзя, надо их синхронизировать.

я про state/prestate
http://www.asic-world.com/tidbits/verilog_fsm.html "Using Two Always Blocks"
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 2 2017, 20:34
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 3 567
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Lutovid @ Jul 2 2017, 19:43) *
Написал FSM разделив синхронку и асинхронку; то есть в одном always блоке синхронный процесс, во втором в списке чувствительности занесены все входные сигналы;

Неправильно написанное вызывает неправильные ответы и недоумение...
В FSM есть две части: комбинационная и последовательностная (регистровая) логика. При этом комбинационная логика сама по себе тоже должна порождаться от регистров и комбинационных схем, т.е. быть синхронной.
А вот входные сигналы, если они асинхронные, то они должны быть засинхронизированы с клоком FSM.
И зачем нам Ваши мутные фотки? Ведь есть такая вещь как скрин-шот...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jul 3 2017, 01:22
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(iosifk @ Jul 2 2017, 23:34) *
Неправильно написанное вызывает неправильные ответы и недоумение...
В FSM есть две части: комбинационная и последовательностная (регистровая) логика. При этом комбинационная логика сама по себе тоже должна порождаться от регистров и комбинационных схем, т.е. быть синхронной.
А вот входные сигналы, если они асинхронные, то они должны быть засинхронизированы с клоком FSM.
И зачем нам Ваши мутные фотки? Ведь есть такая вещь как скрин-шот...


Мутные фотки это все что было на момент написания поста - у меня не было доступа к компьютеру, а фото мне прислали.
Я повторю вопрос конкретнее, это моя ошибка, что сформулировал не достаточно точно - Нормальна ли ситуация, что сигнали из списка чувствительности процесса интерпретировались как незаконстрейнченые клоки и можно ли просто проигнорировать этот факт? или это сигнализирует о некорректном описании в rtl?
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Jul 3 2017, 01:59
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 785
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(Lutovid @ Jul 3 2017, 08:22) *
Нормальна ли ситуация, что сигнали из списка чувствительности процесса интерпретировались как незаконстрейнченые клоки и можно ли просто проигнорировать этот факт? или это сигнализирует о некорректном описании в rtl?

А латчей вы там случаем не наплодили по неопытности? Отсюда и "клоки"...
Go to the top of the page
 
+Quote Post
masics
сообщение Jul 3 2017, 09:26
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 21-02-05
Из: Melbourne, Australia
Пользователь №: 2 779



Скорее всего это latches.
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jul 3 2017, 12:55
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(masics @ Jul 3 2017, 12:26) *
Скорее всего это latches.

Вы праввы
Я посчитал, что вот это
Код
always @(*) begin
    if (header_formatter_ready)
        header_formatter_ready_latch <= 1'b1;
    else if (ascii_header_dataout_rd_en || reset_header_config)
        header_formatter_ready_latch <= 1'b0;
    else
        header_formatter_ready_latch <= header_formatter_ready_latch;
end

синтезируется как LDCE
Код
   LDCE #(
      .INIT(1'b0) // Initial value of latch (1'b0 or 1'b1)
   ) LDCE_inst (
      .Q(header_formatter_ready_latch),      // Data output
      .CLR(ascii_header_dataout_rd_en || reset_header_config),  // Asynchronous clear/reset input
      .D(1'b1),      // Data input
      .G(1'b1),      // Gate input
      .GE(header_formatter_ready)     // Gate enable input
   );

Мне было не очевидно, что на самом деле это не так
Сейчас уже вижу, что приоритеты ресета в двух кусках разные
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Jul 3 2017, 13:08
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 609
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Зачем вы мучаетесь сами и мучаете других подобным стилем кодирования?
Разве не проще что-то вроде:
Код
always @(posedge clk or negedge async_rst_n) begin : sequential_code
  if (!async_rst_n)
    state <= { WIDTH {1'b0}};
  else
    state <=  nextstate;
end

always @* begin : comb_block
  nextstate = state;  // store current state for loopbacks
  case (state)
      STATE0 : begin
         if      (go_state_1) nextstate = STATE1;
         else if (go_state_2) nextstate = STATE2;
         ...
      end
    ...
  endcase
end


Сообщение отредактировал one_eight_seven - Jul 3 2017, 13:13
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jul 3 2017, 13:41
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(one_eight_seven @ Jul 3 2017, 16:08) *
Зачем вы мучаетесь сами и мучаете других подобным стилем кодирования?
Разве не проще что-то вроде:
Код
always @(posedge clk or negedge async_rst_n) begin : sequential_code
  if (!async_rst_n)
    state <= { WIDTH {1'b0}};
  else
    state <=  nextstate;
end

always @* begin : comb_block
  nextstate = state;  // store current state for loopbacks
  case (state)
      STATE0 : begin
         if      (go_state_1) nextstate = STATE1;
         else if (go_state_2) nextstate = STATE2;
         ...
      end
    ...
  endcase
end

Вы про какой стиль? Вы привели пример описания конечного автомата, а я - описания асинхронного латча. Проблемы с сигналами fsm возникли из-за того, что я не правильно описал латч... С учетом того, что мой конечный автомат реализован по методу, который вы и описали, я Вас не понял.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 3 2017, 13:45
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 3 567
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Lutovid @ Jul 3 2017, 15:55) *
Код
always @(*) begin
    if (header_formatter_ready)
        header_formatter_ready_latch <= 1'b1;
    else if (ascii_header_dataout_rd_en || reset_header_config)
        header_formatter_ready_latch <= 1'b0;
    else
        header_formatter_ready_latch <= header_formatter_ready_latch;
end

синтезируется как LDCE

Мне было не очевидно, что на самом деле это не так
Сейчас уже вижу, что приоритеты ресета в двух кусках разные

На самом деле в любом case, если не определить все состояния, появятся латчи. Чтобы этого не произошло, надо определить состояние по "умолчанию"...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jul 3 2017, 13:46
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(iosifk @ Jul 3 2017, 16:45) *
На самом деле в любом case, если не определить все состояния, появятся латчи. Чтобы этого не произошло, надо определить состояние по "умолчанию"...

В моем примере else разве не определяет состояния "по умолчанию"? Если речь идет об fsm, то там default поле, естественно, есть
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 3 2017, 13:59
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 3 567
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Lutovid @ Jul 3 2017, 16:46) *
В моем примере else разве не определяет состояния "по умолчанию"? Если речь идет об fsm, то там default поле, естественно, есть

Я не внимательно вчитался в Ваш код, наверное потому и не понял...
Просто я так никогда не делаю:
always @(*) begin
if (header_formatter_ready)
header_formatter_ready_latch....

Если у Вас есть автомат, то зачем вот это always @(*) ? У Вас что, какие-то сигналы могут меняться "между фронтами клоков"? В любом случае, должен быть автомат, который определяет, кому и когда что можно делать. И должны быть регистры, счетчики и все прочее, которые получают от автомата сигналы на разрешение записи, сдвига, обнуления и т.д.


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Lutovid
сообщение Jul 3 2017, 14:08
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 24-02-14
Из: Москва
Пользователь №: 80 661



Цитата(iosifk @ Jul 3 2017, 16:59) *
Я не внимательно вчитался в Ваш код, наверное потому и не понял...
Просто я так никогда не делаю:
always @(*) begin
if (header_formatter_ready)
header_formatter_ready_latch....

Если у Вас есть автомат, то зачем вот это always @(*) ? У Вас что, какие-то сигналы могут меняться "между фронтами клоков"? В любом случае, должен быть автомат, который определяет, кому и когда что можно делать. И должны быть регистры, счетчики и все прочее, которые получают от автомата сигналы на разрешение записи, сдвига, обнуления и т.д.

Просто пока автомат крутился в ряде начальных состояний мог прийти импульс, а информация о том приходил ли он понадобилась бы лишь в конце, я посчитал, что вместо вставляния этого детектирования во все начальные состояния, проще сделать отдельный латч. Можно было бы сделать синхронное детектирование по клоку, но разве это принципиально?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 3 2017, 14:22
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 3 567
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Lutovid @ Jul 3 2017, 17:08) *
Просто пока автомат крутился в ряде начальных состояний мог прийти импульс, а информация о том приходил ли он понадобилась бы лишь в конце, я посчитал, что вместо вставляния этого детектирования во все начальные состояния, проще сделать отдельный латч. Можно было бы сделать синхронное детектирование по клоку, но разве это принципиально?

Если приходит асинхронный сигнал, то необходимо привязать его к клоку...
И моя позиция такая. Не плодить множество мелких триггеров, а делать наборы автоматов.
Скажем так для примера как в SPI: нижний фильтрует помеху и принимает биты и больше ничего не умеет. Результат передает "вверх" "среднему" по своему выходу "Готов"... "Средний" умеет только принимать слова. Результат передает "вверх" "верхнему" по своему выходу "Готов".. А "верхний" умеет принимать сообщения и класть их в память, например... Он знает куда класть и кому об этом сообщить... И выше всех сидит автомат, который ведет весь процесс. За ним - верхние уровни протокола и пр...
Полное разделение труда...
При таком подходе все становится просто до безобразия...
А компилятор потом сам произведет оптимизацию и уберет все лишнее...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2017 - 15:16
Рейтинг@Mail.ru


Страница сгенерированна за 1.51447 секунд с 7
ELECTRONIX ©2004-2016