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