реклама на сайте
подробности

 
 
> Создание компонета для SOPC Builder с несколькими регистрами ввода/вывода
altlogic
сообщение Jul 25 2012, 06:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Простая по идее задача - хочу созадать свой компонент I2C для SOPC с возможностью конфигурирования его через внутренние регистры компонента (да хотя бы флаг RUN реализоватьsm.gif ). Как это сделать? Нашел на сайте Altera пример Memory Mapped Slave. В этом шаблоне у устройства задается использование 16 внутренних регистров. Но там мощный шаблон, на 700 сток кода. Я аж испугалсяsm.gif
А мне кажется можно это все сделать проще. Ведь всего лишь нужно вытянуть из SOPC информацию о том, по какому адресу он разместил внутренние регистры устройства, ну и сделать их программно доступными конечо с шины Avalon. Примеров других пока не разбирал. Но мне кажется моя задача должна встречаться у всех разработчиков периферии под процессор для FPGA. Товарищ показал код для Xilinx MicroBlaze в аналогичной ситуации. Там, как и в примере Altera в описании компонента применяется специальная нотация.

Смотрел IP-core I2C от Terasic. Там, как я понял используется несколько отдельных регистров ввода-вывода, то есть устройство состоит из нескольких устройств на шине Авалон. Видимо это вообще самое простое решение. Но ведь как-то некрасиво?..


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Acvarif
сообщение Aug 17 2012, 06:44
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Создал компонент Avalon MM Slave с пользовательской логикой.
В качестве пользовательской логики двухпортовая RAM куда с помощью
внешней кнопки загружаются 4 слова данных с последующим тестом чтения (для просмотра на wavwform) в
соответствии с диаграммой работы двухпортовой памяти.
Вот верхний уровень
CODE
--------------------------------------------------------------------
-- Project : ramtest
--------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.numeric_std.all;

entity ramtest is
port (
-- Avalon Slave
clk : in std_logic := '0'; -- clock.clk
reset_n : in std_logic := '0'; -- .reset_n
avs_s0_address : in std_logic_vector(1 downto 0) := (others => '0'); -- s0.address
avs_s0_read_n : in std_logic := '0'; -- .read_n
avs_s0_readdata : out std_logic_vector(15 downto 0); -- .readdata
avs_s0_write_n : in std_logic := '0'; -- .write_n
avs_s0_writedata : in std_logic_vector(15 downto 0) := (others => '0'); -- .writedata
avs_s0_chipselect : in std_logic := '1'; -- .chipselect
-- ins_irq0_irq : out std_logic;

-- RAM Exports
-- Вспомогательные сигналы (тест загрузки и чтения RAM)
ldrd : in std_logic := '1'; -- внешний старт записи-чтения RAM (от кнопки)
ram_load : out std_logic; -- старт загрузки RAM (для теста)
ram_wr : out std_logic; -- строб записи RAM
ram_rd : out std_logic; -- строб чтения RAM
ram_ld : out std_logic; --
ram_wt : out std_logic; --
cnt_out : out std_logic; --
ram_read : out std_logic; -- старт чтение RAM (для теста)
ram_data_in : out std_logic_vector(15 downto 0); -- входные данные RAM (для теста)
ram_data_out : out std_logic_vector(15 downto 0) -- выходные данные RAM (для теста)
);

end entity ramtest;

architecture rtl of ramtest is

--------------------------------------------------------------------
-- компонент двухпортовая RAM

component ramresult
generic
(
DATA_WIDTH : integer := 16;
ADDR_WIDTH : integer := 2
);

port
(
rclk : in std_logic;
wclk : in std_logic;
raddr : in std_logic_vector (0 to ADDR_WIDTH - 1);
waddr : in std_logic_vector (0 to ADDR_WIDTH - 1);
data : in std_logic_vector((DATA_WIDTH-1) downto 0);
we : in std_logic := '1';
q : out std_logic_vector((DATA_WIDTH -1) downto 0)
);
end component;

-- сигналы загрузки и теста чтения RAM
signal cnt : std_logic_vector(3 downto 0) := X"0"; -- делитель
signal s_data_in : std_logic_vector(15 downto 0) := X"0000"; -- данные RAM (вход)
signal s_data_out : std_logic_vector(15 downto 0); -- данные RAM (выход)
signal s_rd : std_logic; -- клок чтения из RAM
signal s_wr : std_logic; -- клок записи в RAM
signal s_we : std_logic := '1'; -- выбор кристалла
signal s_addr_rd_ram : std_logic_vector(1 downto 0); -- адрес чтения
signal s_addr_wr_ram : std_logic_vector(1 downto 0); -- адрес записи
signal en_loadcnt : std_logic := '0'; -- разрешение загрузки в RAM
signal en_readcnt : std_logic := '0'; -- разрешение чтения из RAM
signal s_lrcnt : std_logic_vector(5 downto 0) := "000000"; -- счетчик
signal s_ramload : std_logic := '1'; --
signal s_ramread : std_logic := '1'; --
signal en_wrrd : std_logic := '0'; --

-- сигналы для шины Avalon
signal avs_s0_readdata_reg : std_logic_vector(15 downto 0);

begin

uramresult : ramresult
generic map (16, 2)
port map (rclk => s_rd, wclk => s_wr, raddr => s_addr_rd_ram,
waddr => s_addr_wr_ram, data => s_data_in, we => s_we, q => s_data_out);

--------------------------------------------------------------------
-- Вспомогательные сигналы
--------------------------------------------------------------------
--
process(clk)
begin
if (rising_edge(clk)) then
cnt <= cnt + 1;
end if;
end process;

cnt_out <= cnt(0);

process(cnt(0))
begin
if (rising_edge(cnt(0))) then
if(ldrd = '0') then
en_wrrd <= '1';
end if;
if(en_wrrd = '1') then
s_lrcnt <= s_lrcnt + 1;
end if;
if (s_lrcnt = "000011") then
s_ramload <= '0';
elsif (s_lrcnt = "000101") then
s_ramload <= '1';
elsif (s_lrcnt = "001011") then
s_ramread <= '0';
elsif (s_lrcnt = "001101") then
s_ramread <= '1';
elsif (s_lrcnt = "101101") then
en_wrrd <= '0';
end if;
end if;
end process;

ram_ld <= s_ramload;
ram_wt <= s_ramread;

--------------------------------------------------------------------
-- Заполнение RAM
--------------------------------------------------------------------

-- старт стоп перебора адресов RAM
process(cnt(0))
begin
if (falling_edge(cnt(0))) then
if(s_ramload = '0') then
en_loadcnt <= '1';
end if;
if(en_loadcnt = '1') then
s_addr_wr_ram <= s_addr_wr_ram + 1;
else
s_addr_wr_ram <= (others => '0');
end if;
if(s_addr_wr_ram = "11") then
en_loadcnt <= '0';
end if;
end if;
end process;

ram_load <= en_loadcnt;
s_wr <= not((cnt(0) and en_loadcnt) and (not clk));
ram_wr <= s_wr;

-- загрузка RAM
process(cnt(0))
begin
if (rising_edge(cnt(0))) then
if(en_loadcnt = '1') then
if(s_addr_wr_ram = "00") then
s_data_in <= X"0102";
elsif(s_addr_wr_ram = "01") then
s_data_in <= X"0304";
elsif(s_addr_wr_ram = "10") then
s_data_in <= X"0506";
elsif(s_addr_wr_ram = "11") then
s_data_in <= X"0708";
end if;
end if;
end if;
end process;

ram_data_in <= s_data_in;

--------------------------------------------------------------------
-- Чтение RAM (для тестирования)
--------------------------------------------------------------------

-- старт стоп перебора адресов RAM
process(cnt(0))
begin
if (falling_edge(cnt(0))) then
if(s_ramread = '0') then
en_readcnt <= '1';
s_we <= '0';
end if;
if(en_readcnt = '1') then
s_addr_rd_ram <= s_addr_rd_ram + 1;
end if;
if(s_addr_rd_ram = "11") then
en_readcnt <= '0';
s_we <= '1';
end if;
end if;
end process;

ram_read <= en_readcnt;
s_rd <= cnt(0) and en_readcnt;
ram_rd <= s_rd;
ram_data_out <= s_data_out;

--------------------------------------------------------------------
-- Avalon slave register read logic
--------------------------------------------------------------------
process(clk)
begin
if (falling_edge(clk)) then
if(reset_n = '0') then
avs_s0_readdata_reg <= (others => '0');
else if(avs_s0_read_n = '0' and ) then
avs_s0_readdata_reg <= s_data_out;
end if;
end if;
end if;
end process;

avs_s0_readdata <= avs_s0_readdata_reg;

end architecture rtl; -- of ramtest

Вот двухпортовая RAM
CODE
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ramresult is

generic
(
DATA_WIDTH : natural := 16;
ADDR_WIDTH : natural := 2
);

port
(
rclk : in std_logic;
wclk : in std_logic;
raddr : in std_logic_vector (0 to ADDR_WIDTH - 1);
waddr : in std_logic_vector (0 to ADDR_WIDTH - 1);
data : in std_logic_vector((DATA_WIDTH-1) downto 0);
we : in std_logic;
q : out std_logic_vector((DATA_WIDTH -1) downto 0)
);

end ramresult;

architecture behavioural of ramresult is

-- Build a 2-D array type for the RAM
subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0);
type memory_t is array(2**ADDR_WIDTH-1 downto 0) of word_t;

-- Declare the RAM signal.
signal ram : memory_t;

begin

process(wclk)
begin
if(falling_edge(wclk)) then
ram(conv_integer(waddr)) <= data;
end if;
end process;

process(rclk)
begin
if(rising_edge(rclk)) then
if(we = '0') then
q <= ram(conv_integer(raddr));
else
q <= (others => 'Z');
end if;
end if;
end process;

end behavioural;

Вот Waveform
Прикрепленное изображение

Далее ступор.
Не понимаю как теперь построить логику переноса данных из этой же RAM на шину Avalon
имея набор только этих сигналов
Прикрепленное изображение

Очевидно нужен промежуточный регистр между выходом RAM и Avalon.
Кому приходилось с этим сталкиваться подскажите please как примерно это должно выглядеть в коде (Avalon slave register read logic).
Если не в коде, то словах тоже думаю пойму.

Сообщение отредактировал Acvarif - Aug 17 2012, 06:49
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- altlogic   Создание компонета для SOPC Builder с несколькими регистрами ввода/вывода   Jul 25 2012, 06:23
- - Konst_777   Цитата(altlogic @ Jul 25 2012, 09:23) ......   Jul 25 2012, 17:41
- - altlogic   Спасибо, буду иметь ввиду. Надо поковырять этот мо...   Jul 26 2012, 02:05
|- - barabek   Цитата(altlogic @ Jul 26 2012, 12:05) Спа...   Jul 29 2012, 22:32
- - Orochi   Я учился работать с регистрами анализируя код этог...   Jul 30 2012, 20:00
|- - Acvarif   Цитата(Orochi @ Jul 30 2012, 23:00) Я учи...   Aug 13 2012, 13:41
- - Копейкин   Сигналы, идущие наружу должны иметь тип интерфейса...   Aug 13 2012, 16:40
- - Orochi   Вот как подключен этот этот компонент у меня. aval...   Aug 13 2012, 17:15
|- - Acvarif   Цитата(Orochi @ Aug 13 2012, 20:15) Вот к...   Aug 14 2012, 07:05
- - Копейкин   Deprecated-параметрами не следует пользоваться. Эт...   Aug 14 2012, 08:53
- - Копейкин   Я не силён в VHDL, пишу на Verilog, но 1) Выходной...   Aug 17 2012, 08:00
|- - Acvarif   Спасибо. Попробую разобраться. Если примитивно то...   Aug 17 2012, 08:29
- - Копейкин   Для чтения/записи отдельного байта следует использ...   Aug 20 2012, 09:18
|- - Acvarif   Цитата(Копейкин @ Aug 20 2012, 12:18) Для...   Aug 20 2012, 10:48
- - Копейкин   Макро IORD(base, n) применяется при адресации типа...   Aug 20 2012, 11:48
|- - Acvarif   Цитата(Копейкин @ Aug 20 2012, 14:48) Мак...   Aug 20 2012, 12:35
- - Копейкин   Вы должны увидеть активацию сигналов avs_s0_read_...   Aug 20 2012, 13:36
|- - Acvarif   Цитата(Копейкин @ Aug 20 2012, 16:36) Вы ...   Aug 20 2012, 14:04
- - Копейкин   Вы имеете в виду, что сигналы avs_s0_read_n & ...   Aug 20 2012, 16:51
|- - Acvarif   Цитата(Копейкин @ Aug 20 2012, 19:51) Вы ...   Aug 20 2012, 17:27
|- - Acvarif   Вроде получилось. Для того, чтобы пронаблюдать на ...   Aug 21 2012, 08:07
- - Копейкин   Добавляете интерфейс Interrupt sender. У Вас добав...   Aug 21 2012, 10:35
|- - Acvarif   Цитата(Копейкин @ Aug 21 2012, 13:35) Доб...   Aug 21 2012, 11:10
|- - Acvarif   Почитал немного букварь "Avalon Interface Spe...   Aug 22 2012, 10:13
- - Копейкин   Предупреждение предупреждает (о как), что устройст...   Aug 22 2012, 13:31
|- - Acvarif   Цитата(Копейкин @ Aug 22 2012, 16:31) Пре...   Aug 22 2012, 14:13
- - Копейкин   Нет, автоматом не сбрасывается. Ты должен иметь св...   Aug 22 2012, 15:24
|- - Acvarif   Цитата(Копейкин @ Aug 22 2012, 18:24) Нет...   Aug 23 2012, 06:30
- - Копейкин   У меня примера под рукой нет, но когда разбирался,...   Aug 23 2012, 09:05
|- - Acvarif   Цитата(Копейкин @ Aug 23 2012, 12:05) У м...   Aug 23 2012, 10:18
|- - barabek   Цитата(Acvarif @ Aug 23 2012, 20:18) Спас...   Aug 23 2012, 22:19
|- - Acvarif   Цитата(barabek @ Aug 24 2012, 01:19) По д...   Aug 24 2012, 08:07
- - Копейкин   Импульс небольшой длительности не гарантирует сраб...   Aug 23 2012, 13:32


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 21:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016