[an error occurred while processing this directive]
Latch or FlipFlop (VHDL)? (+)
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Question 15 июля 2004 г. 09:15

Сделал такой проект:

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.std_logic_unsigned.all;

entity fss_proba is
port(
Data : in std_logic_vector (7 downto 0);
Add : in std_logic_vector (2 downto 0);
Wr : in std_logic;
F56 : in std_logic;

FD : out std_logic_vector (15 downto 0);
FA : out std_logic_vector (9 downto 0);
WrFss : out std_logic;
TI : out std_logic;
IZP : out std_logic
);
end fss_proba;

architecture a of fss_proba is
signal Duration : std_logic_vector (15 downto 0);
signal Period : std_logic_vector (15 downto 0);
signal DataFss : std_logic_vector (15 downto 0);
signal AddFss : std_logic_vector (9 downto 0);
signal CntIZP : std_logic_vector (15 downto 0);
signal CntTI : std_logic_vector (20 downto 0);
signal EnaWrFss : std_logic;
signal EnaTI : std_logic;
signal EnaIZP : std_logic;
begin

process (Wr, Add, Data)
begin
if Wr = '1' then
case Add is
when "000" => Duration (15 downto 8) <= Data;
when "001" => Duration (7 downto 0) <= Data;
when "010" => Period (15 downto 8) <= Data;
when "011" => Period (7 downto 0) <= Data;
when "100" => DataFss (15 downto 8) <= Data;
when "101" => DataFss (7 downto 0) <= Data;
when "110" => AddFss (9 downto 2) <= Data;
when "111" => AddFss(1 downto 0) <= Data (7 downto 6);
EnaWrFss <= Data(5);
EnaTI <= Data(4);
EnaIZP <= Data(3);
end case;
end if;
end process;

process (F56)
begin
if (F56'event and F56 = '1') then
if (CntIZP = Duration) then
CntIZP <= Period;
else
CntIZP <= CntIZP-1;
end if;
end if;
end process;
IZP <= CntIZP(15) and EnaIZP;

process (F56)
begin
if (F56'event and F56 = '1') then
if CntTI = "111111111111011101000" then
CntTI <= "010001100011000011001";
else
CntTI <= CntTI - 1;
end if;
end if;
end process;
TI <= not((CntTI(20)) and EnaTI);

FD <= DataFss;
FA <= AddFss;
WrFss <= EnaWrFss;
end a;

Скомпилил. Все нормально. Начал смотреть времянку. Выходные сигналы все получались нарезанные, хотя с длительностями и периодами все нормально.

Заменил строку "if Wr = '1' then" на "if (Wr'event and Wr = '1') then" все стало на свои место. Никаких нарезок.

Кто с таким сталкивался? Вроде latch должна защелкнуться и держать уровень, а какие-то нарезки проходят.

И еще такой вопрос. Частота работы схемы должна быть 56МГц. Удалось достичь такого быстродействия только на м/с 6-ти нс (используется семейство MAX7000S; EPM7128SLC84-6).
На более низкочастотных м/с (-7, -10, -15) частоту не достиг. Думал может из-за заполненности кристалла не получается (при разводке в этой м/с заполнение 90%). Поменял м/с. Поставил с большим числом sell'ов (160, 256). Все-равно частота не достигается (только при градации микросхемы по частоте -6).

Разводку делал в Quartus'е v.3.0. Попробовал Quartus'е v.4.0 частота такая же. Хотя на AHDL можно было бы сделать быстрее на lpm-модуле 8-count (у некоторых коллег имеется опыт с этими модулями).
Не знает ли кто, как можно повысить быстродействие проекта?

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru