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

 
 
> Nios чтение байта из двухпортовой RAM
Acvarif
сообщение Jul 4 2016, 07:36
Сообщение #1


Знающий
****

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



Имеется модуль с Avalon Slave присоединенный в систему с Nios
Код
    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(7 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(7 downto 0) := (others => '0'); --      .writedata
        avs_s0_byteenable    : in  std_logic_vector(0 downto 0)     := (others => '0');
        avs_s0_readdata      : out std_logic_vector(7 downto 0);                    --      .readdata
        ins_irq0_irq         : out std_logic;

В модуле имеется двухпортовая RAM (16 байт) которую необходимо читать по прерыванию ins_irq0_irq
В программе обработчика первым делом сбрасываю импульс прерывания чтением по крайнему адресу
Код
....
void Irq0Isr(void* context, alt_u32 id)
{
    // сброс сигнала прерывания
    IORD_8DIRECT(AMULET_0_BASE, 255);
    Isr0Occur = 1;
    AllIrq0Count++;
}
....

В майн читаю память. Данные в памяти заранее известны. 0x55, 0xaa, ...
Код
...
            if (AllIrq0Count)
            {
                RamData = IORD_8DIRECT(AMULET_0_BASE, 0);
                printf("Прерывание Irq0: N %d \n", AllIrq0Count);
                printf("Данные: %x \n", RamData[0]);
                AllIrq0Count = 0;
            }
....
Все работает нормально пока (AMULET_0_BASE, 0)
Вопрос как считать данные по следующему адресу RAM? Какое должно быть смещение. Поскольку Nios оперирует байтами, а Avalon имеет ширину 32 бита, то смещение для чтения следующего байта из двухпортовой RAM должно быть 4. Прочитанный байт должет быть 0хaa. На практике читается все то же 0х55. Подскажите пожалуйста в чем загвоздка?

Сообщение отредактировал Acvarif - Jul 4 2016, 07:37
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vadimuzzz
сообщение Jul 13 2016, 09:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



надо смотреть, не генерируется ли паразитное прерывание, когда данных еще нет. гляньте signaltap'ом
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jul 13 2016, 12:19
Сообщение #3


Знающий
****

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



Цитата(vadimuzzz @ Jul 13 2016, 12:44) *
надо смотреть, не генерируется ли паразитное прерывание, когда данных еще нет. гляньте signaltap'ом

Контроль веду по осциллографу. Паразитных всплесков нет. Собственно сама RAM
Код
    -- карта соединений памяти меток
    -- принимает (запись) метки от uuartrx_mt
    -- отправляет (чтение) метки в Nios в кажд. эл. дист

    -- enable памяти меток
    s_mtwe <= s_canceler;
    -- сигнал записи данных в пам. меток
    s_wrmt <= s_tx_done_tick;
    -- данные s_datarx на память меток
    s_d_mtdata_one <= s_datarx;
    -- адреса чтения 16 байт
    s_mtraddr <= avs_s0_address(3 downto 0);
    
    umtdata : ramdata
    generic map (8, 4)
    port map (
        rclk => s_rdmt,    
        wclk => s_wrmt,        
        raddr    => s_mtraddr,    
        waddr    => s_mtwaddr,        
        data => s_d_mtdata_one,
        we    => s_mtwe,
        q => s_q_mtdata_one        
        );

    -- данные на Avalon MM Slave из памяти меток
    avs_s0_readdata <= s_q_mtdata_one;
    -- сигнал чтения из Avalon MM Slave на RAM
    s_rdmt <= (not clk and not avs_s0_read_n and avs_s0_byteenable(0));

Наверное лишним прицеплено avs_s0_byteenable(0) для сигнала чтения Ram. Да и без него все то же самое. Чудес не бывает, но обработчик таки действительно только по второму прерыванию читает реальные данные из двухпортовой RAM. Не связано-ли это с какими-то кешами?...
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jul 14 2016, 01:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(Acvarif @ Jul 13 2016, 18:19) *
Не связано-ли это с какими-то кешами?...

Это легко проверить, отключив кэш данных в настройках процессора
Go to the top of the page
 
+Quote Post



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

 


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


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