Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Microblaze и обмен данными
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Alexsandr000
Уважаемые форумчане!


Кто может посоветовать каким образом лучше всего передавать данные с IP core в Microblaze и обратно?

На IP core формируются 32-битные вектора и их надо передать на Microblaze, где происходит их обработка (арифметика + передача через UART на ПК) после чего полученные 32-битные вектора необходимо передать на IP core, где они передаются на ЦАП. cool.gif
Mad_max
Цитата(Alexsandr000 @ Mar 12 2013, 09:46) *
Кто может посоветовать каким образом лучше всего передавать данные с IP core в Microblaze и обратно?


В Microblaze ничего передать нельзя, можно только в память записать/прочитать, к кторой имеет доступ Mb.
Или сделать переферию доступную процу на чтение/запись.

EDK Concepts, Tools and Techniques найдите для своей версии софта, далее chapter 7.
des00
FSL линки чем не подходят ?
Bad0512
Цитата(Alexsandr000 @ Mar 12 2013, 12:46) *
Уважаемые форумчане!


Кто может посоветовать каким образом лучше всего передавать данные с IP core в Microblaze и обратно?

На IP core формируются 32-битные вектора и их надо передать на Microblaze, где происходит их обработка (арифметика + передача через UART на ПК) после чего полученные 32-битные вектора необходимо передать на IP core, где они передаются на ЦАП. cool.gif

Существует много различных вариантов.И много различных микроблейзов. Для каждой задачи - свой способ. Определитесь вначале какой у вас микроблейз (standalone или полноценный) и какая требуется скорость передачи данных. Тогда можно будет что-то посоветовать.
Alexsandr000
Цитата(Bad0512 @ Mar 12 2013, 11:29) *
Существует много различных вариантов.И много различных микроблейзов. Для каждой задачи - свой способ. Определитесь вначале какой у вас микроблейз (standalone или полноценный) и какая требуется скорость передачи данных. Тогда можно будет что-то посоветовать.


Microblaze я так понимаю полноценный, скорость порядка 70 кГц (передаются 32-битные слова). Пытался через AXI, но пока выходит ерунда какая-то.

Возможно кто-то подскажет ссылку на пример

Цитата(des00 @ Mar 12 2013, 10:21) *
FSL линки чем не подходят ?


Пробую, но пока не совсем ясно как с ними работать
des00
Цитата(Alexsandr000 @ Mar 12 2013, 05:21) *
Пробую, но пока не совсем ясно как с ними работать

там тупо интерфейс типа FIFO + 2 операции чтения/записи с блокировкой конвейера по сигналу готовности FIFO либо без оной
Bad0512
Цитата(Alexsandr000 @ Mar 12 2013, 18:21) *
Microblaze я так понимаю полноценный, скорость порядка 70 кГц (передаются 32-битные слова). Пытался через AXI, но пока выходит ерунда какая-то.

Наиболее распространенный случай, скорости низкие - напрашивается банальный AXI slave с генерацией интераптов чтобы зря не мучить микроблейз поллингом. Думаю можно даже тупо майлбоксами от ползти на таких частотах.
Alexsandr000
Цитата(des00 @ Mar 12 2013, 16:22) *
там тупо интерфейс типа FIFO + 2 операции чтения/записи с блокировкой конвейера по сигналу готовности FIFO либо без оной


Хм ... я не сталкивался еще, мне сложновато понять, вот нашел пример пример но как это реализовать на плате, примеров, что-то не найду, скачал с Xilinx, но они нифига не работают.



Цитата(Bad0512 @ Mar 12 2013, 17:52) *
Наиболее распространенный случай, скорости низкие - напрашивается банальный AXI slave с генерацией интераптов чтобы зря не мучить микроблейз поллингом. Думаю можно даже тупо майлбоксами от ползти на таких частотах.


Надо попробовать, а есть у кого пример такой системы?
des00
Цитата(Alexsandr000 @ Mar 12 2013, 08:16) *
Хм ... я не сталкивался еще, мне сложновато понять, вот нашел пример пример но как это реализовать на плате, примеров, что-то не найду, скачал с Xilinx, но они нифига не работают.

если посмотреть описание FSL линка, то там примитивный интерфейс empty/full/read/write. В SDK тоже все просто FSL_blockread/blockwrite(Ncnahhel) или FSL_unblockread/unblockwrite(Nchannel). Соберите систему с микробом и одним выходным FSL линком на светодиоды и тренируйтесь %) даже примеров не надо.

ЗЫ. Имена функций драйвера могу написать не правильно, но смысл понятен.
Alexsandr000
Цитата(des00 @ Mar 12 2013, 19:20) *
если посмотреть описание FSL линка, то там примитивный интерфейс empty/full/read/write. В SDK тоже все просто FSL_blockread/blockwrite(Ncnahhel) или FSL_unblockread/unblockwrite(Nchannel). Соберите систему с микробом и одним выходным FSL линком на светодиоды и тренируйтесь %) даже примеров не надо.

ЗЫ. Имена функций драйвера могу написать не правильно, но смысл понятен.


Спасибо, начал подключать ip к microblaze, все нормально подключается, но, что-то не пойму почему я не могу подключить FSL_M_Clk к часам
Alexsandr000
Правильно я понял, что на MB добавляется подключение к FSL, потом я добавляю IP CORE FSL BUS, блок с которого будут передаваться данные. MB и мой VHDL блок подключаю к шине FSL?

Что-то я запутался с часами FSL_M_Clk и FSL_S_Clk. На MB и моем блоке они CLK, а на шине обычные сигналы.
Maverick
Цитата(Alexsandr000 @ Mar 13 2013, 10:07) *

Может это поможет

Я аналогично подключал - работало... (правда по ссылке шина старая PLB)
Alexsandr000
Цитата(Maverick @ Mar 13 2013, 12:34) *
Может это поможет

Я аналогично подключал - работало... (правда по ссылке шина старая PLB)


Спасибо!!! Сейчас попробую!
Alexsandr000
Цитата(Alexsandr000 @ Mar 13 2013, 12:50) *
Спасибо!!! Сейчас попробую!

Пример хороший, но к сожалению в проекте используется AXI
Alexsandr000
Кто может подсказать в чем может быть проблема
есть VHDL блок:
Код
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
Library UNISIM;
use UNISIM.vcomponents.all;
-------------------------------------------------------------------------------------
-- Definition of Ports
-- FSL_Clk         : Synchronous clock
-- FSL_Rst         : System reset, should always come from FSL bus
-- FSL_S_Clk       : Slave asynchronous clock
-- FSL_S_Read      : Read signal, requiring next available input to be read
-- FSL_S_Data      : Input data
-- FSL_S_CONTROL   : Control Bit, indicating the input data are control word
-- FSL_S_Exists    : Data Exist Bit, indicating data exist in the input FSL bus
-- FSL_M_Clk       : Master asynchronous clock
-- FSL_M_Write     : Write signal, enabling writing to output FSL bus
-- FSL_M_Data      : Output data
-- FSL_M_Control   : Control Bit, indicating the output data are contol word
-- FSL_M_Full      : Full Bit, indicating output FSL bus is full
-----------------------------------------------------------------------------
entity fsbox is
    port(
    --- global -----------------------------
        FSL_Clk         : in    std_logic;
        FSL_Rst         : in    std_logic;
        clk           : in    std_logic;
    --- io ---------------------------------
        input_data_r  : in    std_logic_vector(17 downto 0);
        input_data_i  : in    std_logic_vector(17 downto 0);
        output_data   : out    std_logic_vector(17 downto 0);
        tr_enbl       : out    std_logic;
    --- slave ------------------------------
        FSL_S_Clk      : in    std_logic;
        FSL_S_Read      : out    std_logic;
        FSL_S_Data      : in    std_logic_vector(0 to 31);
        FSL_S_Control : in    std_logic;
        FSL_S_Exists  : in    std_logic;
    --- master -----------------------------
        FSL_M_Clk      : in    std_logic;
        FSL_M_Write      : out    std_logic;
        FSL_M_Data      : out    std_logic_vector(0 to 31);
        FSL_M_Control : out    std_logic;
        FSL_M_Full      : in    std_logic
    );
    attribute SIGIS : string;
    attribute SIGIS of FSL_Clk : signal is "Clk";
    attribute SIGIS of FSL_S_Clk : signal is "Clk";
    attribute SIGIS of FSL_M_Clk : signal is "Clk";
    attribute iob: string;
end fsbox;

architecture EXAMPLE of fsbox is
---------------------------------------------------------------------------------
    signal sign18_data_in_r      : std_logic_vector(17 downto 0):=(others=>'0');
    signal sign18_data_in_i      : std_logic_vector(17 downto 0):=(others=>'0');
    signal sign18_data_out_ff_r  : std_logic_vector(17 downto 0):=(others=>'0');
    signal sign18_data_out_ff_i  : std_logic_vector(17 downto 0):=(others=>'0');
    signal sign18_data_out_fsl_r : std_logic_vector(0 to 31):=(others=>'0');
    signal sign18_data_out_fsl_i : std_logic_vector(0 to 31):=(others=>'0');
    signal full                  : std_logic:='0';
    signal empty                 : std_logic:='0';
    signal rd_en                 : std_logic:='0';
    signal i                     : integer:=0;
---------------------------------------------------------------------------------
    COMPONENT ififo  
        PORT (
            wr_clk : IN STD_LOGIC;
            rd_clk : IN STD_LOGIC;
            din    : IN STD_LOGIC_VECTOR(17 DOWNTO 0);
            wr_en  : IN STD_LOGIC;
            rd_en  : IN STD_LOGIC;
            dout   : OUT STD_LOGIC_VECTOR(17 DOWNTO 0);
            full   : OUT STD_LOGIC;
            empty  : OUT STD_LOGIC
        );
    END COMPONENT;
begin
    input_ff_r : ififo PORT MAP(clk,FSL_Clk, input_data_r, '1', rd_en,sign18_data_out_ff_r,full,empty);
    input_ff_i : ififo PORT MAP(clk,FSL_Clk, input_data_i, '1', rd_en,sign18_data_out_ff_i,open, open);
---------------------------------------------------------------------------------------------
    Dout_IOB_Arr: for i in 17 downto 0
    generate
        attribute iob of Dout_IOB_r    : label is "TRUE";
        attribute iob of Dout_IOB_i    : label is "TRUE";
    begin
        Dout_IOB_r:  FD port map(D => input_data_r(i),Q => sign18_data_in_r(i), C => clk );
        Dout_IOB_i:  FD port map(D => input_data_i(i),Q => sign18_data_in_i(i), C => clk );
  end generate;
---------------------------------------------------------------------------------------------
    tr_enbl <= '0';
    sign18_data_out_fsl_i <= FSL_S_Data;
   output_data <= sign18_data_out_fsl_i(0 to 17);
    FSL_S_Read    <= '0';
---------------------------------------------------------------------------------------------
    wrt_data : process (FSL_Clk)
   begin  
        if FSL_Clk'event and FSL_Clk = '1' then
            if FSL_M_Full = '0' and empty = '0' then
                case i is
                    when 0 =>
                        rd_en <= '1';
                        i<=i+1;
                    when 1 =>
                        FSL_M_Write <= '1';
                        FSL_M_Control <= '1';
                        rd_en <= '1';
                        FSL_M_Data <= SXT(sign18_data_in_r, 32);
                        i<=i+1;
                    when 2 =>
                        FSL_M_Write <= '0';
                        FSL_M_Control <= '0';
                        rd_en <= '0';
                        i<=0;
                    when others =>
                end case;
            else
                FSL_M_Write <= '0';
                rd_en <= '0';
            end if;
        end if;
   end process wrt_data;
end architecture EXAMPLE;

пытаюсь считать данные в MB:
Код
    
        int h=0,g=0;
    delay(10);
    while (h<50){
        //getfsl(g,0);
        microblaze_nbread_cntlfsl(g,0);
        //nputfsl(g,0);
        xil_printf("%d;\n",g);
        h++;
    }

На VHDL блок посылается пила, а в MB:
94;
62;
15;
63;
45;
94;
68;
66;
40;
105;
2;
20;
79;
90;

Данные посылаются на VHDL блок с частотой 8МГц, сама шина FSL работает с частотой 50 МГц.

Кто сталкивался с такой проблемой?
des00
судя по вашему коду и судя по доке http://www.xilinx.com/support/documentatio...ion/fsl_v20.pdf

не понятно как вообще это вы подцепляете к микробу, потому что стробы управления записью/чтением фифо со стороны микроба являются для модуля выходными .

И по идее у вас это и собираться не должно, VHDL должен был конфикт драйверов выдать.

и судя по вашим частотам следования данных и работы шины на чтение, использование неблокирующего чтения (у вас в коде _nblock...) должно учитывать обработку сигнала того, что читалось пустое фифо.

ЗЗЫ. И почему вы не используете Chip Scope? давно бы уже по житагу все отладили.
Alexsandr000
В принципе с входами/выходами проблем не должно быть, все создавалось автоматически. Я создал в XPS периферийное устройство и шиной обмена FSL, в XPS добавил IP core fsl_v20 на прием и передачу. Компилится без проблем, проблемы возникают, когда передаются данные, я все не могу понять как все это засинхронизировать. С VHDl кодом более мене понятно, а вот с MB как не все понятно, я понимаю, что есть команды приема, отправки данных, но вот как определить полон FIFO или нет и т.п.

Данные идут непрерывным потоком на FIFO с частотой 8 МГц, по идее он не должен переполняться, однако, на MB приходит мусор.

вот mhs:
Код
BEGIN fsl_v20
PARAMETER INSTANCE = fsl_v20_0
PARAMETER HW_VER = 2.11.f
PARAMETER C_EXT_RESET_HIGH = 0
PARAMETER C_IMPL_STYLE = 1
PARAMETER C_USE_CONTROL = 0
PORT FSL_Clk = clk_50_0000MHzPLL0
PORT SYS_Rst = proc_sys_reset_0_Interconnect_aresetn
END

BEGIN fsl_v20
PARAMETER INSTANCE = fsl_v20_1
PARAMETER HW_VER = 2.11.f
PARAMETER C_EXT_RESET_HIGH = 0
PARAMETER C_IMPL_STYLE = 1
PARAMETER C_USE_CONTROL = 0
PORT FSL_Clk = clk_50_0000MHzPLL0
PORT SYS_Rst = proc_sys_reset_0_Interconnect_aresetn
END

BEGIN fslbox
PARAMETER INSTANCE = fslbox_0
PARAMETER HW_VER = 1.00.a
BUS_INTERFACE SFSL = fsl_v20_0
BUS_INTERFACE MFSL = fsl_v20_1
PORT FSL_Clk = clk_50_0000MHzPLL0
END
Sombre
Можете попробовать вот это http://xillybus.com/doc-microblaze
Alexsandr000
В качестве решения я использовал AXI4-LITE + FIFO

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.