Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Генерация IP_Core с прерываниями из Матлаб для Xilinx
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Galeaf
Здравствуйте

В Матлабе создана модель обработки данных с АЦП. Стоит задача создать по ней IP_Core для MicroBlaze (no-os). Проект реализуется на Virtex 6 от Xilinx.

Так как IP_Core тактируется от внешних клоков и содержит CIC дециматор и демодулятор, в результате чего, данные с ядра выходят на низкой скорости.
Хотел забирать данные с него (используя AXI4-lite) по прерываниям, но не нашел способа в матлабе создать ядро с данным выходом.

Кто сталкивался с подобной проблемой, прошу помочь.

alexadmin
Цитата(Galeaf @ Sep 19 2016, 14:39) *
Так как IP_Core тактируется от внешних клоков и содержит CIC дециматор и демодулятор, в результате чего, данные с ядра выходят на низкой скорости. Хотел забирать данные с него (используя AXI4-lite) по прерываниям, но не нашел способа в матлабе создать ядро с данным выходом.


Вряд ли прямо так в матлабе выйдет. Из системы выходит поток данных, который по своей сути эквивалентен Axi-Stream. И дальше в EDK можно поставить мост (вроде были стандартные или самописный сделать с теми самыми прерываниями).
count_enable
AXI-Stream с FIFO должны помочь. Интерфейс для работы с очередью думаю Матлаб осилит, остальное - стандартные компоненты. Тогда используя Scatter-Gather DMA Engine можно писать данные прямо в память, этот же движок будет генерировать прерывания. Будет и скорость приличная, и программисту проще. Если нет возможности возиться с памятью, можно AXI-Stream добавить прямо в процессор.
Maverick
Цитата(Galeaf @ Sep 19 2016, 14:39) *
Здравствуйте

В Матлабе создана модель обработки данных с АЦП. Стоит задача создать по ней IP_Core для MicroBlaze (no-os). Проект реализуется на Virtex 6 от Xilinx.

Так как IP_Core тактируется от внешних клоков и содержит CIC дециматор и демодулятор, в результате чего, данные с ядра выходят на низкой скорости.
Хотел забирать данные с него (используя AXI4-lite) по прерываниям, но не нашел способа в матлабе создать ядро с данным выходом.

Кто сталкивался с подобной проблемой, прошу помочь.

FIFO на SRL32
CODE
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity tiny_fifo is
generic (
GC_WIDTH : integer := 8; -- FIFO data width
GC_DEPTH : integer := 32); -- FIFO data depth, <= 32
port (
clk : in std_logic;

-- FIFO data input
fifo_in_data : in std_logic_vector(GC_WIDTH-1 downto 0);
fifo_in_valid : in std_logic;
fifo_in_ready : out std_logic := '0';

-- FIFO data output
fifo_out_data : out std_logic_vector(GC_WIDTH-1 downto 0) := (others => '0');
fifo_out_valid : out std_logic := '0';
fifo_out_ready : in std_logic;

-- status signals
fifo_index : out signed(5 downto 0));
end entity;

architecture arch of tiny_fifo is
type ram_type is array (GC_DEPTH-1 downto 0) of std_logic_vector (GC_WIDTH-1 downto 0);
signal fifo : ram_type := (others => (others => '0'));
signal fifo_index_i : signed (5 downto 0) := to_signed(-1, 6);
signal fifo_empty : boolean;
signal fifo_full : boolean;
signal fifo_in_enable : boolean;
signal fifo_out_enable : boolean;

begin
fifo_full <= (fifo_index_i = GC_DEPTH-1);
fifo_empty <= (fifo_index_i = -1);

fifo_in_ready <= '1' when (not fifo_full) else '0';
fifo_out_valid <= '1' when (not fifo_empty) else '0';

fifo_in_enable <= (fifo_in_valid = '1') and (not fifo_full );
fifo_out_enable <= (fifo_out_ready = '1') and (not fifo_empty);

fifo_out_data <= fifo(to_integer(unsigned(fifo_index_i(4 downto 0))));
fifo_index <= fifo_index_i;

process (clk)
begin
if rising_edge(clk) then
if fifo_in_enable then
fifo(GC_DEPTH-1 downto 1) <= fifo(GC_DEPTH-2 downto 0);
fifo(0) <= fifo_in_data;
if not fifo_out_enable then fifo_index_i <= fifo_index_i + 1; end if;
elsif fifo_out_enable then fifo_index_i <= fifo_index_i - 1;
end if;
end if;
end process;

end architecture;


SRL32 FIFO to AXI4-Stream
CODE
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity axis_tiny_fifo is
generic (
GC_WIDTH : integer := 8;
GC_DEPTH : integer := 32);
port (
aclk : in std_logic;

-- axi4 stream slave (data input)
s_axis_tdata : in std_logic_vector(GC_WIDTH-1 downto 0);
s_axis_tvalid : in std_logic;
s_axis_tready : out std_logic;

-- axi4 stream master (data output)
m_axis_tdata : out std_logic_vector(GC_WIDTH-1 downto 0);
m_axis_tvalid : out std_logic;
m_axis_tready : in std_logic;

-- status signals
index : out signed(5 downto 0));
end entity;

architecture arch of axis_tiny_fifo is
begin

tiny_fifo_i : entity work.tiny_fifo
generic map (
GC_WIDTH => GC_WIDTH,
GC_DEPTH => GC_DEPTH)
port map (
clk => aclk,
fifo_in_data => s_axis_tdata,
fifo_in_valid => s_axis_tvalid,
fifo_in_ready => s_axis_tready,
fifo_out_data => m_axis_tdata,
fifo_out_valid => m_axis_tvalid,
fifo_out_ready => m_axis_tready,
fifo_index => index);

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