|
Spartan3AN, IP-Core Generator и оперативная память |
|
|
|
Aug 21 2013, 06:48
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 8-07-13
Пользователь №: 77 442

|
Здравствуйте, на плате 3АН стоит память 512 Mbit (32M x 16) Micron Technology DDR2 SDRAM (MT47H32M16) как задействовать её в качестве буфера? нужно что то типа ФИФО, данные с АЦП (14 бит) записать в неё (т.е. 4096 раз по два байта), а потом вывести по РС232 в комп, и аналогично из файла считать и по тому же 232 записать в память, а оттуда в ЦАП. В делах IP генератора я совсем темный. Я создал отсюда ФИФО
Расскажите кто нибудь поподробнее что теперь с этим делать, код какой то странный, не понимаю что в нем откуда. Спасибо.
|
|
|
|
|
Aug 21 2013, 06:56
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 8-07-13
Пользователь №: 77 442

|
Значит надо брать MIG?
|
|
|
|
|
Aug 21 2013, 11:53
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 8-07-13
Пользователь №: 77 442

|
я скорее учусь чем что-то делаю, мне хочется задействовать память, интересуют варианты, ды и просто про ИП кор генератор узнать хочется.
|
|
|
|
|
Aug 21 2013, 12:06
|
Местный
  
Группа: Участник
Сообщений: 221
Регистрация: 6-07-12
Пользователь №: 72 653

|
Цитата(Balabes @ Aug 21 2013, 15:53)  я скорее учусь чем что-то делаю, мне хочется задействовать память, интересуют варианты, ды и просто про ИП кор генератор узнать хочется. Вариантов видится два. Можно поднять cофт-процессор microblaze (он есть в coregenerator), подключить к нему вашу DDR2, подлючить модуль UART и написать программу на си для управления всем этим добром. А можно другим путём: поднять контроллер памяти через MIG, поднять UART и собрать логику управления самому (без проца).
|
|
|
|
|
Aug 21 2013, 14:38
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 8-07-13
Пользователь №: 77 442

|
микроблейз это я думаю клево, но позже, пока хочется самому. в генерируемых файлах одни порт мапы, логику не увидел - как вообще пользоваться полученным кодом?
|
|
|
|
|
Aug 21 2013, 17:38
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 8-07-13
Пользователь №: 77 442

|
искал но не нашел мануала по использованию генератора "в картинка для чайника" и это большая печаль
|
|
|
|
|
Aug 23 2013, 11:06
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 8-07-13
Пользователь №: 77 442

|
подскажите пожалуйста с процессом создания ядра миг, а точнее что происходит когда нужно выбирать банки (см скрин) тут выбираем микросхему памяти и data width (я так понимаю размер одного элемента в памяти, байт, два байта и тд?)
далее будет это
тут допустим перетягиваем банк0 вправо и попадаем в такое окно
почему галочки adress controll/data относятся к банку1? + system controll/ system clock отмечен красным и следующий шаг не доступен пока в банке2 не отметишь эти пункты галкой? как следствие в такой конфигурации ядро не создается, если банки не выбирать то оно создается, но видимо работать не будет. В чем проблема? банк0 особенный какой то и его использовать нельзя? не получилось нагуглить ничего понятного и хорошего, надеюсь подробно описал, заранее спасибо
|
|
|
|
|
Aug 23 2013, 11:16
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(Inanity @ Aug 21 2013, 14:27)  MIG - MIGом, но он не создаст фифо. Он даст контроллер памяти. Вы уверены, что вам нужно именно фифо? По-моему можно обойтись без неё. правильно он создаст контроллер памяти, затем Вы пишите фифо на основе внешней памяти. Вот пример фифо на основе встроенной двупортовой памяти Код library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;
entity fifo is port( din : in std_logic_vector(31 downto 0); write_busy : in std_logic; fifo_full : out std_logic; dout : out std_logic_vector(31 downto 0); read_busy : in std_logic; fifo_empty : out std_logic; fifo_clk : in std_logic; reset_al : in std_logic; fifo_flush : in std_logic ); end entity fifo;
architecture fifo_arch of fifo is
signal write_occupancy : std_logic_vector(8 downto 0); signal read_occupancy : std_logic_vector(8 downto 0); signal next_write_occupancy : std_logic_vector(8 downto 0); signal next_read_occupancy : std_logic_vector(8 downto 0); signal next_write_ptr : std_logic_vector(7 downto 0); signal write_ptr : std_logic_vector(7 downto 0); signal next_read_ptr : std_logic_vector(7 downto 0); signal read_ptr : std_logic_vector(7 downto 0); signal read_index : std_logic_vector(7 downto 0); signal dout_next : std_logic_vector(31 downto 0); signal write_busy_d : std_logic; signal fifo_full_s : std_logic; signal fifo_empty_s : std_logic; signal read_occ_case_sel : std_logic_vector(1 downto 0); signal write_occ_case_sel : std_logic_vector(1 downto 0);
type memory is array (255 downto 0) of std_logic_vector(31 downto 0);
signal data_array : memory;
begin -- arch begin
process(fifo_clk, reset_al) begin if (reset_al = '0') then write_ptr <= "00000000"; elsif(fifo_clk'event and fifo_clk = '1') then write_ptr <= next_write_ptr; end if; end process;
--Calculate next write pointer value process (fifo_flush, write_busy, write_ptr, fifo_full_s) begin if(fifo_flush = '1')then next_write_ptr <= "00000000"; else next_write_ptr <= (write_ptr + (write_busy and (not fifo_full_s))); end if; end process;
process(fifo_clk, reset_al) begin if (reset_al = '0') then read_ptr <= "00000000"; elsif(fifo_clk'event and fifo_clk = '1') then read_ptr <= next_read_ptr; end if; end process;
--Calculate next read pointer value
process (fifo_flush, read_busy, read_ptr, fifo_empty_s) begin if(fifo_flush = '1')then next_read_ptr <= "00000000"; else next_read_ptr <= (read_ptr + (read_busy and (not fifo_empty_s))); end if; end process;
--Read correct memory location process (read_busy, read_ptr, next_read_ptr) begin if(read_busy = '1')then read_index <= next_read_ptr; else read_index <= read_ptr; end if; end process;
--Write data into memory process(fifo_clk)begin if(fifo_clk'event and fifo_clk = '1')then if (write_busy = '1')then data_array(conv_integer(write_ptr)) <= din; end if; end if; end process;
-- read memory data process(fifo_clk) begin if(fifo_clk'event and fifo_clk = '1')then dout <= dout_next; end if; end process;
dout_next <= data_array(conv_integer(read_index(7 downto 0)));
process(fifo_clk, reset_al) begin if (reset_al = '0') then write_occupancy <= "000000000"; elsif(fifo_clk'event and fifo_clk = '1')then write_occupancy <= next_write_occupancy; end if; end process;
process(fifo_clk, reset_al) begin if (reset_al = '0')then read_occupancy <= "000000000"; elsif(fifo_clk'event and fifo_clk = '1')then read_occupancy <= next_read_occupancy; end if; end process;
process(fifo_clk, reset_al) begin if(reset_al = '0') then write_busy_d <= '0'; elsif(fifo_clk'event and fifo_clk = '1')then write_busy_d <= write_busy; end if; end process;
read_occ_case_sel <= write_busy_d & read_busy; write_occ_case_sel <= write_busy & read_busy;
process(fifo_flush, read_occ_case_sel, read_occupancy) begin if (fifo_flush = '1') then next_read_occupancy <= "000000000"; else case read_occ_case_sel is when "00" => next_read_occupancy <= read_occupancy; when "01" => next_read_occupancy <= read_occupancy - '1'; when "10" => next_read_occupancy <= read_occupancy + '1'; when "11" => next_read_occupancy <= read_occupancy; when others => next_read_occupancy <= read_occupancy; end case; end if; end process;
process(fifo_flush, write_occ_case_sel, write_occupancy) begin if (fifo_flush = '1') then next_write_occupancy <= "000000000"; else case write_occ_case_sel is when "00" => next_write_occupancy <= write_occupancy; when "01" => next_write_occupancy <= write_occupancy - '1'; when "10" => next_write_occupancy <= write_occupancy + '1'; when "11" => next_write_occupancy <= write_occupancy; when others => next_write_occupancy <= write_occupancy; end case; end if; end process;
process(fifo_clk, reset_al) begin if (reset_al = '0')then fifo_full_s <= '0'; elsif(fifo_clk'event and fifo_clk = '1')then if (next_write_occupancy = "100000000")then fifo_full_s <= '1'; else fifo_full_s <= '0'; end if; end if; end process;
fifo_full <= fifo_full_s;
process(fifo_clk, reset_al) begin if (reset_al = '0')then fifo_empty_s <= '1'; elsif(fifo_clk'event and fifo_clk = '1')then if (next_read_occupancy = "000000000")then fifo_empty_s <= '1'; else fifo_empty_s <= '0'; end if; end if; end process;
fifo_empty <= fifo_empty_s;
end architecture fifo_arch; Вам нужно "выбросить" двупортовую память и использовать Вашу внешнюю память (как я понял вопрос).
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 23 2013, 11:35
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 8-07-13
Пользователь №: 77 442

|
По большому счету фифо тут ни при чем, это я просто тренировался) мне интересны банки сейчас ибо ничего не понятно.
|
|
|
|
|
Aug 23 2013, 11:44
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 8-07-13
Пользователь №: 77 442

|
что?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|