реклама на сайте
подробности

 
 
> Запись по базовому адресу пользовательской логики
Acvarif
сообщение Dec 4 2012, 11:46
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Имеется пользовательская логика с базовым адресом 0x00000010 подключенная к шине Avalon в SOPC
с портами
Код
    port (
        -- Avalon Slave
        clk                  : in  std_logic                     := '0';             -- clock.clk
        reset_n              : in  std_logic                     := '0';             --      .reset_n
        avs_s0_address       : in  std_logic_vector(1 downto 0)  := (others => '0'); --    s0.address
        avs_s0_read_n        : in  std_logic                     := '0';             --      .read_n
        avs_s0_write_n       : in  std_logic                     := '0';             --      .write_n
        avs_s0_writedata     : in  std_logic_vector(15 downto 0) := (others => '0'); --      .writedata
        avs_s0_byteenable    : in  std_logic_vector(1 downto 0)     := (others => '0');
        avs_s0_readdata      : out std_logic_vector(15 downto 0);                    --      .readdata
        ins_irq0_irq             : out std_logic;    

        -- Avalon Source
        aso_out0_ready                     : in  std_logic                     := '0'; --      .ready
        aso_out0_data                      : out std_logic_vector(15 downto 0);        --  out0.data
        aso_out0_valid                     : out std_logic;                            --      .valid
......................................................и т. д.
В пользовательской логике имеется такая конструкция (VHDL)
Код
    process(clk)
    begin
    if (falling_edge(clk)) then
        if(avs_s0_address = "00" and avs_s0_write_n = '0') then
            if(avs_s0_writedata = "0000000000000001") then
                s_aso_out0_ready <= '1';
            elsif (avs_s0_writedata = "0000000000000000") then    
                s_aso_out0_ready <= '0';
            end if;    
        end if;    
    end if;        
    end process;

В программе Nios запись для установки s_aso_out0_ready в 1 делаю так
Код
#define IOWR_ALTERA_AVALON_PUSK(base)   IOWR_32DIRECT(base, 0, 0x0001);
#define IOWR_ALTERA_AVALON_STOP(base)   IOWR_32DIRECT(base, 0, 0x0000);

          IOWR_ALTERA_AVALON_PUSK(0x00000010);
          Delay(0x0002);
          IOWR_ALTERA_AVALON_STOP(0x00000010);
          Delay(0x000f);

Все работает.
Но как теперь сделать то же только по адресу avs_s0_address = "01" ?
Не врубаюсь, что теперь нужно менять в IOWR_ALTERA_AVALON_PUSK(base) IOWR_32DIRECT(base, 0, 0x0001);
смещение или базовый адрес...или еще как-то

Сообщение отредактировал Acvarif - Dec 4 2012, 11:48
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Копейкин
сообщение Dec 7 2012, 08:30
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



Нужно просто уложить в голове, что у процессора адресация всегда побайтная.
А вот шина Avalon-MM использует в качестве самого младшего адреса для слейва:
8 бит - A[0]
16 бит - A[1]
32 бит - A[2]
Я привел пример для записи в 16-битный слейв, где смещение reg * 2,
так как A[0] не используется, а самый младший используемый адрес A[1].
Для 8-битного слейва (reg * 1) т.е. IOWR_8DIRECT( base, reg, val ).
Для 32-битного, соответственно (reg *4) т.е. IOWR_32DIRECT( base, reg*4, val).
Собственно макросы IOWR_ это ассемблерные команды STBIO, STHIO, STWIO (store byte/halfword/word in IO space)
Так яснее?
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 7 2012, 13:07
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Копейкин @ Dec 7 2012, 11:30) *
Нужно просто уложить в голове, что у процессора адресация всегда побайтная.
А вот шина Avalon-MM использует в качестве самого младшего адреса для слейва:
8 бит - A[0]
16 бит - A[1]
32 бит - A[2]
Я привел пример для записи в 16-битный слейв, где смещение reg * 2,
так как A[0] не используется, а самый младший используемый адрес A[1].
Для 8-битного слейва (reg * 1) т.е. IOWR_8DIRECT( base, reg, val ).
Для 32-битного, соответственно (reg *4) т.е. IOWR_32DIRECT( base, reg*4, val).
Собственно макросы IOWR_ это ассемблерные команды STBIO, STHIO, STWIO (store byte/halfword/word in IO space)
Так яснее?

Спасибо. Понятно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016