Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Компонент в SOPC Builder
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
torik
Итак, делаем компонент в SOPC Builder. Это будет avalon slave. Создаем модуль с текстом вроде:

Код
                         ....................
                        input [15:0] address,
                        input [15:0] data,
                        input wren
                        );
.........
reg        [3:0]    reg_alpha;

always @(posedge clock  or posedge reset) begin
    if(reset) begin
        reg_alpha <= 4'd4;
    end else begin
        if((wren == 1'b1)&&(address == 0 [b](???)[/b])) begin
            reg_alpha <= data[3:0];
        end
    end
end


Т.е. имеется набор регистров в этом модуле, куда мастер (например процессор) будет записывать данные. Но когда модуль ставим в систему, ему присваивается адрес, обычно отличный от нуля. Как мне его определить, учесть в модуле?
vetal
Зачем его учитывать?
SOPC Builder выделит вашему модулю пространство адресов внутри которого ему будет пересчитал адрес и выставлены сигналы управления. В вашем случае это будет 128 кБайт.

В программе этот адрес можно взять из файла system.h
torik
Нет, я не это имею ввиду. Просто я невнятно объясняю.
Например в самом модуле я хочу записывать данные data в регистр, когда шина обращается к этому модулю по относительному адресу "0". Т.е. заполнение регистрового файла...

Код
        if((wren == 1'b1)&&(address == 0) begin
            reg_alpha <= data[3:0];
        end


Тут в регистр reg_alpha пишутся данные data, если идет обращение по адресу (адрес модуля + 0). Но адрес модуля в системе может измениться, как это учесть?

Где-то я читал давно, да найти не могу. Модуль будет "видеть" абсолютный адрес или только относительный? В последнем случае достаточно будет использовать сигнал CS шины авалон.
des00
Цитата(torik @ Jan 28 2009, 04:52) *
Где-то я читал давно, да найти не могу. Модуль будет "видеть" абсолютный адрес или только относительный? В последнем случае достаточно будет использовать сигнал CS шины авалон.


vetal вам уже сказал. Задачу декодирования доступа к вашему слейву берет на себя интерконект (Avalon Switch Fabric), и адрес он вам подсунет после удаления из него информации о выборе вашего слейва.

Обычно это делается за счет "адресных окон" в карте адресов, которые выбираются кратными 2^N.

например. пусть мастер пользует карту :: слейв1 : 0x000 - 0x0FF, слейв 2 0x100 - 0x1FF. В этом случае 9ый бит выбирает к какому слейву обращаться, а каждый слейв видит CS (зависит от используемой шины) и адрес 0x00-0xFF .

Но для себя можно поизвращаться и сделать окна не кратные 2^N, будет весело %)
vetal
Цитата
Но адрес модуля в системе может измениться, как это учесть?

Никак это учитывать не надо. Все уже учтено за вас. На момент обращения к модулю он будет видеть только свои адреса. В сигналы чтения/записи и cs вся необходимая информация уже встроена. Никаких дополнительных телодвижений со стороны железа делать не требуется.
torik
Спасибо! Да, теперь все понятно. Дело в том, что CS я сперва поленился использовать smile.gif, исправляю...
vetal
Цитата
Спасибо! Да, теперь все понятно. Дело в том, что CS я сперва поленился использовать smile.gif, исправляю...

Его необязательно использовать. Он уже входит в состав сигнала wren !
torik
Здорово, тогда, получается, у меня все впорядке smile.gif. Оно и работает, просто одолевали сомнения...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.