|
SOPC component builder |
|
|
|
Mar 4 2010, 12:22
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Извините, было наверное уже, но впрямую не нашел. Написал модулек небольшой на Verilog. В нем буфер небольшое, по приему байта буфер сдвигается, и над буфером производится XOR по всем байтам. Вобщем не суть. То есть input 8 bit и 8 bit output (ну и clock) . Создал в Component editor модуль, Avalon slave как я понимаю мне проставился автоматом. После компиляции в system.h появился базовый адрес этого моего модуля. А вот чего с этим адресом делать - не пойму. Мне б надо на Сях в модуль байтик этот туда(в input) писать, а следущей командой считывать из output.. Несколько сумбурно объяснил, но, наверное, суть ясна.
|
|
|
|
|
Mar 4 2010, 14:34
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(DASM @ Mar 4 2010, 20:26)  неужели все так сложно =) Найти банального примера простейшего модуля на Verilog и как его подключить ? вроде ж не так много хочу для начала. Просто сейчас стадия такая, что нужно вообще оценить, насколь NIOS нужен в проекте. Углубиться в основы еще успею т.е. даже какие сигналы в шине avalon используются читать не хотите?  зря. ну для ленивых: clk,reset,read_data;read_address;read;write_data;write_address;write. регистры замапить на соотв. адреса, например, inData на адрес 0, out - на 1. это локальные адреса, потом они автоматом преобразуются в глобальные. upd: а может вы и код писать не хотите?  в том примере, что я выше приводил, он есть. как раз на верилоге.
|
|
|
|
|
Mar 4 2010, 17:30
|
Гуру
     
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640

|
еще раз посоветую: всякие операции с потоками лучше прогонять через Streaming, а не MM Avalon там и интерфейс гораздо проще  а потом, например, поставить FIFO с преобразованием stream в ММ ---------------- у ксайлинса слейв генерится автоматом (но там кореконнект - замаишься руками писать), а так как тут шина простая, то альтеровцы предлагают самому слэйва писать. ну и смысла в автоматическом генераторе нет - на выходе будет тоже что и на входе
|
|
|
|
|
Mar 5 2010, 09:27
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Чего-то все равно лыжи не едут.. Если я не использую address signal в Avalon slave, а использую только readdata и writedata и стробы read write - то они оба будут иметь адресс BASE ? Для теста сделал always @(posedge clock) if (read) begin out <= 8'haa; end В NIOS же считывается 0xFC  В чем не так ?
|
|
|
|
|
Mar 5 2010, 10:01
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(DASM @ Mar 5 2010, 12:27)  В чем не так ? Во всем  Avalon - это системная шина. На нее могут подключаться разные устройства - ведущие (master) и ведомые (slave). Мастер может инициировать транзакцию на шине, а слейв может только реагировать на транзакцию мастера, адресованную именно этому слейву. Мастеров и слейвов на шине может быть много. Для того, чтобы определять нужный слейв на Avalon'е, служит шина адреса. Тут все абсолютно аналогично стандартной микропроцессорной схемотени. Т.е. адресовать слейв нужно обязательною (в исходнике предусмотрите порт адреса, и дешифровку, если нужно). А SOPC Builder на этапе сборки системы привяжет базовый адрес этого слейва к конкретному адресу на авалоне. Поскольку ресурсы ПЛИСа хочется сэкономить, Avalon всегда создается неким оптимальныс с точки зрения SOPC Builder'a способом - а именно каждый мастер соединяется только с теми слейвами, с которыми он может организовать транзакции. И еще один момент - при создании нового модуля в Component Editor'е можно указать, что этот модуль является памятью (там нужно спец. галку установить) - тогда с этим модулем можно будет общаться через указатели.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Mar 5 2010, 10:11
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(DASM @ Mar 5 2010, 13:06)  да, все всегда пересобираю.. Как-то странно, out <= 8'haa или другие, отличные нуля числа ; - на выходе 0xFC , только если ь out <= 8'h00 - тогда ноль читается. То есть читаю, похоже оттуда, но почему-то все портится. Мож времянка какая не того ? Тактовая у циклона 27 Мгц PLL нету, то есть частоты то невысокие. До сигналтапа еще не проэрудировался  Так это, поди, конфликт на шине. При любом цикле чтения на шине (чтении из памяти, к примеру) Ваш модуль будет пытаться тоже чего-то там на шину выдать.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Mar 5 2010, 10:29
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(DASM @ Mar 5 2010, 13:16)  Разве Avalon не рулит этим ? Не к адресам же модуля обращаются Да, что-то я погорячился... Сорри...  Цитата(DASM @ Mar 5 2010, 13:06)  PS Оппа... просто регистр был 8-битный, а читал я видимо его как 8-битный. Полагал что это не страшно. Однако какой эффект... сделал его 32 битным - все OK Тогда понятно. Вопросы выравнивания. Забейте на макросы и переходите на работу с указателями.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Mar 5 2010, 12:59
|
Гуру
     
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640

|
Цитата(Stewart Little @ Mar 5 2010, 13:29)  Забейте на макросы и переходите на работу с указателями. а меня заодно проинформируйте - как определить - кэшед или ан-кэшед обращение сгенерирует та или иная конструкция (конструкция HAL-а или API альтеровского - то есть высокоуровневая) ? проц без ММУ то, что это определяется 31-м битом я знаю, и по коду могу посмотреть собственно IOWR / IORD тем и хороши, что ан-кешед аксес генерят и думать не надо, я их и использую а с указателем надо 0х80000000 добавить к базовому адресу или как-то по другому? ------------------------------------- 2DASM по поводу многопроцессорных ниосов я вопроса не нашел, а то что я разбирался - мне показалось проще иметь несколько независимых проектов для SOPC (для каждого процессора свой) при этом плюсы - при изменении одного SOPC не надо пересобирать софтверные проекты для остальных процессоров, ну и квартус быстрее собирает ну и мне всегда казалось, что двумя половинками проще оперировать чем одним целым, в моем случае разные программисты программируют разные процессоры, поэтому организационно это проще - каждому свой ptf файл - меньше проблем так как с именами там проблема (SOPC генерит верилог с одинаковыми именами), то надо для каждой системы свою директорию, которую включить для сборки в квартус в качестве эксперимента пробовал многопроцессорную систему SOPC - но, по-моему, более трудоемко/громоздко, потом требуется дополнительно внимание прилагать для распределения памятей и т.п. (свойства системной библиотеки) плюсов никаких не увидел, так как софт все-равно для каждого процессора автономный/независимый upd: у меня разделяемой периферии не было, передача данных через conduit-ы вытащенные на топ-левел, причем кондуиты к Avalon-ST (а не ММ) ну и еще есть вопросы работы шины - лень влезать. минус аппаратный семафор не поставить, но как сделать семафор на общей памяти без блокировки Дейкста еще в 50-е придумал в обоих случаях столкнулся с проблемой отладки/загрузки/программирования флаш - тулзы не могут правильно определить какой процессор используешь, поэтому вручную надо праставлять --instance (в дополнительных параметрах, если из gui)
|
|
|
|
|
Mar 10 2010, 10:13
|
Гуру
     
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640

|
Цитата(vadimuzzz @ Mar 7 2010, 05:35)  в HAL API есть соотв. функции. например, alt_remap_uncached(void* ptr, alt_u32 len) преобразует область памяти по адресу ptr для некэшированного доступа. если не лень - объясните, как она работает? то есть 1) как использовать, 2) как устроено в софте UPD : посмотрел, зачем же там параметр len, вобщем-то разумно, почистить кэш, хотя с другой стороны кэш - write-through, поэтому зачем флашить его - непонятно Код volatile void* alt_remap_uncached (void* ptr, alt_u32 len) { alt_dcache_flush (ptr, len); return (volatile void*) (((alt_u32) ptr) | BYPASS_DCACHE_MASK); }
Сообщение отредактировал Omen_13 - Apr 1 2010, 15:54
Причина редактирования: Оформление кода
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|