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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Spartan3AN, IP-Core Generator и оперативная память
Balabes
сообщение Aug 21 2013, 06:48
Сообщение #1


Участник
*

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



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

Расскажите кто нибудь поподробнее что теперь с этим делать, код какой то странный, не понимаю что в нем откуда. Спасибо.
Go to the top of the page
 
+Quote Post
ZASADA
сообщение Aug 21 2013, 06:54
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 738
Регистрация: 13-01-11
Из: Минск
Пользователь №: 62 210



IP-Core Generator делает ФИФО из внутренних блоков памяти.
Go to the top of the page
 
+Quote Post
Balabes
сообщение Aug 21 2013, 06:56
Сообщение #3


Участник
*

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



Значит надо брать MIG?
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 21 2013, 10:40
Сообщение #4


я только учусь...
******

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



Цитата(Balabes @ Aug 21 2013, 09:56) *
Значит надо брать MIG?

да


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Inanity
сообщение Aug 21 2013, 11:27
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 221
Регистрация: 6-07-12
Пользователь №: 72 653



MIG - MIGом, но он не создаст фифо. Он даст контроллер памяти. Вы уверены, что вам нужно именно фифо? По-моему можно обойтись без неё.
Go to the top of the page
 
+Quote Post
Balabes
сообщение Aug 21 2013, 11:53
Сообщение #6


Участник
*

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



я скорее учусь чем что-то делаю, мне хочется задействовать память, интересуют варианты, ды и просто про ИП кор генератор узнать хочется.
Go to the top of the page
 
+Quote Post
Inanity
сообщение Aug 21 2013, 12:06
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 221
Регистрация: 6-07-12
Пользователь №: 72 653



Цитата(Balabes @ Aug 21 2013, 15:53) *
я скорее учусь чем что-то делаю, мне хочется задействовать память, интересуют варианты, ды и просто про ИП кор генератор узнать хочется.

Вариантов видится два. Можно поднять cофт-процессор microblaze (он есть в coregenerator), подключить к нему вашу DDR2, подлючить модуль UART и написать программу на си для управления всем этим добром.
А можно другим путём: поднять контроллер памяти через MIG, поднять UART и собрать логику управления самому (без проца).
Go to the top of the page
 
+Quote Post
Balabes
сообщение Aug 21 2013, 14:38
Сообщение #8


Участник
*

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



микроблейз это я думаю клево, но позже, пока хочется самому. в генерируемых файлах одни порт мапы, логику не увидел - как вообще пользоваться полученным кодом?
Go to the top of the page
 
+Quote Post
ZASADA
сообщение Aug 21 2013, 15:13
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 738
Регистрация: 13-01-11
Из: Минск
Пользователь №: 62 210



Цитата(Balabes @ Aug 21 2013, 17:38) *
в генерируемых файлах одни порт мапы, логику не увидел - как вообще пользоваться полученным кодом?

на каждое ядро есть пдф, там все прозрачно расписано.
Go to the top of the page
 
+Quote Post
Balabes
сообщение Aug 21 2013, 17:38
Сообщение #10


Участник
*

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



искал но не нашел мануала по использованию генератора "в картинка для чайника" и это большая печаль
Go to the top of the page
 
+Quote Post
Balabes
сообщение Aug 23 2013, 11:06
Сообщение #11


Участник
*

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



подскажите пожалуйста с процессом создания ядра миг, а точнее что происходит когда нужно выбирать банки (см скрин)
тут выбираем микросхему памяти и data width (я так понимаю размер одного элемента в памяти, байт, два байта и тд?)
Прикрепленное изображение


далее будет это
Прикрепленное изображение

тут допустим перетягиваем банк0 вправо и попадаем в такое окно
Прикрепленное изображение

почему галочки adress controll/data относятся к банку1? + system controll/ system clock отмечен красным и следующий шаг не доступен пока в банке2 не отметишь эти пункты галкой? как следствие в такой конфигурации ядро не создается, если банки не выбирать то оно создается, но видимо работать не будет. В чем проблема? банк0 особенный какой то и его использовать нельзя? не получилось нагуглить ничего понятного и хорошего, надеюсь подробно описал, заранее спасибо
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 23 2013, 11:16
Сообщение #12


я только учусь...
******

Группа: Модераторы
Сообщений: 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.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Balabes
сообщение Aug 23 2013, 11:35
Сообщение #13


Участник
*

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



По большому счету фифо тут ни при чем, это я просто тренировался) мне интересны банки сейчас ибо ничего не понятно.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 23 2013, 11:38
Сообщение #14


я только учусь...
******

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



Цитата(Balabes @ Aug 23 2013, 14:35) *
По большому счету фифо тут ни при чем, это я просто тренировался) мне интересны банки сейчас ибо ничего не понятно.

wacko.gif wacko.gif wacko.gif


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Balabes
сообщение Aug 23 2013, 11:44
Сообщение #15


Участник
*

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



что?
Go to the top of the page
 
+Quote Post

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

 


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


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