Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Люди, помогите разобраться с VHDL...

Отправлено GW 20 августа 2009, г. 18:38


До этого, если и приходилось иметь дело с ПЛИС, то только на уровне схемного редактора. Решил освоить более прогрессивный метод и на простейшей задаче встал в тупик. Видимо, чего-то не понимаю в самой идеологии VHDL.
Берем простейшую задачу: при подаче на вход А положительного фронта (допустим, уже синхронизированного с клоком) сформировать некую последовательность импульсов на выходах В и С . Само формирование последовательности проблем не вызывает, написал простейший автомат и все заработало.

entity automat is
Port ( clk : in STD_LOGIC;
A : in STD_LOGIC;
BC : out STD_LOGIC_VECTOR (1 downto 0));
end automat;

architecture Behavioral of automat is

type TState is (s1,s2,s3);
signal state,next_state:TState;

begin

process(state)
begin
case state is
when s1 =>
next_state <= s2;
BC <= "00";

when s2 =>
next_state <= s3;
BC <= "01";
when s3 =>
next_state <= s1;
BC <= "10";
end case;
end process;

state <= next_state when clk'event and clk = '0';
end Behavioral;

А вот как заставить этот автомат формировать последовательность однократно по приходу фронта на А?
Если переход из состояния 1 в 2 сделать по условию прихода фронта, то компилятор ругается «Signal next_state cannot be synthesized, bad synchronous description.»

process(state,А)
begin
case state is
when s1 =>
if(A'event and A='1') then
next_state <= s2;
end if;
BC <= "00";
….

Второй путь, который приходит в голову – не зацикливать автомат, пусть он остается в состоянии 3, но сбрасывать его по фронту А в начальное состояние. Но и это не проходит, поскольку сбрасывать придется в другом процессе, а это «multi source».


begin

process(А)
begin
if(А'event and А = '1') then
state <= s1;
end if;
end process;


state <= next_state when clk'event and clk = '0';
end Behavioral;

Понимаю, что мыслю как-то совсем не туда, объясните, куда надо?


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 85:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru