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

 
 
> Память на плис, реализация памяти на VHDL или Coregen
Anton1990
сообщение Sep 17 2015, 05:21
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 155
Регистрация: 26-04-12
Пользователь №: 71 584



Все добрый день.
Использую виртекс6. Реализую промежуточный накопитель оцифрованного сигнала (16 бит) с АЦП с дискретизацией 200 МГц. и последующим сливом в ПК.
На VHDL реализовал накопитель. Вродебы все просто: в массив длинной 65536 загоняю сигнал и останавливаю запись. Далее медленно по PCI скачиваю данные. Сигнал тактирования разумеется законстрейнил (задал period). При компиляции не ругается. Вся конструкция работает, но наблюдается нестабильность от разводки к разведке проекта. При использовании FIFO созданного в Coregeneratore результат значительно лучше (практически нет глюков).
Вопрос: в чем отличие? Может я чего то незнаю? Какая нибудь потаенная галочка, констрейн или еще что?
Кстати памяти в плис используется немного всего 20 %.
Заранее спасибо за ответы.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Sep 17 2015, 18:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Вообще схема отработанная годами. Память в плис с точки зрения логики ее чтения ничем не отличается от большой кучи регистров. А следовательно проблема в правильной записи в эти ''регистры''.

то есть у вас все работает и проблем никаких нет, да?

наводящий вопрос
Как вы думаете регистр состоящий из Д триггеров, который может быть размещен в любом месте плис и ячейка памяти расположенная в блоке, с адресацией, имеют одинаковое время распространения сигнала от них до точки где данные захлопнуться?
Как вы думаете может такое получиться что вы выставите желаемый адрес по которому хотите считать данные так близко к моменту защелкивания данных, что не все сигналы успели дойти до регистра защелкивающего данные в другой части ПЛИС, к фронту клока управляющего этим регистром?
Go to the top of the page
 
+Quote Post
Anton1990
сообщение Sep 18 2015, 06:08
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 155
Регистрация: 26-04-12
Пользователь №: 71 584



Цитата(Golikov A. @ Sep 17 2015, 21:36) *
то есть у вас все работает и проблем никаких нет, да?

наводящий вопрос
Как вы думаете регистр состоящий из Д триггеров, который может быть размещен в любом месте плис и ячейка памяти расположенная в блоке, с адресацией, имеют одинаковое время распространения сигнала от них до точки где данные захлопнуться?
Как вы думаете может такое получиться что вы выставите желаемый адрес по которому хотите считать данные так близко к моменту защелкивания данных, что не все сигналы успели дойти до регистра защелкивающего данные в другой части ПЛИС, к фронту клока управляющего этим регистром?


По первой части ответ очевиден - время распространения разное.
По второй части вопрос не доконца понял. Но отвечу так. Если частота выставления адреса чтения очень низкая, то проблем быть не должно. Наверное.

Цитата(iosifk @ Sep 17 2015, 22:16) *
Вот две строки:

if rd'event and rd='1' then
bufDO(15 downto 0) <= Mem(conv_integer(Ard)); --вынимаем из памяти два отсчета данных
bufDO(31 downto 16) <= Mem(conv_integer(Ard+1));

Скажите, как происходит
Mem(conv_integer(Ard)); --вынимаем из памяти два отсчета данных

и Ard+1

Что там с латентностью? И насколько быстро произойдет "Ard+1" и потом Mem(conv_integer(Ard+1));
И все это за один фронт "rd'event and rd='1'" при том, что больше клоков то нет.... Только один этот фронт...
Т.е. это скорее всего счетчик, который идет на младшее слово. А с него же адрес идет на сумматор, и после сумматора на старшее??? Или это действительно две ячейки памяти и по выходу мультиплексор?

И если сравнивать с регистрами, то память медленнне раза в два....


Mem(conv_integer(Ard)); --вынимаем из памяти два отсчета данных
комментарий сразу к двум строкам относиться.

Что касается Ard+1, то у меня были по этому поводу сомнения. Взял да убрал чтения сразу двух отсчетов, теперь пишем в память 16 разрядов и читает из памяти 16 разрядов. Ну стало считываться в ПК в 2 раза медленнее ну и пофиг. НО общая проблема осталась.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Sep 18 2015, 06:56
Сообщение #4


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

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



Цитата(Anton1990 @ Sep 18 2015, 09:08) *

Общее, что у Вас должно быть:
- память двух портовая с двумя клоками (своя тактовая частота для каждого порта памяти):
CODE

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

entity memA0 is
generic
(
DATA_WIDTH : natural := 4;
ADDR_WIDTH : natural := 13
);

port
(
clk_a : in std_logic;
clk_b : in std_logic;
addr_a : in std_logic_vector((ADDR_WIDTH-1) downto 0);
addr_b : in std_logic_vector((ADDR_WIDTH-1) downto 0);
data_a : in std_logic_vector((DATA_WIDTH-1) downto 0);
data_b : in std_logic_vector((DATA_WIDTH-1) downto 0);
we_a : in std_logic := '1';
we_b : in std_logic := '1';
q_a : out std_logic_vector((DATA_WIDTH -1) downto 0);
q_b : out std_logic_vector((DATA_WIDTH -1) downto 0)
);

end memA0;

architecture Behavioral of memA0 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;

shared variable ram : memory_t:= (others => (others => '0'));
-- signal ram : memory_t :=
--(
-- to initialize memory
-- );
signal mem_data : std_logic_vector (14 downto 0);


begin

-- Port A
process(clk_a)
begin
if(rising_edge(clk_a)) then
if(we_a = '1') then
ram(conv_integer(addr_a)) := data_a;
end if;
q_a <= ram(conv_integer(addr_a));
end if;
end process;

-- Port B
process(clk_b)
begin
if(rising_edge(clk_b)) then
if(we_b = '1') then
ram(conv_integer(addr_b)) := data_b;
end if;
q_b <= ram(conv_integer(addr_b));
end if;
end process;

end Behavioral;


- схема записи данных с АЦП должна соединяться с одним портом памяти на своей тактовой частоте (у Вас вроде это clk).
- схема вычитки данных для PCI должна соединяться с другим портом памяти на своей тактовой частоте (у Вас вроде это rd).
- сигналы квитирования или готовности данных должны быть пропущены через синхронизирующую цепочку регистров. Это необходимо когда Вы производите передачу готовности с одной схемы в другую.

PS Можно вместо предложенной памяти использовать ФИФО (тоже на 2 клока для входа и выхода).


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

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

Сообщений в этой теме
- Anton1990   Память на плис   Sep 17 2015, 05:21
- - Maverick   Цитата(Anton1990 @ Sep 17 2015, 08:21) Вс...   Sep 17 2015, 05:28
|- - Krys   Цитата(Maverick @ Sep 17 2015, 12:28) дву...   Sep 17 2015, 06:03
- - blackfin   Цитата(Anton1990 @ Sep 17 2015, 08:21) Си...   Sep 17 2015, 05:41
- - Golikov A.   Цитатана двухпортовой памяти с независимыми клокам...   Sep 17 2015, 06:18
|- - blackfin   Цитата(Golikov A. @ Sep 17 2015, 09:18) д...   Sep 17 2015, 06:24
- - Golikov A.   в том что скачиваться данные из памяти могут на од...   Sep 17 2015, 06:52
|- - Anton1990   Цитата(Golikov A. @ Sep 17 2015, 09:52) в...   Sep 17 2015, 08:07
- - Golikov A.   ЦитатаЕще раз. В память данные пишутся на 200 МГц ...   Sep 17 2015, 08:22
|- - Anton1990   Цитата(Golikov A. @ Sep 17 2015, 11:22) к...   Sep 17 2015, 08:36
|- - Maverick   Цитата(Anton1990 @ Sep 17 2015, 11:36) Ни...   Sep 17 2015, 09:02
- - iosifk   Цитата(Anton1990 @ Sep 17 2015, 08:21) Пр...   Sep 17 2015, 09:06
|- - Maverick   Цитата(iosifk @ Sep 17 2015, 12:06) Про к...   Sep 17 2015, 09:10
|- - Anton1990   Цитата(iosifk @ Sep 17 2015, 12:06) Я для...   Sep 17 2015, 09:21
|- - Maverick   Цитата(Anton1990 @ Sep 17 2015, 12:21) А ...   Sep 17 2015, 09:25
|- - iosifk   Цитата(Anton1990 @ Sep 17 2015, 12:21) Ну...   Sep 17 2015, 09:29
|- - Anton1990   Цитата(iosifk @ Sep 17 2015, 12:29) Тогда...   Sep 17 2015, 12:45
|- - iosifk   Цитата(Anton1990 @ Sep 17 2015, 15:45) Си...   Sep 17 2015, 13:06
|- - Maverick   Цитата(Anton1990 @ Sep 17 2015, 15:45) Вы...   Sep 17 2015, 13:06
|- - Anton1990   Цитата(Maverick @ Sep 17 2015, 16:06) я н...   Sep 17 2015, 13:12
||- - Maverick   Цитата(Anton1990 @ Sep 17 2015, 16:12) А ...   Sep 17 2015, 13:22
|- - Anton1990   Цитата(Maverick @ Sep 17 2015, 16:06) я н...   Sep 17 2015, 13:48
|- - Krys   Цитата(Anton1990 @ Sep 17 2015, 20:48) Ту...   Sep 18 2015, 08:05
- - Golikov A.   есть, потому что синтезаторы анализирует текст на ...   Sep 17 2015, 13:25
- - Golikov A.   строго говоря я думаю что именно в этом случае син...   Sep 17 2015, 13:59
|- - Anton1990   Цитата(Golikov A. @ Sep 17 2015, 16:59) с...   Sep 17 2015, 14:41
|- - iosifk   Цитата(Golikov A. @ Sep 17 2015, 21:36) т...   Sep 17 2015, 19:16
- - Golikov A.   ЦитатаЕсли частота выставления адреса чтения очень...   Sep 18 2015, 06:25


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

 


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


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