Перейти к содержанию
    

связь fpga с nios ii

Добрый день.

 

Подскажите, пожалуйства, правильно ли делаю.

 

Связываю плис и nios (плата DE0-nano) при помощи двух dual-port RAM: одна для передали данных из плис в nios, другая - из nios в плис.

Также используются две линии: одна для передачи сигнала готовности данных от плис в nios w_data_ready (данная линия заведена на прерывания от PIO),

другая - от nios в плис.

 

Вот часть кода:

 ......
ram RAMin(.clock_a(CLOCK_25),         .clock_b(CLOCK_50i),
                  .address_a(w_address_in), .address_b(w_address_in_nios),

              .data_a(w_data_in), .data_b(),
              .q_a(),                    .q_b(w_data_in_nios),
             
             .rden_a(1'b0), .rden_b(1'b1),             
             .wren_a(1'b1), .wren_b(1'b0));
             
  ram RAMout(.clock_a(CLOCK_25),        .clock_b(CLOCK_50i),
                 .address_a(w_address_out), .address_b(w_address_out_nios),
                
              .data_a(),             .data_b(w_data_out_nios),
          .q_a(w_data_out), .q_b(),

              .rden_a(1'b1),  .rden_b(1'b0),
                  .wren_a(1'b0),  .wren_b(1'b1));            
            
    de0_nano_Qsys d1(
        .clk_clk(CLOCK_50i),                // clk.clk
        .reset_reset_n(1'b1),                 // reset.reset_n
        .sdra_wire_addr(DRAM_ADDR),   // new_sdram_controller_wire.addr
        .sdra_wire_ba(DRAM_BA),       // .ba
        .sdra_wire_cas_n(DRAM_CAS_N), // .cas_n
        .sdra_wire_cke(DRAM_CKE),     // .cke
        .sdra_wire_cs_n(DRAM_CS_N),   // .cs_n
        .sdra_wire_dq(DRAM_DQ),       // .dq
        .sdra_wire_dqm(DRAM_DQM),     // .dqm
        .sdra_wire_ras_n(DRAM_RAS_N), // .ras_n
        .sdra_wire_we_n(DRAM_WE_N),   // .we_n
        
        .addres_nios_in_export(w_address_in_nios),  //  addres_nios_in.export
        .data_nios_in_export(w_data_in_nios),    //    data_nios_in.export
        
        .addres_nios_out_export(w_address_out_nios), // addres_nios_out.export
                .data_nios_out_export(w_data_out_nios),   //   data_nios_out.export      
             
                .signal_nios_in_export({w_data_ready,w_data_ready_FS}),  //  signal_nios_in.export
                .signal_nios_out_export({w_data_ready_PE,reset}),  // signal_nios_out.export
       
                .uart_0_rxd(RxD),      //    uart_0.rxd
                .uart_0_txd(TxD),       //   uart_0.txd      
    );

Данные в eclipse считываю после возникновения прерывания по линии w_data_ready как:

  ...
   IOWR_ALTERA_AVALON_PIO_DATA(ADDRES_NIOS_IN_BASE, 0x00);
   aM[1][0].p_int = IORD_ALTERA_AVALON_PIO_DATA(DATA_NIOS_IN_BASE);
  ...

Данные в плис пишу:

  .....

  assign w_data_in    = r_data_in;
  assign w_address_in = r_address_in;

  if(count == 4110) begin         
    r_data_in    <= out_conv;    
    r_address_in <= 0;
    r_conv       <= {{3'b001},{54'b0}};
  end else;
    
   if(count == 4120) begin
        r_data_in      <= out_conv;            
    r_address_in <= 1;
    r_conv          <= {{4'b0001},{53'b0}}; 
   end else;

   ....

При отладке в eclipse постоянно считываю нули.

 

Подскажите, в каком направлении копать?

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне тут понадобилось подключить шину данных процессора NIOS к блокам, реализованным на VHDL. В Qsys добавил компонент Avalon-MM Pipeline Bridge. У него Avalon Memory Mapped Slave подключил к data master процессора, а MM Master экспортировал. Для 32-разрядных данных и 16-разрядного адреса получился такой набор сигналов

 

avalon_bridge_waitrequest      : in  std_logic;
avalon_bridge_readdata         : in  std_logic_vector(31 downto 0);
avalon_bridge_readdatavalid    : in  std_logic;
avalon_bridge_burstcount       : out std_logic_vector(0 downto 0);
avalon_bridge_writedata        : out std_logic_vector(31 downto 0);
avalon_bridge_address          : out std_logic_vector(15 downto 0);
avalon_bridge_write            : out std_logic;
avalon_bridge_read             : out std_logic;
avalon_bridge_byteenable       : out std_logic_vector(3 downto 0);
avalon_bridge_debugaccess      : out std_logic;

 

Обращения из NIOS делаются так:

IOWR(AVALON_BRIDGE_BASE, addr, wr_dat);
rd_dat = IORD(AVALON_BRIDGE_BASE, addr);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я обычно просто делаю блоки которые мне нужны в qsys со стандартными интерфейсами (имеются в виду avalon-MM, avalon-ST). Если прям есть необходимость сделать связь внешней периферией с qsys-системой, то опять же делаю блоки выполняющие роль мостов, например conduit -> avalon-ST.

 

Приведу пример : я хочу поток с ацп записать потоком в озу, а потом отправить на пк.

Делаю следующее:

- делаю блок переводящий шину с ацп в avalon ST;

- ставлю двухклоковое фифо для перевода из клокового домена ацп в клоковый домен системы + для краткосрочной буферизации;

- дальше блок делающий из потокового avalon-ST в пакетный (нужно для дма);

- с помощью sgdma пишу поток в память;

- процессором читаю из памяти( просто обращаюсь по указателю) отправляю дальше куда мне надо.

 

Итого в топ модуле подключается qsys-система, непосредственно на неё заводятся пины ацп (данные и сопровождающий их клок).

Все остальное уже соединено в qsys.

 

В общем, применительно к вашему случаю, я бы не делал связь вашего устройства и процессора через пару буферов, а оформил бы его в качестве обычной периферии к процессору с MM интерфейсов и прерыванием.

 

Ну это конечно все при условии, что я верно понял ваши затруднения))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавте в QSys компонент On-Chip Memory, сделайте его двух-портовым, порт s1, clk1, reset1 подключите к Nios и системному клоку/ресету, а s2, clk2, reset2 экспортируйте. Используйте их для подключения к своему RTL. Правила работы с шиной Avalon можно прочитать в доке, там вроде все просто. Через одну память можно как читать так и писать. Готовность данных можно проверять по некоторому формальному признаку (флагу), который прописывается по заранее известному адресу. Это самое простое. Если нужна поддержка прерываний, то проще сделать собственное IP с поддержкой Avalon-MM и прерываний, а наружу выбрасить интерфейс памяти для RTL части.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...