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

Lutovid

Свой
  • Постов

    163
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Lutovid

  • Звание
    Частый гость
    Частый гость
  • День рождения 17.05.1992

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

2 661 просмотр профиля
  1. https://support.xilinx.com/s/question/0D52E00006hpi7ySAA/microblaze-dual-ethernet-problem-with-lwip?language=en_US Кто искал ответ на тот же вопрос что и я - в примере выше dma, но с fifo то же самое
  2. https://lwip.fandom.com/wiki/Network_interfaces_management Как я понимаю если у нас есть уже один рабочий netif, то его не должно выбивать добавление нового Но я вижу обратное static struct netif server_netif; static struct netif server_netif2; struct netif *echo_netif; struct netif *echo_netif2; XUartLite UartLite; struct ip_addr ipaddr, netmask, gw; struct ip_addr ipaddr2, netmask2, gw2; /* the mac address of the board. this should be unique per board */ unsigned char mac_ethernet_address[] = { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 }; unsigned char mac_ethernet_address2[] = { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x03 }; void ProcUartCommand(u8 inp) { if(inp == '1') { xil_printf("adding netif\n\r"); if (!xemac_add(echo_netif2, &ipaddr2, &netmask2, &gw2, mac_ethernet_address2, XPAR_AXI_ETHERNET_1_BASEADDR)) { xil_printf("Error adding N/W interface\n\r"); } } } int main() { u8 UARTRecvBuffer[UART_BUFFER_SIZE]; u8 ReceivedCount = 0; XUartLite_Initialize(&UartLite, XPAR_UARTLITE_0_DEVICE_ID); echo_netif = &server_netif; echo_netif2 = &server_netif2; /* Define this board specific macro in order perform PHY reset on ZCU102 */ init_platform(); /* initliaze IP addresses to be used */ IP4_ADDR(&ipaddr, 192, 168, 7, 10); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 7, 1); IP4_ADDR(&ipaddr2, 192, 168, 7, 11); IP4_ADDR(&netmask2, 255, 255, 255, 0); IP4_ADDR(&gw2, 192, 168, 7, 1); print_app_header(); lwip_init(); /* Add network interface to the netif_list, and set it as default */ if (!xemac_add(echo_netif, &ipaddr, &netmask, &gw, mac_ethernet_address, XPAR_AXI_ETHERNET_0_BASEADDR)) { xil_printf("Error adding N/W interface\n\r"); return -1; } // if (!xemac_add(echo_netif2, &ipaddr2, &netmask2, // &gw2, mac_ethernet_address2, // XPAR_AXI_ETHERNET_1_BASEADDR)) { // xil_printf("Error adding N/W interface\n\r"); // return -1; // } netif_set_default(echo_netif); /* now enable interrupts */ platform_enable_interrupts(); /* specify that the network if is up */ netif_set_up(echo_netif); print_ip_settings(&ipaddr, &netmask, &gw); /* start the application (web server, rxtest, txtest, etc..) */ start_application(); /* receive and process packets */ while (1) { if (TcpFastTmrFlag) { tcp_fasttmr(); TcpFastTmrFlag = 0; } if (TcpSlowTmrFlag) { tcp_slowtmr(); TcpSlowTmrFlag = 0; } ReceivedCount += XUartLite_Recv(&UartLite,UARTRecvBuffer,UART_BUFFER_SIZE); if (ReceivedCount != 0) { ReceivedCount=0; ProcUartCommand(UARTRecvBuffer[0]); } xemacif_input(echo_netif); transfer_data(); } /* never reached */ cleanup_platform(); return 0; } Вот мой участок кода, который я правлю
  3. Всем привет. У меня возникла необходимость подключить 2 axi ethernet subsystem к одному microblaze. С одним я работал, а вот с двумя не доводилось. Решил танцевать от примера echo, но пока меня интересует только ответ на ping. Подключил оба интерфейса. Запустил пример - все пингуется. Как только добавляю строки if (!xemac_add(echo_netif2, &ipaddr2, &netmask2, &gw2, mac_ethernet_address2, XPAR_AXI_ETHERNET_1_BASEADDR)) { xil_printf("Error adding N/W interface\n\r"); return -1; } Что бы добавить новый netif в lwip, отваливается и первый интерфейс. Кто это реализовывал? может у меня есть какое-то принципиальное недопонимание? Любой подсказке буду рад
  4. Удалось. В консоли более подробные описания ошибок оказались, так как это проблемы сборки именно библиотеки(до этого смотрел просто эррор репорт) - нужно было еще в паре мест make файлы поправить.
  5. Всем привет! Появилась необходимость поднять snmp агент на microblaze. Я полазил в lwip, который в xsdk подключается - там есть функции snmp, но такой опции в gui bsp settings нет. Среда Vivado17.1/xsdk17.1 Что бы включить этот функционал надо задефайнить LWIP_SNMP в lwipopts.h. Но это автогенерируемый файл - пришлось править скрипт tcl создания этого хедера(https://support.xilinx.com/s/article/35787?language=en_US - вот по этому примеру добавил этот дефайн) прямо в папке библиотеки там где установлен xsdk После того как дефайн прошел - повалились ошибки: cannot find -llwip4 main_processing C/C++ Problem expected expression before ';' token standalone_bsp_0 line 536 C/C++ Problem Кто этот функционал включал? Может этот функционал был частично обрезан? Или я просто делаю что-то не так? P/S запуллил из гита соответствующую версию lwip/ Ничего там не выпилино вроде как, кроме ppp
  6. Ну там действительно должен иметься высокодобротный фильтр пилота, его удобно делать через IIR, но задержки нужно будет конечно учитывать. В общем, можно сделать вывод что функционал не доступен пока, как я понимаю...
  7. Привет! Возник вопрос по реализации стерео модулятора/демодулятора. На базе примера из help https://www.mathworks.com/help/comm/ref/comm.fmbroadcastmodulator-system-object.html реализовал коротенький скрипт: clear all; [y,Fs] = audioread('stereo_file.mp3'); % soundsc(y, Fs) AirFs = 441000; fmbMod = comm.FMBroadcastModulator('AudioSampleRate',Fs, ... 'SampleRate',AirFs, 'Stereo', true); fmbDemod = comm.FMBroadcastDemodulator( ... 'AudioSampleRate',Fs, ... 'SampleRate',AirFs,'PlaySound',true, 'Stereo', true); audioData = y(1:AirFs*2, 1:2); modData = fmbMod(audioData); demodData = fmbDemod(modData); В результате выполнения проигрывается моно сигнал(взял запись теста стереоэффекта с поочередным появлением звука то в одном канале, то в другом). Если убрать комментарий и проиграть soundsc(y, Fs), то стереоэффект есть. Еще информация - в исходном стереосигнале есть большая разница между сигналами R и L, после демодуляции разница между каналами на 4 порядка ниже. Если использовать пример из хелпа, то он не репрезентативный(пример с RBDS) так как там хоть и стоит флаг stereo, но в исходном сигнале нет стереоэффекта(rbds_capture_47500.wav) Так же пробовал повторить в симулинке - там такая же проблема. Более того если построить спектр от моделированного сигнала, я ожидал увидеть нечто похожее на картинку из help - то есть L+R, L-R и пилот на 19кГц, я же такой картины не вижу, то есть явно есть какая-то проблема с модуляцией. Помогите пожалуйста разобраться. Вот тут этот же вопрос задал, но может на этом форуме мне быстрее помогут. Извините за копипаст https://hub.exponenta.ru/quest/fmbroadcastmodulator-vopros-po-stereo-demodulyatsii680
  8. Вдруг будет полезно - в Vivado в Language templates есть макросы для CDC xpm_cdc_single, xpm_cdc_array_single, xpm_cdc_handshake - для них отдельно задавать тайминг констрэйнты не нужно, если их функционал устраивает.
  9. До этого проводил тесты с флешкой 16 гигов fat 32, сейчас 4Гига fat16 - тест прошел, спасибо!
  10. там написано * To test with different logical drives, drive number should be mentioned in * both FileName and Path variables. By default, it will take drive 0 if drive * number is not mentioned in the FileName variable. Раз я тестирую SD0, то по идее не нужно задавать имя "0:/Test.bin" А Path указан корректно TCHAR *Path = "0:/"; Я отформатировал с компа sd под fat32. Надо попробовать fat16, но мне как-то это не пришло в голову, раз не написано какой fat
  11. Привет всем! Возникла проблема с sd картой. Решил в качестве тестов использовать пример от xilinx (прикрепил файл). Плата zc702. Беру в sdk пребилд hw_platform для zc702, в bsp ставлю галку на использование библиотеки xilffs, в качестве исходников софта использую этот файл. По идее, я полагал, что при настолько дефолтных условиях пример должен работать из коробки. В итоге фэйлится на f_write - возвращает FR_DISK_ERR. После ряда тестирований начало фэйлиться на f_mkfs - возвращает FR_NOT_READY. Я грешу на то, что SD карта не поддерживается, но линукс с нее стартовал когда-то на этой же плате. Подскажите пожалуйста, что может быть причиной такого поведения? P/S Ключ защиты записи на самой карте не стоит, переключатели бута ставил и в положение загрузки с флешки и в положение загрузки по джтаг - это не изменило картины. xilffs_polled_example.c
  12. У меня есть возможность оптику из tx в rx в sfp ткнуть. Попробую спасибо,
  13. Всем привет! Возникла проблема с переводом проекта с меди 1000BASE-T на одномодовую оптику 1000BASE-LX Отладочный проект состоит из микроблэйза, ядра axi ethernet subsystem и ядра ethernet pcs/pma - стандартные ксаевские. Дифпара от трансиверов идет на sfp. Внешнего фая нет, есть только iic для общения с sfp. Я полагал, что поддерживаться должна как медь так и оптика, стандарт в pcs/pma выбран sgmii, линк всегда 1Гигабит для обоих режимов. В итоге для оптики линк поднимается, но данных на gmii с pcs/pma никаких не наблюдается кроме интерфрэйм гэпа(BC50). Подскжите пожалуйста в какую сторону копать? Возможно нужна специфическая инициализация через iic? или для одномодовой оптики есть свое кодирование, fec какой-нибудь?
  14. Возникла старая проблема, которую пока накак не получается решить. Вставил emc в дизайн согласно примеру.(картинка) Код rtl блока просто выдран из примера(у них он вставлен во враппер, я вынес отдельно) library IEEE; use IEEE.STD_LOGIC_1164.ALL; library UNISIM; use UNISIM.VCOMPONENTS.ALL; use unisim.vcomponents.STARTUPE3; entity Linear_flash_interface is port ( Clk_out: in STD_LOGIC; Linear_Flash_address_in : in STD_LOGIC_VECTOR ( 25 downto 0 ); Linear_Flash_address : out STD_LOGIC_VECTOR ( 25 downto 0 ); Linear_Flash_adv_ldn_in : in STD_LOGIC; Linear_Flash_adv_ldn : out STD_LOGIC; Linear_Flash_ce_n : in std_logic_vector (0 downto 0); Linear_Flash_wait : in STD_LOGIC_VECTOR ( 0 to 0 ); Linear_Flash_wait_out : out STD_LOGIC_VECTOR ( 0 to 0 ); Linear_Flash_oe_n_in : in STD_LOGIC_VECTOR ( 0 to 0 ); Linear_Flash_oe_n : out STD_LOGIC_VECTOR ( 0 to 0 ); Linear_Flash_we_n_in : in STD_LOGIC; Linear_Flash_we_n : out STD_LOGIC; RESET : in STD_LOGIC; mem_dq_io : inout STD_LOGIC_VECTOR ( 0 to 11 ); mem_dq_t : in STD_LOGIC_VECTOR ( 15 downto 0 ); mem_dq_i : out STD_LOGIC_VECTOR ( 0 to 15 ); mem_dq_o : in STD_LOGIC_VECTOR ( 15 downto 0 ) ); end Linear_flash_interface; architecture STRUCTURE of Linear_flash_interface is signal dq_o : std_logic_vector (3 downto 0); signal dq_o_e, dq_i_e_int : std_logic_vector (15 downto 0); signal dq_t : std_logic_vector (3 downto 0); signal dq_t_e : std_logic_vector (15 downto 0); signal dq_i : std_logic_vector (3 downto 0); signal dq_i_e : std_logic_vector (0 to 11); --------------------------------------------- constant ADD_PIPELINTE : integer := 8; signal pipe_signal : std_logic_vector(ADD_PIPELINTE-1 downto 0); signal PREQ_int : std_logic; signal PACK_int : std_logic; signal cnt : integer := 0; signal div_temp : std_logic := '0'; signal startupe3_eos : std_logic; signal GPIO_LED_0_LS: STD_LOGIC; signal GPIO_LED_1_LS: STD_LOGIC; signal GPIO_LED_2_LS: STD_LOGIC; signal GPIO_LED_3_LS: STD_LOGIC; signal GPIO_LED_4_LS: STD_LOGIC; signal GPIO_LED_5_LS: STD_LOGIC; signal GPIO_LED_6_LS: STD_LOGIC; signal GPIO_LED_7_LS: STD_LOGIC; --------------------------------------------- begin PREQ_REG_P:process(Clk_out)is begin if(Clk_out'event and Clk_out = '1') then if(reset = '1')then pipe_signal(0) <= '0'; elsif(PREQ_int = '1')then pipe_signal(0) <= '1'; end if; end if; end process PREQ_REG_P; PIPE_PACK_P:process(Clk_out)is begin if(Clk_out'event and Clk_out = '1') then if(reset = '1')then pipe_signal(ADD_PIPELINTE-1 downto 1) <= (others => '0'); else pipe_signal(1) <= pipe_signal(0); pipe_signal(2) <= pipe_signal(1); pipe_signal(3) <= pipe_signal(2); pipe_signal(4) <= pipe_signal(3); pipe_signal(5) <= pipe_signal(4); pipe_signal(6) <= pipe_signal(5); pipe_signal(7) <= pipe_signal(6); if (cnt >= 50000000) then div_temp <= not(div_temp); cnt <= 0; else cnt <= (cnt + 1); end if; GPIO_LED_0_LS <= not(div_temp); GPIO_LED_1_LS <= '0'; GPIO_LED_2_LS <= '0'; GPIO_LED_3_LS <= '0'; GPIO_LED_4_LS <= '0'; --startupe3_eos; GPIO_LED_5_LS <= '0'; GPIO_LED_6_LS <= '0'; GPIO_LED_7_LS <= not (startupe3_eos); end if; end if; end process PIPE_PACK_P; PACK_int <= pipe_signal(7); Linear_Flash_address(25 downto 0) <= Linear_Flash_address_in(25 downto 0); Linear_Flash_adv_ldn <= Linear_Flash_adv_ldn_in; Linear_Flash_oe_n(0) <= Linear_Flash_oe_n_in(0); Linear_Flash_we_n <= Linear_Flash_we_n_in; Linear_Flash_wait_out(0) <= Linear_Flash_wait(0); dq_t_e(15 downto 0) <= mem_dq_t(15 downto 0); mem_dq_i <= dq_i_e( 0 to 11) & dq_i; dq_o_e(15 downto 0) <= mem_dq_o; STARTUPE3_inst : component STARTUPE3 ----------------------- generic map ( PROG_USR => "FALSE", -- Activate program event security feature. SIM_CCLK_FREQ => 0.0 -- Set the Configuration Clock Frequency(ns) for simulation. ) port map ( CFGCLK => open, -- 1-bit output: Configuration main clock output CFGMCLK => open, -- 1-bit output: Configuration internal oscillator clock output DI => dq_i, -- 4-bit output: Allow receiving on the D input pin EOS => startupe3_eos, -- 1-bit output: Active-High output signal indicating the End Of Startup PREQ => open, -- 1-bit output: PROGRAM request to fabric output DO => dq_o_e(3 downto 0), -- 4-bit input: Allows control of the D pin output DTS => dq_t_e(3 downto 0), -- 4-bit input: Allows tristate of the D pin FCSBO => Linear_Flash_ce_n(0), -- 1-bit input: Contols the FCS_B pin for flash access FCSBTS => '0', -- 1-bit input: Tristate the FCS_B pin GSR => '0', -- 1-bit input: Global Set/Reset input (GSR cannot be used for the port) GTS => '0', -- 1-bit input: Global 3-state input (GTS cannot be used for the port name) KEYCLEARB => '1', -- 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM) PACK => PACK_int, -- 1-bit input: PROGRAM acknowledge input USRCCLKO => Clk_out, -- 1-bit input: User CCLK input USRCCLKTS => '0', -- 1-bit input: User CCLK 3-state enable input USRDONEO => '1', -- 1-bit input: User DONE pin output control USRDONETS => '1' -- 1-bit input: User DONE 3-state enable output ); mem_dq_iobuf_4 : IOBUF port map ( I => dq_o_e(4), IO => mem_dq_io(0), O => dq_i_e(11), T => dq_t_e(4) ); mem_dq_iobuf_5 : IOBUF port map ( I => dq_o_e(5), IO => mem_dq_io(1), O => dq_i_e(10), T => dq_t_e(5) ); mem_dq_iobuf_6 : IOBUF port map ( I => dq_o_e(6), IO => mem_dq_io(2), O => dq_i_e(9), T => dq_t_e(6) ); mem_dq_iobuf_7 : IOBUF port map ( I => dq_o_e(7), IO => mem_dq_io(3), O => dq_i_e(8), T => dq_t_e(7) ); mem_dq_iobuf_8 : IOBUF port map ( I => dq_o_e(8), IO => mem_dq_io(4), O => dq_i_e(7), T => dq_t_e(8) ); mem_dq_iobuf_9 : IOBUF port map ( I => dq_o_e(9), IO => mem_dq_io(5), O => dq_i_e(6), T => dq_t_e(9) ); mem_dq_iobuf_10 : IOBUF port map ( I => dq_o_e(10), IO => mem_dq_io(6), O => dq_i_e(5), T => dq_t_e(10) ); mem_dq_iobuf_11 : IOBUF port map ( I => dq_o_e(11), IO => mem_dq_io(7), O => dq_i_e(4), T => dq_t_e(11) ); mem_dq_iobuf_12 : IOBUF port map ( I => dq_o_e(12), IO => mem_dq_io(8), O => dq_i_e(3), T => dq_t_e(12) ); mem_dq_iobuf_13 : IOBUF port map ( I => dq_o_e(13), IO => mem_dq_io(9), O => dq_i_e(2), T => dq_t_e(13) ); mem_dq_iobuf_14 : IOBUF port map ( I => dq_o_e(14), IO => mem_dq_io(10), O => dq_i_e(1), T => dq_t_e(14) ); mem_dq_iobuf_15 : IOBUF port map ( I => dq_o_e(15), IO => mem_dq_io(11), O => dq_i_e(0), T => dq_t_e(15) ); end STRUCTURE; Дальше ноги идут непосредственно на выход. В такой конфигурации все работает хорошо, но как только я убираю ila читаться из флешки перестает... В превую очередь я грешил на констрэйнты, но они заданы согласно даташиту #### Max Tco -- Clock to input delay for flash set tco_max 5.5 set tco_min 5.5 #### Trace delays for VCU108 board set tdata_trace_delay_max 0.25 set tdata_trace_delay_min 0.25 set tclk_trace_delay_max 0.2 set tclk_trace_delay_min 0.2 set startup_delay_max 7.000 set startup_delay_min 1.350 set board_del_max 1.000 set board_del_min 0.500 set_input_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tco_max + $tdata_trace_delay_max+ $tclk_trace_delay_max + $startup_delay_max + $board_del_max] [get_ports {mem_dq_io[*]}] set_input_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tco_min + $tdata_trace_delay_min+ $tclk_trace_delay_min + $startup_delay_min + $board_del_min] [get_ports {mem_dq_io[*]}] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $startup_delay_max + $board_del_max] [get_ports {mem_dq_io[*]}] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $startup_delay_min + $board_del_min] [get_ports {mem_dq_io[*]}] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $board_del_max] [get_ports {Linear_Flash_address[*]}] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $board_del_min] [get_ports {Linear_Flash_address[*]}] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $board_del_max] [get_ports {Linear_Flash_oe_n[0]}] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $board_del_min] [get_ports {Linear_Flash_oe_n[0]}] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $board_del_max] [get_ports Linear_Flash_we_n] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $board_del_min] [get_ports Linear_Flash_we_n] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tdata_trace_delay_max -$tclk_trace_delay_min + $board_del_max] [get_ports Linear_Flash_adv_ldn] set_output_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tdata_trace_delay_min -$tclk_trace_delay_max + $board_del_min] [get_ports Linear_Flash_adv_ldn] #### Input delay constraints (max/min) for Linear_flash_wait[0] set_input_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -max [expr $tco_max + $tdata_trace_delay_max + $tclk_trace_delay_max + $board_del_max] [get_ports {Linear_Flash_wait[0]}] set_input_delay -clock [get_clocks clk_50MHz_vzr_top_clk_wiz_0_0] -min [expr $tco_min + $tdata_trace_delay_min + $tclk_trace_delay_min + $board_del_min] [get_ports {Linear_Flash_wait[0]}] set_input_delay -max [expr $tdata_trace_delay_max + $tclk_trace_delay_max + $board_del_max] [get_ports RESET] set_input_delay -min [expr $tdata_trace_delay_min - $tclk_trace_delay_max + $board_del_min] [get_ports RESET] Так же я с такими проблемами сталкивался когда есть кривые комбинационные схемы или есть тайминг игнор на некоторые цепи и он некорректен. Но в данном случае этого нет. Попробовал зафиксировать положение блока в констрейнтах - это так же результата не дало. Так же попробовал перейти на более новую вивадо - тоже без результата. Частоты выставил как в примере - так что тут тоже проблем вроде не должно быть. Подскажите пожалуйста, где может быть проблема?
×
×
  • Создать...