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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Память на плис, реализация памяти на 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
Maverick
сообщение Sep 17 2015, 05:28
Сообщение #2


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

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



Цитата(Anton1990 @ Sep 17 2015, 08:21) *
Все добрый день.
Использую виртекс6. Реализую промежуточный накопитель оцифрованного сигнала (16 бит) с АЦП с дискретизацией 200 МГц. и последующим сливом в ПК.
На VHDL реализовал накопитель. Вродебы все просто: в массив длинной 65536 загоняю сигнал и останавливаю запись. Далее медленно по PCI скачиваю данные. Сигнал тактирования разумеется законстрейнил (задал period). При компиляции не ругается. Вся конструкция работает, но наблюдается нестабильность от разводки к разведке проекта. При использовании FIFO созданного в Coregeneratore результат значительно лучше (практически нет глюков).
Вопрос: в чем отличие? Может я чего то незнаю? Какая нибудь потаенная галочка, констрейн или еще что?
Кстати памяти в плис используется немного всего 20 %.
Заранее спасибо за ответы.

предположение:
переходы из одного клокового домена в другой - двух клоковое FIFO решает как раз эту проблему...


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

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


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Anton1990 @ Sep 17 2015, 08:21) *
Сигнал тактирования разумеется законстрейнил (задал period). При компиляции не ругается. Вся конструкция работает, но наблюдается нестабильность от разводки к разведке проекта.
Вопрос: в чем отличие? Может, я чего-то не знаю? Какая-нибудь потаенная галочка, констрейн или еще что?

Просто задать период клока недостаточно. Необходимо задать задержки по всем входам и выходам.

Для SDC это команды типа:

set_input_delay -clock clk -min 1.000 [all_inputs]
set_input_delay -clock clk -max 2.000 [all_inputs]

set_output_delay -clock clk -min 0.000 [all_outputs]
set_output_delay -clock clk -max 1.000 [all_outputs]

Для UCF (в ISE) есть похожие команды (См., UG612).
Go to the top of the page
 
+Quote Post
Krys
сообщение Sep 17 2015, 06:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271



Цитата(Maverick @ Sep 17 2015, 12:28) *
двух клоковое FIFO решает как раз эту проблему...
на двухпортовой памяти с независимыми клоками


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 17 2015, 06:18
Сообщение #5


Гуру
******

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



Цитата
на двухпортовой памяти с независимыми клоками

для которой ксалинкс честно пишет, что писать по одному порту и читать по другому по разным клокам из одного и того же адреса некорректно, данные на выходе будут не определены.
Одной памяти мало, в фифо еще встроен правильный переход между клоковыми доменами с правильной синхронизацией
Go to the top of the page
 
+Quote Post
blackfin
сообщение Sep 17 2015, 06:24
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Golikov A. @ Sep 17 2015, 09:18) *
для которой ксалинкс честно пишет, что писать по одному порту и читать по другому по разным клокам из одного и того же адреса некорректно, данные на выходе будут не определены.

Так и ТС честно пишет: "в массив длиной 65536 загоняю сигнал и останавливаю запись. Далее медленно по PCI скачиваю данные."

В чем проблема?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 17 2015, 06:52
Сообщение #7


Гуру
******

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



в том что скачиваться данные из памяти могут на одном клоке, а отправляться на другом. Среда следит чтобы данные выставляемые по переднему фронту первого клока, были валидны к следующему переднему фронту (констраины только на период), Но среда совершенно не следит чтобы они были валидны к фронту того клока по которому они отправляются.
В случае фифо данные, наверняка забираются по фронту по которому отправляются и там среда опять следит.

Но это все предположения, правду от нас скрываютsm.gif
Go to the top of the page
 
+Quote Post
Anton1990
сообщение Sep 17 2015, 08:07
Сообщение #8


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

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



Цитата(Golikov A. @ Sep 17 2015, 09:52) *
в том что скачиваться данные из памяти могут на одном клоке, а отправляться на другом. Среда следит чтобы данные выставляемые по переднему фронту первого клока, были валидны к следующему переднему фронту (констраины только на период), Но среда совершенно не следит чтобы они были валидны к фронту того клока по которому они отправляются.
В случае фифо данные, наверняка забираются по фронту по которому отправляются и там среда опять следит.

Но это все предположения, правду от нас скрываютsm.gif


Еще раз. В память данные пишутся на 200 МГц. По заполнению запись ОСТАНАВЛИВАЕТСЯ. Далее по сигналу чтения из шины PCI данные медленно выбираются. Как только выбрал все, по программно формируемому сигналу сброса память снова начинает заполняться. Т.е. процесс записи и чтения во времени строго разделены, одновременного чтения и записи одного адреса НЕТ. Ошибки в логике построения записи-чтения нет. Ведь иной раз все работает нормально. Меняю что либо в другой части проекта, перекомпилирую и ВСЕ глюки и не работает.

Цитата(Golikov A. @ Sep 17 2015, 09:52) *
в том что скачиваться данные из памяти могут на одном клоке, а отправляться на другом. Среда следит чтобы данные выставляемые по переднему фронту первого клока, были валидны к следующему переднему фронту (констраины только на период), Но среда совершенно не следит чтобы они были валидны к фронту того клока по которому они отправляются.
В случае фифо данные, наверняка забираются по фронту по которому отправляются и там среда опять следит.

Но это все предположения, правду от нас скрываютsm.gif


Высказывается много предположений почему не работает. Подскажите что делать чтоб работало.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 17 2015, 08:22
Сообщение #9


Гуру
******

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



Цитата
Еще раз. В память данные пишутся на 200 МГц

как они из памяти читаются.
Приведите кусок кода.

Цитата
Подскажите что делать чтоб работало.

если правильно угадали почему не работает, то нужно описать констрейны и доделать междоменный переход
Go to the top of the page
 
+Quote Post
Anton1990
сообщение Sep 17 2015, 08:36
Сообщение #10


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

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



Цитата(Golikov A. @ Sep 17 2015, 11:22) *
как они из памяти читаются.
Приведите кусок кода.

если правильно угадали почему не работает, то нужно описать констрейны и доделать междоменный переход

Ниже привожу полный текст модуля. Критикуйте. А лучше исправляйте. Подсказывайте.

entity MemSV_vhdl is
generic (Nbit : integer := 16;
N : integer := 65536;
BitSignal : integer := 16
);
Port ( I : in STD_LOGIC_VECTOR (BitSignal-1 downto 0);
clk : in STD_LOGIC;
reset : in STD_LOGIC;
rd : in STD_LOGIC;
DO : out STD_LOGIC_VECTOR (31 downto 0);
full : out STD_LOGIC);
end MemSV_vhdl;

architecture Behavioral of MemSV_vhdl is

type TMemory is array (0 to N-1) of std_logic_vector(BitSignal-1 downto 0);
signal Mem : TMemory;
signal Ard, Awr: std_logic_vector(Nbit-1 downto 0);
signal ce, q_thres : std_logic;
signal bufDO : std_logic_vector(2*BitSignal-1 downto 0);
signal bufI : std_logic_vector(BitSignal-1 downto 0);
begin
process (clk, Reset, rd)
begin
if clk'event and clk='1' then
bufI <= I; --просто регистр на входе
end if;
if Reset='1' then
Awr <= Conv_Std_Logic_Vector(0, Nbit); --если сброс то обнуляет счетчик адреса записи
q_thres <= '0';
else
if clk'event and clk='1' and ce='1' then
Awr <= Awr + 1;
if Awr=Conv_Std_Logic_Vector(N-1, Nbit) then
q_thres <='1';
end if;
end if;
end if;
ce <= not q_thres; --останавливаем запись когда заполниться память
full <= q_thres; --тут все и так понятно

if clk'event and clk='1' and q_thres='0' then
Mem(conv_integer(Awr))(BitSignal-1 downto 0) <= bufI; --собственно заполняем память
end if;
if Reset='1' then
Ard <= Conv_Std_Logic_Vector(0, Nbit); --при сбросе обнуляет счетчик адреса чтения
else
if rd'event and rd='1' then
Ard <= Ard + 2; --адреса преребираем через два т.к. шина PCI 32 разряда
end if;
end if;
if rd'event and rd='1' then
bufDO(15 downto 0) <= Mem(conv_integer(Ard)); --вынимаем из памяти два отсчета данных
bufDO(31 downto 16) <= Mem(conv_integer(Ard+1));
end if;
DO <= bufDO;
end process;
end Behavioral;
Go to the top of the page
 
+Quote Post
Maverick
сообщение Sep 17 2015, 09:02
Сообщение #11


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

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



Цитата(Anton1990 @ Sep 17 2015, 11:36) *
Ниже привожу полный текст модуля. Критикуйте. А лучше исправляйте. Подсказывайте.

entity MemSV_vhdl is
generic (Nbit : integer := 16;
N : integer := 65536;
BitSignal : integer := 16
);
Port ( I : in STD_LOGIC_VECTOR (BitSignal-1 downto 0);
clk : in STD_LOGIC;
reset : in STD_LOGIC;
rd : in STD_LOGIC;
DO : out STD_LOGIC_VECTOR (31 downto 0);
full : out STD_LOGIC);
end MemSV_vhdl;

architecture Behavioral of MemSV_vhdl is

type TMemory is array (0 to N-1) of std_logic_vector(BitSignal-1 downto 0);
signal Mem : TMemory;
signal Ard, Awr: std_logic_vector(Nbit-1 downto 0);
signal ce, q_thres : std_logic;
signal bufDO : std_logic_vector(2*BitSignal-1 downto 0);
signal bufI : std_logic_vector(BitSignal-1 downto 0);
begin
process (clk, Reset, rd)
begin
if clk'event and clk='1' then
bufI <= I; --просто регистр на входе
end if;
if Reset='1' then
Awr <= Conv_Std_Logic_Vector(0, Nbit); --если сброс то обнуляет счетчик адреса записи
q_thres <= '0';
else
if clk'event and clk='1' and ce='1' then
Awr <= Awr + 1;
if Awr=Conv_Std_Logic_Vector(N-1, Nbit) then
q_thres <='1';
end if;
end if;
end if;
ce <= not q_thres; --останавливаем запись когда заполниться память
full <= q_thres; --тут все и так понятно

if clk'event and clk='1' and q_thres='0' then
Mem(conv_integer(Awr))(BitSignal-1 downto 0) <= bufI; --собственно заполняем память
end if;
if Reset='1' then
Ard <= Conv_Std_Logic_Vector(0, Nbit); --при сбросе обнуляет счетчик адреса чтения
else
if rd'event and rd='1' then
Ard <= Ard + 2; --адреса преребираем через два т.к. шина PCI 32 разряда
end if;
end if;
if rd'event and rd='1' then
bufDO(15 downto 0) <= Mem(conv_integer(Ard)); --вынимаем из памяти два отсчета данных
bufDO(31 downto 16) <= Mem(conv_integer(Ard+1));
end if;
DO <= bufDO;
end process;
end Behavioral;



Описание желает лучшего...


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

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


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Anton1990 @ Sep 17 2015, 08:21) *
При использовании FIFO созданного в Coregeneratore результат значительно лучше (практически нет глюков).


Я для таких целей применяю библиотечный компонент Ксайлинкса. Он легко устанавливается в проект и он достаточно описан... Да и текста в проекте значительно меньше...
Про клоки в Вашем тексте все понятно, а вот про rd'event не понятно... Что это? Это частота или внешние сигналы? Для PCI Вы должны иметь их клоки и сигналы чтения. Так вот, сигналы чтения надо применить как "разрешение", а не как тактовые. Иначе и пойдут глюки...
Еще где-то надо учесть латентность...

А еще взять FIFO у которого с одной стороны 16 бит, а с другой 32... Это тоже очень просто...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Maverick
сообщение Sep 17 2015, 09:10
Сообщение #13


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

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



Цитата(iosifk @ Sep 17 2015, 12:06) *
Про клоки в Вашем тексте все понятно, а вот про rd'event не понятно... Что это? Это частота или внешние сигналы? Для PCI Вы должны иметь их клоки и сигналы чтения. Так вот, сигналы чтения надо применить как "разрешение", а не как тактовые. Иначе и пойдут глюки...
Еще где-то надо учесть латентность...

там кроме rd'event
есть еще
if clk'event and clk='1' and q_thres='0' then
if clk'event and clk='1' and ce='1' then

я понимаю что q_thres, се - сигналы разрешения, но нужно соблюдать правила...
Посмотрите как описывается триггер с сигналом разрешения и сбросом



--------------------
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, 09:21
Сообщение #14


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

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



Цитата(iosifk @ Sep 17 2015, 12:06) *
Я для таких целей применяю библиотечный компонент Ксайлинкса. Он легко устанавливается в проект и он достаточно описан... Да и текста в проекте значительно меньше...
Про клоки в Вашем тексте все понятно, а вот про rd'event не понятно... Что это? Это частота или внешние сигналы? Для PCI Вы должны иметь их клоки и сигналы чтения. Так вот, сигналы чтения надо применить как "разрешение", а не как тактовые. Иначе и пойдут глюки...
Еще где-то надо учесть латентность...

А еще взять FIFO у которого с одной стороны 16 бит, а с другой 32... Это тоже очень просто...


Ну с коркой фифо я уже говорил работает лучше. Хочу узнать свои проблемы. Сигнал Rd это клок - по преднему фронту данные выставляются на шину PCI. Как таковой клок шины я не использую.

Цитата(Maverick @ Sep 17 2015, 12:10) *
там кроме rd'event
есть еще
if clk'event and clk='1' and q_thres='0' then
if clk'event and clk='1' and ce='1' then

я понимаю что q_thres, се - сигналы разрешения, но нужно соблюдать правила...

из-за этого и спрашиваю что ТС описал или хотел описать


А что собственно в этих строчках ненравиться? О каких правилах речь?
Go to the top of the page
 
+Quote Post
Maverick
сообщение Sep 17 2015, 09:25
Сообщение #15


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

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



Цитата(Anton1990 @ Sep 17 2015, 12:21) *
А что собственно в этих строчках ненравиться? О каких правилах речь?

пример

Код
-- Following is the equivalent VHDL code for a 4-bit register with a positive-edge clock, asynchronous set and clock enable.
library ieee;  
use ieee.std_logic_1164.all;  

entity flop is  
  port(C, CE, PRE : in std_logic;  
        D : in  std_logic_vector (3 downto 0);  
        Q : out std_logic_vector (3 downto 0));  
end flop;
architecture archi of flop is  
  begin  
    process (C, PRE)  
      begin  
        if (PRE='1') then  
          Q <= "1111";  
        elsif (C'event and C='1')then  
          if (CE='1') then  
            Q <= D;  
          end if;  
        end if;  
    end process;  
end archi;


Вот здесь Вы найдете больше описаний простых элементов цифровой схемы

В Xilinx ISE есть Template Language - посмотрите еще туда...


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

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

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

 


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


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