Jump to content

    
Петр Юркевич

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

Recommended Posts

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

Делаю частотомер на ПЛИС (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, но здесь он используется только как сторонний генератор измеряемой частоты.

Edited by Петр Юркевич
Дополнение информации о проекте

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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. Я подумаю над перекодированием, сейчас мне просто интересно, можно ли сделать так, как я изначально задумал

Share this post


Link to post
Share on other sites
On 10/10/2020 at 10:08 AM, Петр Юркевич said:

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

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

Share this post


Link to post
Share on other sites
30 минут назад, Nick_K сказал:

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.