|
Память на плис, реализация памяти на VHDL или Coregen |
|
|
|
 |
Ответов
|
Sep 17 2015, 18:36
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Вообще схема отработанная годами. Память в плис с точки зрения логики ее чтения ничем не отличается от большой кучи регистров. А следовательно проблема в правильной записи в эти ''регистры''. то есть у вас все работает и проблем никаких нет, да? наводящий вопрос Как вы думаете регистр состоящий из Д триггеров, который может быть размещен в любом месте плис и ячейка памяти расположенная в блоке, с адресацией, имеют одинаковое время распространения сигнала от них до точки где данные захлопнуться? Как вы думаете может такое получиться что вы выставите желаемый адрес по которому хотите считать данные так близко к моменту защелкивания данных, что не все сигналы успели дойти до регистра защелкивающего данные в другой части ПЛИС, к фронту клока управляющего этим регистром?
|
|
|
|
|
Sep 18 2015, 06:08
|
Частый гость
 
Группа: Участник
Сообщений: 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 раза медленнее ну и пофиг. НО общая проблема осталась.
|
|
|
|
|
Sep 18 2015, 06:56
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|