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

 
 
> Запись по базовому адресу пользовательской логики
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 5 2012, 15:47
Сообщение #2


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

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



Выглядеть будет так:
IOWR_16DIRECT( base, reg * 2, val);
где номер регистра reg = 0, 1, 2, 3...n
reg - 16-битный регистр.
Так как адресация процессора всё равно байтовая.
В железе младший адрес адресной шины будет выбран
автоматически, согласно разрядности шины данных.
Поэтому в железе смещение будет на 1.
reg0 - 0x00
reg1 - 0x01
reg2 - 0x02 ...

Сообщение отредактировал Копейкин - Dec 5 2012, 15:55
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 7 2012, 07:43
Сообщение #3


Знающий
****

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



Цитата(Копейкин @ Dec 5 2012, 19:47) *
Выглядеть будет так:
IOWR_16DIRECT( base, reg * 2, val);
где номер регистра reg = 0, 1, 2, 3...n
reg - 16-битный регистр.
Так как адресация процессора всё равно байтовая.
В железе младший адрес адресной шины будет выбран
автоматически, согласно разрядности шины данных.
Поэтому в железе смещение будет на 1.
reg0 - 0x00
reg1 - 0x01
reg2 - 0x02 ...

Спасибо. Работает. Тоесть чтобы записать данные в пользовательский регистр 01 нужно выполнить IOWR_16DIRECT( base, 2, val);
не совсем понятны рассуждения.
Команда IOWR_16DIRECT( base, reg * 2, val); пишет данные val в 16 битный регистр по базовому адресу base со смещением относительно базового адреса на reg * 2
Тоесть если бы в пользовательской логике был регистр 8 разрядный то смещение нужно было-бы делать reg * 4 и команда должна быть IOWR_8DIRECT( base, 4, val);
. Это верно? Или все же reg + 4, а в предыдущем случае reg + 2?

Сообщение отредактировал Acvarif - Dec 7 2012, 07:57
Go to the top of the page
 
+Quote Post



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

 


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


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