Вопрос: Машина состояний на VHDL с Generic параметром

Отмазка: проходим в институте VHDL(а именно его применение для плис в Quartus II), тема «умножение\деление N разрядных»

есть вот такая радость, например:
STATE: PROCESS (CLK, RST)
BEGIN
	IF RST = '1' THEN
		ST<=FINISH;
	ELSIF CLK = '1' AND CLK'EVENT THEN
	CASE ST IS
	WHEN S1 => ST<= S2;
	WHEN S2 => ST<= S3;  
	WHEN S3 => ST<= S4;
	WHEN S4 => ST<= S5;
	WHEN S5 => ST<= FINISH;
	WHEN FINISH => IF START='1' THEN ST<= S1;
					ELSE ST<=FINISH; END IF;
	END CASE;
	END IF;
END PROCESS;
используется для управляющего автомата при делении\умножения N разрядных чисел на плисине.
можно ли сюда прикрутить generic, чтобы можно было изменять только N и не править управляющий автомат. Если можно то как и что по теме почитать?

про вариант со счетчиком знаю, не то. вопрос стоит именно в масштабируемой машине состояний Start-1-2-..-N-Finish
  • 0
  • 05 ноября 2011, 17:01
  • NCCat

Комментарии (11)

RSS свернуть / развернуть
В верилоге можно цикл прикрутить.
Тут нельзя также?
0
Этот цикл будет синтезирован в счетчик, что несколько не то. нужен либо код Грея, либо унифицированный(емнип так называется, когда 1 = 0001, 2 = 0010, 3 = 0100 etc). Иначе на 200+ MHZ оно просто будет тупить при переходе от 011111 к 100000 состояниям.
Ну и при отладке удобнее видеть на диаграмме ST.Sx или еще что вместо циферок счетчика.
Ну и плюс блок с автоматом состояний вынесен наружу умножителя\делителя.
0
В верилоге циклы имеют другой смысл.
Написать вот это:
parameter n = 3
integer i;
for (i = 0; i < n; i = i + 1)
case (st)
i: st <= i + 1
endcase;
эквивалентно вот этому:
case (st)
0: st <= 1;
1: st <= 2;
2: st <= 3;
endcase;
0
Буду знать, verilog в глаза не видел
0
В VHDL это оператор Generate. Так что смысл один и тот же, просто не надо путать параллельные операторы и последовательные.
Вот как будет выглядеть пример на VHDL:

G1: for i in 0 to N generate
st <= i+1;
end G1;
0
накосячил надо st(i) вместо st
0
Упс, у себя накосячил.
правильно так:
parameter n = 3
integer i;
case (st)
for (i = 0; i < n; i = i + 1)
i: st <= i + 1;
endcase
0
А про код Грея спасибо ))) Единственное применение для него, которое я знал — это энкодеры.
Это реально классно, применять его для задания кода состояния.
У меня данная тематика(ПЛИС) пойдет на следующем курсе только. Пока сам потихоньку курю
0
Первое что на ум пришло, только вроде ресурсов будет хавать тучу
entity T is
generic( N : integer := 5);
port( RST, CLK : out bit);
end T;

architecture A_T of T is
signal S,S1 : bit_vector(N downto 0);
begin
STATE: PROCESS (CLK, RST)
BEGIN
        IF RST = '1' THEN
                S<=(others => '1');
        ELSIF CLK = '1' AND CLK'EVENT THEN
        if S = (others => '1') then
		  S <= S+1;
		  else
		  IF START='1' THEN S<= (others =>'0');end if;
        END IF;
		  end if;
END PROCESS;
end A_T;
0
Забыл только равно в это строке
if S = (others => '1') then
на неравно поправить
if S /= (others => '1') then
0
Можно еще так, только ручками надо дописывать тип, т.е. сколько надо состояний, столько перечислить. Он может и такой вариант на счетчике синтезировать, посмотри. Если не трудно кинь картинку синтезированной схемы.
package My is
type state is (ST1,ST2,ST3,ST4,ST5);
end My;

Library work;
use work.My.all;

entity T2 is
port(	RST, CLK, START : in bit;
		State_out : out state);
end T2;

architecture A_T2 of T2 is
signal S: state;
begin
STATE_P: PROCESS (CLK, RST)
BEGIN
        IF RST = '1' THEN
                S <= state'right;
        ELSIF CLK = '1' AND CLK'EVENT THEN
        if S /= state'right then
		  S <= state'val(state'pos(S)+1);
		  else
		  IF START='1' THEN S<= state'left;end if;
        END IF;
		  end if;
END PROCESS;
state_out <= s;
end A_T2;
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.