[an error occurred while processing this directive]
Несколько вопросов по VHDL
(«Телесистемы»: Конференция «Языки описания аппаратуры (VHDL и др.))

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

Отправлено gen 20 октября 2005 г. 21:34

Имеются несколько описаний разных устройств, работающих по фронту, с синхронным сбросом и энейблом. Хотелось бы, чтобы устройства работали на двух меандрах, один – собственно на тактовый вход, другой - на энейбл, с частотой в два раза ниже и со сдвигом по фазе на пол периода, дабы обеспечивать высокий (разрешающий уровень) во время фронта тактовой частоты. Все вроде работает, но на малых частотах. Стоит только убрать энейбл и частота работы увеличивается в разы. Возможно, я где-то чего-то не так описываю, посему хотелось бы узнать, где я ошибаюсь.
-----------------------------------------------------------------
Пара сдвиговых регистров:
entity reg is
generic (
A_Size : integer := 17;
B_SiZe : integer := 14
);
port (
RESET : in std_logic;
CLOCK : in std_logic;
ENA : in std_logic;
LOAD : in std_logic;
A : in std_logic_vector(A_Size + B_Size - 1 downto 0);
B : in std_logic_vector(B_Size - 1 downto 0);
A_RES : out std_Logic_vector(A_Size + B_Size - 1 downto 0);
B_RES : out std_logic_vector(B_Size - 1 downto 0)
);
end reg;
architecture rtl of reg is
begin
process(CLOCK)
begin
if rising_edge(CLOCK) then
if RESET = '1' then
A_RES <= (others => '0');
B_RES <= (others => '0');
elsif ENA = '1' then
if LOAD = '1' then
A_RES <= A;
B_RES <= B;
else
A_RES <= A(A_Size + B_Size - 2 downto 0) & '0';
B_RES <= '0' & B(B_Size - 1 downto 1);
end if;
end if;
end if;
end process;
end rtl;
---------------------------------------------------------------------
ргеистр типа мастер-слэйв:
entity regout is
generic(
size : integer := 31
);
port(
reset, clock, ena: in std_logic;
input : in std_logic_vector(size - 1 downto 0);
output : out std_logic_vector(size - 1 downto 0)
);
end regout;
architecture rtl of regout is
signal s : std_logic_vector(size - 1 downto 0);
begin
process(reset, clock, input)
begin
if falling_edge(clock) then
if reset = '1' then
s <= (others => '0');
elsif ena = '1' then
s <= input;
else
s <= s;
end if;

elsif rising_edge(clock) then
if reset = '1' then
output <= (others => '0');
else
output <= s;
end if;
end if;
end process;
end rtl;
-------------------------------------------------------------------------------
Сумматор-субратор
entity adder is
generic (
A_Size : integer := 17;
B_Size : integer := 14
);
port (
RESET : in std_logic;
CLOCK : in std_logic;
ENA : in std_logic;
LOAD : in std_logic;
ADDER_CE : in std_logic;
SUB_CE : in std_logic;
A : in std_logic_vector(A_Size + B_Size - 1 downto 0);
B : in std_logic_vector(A_Size + B_Size - 1 downto 0);
ADDER : out std_logic_vector(A_Size + B_Size - 1 downto 0)
);
end adder;
architecture rtl of adder is
signal ADD : std_logic_vector(A_Size + B_Size - 1 downto 0);
begin

process(CLOCK, RESET, ENA)
begin
if rising_edge(CLOCK) then
if RESET = '1' then
ADD <= (others => '0');
elsif ENA = '1' then
if LOAD = '1' then
ADD <= (others => '0');
elsif ADDER_CE = '1' then
ADD <= A + B;
elsif SUB_CE = '1' then
ADD <= B - A;
elsif (ADDER_CE = '0')or(SUB_CE = '0') then
ADD <= B;
end if;
end if;
end if;
end process;
ADDER <= ADD;
end rtl;

И еще один маленький вопрос - что правильно вставлят в список чувствительности процесса, какие сигналы? Хотя бы на моих примерах.

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

Ответы


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

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

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

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

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


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

E-mail: info@telesys.ru