2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Есть небольшой вопрос по VHDL
Сообщение16.11.2014, 17:47 
Аватара пользователя
Имеется такой код:

commut: process(c)
begin
if (rising_edge(c)) then
for i in 0 to 5 loop
case i is
when 0 =>
commutator0 <= din;
when 1 =>
commutator1 <= din;
when 2 =>
commutator2 <= din;
when 3 =>
commutator3 <= din;
when 4 =>
commutator4 <= din;
when 5 =>
commutator5 <= din;
when others => null;
end case;
end loop;
end if;
end process commut;


Правильно ли я понимаю происходящее: по приходу переднего фронта тактового сигнала запускается счетчик, по которому выполняются некие действия. Счетчик пробегает 6 значений, после чего, по приходу нового переднего фронта,обнуляется и все начинается сначала.

С другой стороны, имеется такая версия:
commut: process(c)
variable i : integer := 0;
begin
if (rising_edge(c)) then
case i is
when 0 =>
commutator0 <= din;
when 1 =>
commutator1 <= din;
when 2 =>
commutator2 <= din;
when 3 =>
commutator3 <= din;
when 4 =>
commutator4 <= din;
when 5 =>
commutator5 <= din;
when others => null;
end case;
if ( i < 6 ) then
i := i + 1;
else i := 0;
end if;
end if;
end process commut;


Предполагается, что в такой интерпретации по приходу переднего фронта тактового сигнала будет выполняться действие из case, соответствующее номером значению i. После чего i будет увеличиваться на 1, а в случае превышения значения i 6, i будет обнуляться и отсчет будет начат заново. Это так?

Кратко о задаче: требуется написать полифазный фильтр - дециматор. Данный блок должен осуществлять коммутацию, то есть, переключение между субфильтрами каждый такт.

 
 
 
 Re: Есть небольшой вопрос по VHDL
Сообщение16.11.2014, 19:45 
Первый код эквивалентен

Код:
commut: process(c)
begin
if (rising_edge(c)) then
commutator0 <= din;
commutator1 <= din;
commutator2 <= din;
commutator3 <= din;
commutator4 <= din;
commutator5 <= din;
end if;
end process commut;

Т. е. все сигналы присваиваются по восходящему фронту. Во втором случае по восходящему фронту присваивается только один очередной сигнал в цикле

 
 
 
 Re: Есть небольшой вопрос по VHDL
Сообщение16.11.2014, 19:49 
Аватара пользователя
spctr в сообщении #931950 писал(а):
Т. е. все сигналы присваиваются по восходящему фронту. Во втором случае по восходящему фронту присваивается только один очередной сигнал в цикле

Правильно ли я понимаю,что во втором случае это работает так: приходит восходящий фронт, сигналу commutator0 присваивается значение din, i+1. Затем следует очередной восходящий фронт, сигналу commutator1 присваивается значение din, i+1,и так далее, пока i не станет равным 5. После этого, i обнуляется и отсчет начинается заново.

 
 
 
 Re: Есть небольшой вопрос по VHDL
Сообщение16.11.2014, 20:01 
geezer в сообщении #931951 писал(а):
Правильно ли я понимаю,что во втором случае это работает так: приходит восходящий фронт, сигналу commutator0 присваивается значение din, i+1. Затем следует очередной восходящий фронт, сигналу commutator1 присваивается значение din, i+1,и так далее, пока i не станет равным 5. После этого, i обнуляется и отсчет начинается заново.


Да.

 
 
 
 Re: Есть небольшой вопрос по VHDL
Сообщение16.11.2014, 20:02 
Аватара пользователя
spctr в сообщении #931959 писал(а):
Да.

Благодарю, очень выручили.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group