bva_rzn 0 18 декабря, 2014 Опубликовано 18 декабря, 2014 · Жалоба Добрый день. Подскажите, пожалуйства, правильно ли делаю. Связываю плис и 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 постоянно считываю нули. Подскажите, в каком направлении копать? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nickolas 0 19 декабря, 2014 Опубликовано 19 декабря, 2014 · Жалоба Мне тут понадобилось подключить шину данных процессора 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Swup 0 19 декабря, 2014 Опубликовано 19 декабря, 2014 · Жалоба Я обычно просто делаю блоки которые мне нужны в qsys со стандартными интерфейсами (имеются в виду avalon-MM, avalon-ST). Если прям есть необходимость сделать связь внешней периферией с qsys-системой, то опять же делаю блоки выполняющие роль мостов, например conduit -> avalon-ST. Приведу пример : я хочу поток с ацп записать потоком в озу, а потом отправить на пк. Делаю следующее: - делаю блок переводящий шину с ацп в avalon ST; - ставлю двухклоковое фифо для перевода из клокового домена ацп в клоковый домен системы + для краткосрочной буферизации; - дальше блок делающий из потокового avalon-ST в пакетный (нужно для дма); - с помощью sgdma пишу поток в память; - процессором читаю из памяти( просто обращаюсь по указателю) отправляю дальше куда мне надо. Итого в топ модуле подключается qsys-система, непосредственно на неё заводятся пины ацп (данные и сопровождающий их клок). Все остальное уже соединено в qsys. В общем, применительно к вашему случаю, я бы не делал связь вашего устройства и процессора через пару буферов, а оформил бы его в качестве обычной периферии к процессору с MM интерфейсов и прерыванием. Ну это конечно все при условии, что я верно понял ваши затруднения)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба Добавте в QSys компонент On-Chip Memory, сделайте его двух-портовым, порт s1, clk1, reset1 подключите к Nios и системному клоку/ресету, а s2, clk2, reset2 экспортируйте. Используйте их для подключения к своему RTL. Правила работы с шиной Avalon можно прочитать в доке, там вроде все просто. Через одну память можно как читать так и писать. Готовность данных можно проверять по некоторому формальному признаку (флагу), который прописывается по заранее известному адресу. Это самое простое. Если нужна поддержка прерываний, то проще сделать собственное IP с поддержкой Avalon-MM и прерываний, а наружу выбрасить интерфейс памяти для RTL части. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться