Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SOPC builder + AVALON
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Alezi
Приветствую!
Тружусь над подключением своего устройства к шине авалон, но пока безрезультатно.(( Идея заключается в разработке и подключении контроллера памяти (SRAM) к софт процессору NIOSII с последующим управлением чтением/записью)) Может кто занимался подобными вещами?
Вопрос в следующем:
1) как в файле проекта (пишу контроллер на VHDL) сделать привязку к авалон, надо ли?
2) подключать пробовал (SOPC builder->create new component) через Avalon-MM, стоит ли через Avalon-Tristate Bridge?
Спецификацию по шине авалон штудирую))
Пока делал через Avalon-MM Slave, настраивал шины данных, адреса и управления. В итоге при написании программы управления в NIOS EDS и RUN AS возникает проблема, не может загрузить данные в процессор, в итоге ставит процессор в ожидание.
Alezi
Просмотрел все ссылки, но решения так и не нашел.
help.gif
Postoroniy_V
Цитата(Alezi @ Sep 28 2008, 12:09) *
Просмотрел все ссылки, но решения так и не нашел.
help.gif

а так искали?
http://www.altera.com/literature/hb/qts/qt...oss=sopc%20sram
глава
Off-Chip SRAM
and Flash
Memory
Alezi
За ссылку конечно спасибо, я уже смотрел. Дело в том, что там приведена реализация по шаблону. В моем случае создается свой контроллер. Не могу понять как производится привязка контроллера именно к авалону (Avalon-MM), а может быть лучше через Avalon-Tristate. Хотелось бы посмотреть примеры такой или подобной реализации, что называется "от и до", сам пока не соображу...
Postoroniy_V
Цитата(Alezi @ Sep 28 2008, 21:25) *
За ссылку конечно спасибо, я уже смотрел. Дело в том, что там приведена реализация по шаблону. В моем случае создается свой контроллер. Не могу понять как производится привязка контроллера именно к авалону (Avalon-MM), а может быть лучше через Avalon-Tristate. Хотелось бы посмотреть примеры такой или подобной реализации, что называется "от и до", сам пока не соображу...

в случае с offchip SRAM я не совсем понимаю смысла лепить свой контроллер, когда sopc это сделает за вас. и по ссылки как раз и есть объяснение как привязываться.
в чем уникальность "своего" контроллера?
Alezi
Смысл сией затеи научится работать ручками... smile.gif
Дальнейшая работа будет много сложней, плануруется подключение кодера JPEG 2000 AD202. Поэтому хочется разобраться во всех тонкостях Avalona... smile.gif
Postoroniy_V
Цитата(Alezi @ Sep 29 2008, 11:14) *
Смысл сией затеи научится работать ручками... smile.gif
Дальнейшая работа будет много сложней, плануруется подключение кодера JPEG 2000 AD202. Поэтому хочется разобраться во всех тонкостях Avalona... smile.gif

сей агрегат адв202 как раз и подключали так как я вам сказал smile.gif
Stewart Little
Цитата(Alezi @ Sep 29 2008, 06:14) *
Смысл сией затеи научится работать ручками... smile.gif

Блок подключения внешнего статического ОЗУ (не поворачивается язык назвать его контроллером) для этого мало годится, так как прост как грабли. Использовать для него шаблон гораздо удобнее, т.к. при этом будет проще с адресацией разобраться smile.gif
Ну а если очень хочется врукопашную, то так :

Код
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;


Для работы с авалоном самое главное - изучить его спецификацию smile.gif :
Avalon Interface Specifications
Alezi
Цитата(Postoroniy_V @ Sep 29 2008, 09:25) *
сей агрегат адв202 как раз и подключали так как я вам сказал smile.gif

Хотелось бы поинтересоваться результатами, успешно? Может подкините идейку по подключению... smile.gif
Буду благодарен! Заранее спасибо! smile.gif

Цитата(Stewart Little @ Sep 29 2008, 10:36) *
Блок подключения внешнего статического ОЗУ (не поворачивается язык назвать его контроллером) для этого мало годится, так как прост как грабли. Использовать для него шаблон гораздо удобнее, т.к. при этом будет проще с адресацией разобраться smile.gif
Ну а если очень хочется врукопашную, то так :

Код
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 функции доступа к внешней памяти (чтения/записи), за исключением меньшего быстродействия в последнем случае.
Кстати последний вариант был мною успешно реализован. Осталось сделать это первым способом. smile.gif
Postoroniy_V
Цитата(Alezi @ Sep 30 2008, 07:34) *
Хотелось бы поинтересоваться результатами, успешно? Может подкините идейку по подключению... smile.gif
Буду благодарен! Заранее спасибо! smile.gif
Извинияюсь Уважаемый, но в приведенном примере не нашел передачи данных с выхода Авалона на выхоы ПЛИС. С тем же успехом можно было в SOPC билдере создать систему и передавать все сигналы через I/O PIO.

успешно! smile.gif
цепляете её как срам, и не забудьте цепануть ready к wait_request(названия на адв не помню, помню что есть там такой сигнал). вот и всё.
А про PIO конечно хорошо говорите...только "успех не тот же" smile.gif
то что не нашли передачи данных это конечно..страно 07.gif
вам Stewart Little всё описал уже...осталось шаблон только в сопц билдеру отдать
пробовали???..думаю что нет smile.gif
Цитата
Как я понимаю "Блок подключения внешнего статического ОЗУ " должен формировать временную диаграмму чтения/записи, что равносильно системе с I/O PIO с использование написанных в NIOS IDE функции доступа к внешней памяти (чтения/записи), за исключением меньшего быстродействия в последнем случае.

понимаете правильно, только незачем самому это делать. почитайте/посмотрите выше/ как сделаны шаблонные подключения срамов к ниосу - вам все станет сразу ясно.
Stewart Little
Цитата(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-файл.
Alezi
Цитата(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) будут формировать временную диаграмму.
Stewart Little
Цитата(Alezi @ Oct 2 2008, 05:46) *
Сколько хватило терпения переводить спецификацию читал...))

Видимо, терпения хватило не надолго smile.gif
У авалона две однонаправленных шины данных - одна на запись, другая на чтение. А у стандартной внешней памяти шина двунаправленная. Так что тристейт все равно необходим. SOPC Builder тем и хорош, что всю рутину по организации шин берет на себя. Вы уверены, что сделаете компактнее, чем он ???

Цитата(Alezi @ Oct 2 2008, 05:46) *
Не понимаю, что надо "объяснять"? Прописываются функции записи и чтения, которые на выходе (PIO) будут формировать временную диаграмму.

Временная диаграмма - это еще не все, что нужно для счастья. Кроме этого нужно, чтобы и процессор, и компилятор понимали, что в этом диапазоне адресов находится именно память - в которой можно размещать различные сегменты (кода, данных, стек), и куда можно назначить вектор сброса и перехода по исключению.
Alezi
Цитата(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! 05.gif
vetal
для байтовой шины:
output [7:0] SRAM_ADDR;
assign SRAM_ADDR[5..0] = iADDR[7..2];
Stewart Little
Цитата(Alezi @ Oct 8 2008, 03:25) *
В последнем утверждении я с вами не согласен, необходимости в тристейте нет!

Ну Вы, блин, даете! (с)
А вот это :
Код
assign    SRAM_DQ     =    SRAM_WE_N ? 8'hzz : iDATA;

у вас не тристейт ???
Вы врукопашную сделали все тоже самое, что и Avalon-MM Trisatе Bridge (с шаблоном), только с большей кривизной. т.к.:
Цитата(Alezi @ Oct 8 2008, 03:25) *
в процессе чтения на осцллографе наблюдаю 4 сигнала chipselect (идут подряд), причем идет изменение адресов. Такое чувство, что шина данных считается 32 разрядной, хотя указатель *ptr_byte обозначен как unsigned char. При изменении разрядности шины данных с 8 до 16 таких сигналов становится 2!

Я Вам уже писал, о том, что при работе врукопашную нужно быть очень внимательным к адресации. Уважаемый vetal Вам подсказал, что нужно сделать.
Alezi
С подключением памяти к Avalon разобрался! smile.gif Всем огромное спасибо!
Хотел бы поинтересоваться более подробно про подключение ADV202. Пока возник вопрос обращения к direct и indirect. Более точно, каким типом назначать переменные для организации чтения/записи? Тип int для ПЛИС означает 32 бита, char - 8 бит как я понял...
Несколько раньше Уважаемый Postoroniy_V оговорился, что такую задачу выполнил успешно...
Цитата(Postoroniy_V @ Sep 30 2008, 04:09) *
успешно! smile.gif
цепляете её как срам, и не забудьте цепануть ready к wait_request(названия на адв не помню, помню что есть там такой сигнал). вот и всё.

Хотелось бы особенно обратиться к нему. ))
Postoroniy_V
Цитата(Alezi @ Oct 18 2008, 19:42) *
С подключением памяти к Avalon разобрался! smile.gif Всем огромное спасибо!
Хотел бы поинтересоваться более подробно про подключение ADV202. Пока возник вопрос обращения к direct и indirect. Более точно, каким типом назначать переменные для организации чтения/записи? Тип int для ПЛИС означает 32 бита, char - 8 бит как я понял...
Несколько раньше Уважаемый Postoroniy_V оговорился, что такую задачу выполнил успешно...

Хотелось бы особенно обратиться к нему. ))

тип int для плис ваще ничего не значит smile.gif так же как и char
и многое зависит от
HOST INTERFACE (HDATA BUS)
The ADV202 can connect directly to a wide variety of host processors and ASICs using an asynchronous SRAM-style interface, DMA accesses, or streaming mode (JDATA) interface. The ADV202 supports 16- and 32-bit buses for control and 8-, 16-, and 32-bit buses for data transfer.
The control and data channel bus widths can be specified independently, which allows the ADV202 to support applica-tions that require control and data buses of different widths.

обратите внимание на это (сигнал ~ack)
Нажмите для просмотра прикрепленного файла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.