Перейти к содержанию
    

Проблема с передачей числа с NIios на другой модуль

Здравствуйте!

Делаю частотомер на ПЛИС (DE0-Nano-SoC, Cyclone V). Мне необходимо выводить значение измеренной частоты на внешний дисплей, поэтому было удобно подключить Nios, чтобы он этим занимался. Т.к. частотомер измеряет отрезок времени по некоторой опорной частоте, ему необходимо значение этой частоты, которое передаётся в модуль частотомера извне.

Была идея реализовать поддержку изменения опорной частоты и интервала, на котором производится измерение, а также впоследствии возможность простого ввода этих значений (пока ввод реализован посредством переключения свитчей). Решил сделать это через Nios. Если с делителем интервала (деление посредством сдвига, поэтому по-умолчанию ставится 0) проблем не возникло, то с передачей значения опорной частоты (точно такого же формата, что и делитель) из Nios в частотомер возникла непонятная мне проблема:

Выход Nios соединяется с соответствующим входом частотомера прямым проводом, который (судя по схеме Квартуса) ничем не делится.

2020-10-10_00-48-07.thumb.png.9edfb8a4584898cfa42865d655ab7147.png

Но когда я всё запускаю и прошиваю Nios, он выставляет на выходе значение 200_000_000 (Гц). Но если посмотреть по SignalTap'у, то оказывается, что на выходе Nios правильное число (3я строка), а на входе частотомера 0 (1я строка), причём делитель передаётся нормально (здесь не видно, но если изменить на другое число, то на 2й и 4й строчках числа будут одинаковыми).

2020-10-10_00-28-23.thumb.png.c78c3d1c1de7d06e1db37f5117f949ad.png

В чём здесь может быть проблема?

Проект находится на ГитХабе: https://github.com/FlexlabCompany/frequency_meter_Nios_display

Проект ещё содержит часть для DE1-SoC, но здесь он используется только как сторонний генератор измеряемой частоты.

Изменено пользователем Петр Юркевич
Дополнение информации о проекте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала: Вы смотрите пост-элаборейт схематик. А тут может быть нарисовано всё что угодно и как угодно, лишь бы красиво и понятно. Чтобы понимать реальность, нужно смотреть пост-синтез схематик. Там скорее всего нет такой чёткой иерархии, но там будет видно куда именно цепляется сигналтап. Возможно во время оптимизации и горячо любимого Альтерой флаттеринга, меняется расстановка или реордерится какая-то логика. В результате будут разные значения.

Второй момент: а действительно вот так жизненно необходимо передавать именно число частоты? Нельзя ли как-то закодировать значения передаваемых частот (2'b00 = 200МГц, 2'b01 = 100МГц и т.д.), а на приёмной стороне уже сделать необходимую подстановку констант. Я очень сомневаюсь, что это число у Вас сильно варьируется, а вот гонять по кристаллу на 99% пустую 32-х битную шину - это глупо как минимум. По этой же причине, возможно, инструмент оказался хитрее и сам оптимизировал-закодировал передаваемые значения (код 00...0h приравнивается к 200kk).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Nick_K сказал:

Для начала: Вы смотрите пост-элаборейт схематик. А тут может быть нарисовано всё что угодно и как угодно, лишь бы красиво и понятно. Чтобы понимать реальность, нужно смотреть пост-синтез схематик. Там скорее всего нет такой чёткой иерархии, но там будет видно куда именно цепляется сигналтап. Возможно во время оптимизации и горячо любимого Альтерой флаттеринга, меняется расстановка или реордерится какая-то логика. В результате будут разные значения.

Второй момент: а действительно вот так жизненно необходимо передавать именно число частоты? Нельзя ли как-то закодировать значения передаваемых частот (2'b00 = 200МГц, 2'b01 = 100МГц и т.д.), а на приёмной стороне уже сделать необходимую подстановку констант. Я очень сомневаюсь, что это число у Вас сильно варьируется, а вот гонять по кристаллу на 99% пустую 32-х битную шину - это глупо как минимум. По этой же причине, возможно, инструмент оказался хитрее и сам оптимизировал-закодировал передаваемые значения (код 00...0h приравнивается к 200kk).

Нашёл post-fitting схему. Там Квартус сделал что-то странное. Шины freq_base и time_del почему-то объединены, но со сдвигом на 1. При этом они целиком идут в SignalTap, а в частотомер уходят только бит 0 из каждой... Видимо он действительно решил упростить себе работу. Можно его как-то заставить сделать правильно? Может, существуют настройки разводки?

2020-10-10_10-00-22.thumb.png.675994159ceeb0f6d49f75a06416cefe.png

P.S. Я подумаю над перекодированием, сейчас мне просто интересно, можно ли сделать так, как я изначально задумал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/10/2020 at 10:08 AM, Петр Юркевич said:

Может, существуют настройки разводки?

Недавно поднимал тему - обьявление сигналов как (* keep = 1 *) или /* synthesis keep */ должны предотвратить оптимизацию (второй вариант у меня почему-то не работал). Но повторюсь - это очень плохое решение и может вызвать неординарное раздутие проекта, потому что протрейсить 32 net'а ещё та задачка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 минут назад, Nick_K сказал:

обьявление сигналов как (* keep = 1 *) или /* synthesis keep */ должны предотвратить оптимизацию

Спасибо! Попробую

 

30 минут назад, Nick_K сказал:

очень плохое решение и может вызвать неординарное раздутие проекта, потому что протрейсить 32 net'а ещё та задачка

Да, я понял, скорее всего сделаю кодирование значений. Спасибо за советы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...