Вопрос: Машина состояний на VHDL с Generic параметром
Отмазка: проходим в институте VHDL(а именно его применение для плис в Quartus II), тема «умножение\деление N разрядных»
есть вот такая радость, например:
можно ли сюда прикрутить generic, чтобы можно было изменять только N и не править управляющий автомат. Если можно то как и что по теме почитать?
про вариант со счетчиком знаю, не то. вопрос стоит именно в масштабируемой машине состояний Start-1-2-..-N-Finish
есть вот такая радость, например:
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
Этот цикл будет синтезирован в счетчик, что несколько не то. нужен либо код Грея, либо унифицированный(емнип так называется, когда 1 = 0001, 2 = 0010, 3 = 0100 etc). Иначе на 200+ MHZ оно просто будет тупить при переходе от 011111 к 100000 состояниям.
Ну и при отладке удобнее видеть на диаграмме ST.Sx или еще что вместо циферок счетчика.
Ну и плюс блок с автоматом состояний вынесен наружу умножителя\делителя.
Ну и при отладке удобнее видеть на диаграмме ST.Sx или еще что вместо циферок счетчика.
Ну и плюс блок с автоматом состояний вынесен наружу умножителя\делителя.
В верилоге циклы имеют другой смысл.
Написать вот это:
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;
Написать вот это:
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;
- PPetrovich
- 06 ноября 2011, 00:24
- ↑
- ↓
Упс, у себя накосячил.
правильно так:
parameter n = 3
integer i;
case (st)
for (i = 0; i < n; i = i + 1)
i: st <= i + 1;
endcase
правильно так:
parameter n = 3
integer i;
case (st)
for (i = 0; i < n; i = i + 1)
i: st <= i + 1;
endcase
- PPetrovich
- 06 ноября 2011, 16:21
- ↑
- ↓
А про код Грея спасибо ))) Единственное применение для него, которое я знал — это энкодеры.
Это реально классно, применять его для задания кода состояния.
У меня данная тематика(ПЛИС) пойдет на следующем курсе только. Пока сам потихоньку курю
Это реально классно, применять его для задания кода состояния.
У меня данная тематика(ПЛИС) пойдет на следующем курсе только. Пока сам потихоньку курю
- PPetrovich
- 06 ноября 2011, 00:26
- ↑
- ↓
Первое что на ум пришло, только вроде ресурсов будет хавать тучу
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;
Можно еще так, только ручками надо дописывать тип, т.е. сколько надо состояний, столько перечислить. Он может и такой вариант на счетчике синтезировать, посмотри. Если не трудно кинь картинку синтезированной схемы.
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;
Комментарии (11)
RSS свернуть / развернуть