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

Подскажите как сделать следующее.

Есть система Qsys в ней всё как обычно - процессор, память с шиной 64 бит, компонент DMA с шиной 64 бит и два компонента по сути содержащие просто последовательность регистров для записи и чтения по шине, причём один компонент с шиной 64-бит, второй с шиной 32 бит. Необходимо передать данные из заданного адреса каждого компонента (адрес постоянный) в память.

При чтении с помощью 64 битного DMA из 64 битного компонента всё нормально, данные читаются и записываются в памть как и должны. При чтении с помощью 64 битного DMA из 32 битного компонента происходит неправильное чтение, а именно два чтения. Видимо это происходит из-за "Dynamic bus sizing".

Что делать?

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


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

3 minutes ago, DuHast said:

Сделать шину 64 бита, добив нулями. Если я Вас правильно понял.

Не вариант.

Посталю вопрос по другому. Можно ли читать один фиксированный адрес из 32 битного слэйва с помощью 64 битного мастера ?

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


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

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

Что делать?

Формальный подход такой. Если память адресуется только словами, то соответственно "Блок шинного интерфейса" должен автоматически выполнять несколько чтений из шины меньшей разрядности. При этом процессор оперирует только командами "запись-чтение слова". И по-другому тут ничего не сделать. 

А вот если у процессора есть команды  "запись-чтение пол-слова" или определенного байта, то тогда дешифратор команд и передает управление в  "Блок шинного интерфейса", который и выполняет требуемое действие. И при этом память  адресуется не словами, а байтами...

Но на самом деле, обращение к интерфейсу идет достаточно редко относительно потока команд. Вы можете взять ассемблерный код и увидите, что на одну команду обращения к интерфейсу приходится до сотни команд обращения к памяти. Да при этом необходимо учитывать, что процессор скорее всего Гарвардский, а значит что у него шины памяти и интерфейса разделены....

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


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

11 hours ago, iosifk said:

Формальный подход такой. Если память адресуется только словами, то соответственно "Блок шинного интерфейса" должен автоматически выполнять несколько чтений из шины меньшей разрядности. При этом процессор оперирует только командами "запись-чтение слова". И по-другому тут ничего не сделать. 

А вот если у процессора есть команды  "запись-чтение пол-слова" или определенного байта, то тогда дешифратор команд и передает управление в  "Блок шинного интерфейса", который и выполняет требуемое действие. И при этом память  адресуется не словами, а байтами...

Но на самом деле, обращение к интерфейсу идет достаточно редко относительно потока команд. Вы можете взять ассемблерный код и увидите, что на одну команду обращения к интерфейсу приходится до сотни команд обращения к памяти. Да при этом необходимо учитывать, что процессор скорее всего Гарвардский, а значит что у него шины памяти и интерфейса разделены....

Вообще я пытаюсь использовать DMA для передачи данных.

Попробовал переделать свой компонент для байтовой адресации - в параметрах компонента есть такое поле Address units - было Word сделал Symbol(8 бит). В общем не помогло мастер также читает по два адреса, правда значение адреса теперь в 4 раза больше.

Получается нонсенс какой-то, т.е. используя более широкий мастер невозможно нормально прочитать более узкий слэйв. Как же тогда должны работать всякие SPI и UART? Раньше всё вроде работало, но тогда адресация была Native, а не Dynamic.

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


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

1 час назад, djhall сказал:

Получается нонсенс какой-то, т.е. используя более широкий мастер невозможно нормально прочитать более узкий слэйв. Как же тогда должны работать всякие SPI и UART? Раньше всё вроде работало, но тогда адресация была Native, а не Dynamic.

Да нет, все как обычно... Просто "более широкий мастер" не понимает как читать часть слова. Ну давайте так, представьте процессор, у которого есть дешифратор команд. И этот аппаратный узел получает из памяти команд код команды "прочесть слово". В этом коде команды нет дополнительных битов, указывающих какую часть слова нужно прочесть. И даже если Вы что-то меняете в настройках - "Address units - было Word сделал Symbol", то дешифратор команд не поменялся... просто для программной модели памяти числа, указывающие адрес стали другие - "адреса теперь в 4 раза больше". (В попугаях оно конечно больше :))

Но на самом деле, вопрос не в этом. Зачем нужно бороться с несуществующей проблемой? Ну читается 64 бита и что из этого? Информация же может присутствовать только в одном байте и что в этом плохого? Скажем младший байт с данными, а у остальных байтов может быть признак валидности показывать недостоверную информацию.. Вот PCI-ный бёрст передает 4 слова, хотя возможно нужно только одно. И что в этом плохого? Медленно? Так давайте вспомним про латентность. А уж если Вы будете говорить, что это тормозит процессор, то дальше будет разговор про кэш и количество вызовов-возвратов и переходов программе. Ведь это там рушится конвейер команд, а многопоточность есть далеко не у всех процессоров. 

Ну и еще про "всякие SPI и UART". Можно одним чтением слова вычитывать регистр состояния и регистр данных, которым уже потом можно анализировать из памяти. Или, если хотите "быстро", то кто же мешант сделать в них ФИФО на 8 байт?

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


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

С шириной адреса не напортачили? Ширина адреса 32 бит и адрес 64 бит будет отличаться. Я бы привел все к ширине 64бит и добил нулями. Поймался как то именно на этом именно в таком же qsys.

Изменено пользователем new123

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


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

16 hours ago, djhall said:

При чтении с помощью 64 битного DMA из 32 битного компонента происходит неправильное чтение, а именно два чтения.

у вас там все авалонами повязано. Я бы глянул доку по нему. По соответствующей теме есть целый раздел, подробно описывающий этот момент.

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


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

1 hour ago, iosifk said:

Но на самом деле, вопрос не в этом. Зачем нужно бороться с несуществующей проблемой? Ну читается 64 бита и что из этого?

Ну когда из памяти читаете, то разницы действительно нет. Представьте копятся в FIFO по адресу 0 и 1 данные от АЦП, накопились теперь нужно их считать. Считываете с адреса 0, сохраняете в память. Считываете с адреса 1 и тут выясняется, что там пусто ведь заботливый мастер всё скачал и непонятно куда дел.

1 hour ago, new123 said:

С шириной адреса не напортачили? Ширина адреса 32 бит и адрес 64 бит будет отличаться. Я бы привел все к ширине 64бит и добил нулями. Поймался как то именно на этом именно в таком же qsys.

 

Да не вроде норм. Можно конечно и к 64 битам привести, но где гарантия, что в следующий раз не придётся приводить к 128 байтам.

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


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

11 минут назад, djhall сказал:

Ну когда из памяти читаете, то разницы действительно нет. Представьте копятся в FIFO по адресу 0 и 1 данные от АЦП, накопились теперь нужно их считать. Считываете с адреса 0, сохраняете в память. Считываете с адреса 1 и тут выясняется, что там пусто ведь заботливый мастер всё скачал и непонятно куда дел.

Да нет, при считывании из узкого АЦП в широкую память  "Блок шинного интерфейса" сделает несколько чтений из АЦП и как раз и положит два полу-слова из АЦП в одно слово в памяти... Или 4 байта из АЦП в одно слово в памяти... Просто надо соответствующим образом настроить дешифратор адресов для АЦП...

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


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

4 minutes ago, iosifk said:

Да нет, при считывании из узкого АЦП в широкую память  "Блок шинного интерфейса" сделает несколько чтений из АЦП и как раз и положит два полу-слова из АЦП в одно слово в памяти... Или 4 байта из АЦП в одно слово в памяти... Просто надо соответствующим образом настроить дешифратор адресов для АЦП...

Давайте ещё раз.

Как я это представляю: есть 64-битный мастер, он читает из 32-битного слэйва, между ними шина Avalon. 64-битный мастер читает одно слово по адресу 0, Avalon преобразует этот запрос и из слэйва происходит чтение двух слов по адресу 0 и 1. Так?

Так как же мне настроить "дешифратор адресов для АЦП". Может так:

Было:
assign data0_read = avs_chipselect & avs_read  & (avs_address==6'd0);
assign data1_read = avs_chipselect & avs_read  & (avs_address==6'd1);

Стало:
assign data0_read = avs_chipselect & avs_read  & ((avs_address==6'd0) | (avs_address==6'd1));

Если вы это имели ввиду, то это не самый лучший вариант, т.к. теперь Verilog код компонента зависит от того к какому мастеру я его подключу в будущем.

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


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

6 минут назад, djhall сказал:

Давайте ещё раз.

Как я это представляю: есть 64-битный мастер, он читает из 32-битного слэйва, между ними шина Avalon. 64-битный мастер читает одно слово по адресу 0, Avalon преобразует этот запрос и из слэйва происходит чтение двух слов по адресу 0 и 1. Так?

Так как же мне настроить "дешифратор адресов для АЦП". Может так:


Было:
assign data0_read = avs_chipselect & avs_read  & (avs_address==6'd0);
assign data1_read = avs_chipselect & avs_read  & (avs_address==6'd1);

Стало:
assign data0_read = avs_chipselect & avs_read  & ((avs_address==6'd0) | (avs_address==6'd1));

Если вы это имели ввиду, то это не самый лучший вариант, т.к. теперь Verilog код компонента зависит от того к какому мастеру я его подключу в будущем.

Что касается последней фразы, то тут легко все решается параметрами... Но "Стало" - не то, что нужно. Для Узкой шины должна быть сетка адресов для "полу-слова". А то, что вы привели, если avs_address это тот же адрес, что и для "слова", то  в "Стало" - это сетка адресов для "Слова", а значит не будет двух чтений.

Если хотите, то можно это обсудить голосом по скайпу, так быстрее и легче...

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


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

20 hours ago, iosifk said:

Что касается последней фразы, то тут легко все решается параметрами... Но "Стало" - не то, что нужно. Для Узкой шины должна быть сетка адресов для "полу-слова". А то, что вы привели, если avs_address это тот же адрес, что и для "слова", то  в "Стало" - это сетка адресов для "Слова", а значит не будет двух чтений.

Если хотите, то можно это обсудить голосом по скайпу, так быстрее и легче...

Наверное можно, что-то придумать если вы разрабатываете и мастер и слэйв - выставлять определённые byteenable, например. Я применяю стандартный компонент DMA, а он похоже читает только словами, полагаю также ведёт себя SGDMA и mSGDMA. Так что двух чтений последовательных адресов из 32-битной шины видимо не избежать.

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


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

21 минуту назад, djhall сказал:

 Так что двух чтений последовательных адресов из 32-битной шины видимо не избежать.

И что в этом плохого? Либо данные из 32-битной шины будут только в младшем полу-слове, а старшее будет пустым, либо два последовательных значения из 32-битной шины будут лежать в младшем и старшем полу-словах... 

Для чтения данных памяти мало? Что Вас в этом смущает? 

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


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

4 hours ago, iosifk said:

И что в этом плохого? Либо данные из 32-битной шины будут только в младшем полу-слове, а старшее будет пустым, либо два последовательных значения из 32-битной шины будут лежать в младшем и старшем полу-словах... 

Для чтения данных памяти мало? Что Вас в этом смущает? 

Меня смущает следущее:

1. Уменьшение производительности. В данном случае в два раза. В произвольном случае в зависимости от отношений ширин мастера и слэйва.

2. Невозможно считать данные из нечётного адреса. Можно считать данные из 0-го и 1-го адреса сразу и они будут лежать последовательно в памяти. Можно считать данные из 0-го адреса и данные будут лежать в младшем и старшем полу-словах. Только из первого адреса данные считать вообще нельзя, ну во всяком случае с помощью стандартной DMA.

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


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

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

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

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

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

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

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

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

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

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