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

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


Частый гость
**

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



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


Местный
***

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



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


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 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
iosifk
сообщение Jul 3 2017, 13:45
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 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
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 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
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 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
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 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



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 07:15
Рейтинг@Mail.ru


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