|
SOPC builder + AVALON, Подключения "своего" устройства к шине авалон |
|
|
|
Sep 28 2008, 13:16
|

МедвеД Инженер I
   
Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951

|
Цитата(Alezi @ Sep 28 2008, 21:25)  За ссылку конечно спасибо, я уже смотрел. Дело в том, что там приведена реализация по шаблону. В моем случае создается свой контроллер. Не могу понять как производится привязка контроллера именно к авалону (Avalon-MM), а может быть лучше через Avalon-Tristate. Хотелось бы посмотреть примеры такой или подобной реализации, что называется "от и до", сам пока не соображу... в случае с offchip SRAM я не совсем понимаю смысла лепить свой контроллер, когда sopc это сделает за вас. и по ссылки как раз и есть объяснение как привязываться. в чем уникальность "своего" контроллера?
--------------------
Cogito ergo sum
|
|
|
|
|
Sep 29 2008, 06:36
|

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

|
Цитата(Alezi @ Sep 29 2008, 06:14)  Смысл сией затеи научится работать ручками...  Блок подключения внешнего статического ОЗУ (не поворачивается язык назвать его контроллером) для этого мало годится, так как прост как грабли. Использовать для него шаблон гораздо удобнее, т.к. при этом будет проще с адресацией разобраться  Ну а если очень хочется врукопашную, то так : Код library ieee; use ieee.std_logic_1164.all;
entity async_sram_256kx32 is port( ats_address : in std_logic_vector(17 downto 0); ats_read_n : in std_logic; ats_write_n : in std_logic; ats_chipselect_n : in std_logic; ats_byteenable_n : in std_logic_vector(3 downto 0); ats_data : inout std_logic_vector(31 downto 0);
cos_addr : out std_logic_vector(17 downto 0); cos_read_n : out std_logic; cos_write_n : out std_logic; cos_chipselect_n : out std_logic; cos_byteenable_n : out std_logic_vector(3 downto 0) ); end async_sram_256kx32;
architecture rtl of async_sram_256kx32 is
begin cos_addr <= ats_address; cos_read_n <= ats_read_n; cos_write_n <= ats_write_n; cos_chipselect_n <= ats_chipselect_n; cos_byteenable_n <= ats_byteenable_n;
end rtl; Для работы с авалоном самое главное - изучить его спецификацию  : Avalon Interface Specifications
Сообщение отредактировал Omen_13 - Sep 29 2008, 16:00
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Sep 29 2008, 22:34
|

Участник

Группа: Участник
Сообщений: 47
Регистрация: 8-07-08
Из: Хабаровск
Пользователь №: 38 795

|
Цитата(Postoroniy_V @ Sep 29 2008, 09:25)  сей агрегат адв202 как раз и подключали так как я вам сказал  Хотелось бы поинтересоваться результатами, успешно? Может подкините идейку по подключению... Буду благодарен! Заранее спасибо!  Цитата(Stewart Little @ Sep 29 2008, 10:36)  Блок подключения внешнего статического ОЗУ (не поворачивается язык назвать его контроллером) для этого мало годится, так как прост как грабли. Использовать для него шаблон гораздо удобнее, т.к. при этом будет проще с адресацией разобраться  Ну а если очень хочется врукопашную, то так : Код architecture rtl of async_sram_256kx32 is
begin cos_addr <= ats_address; cos_read_n <= ats_read_n; cos_write_n <= ats_write_n; cos_chipselect_n <= ats_chipselect_n; cos_byteenable_n <= ats_byteenable_n;
end rtl; Извинияюсь Уважаемый, но в приведенном примере не нашел передачи данных с выхода Авалона на выхоы ПЛИС. С тем же успехом можно было в SOPC билдере создать систему и передавать все сигналы через I/O PIO. Как я понимаю "Блок подключения внешнего статического ОЗУ " должен формировать временную диаграмму чтения/записи, что равносильно системе с I/O PIO с использование написанных в NIOS IDE функции доступа к внешней памяти (чтения/записи), за исключением меньшего быстродействия в последнем случае. Кстати последний вариант был мною успешно реализован. Осталось сделать это первым способом.
|
|
|
|
|
Sep 30 2008, 00:09
|

МедвеД Инженер I
   
Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951

|
Цитата(Alezi @ Sep 30 2008, 07:34)  Хотелось бы поинтересоваться результатами, успешно? Может подкините идейку по подключению... Буду благодарен! Заранее спасибо!  Извинияюсь Уважаемый, но в приведенном примере не нашел передачи данных с выхода Авалона на выхоы ПЛИС. С тем же успехом можно было в SOPC билдере создать систему и передавать все сигналы через I/O PIO. успешно! цепляете её как срам, и не забудьте цепануть ready к wait_request(названия на адв не помню, помню что есть там такой сигнал). вот и всё. А про PIO конечно хорошо говорите...только "успех не тот же" то что не нашли передачи данных это конечно..страно вам Stewart Little всё описал уже...осталось шаблон только в сопц билдеру отдать пробовали???..думаю что нет Цитата Как я понимаю "Блок подключения внешнего статического ОЗУ " должен формировать временную диаграмму чтения/записи, что равносильно системе с I/O PIO с использование написанных в NIOS IDE функции доступа к внешней памяти (чтения/записи), за исключением меньшего быстродействия в последнем случае. понимаете правильно, только незачем самому это делать. почитайте/посмотрите выше/ как сделаны шаблонные подключения срамов к ниосу - вам все станет сразу ясно.
--------------------
Cogito ergo sum
|
|
|
|
|
Sep 30 2008, 08:33
|

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

|
Цитата(Alezi @ Sep 30 2008, 02:34)  Извинияюсь Уважаемый, но в приведенном примере не нашел передачи данных с выхода Авалона на выхоы ПЛИС. С тем же успехом можно было в SOPC билдере создать систему и передавать все сигналы через I/O PIO. Взаимно извиняюсь, но Вы спецификацию авалона до конца дочитали? А доку на SOPC Builder посмотрели? Про стандартные префиксы ats (avalon tristate slave) и cos (conduit output start)??? В моем примере сигналы с префиксом cos - это и есть выход из FPGA во внешний мир. Цитата(Alezi @ Sep 30 2008, 02:34)  Как я понимаю "Блок подключения внешнего статического ОЗУ " должен формировать временную диаграмму чтения/записи, что равносильно системе с I/O PIO с использование написанных в NIOS IDE функции доступа к внешней памяти (чтения/записи), за исключением меньшего быстродействия в последнем случае. Не совсем правильно. Тут, как говорится, "все украдено до нас" (с). "Временную диаграмму" формирует Avalon с Avalon-MM Tristate Interface, а Вам нужно только его сигналы наружу вытащить. Задача тривильная. И еще, насчет "системы с I/O PIO". SOPC Builder'у еще нужно объяснить, что этот компонент должен рассматриваться как память. При использовании шаблонов это делается автоматически (точнее говоря, установкой нужной галки в компонент едиторе). В противном случае нужно врукопашную подкручивать компонентный tcl-файл.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Oct 2 2008, 01:46
|

Участник

Группа: Участник
Сообщений: 47
Регистрация: 8-07-08
Из: Хабаровск
Пользователь №: 38 795

|
Цитата(Stewart Little @ Sep 30 2008, 12:33)  Взаимно извиняюсь, но Вы спецификацию авалона до конца дочитали? А доку на SOPC Builder посмотрели? Про стандартные префиксы ats (avalon tristate slave) и cos (conduit output start)??? В моем примере сигналы с префиксом cos - это и есть выход из FPGA во внешний мир. Не совсем правильно. Тут, как говорится, "все украдено до нас" (с). "Временную диаграмму" формирует Avalon с Avalon-MM Tristate Interface, а Вам нужно только его сигналы наружу вытащить. Задача тривильная. Сколько хватило терпения переводить спецификацию читал...)) Про то, какие имеются со стороны авалона и внешнего устройства сигналы прочел. Для себя решил следующее: раз я обращаюсь к одному внешнему устройству, то вариант использовать Avalon-MM Tristate Interface отпадает по причине избыточности (дополнителный Tristate мост). Буду обращаться непосредственно к шине Авалона, на которой тоже можно формировать временную диаграмму чтения/записи. Цитата(Stewart Little @ Sep 30 2008, 12:33)  И еще, насчет "системы с I/O PIO". SOPC Builder'у еще нужно объяснить, что этот компонент должен рассматриваться как память. Не понимаю, что надо "объяснять"? Прописываются функции записи и чтения, которые на выходе (PIO) будут формировать временную диаграмму.
|
|
|
|
|
Oct 5 2008, 09:16
|

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

|
Цитата(Alezi @ Oct 2 2008, 05:46)  Сколько хватило терпения переводить спецификацию читал...)) Видимо, терпения хватило не надолго  У авалона две однонаправленных шины данных - одна на запись, другая на чтение. А у стандартной внешней памяти шина двунаправленная. Так что тристейт все равно необходим. SOPC Builder тем и хорош, что всю рутину по организации шин берет на себя. Вы уверены, что сделаете компактнее, чем он ??? Цитата(Alezi @ Oct 2 2008, 05:46)  Не понимаю, что надо "объяснять"? Прописываются функции записи и чтения, которые на выходе (PIO) будут формировать временную диаграмму. Временная диаграмма - это еще не все, что нужно для счастья. Кроме этого нужно, чтобы и процессор, и компилятор понимали, что в этом диапазоне адресов находится именно память - в которой можно размещать различные сегменты (кода, данных, стек), и куда можно назначить вектор сброса и перехода по исключению.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Oct 7 2008, 23:25
|

Участник

Группа: Участник
Сообщений: 47
Регистрация: 8-07-08
Из: Хабаровск
Пользователь №: 38 795

|
Цитата(Stewart Little @ Oct 5 2008, 13:16)  У авалона две однонаправленных шины данных - одна на запись, другая на чтение. А у стандартной внешней памяти шина двунаправленная. Так что тристейт все равно необходим. В последнем утверждении я с вами не согласен, необходимости в тристейте нет! Из документации к Авалону явно видно , что в основном он используется когда требуется подключить несколько устройств, которые будут использовать одну шину адреса/данных. В моем случае идет подключение напрямую к шине по интерфейсу Avalon-MM Slave. Программный код "блока подключения внешней памяти" в моем примере выгляит так: Код module SRAM ( // Host Data oDATA,iDATA,iADDR, iWE_N,iOE_N, iCE_N,iCLK, // SRAM SRAM_DQ, SRAM_ADDR, SRAM_WE_N, SRAM_CE_N, SRAM_OE_N ); // Host Side input [7:0] iDATA; output [7:0] oDATA; input [5:0] iADDR; input iWE_N,iOE_N; input iCE_N,iCLK;
// SRAM Side inout [7:0] SRAM_DQ; output [5:0] SRAM_ADDR; output SRAM_WE_N, SRAM_CE_N, SRAM_OE_N;
assign SRAM_DQ = SRAM_WE_N ? 8'hzz : iDATA; assign oDATA = SRAM_DQ; assign SRAM_ADDR = iADDR; assign SRAM_WE_N = iWE_N; assign SRAM_OE_N = iOE_N; assign SRAM_CE_N = iCE_N;
endmodule А в NIOS обращение выглядит как: Код #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h"
unsigned char* ptr_byte; unsigned char a;
int main (void) { ptr_byte = (unsigned char*)SRAM_INST_BASE; while(1) { IOWR(VYHOD_BASE,0,1); // использую для синхронизации оциллографа *ptr_byte = 0x55; //процесс записи
IOWR(VYHOD_BASE,0,0);// использую для синхронизации оциллографа
a = *ptr_byte; //процесс чтения
}; return 0; } Непонятен только один вопрос, в процессе чтения на осцллографе наблюдаю 4 сигнала chipselect (идут подряд), причем идет изменение адресов. Такое чувство, что шина данных считается 32 разрядной, хотя указатель *ptr_byte обозначен как unsigned char. При изменении разрядности шины данных с 8 до 16 таких сигналов становится 2!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|