|
Память на плис, реализация памяти на VHDL или Coregen |
|
|
|
Sep 17 2015, 05:41
|
Гуру
     
Группа: Свой
Сообщений: 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).
|
|
|
|
|
Sep 17 2015, 08:07
|
Частый гость
 
Группа: Участник
Сообщений: 155
Регистрация: 26-04-12
Пользователь №: 71 584

|
Цитата(Golikov A. @ Sep 17 2015, 09:52)  в том что скачиваться данные из памяти могут на одном клоке, а отправляться на другом. Среда следит чтобы данные выставляемые по переднему фронту первого клока, были валидны к следующему переднему фронту (констраины только на период), Но среда совершенно не следит чтобы они были валидны к фронту того клока по которому они отправляются. В случае фифо данные, наверняка забираются по фронту по которому отправляются и там среда опять следит. Но это все предположения, правду от нас скрывают  Еще раз. В память данные пишутся на 200 МГц. По заполнению запись ОСТАНАВЛИВАЕТСЯ. Далее по сигналу чтения из шины PCI данные медленно выбираются. Как только выбрал все, по программно формируемому сигналу сброса память снова начинает заполняться. Т.е. процесс записи и чтения во времени строго разделены, одновременного чтения и записи одного адреса НЕТ. Ошибки в логике построения записи-чтения нет. Ведь иной раз все работает нормально. Меняю что либо в другой части проекта, перекомпилирую и ВСЕ глюки и не работает. Цитата(Golikov A. @ Sep 17 2015, 09:52)  в том что скачиваться данные из памяти могут на одном клоке, а отправляться на другом. Среда следит чтобы данные выставляемые по переднему фронту первого клока, были валидны к следующему переднему фронту (констраины только на период), Но среда совершенно не следит чтобы они были валидны к фронту того клока по которому они отправляются. В случае фифо данные, наверняка забираются по фронту по которому отправляются и там среда опять следит. Но это все предположения, правду от нас скрывают  Высказывается много предположений почему не работает. Подскажите что делать чтоб работало.
|
|
|
|
|
Sep 17 2015, 08:22
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Еще раз. В память данные пишутся на 200 МГц как они из памяти читаются. Приведите кусок кода. Цитата Подскажите что делать чтоб работало. если правильно угадали почему не работает, то нужно описать констрейны и доделать междоменный переход
|
|
|
|
|
Sep 17 2015, 08:36
|
Частый гость
 
Группа: Участник
Сообщений: 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;
|
|
|
|
|
Sep 17 2015, 09:02
|

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

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Sep 17 2015, 09:21
|
Частый гость
 
Группа: Участник
Сообщений: 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, се - сигналы разрешения, но нужно соблюдать правила...
из-за этого и спрашиваю что ТС описал или хотел описать А что собственно в этих строчках ненравиться? О каких правилах речь?
|
|
|
|
|
Sep 17 2015, 09:25
|

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