Полная версия этой страницы:
Не работает конечный автомат!
LeshiySoft
Jan 22 2006, 22:19
Вот написал автоматик:
mashine:process(clk)
type TSS is (s0,s1,s2,s3,s4,s5,s6,s7,s8);
variable SS:TSS:=s0;
begin
if clk='1' and clk'event then
case SS is
when s0=> SS:=s1;
when s1=> SS:=s2;
when s2=> SS:=s3;
when s3=> SS:=s4;
when s4=> SS:=s5;
when s5=> SS:=s6;
when s6=> SS:=s7;
when s7=> SS:=s8;
when s8=> SS:=s1;
end case;
end if;
if SS=s8 then clk_out<='1'; else clk_out<='0'; end if;
end process;
А Quartus мне и говорит:
Warning: Can't display state machine states -- register holding state machine bit "|InBuffer|\mashine:SS.s0" was synthesized away
В симуляции на clk_out вечный false, что за беда такая, может кто знает?
Цитата(LeshiySoft @ Jan 22 2006, 17:19)

Вот написал автоматик:
mashine:process(clk)
type TSS is (s0,s1,s2,s3,s4,s5,s6,s7,s8);
variable SS:TSS:=s0;
begin
if clk='1' and clk'event then
case SS is
when s0=> SS:=s1;
when s1=> SS:=s2;
when s2=> SS:=s3;
when s3=> SS:=s4;
when s4=> SS:=s5;
when s5=> SS:=s6;
when s6=> SS:=s7;
when s7=> SS:=s8;
when s8=> SS:=s1;
end case;
end if;
if SS=s8 then clk_out<='1'; else clk_out<='0'; end if;
end process;
А Quartus мне и говорит:
Warning: Can't display state machine states -- register holding state machine bit "|InBuffer|\mashine:SS.s0" was synthesized away
В симуляции на clk_out вечный false, что за беда такая, может кто знает?
Проблема в том, что так КА не пишут !!!!!!!!! используйте двух процессное описание с сигналом сброса КА. скачайте XST.pdf в разделе №3 там прекрасно написанно как правильно писать КА.
Желаю удачи
v_mirgorodsky
Jan 23 2006, 08:32
Добавлением Reset'а должно полечиться. У вас машина ходит по циклу s1-s8, выходя из s0 только в самый первый момент времени. В то же время Quartus очень плохо относится к начальной инициализации переменных, потому и выбргосил состояние s0, а все остальное оставил в соответствии с кодом. Короче, или добавьте s0 в цикл или добавьте синхронный или ассинхронный Reset.
Postoroniy_V
Jan 23 2006, 08:42
1 не туда вставлен
if SS=s8 then clk_out<='1'; else clk_out<='0'; end if;
2 нет сброса - что не есть гуд
Итого имеем:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity state is
port(
clk : in STD_LOGIC;
reset : in STD_LOGIC;
clk_out : out STD_LOGIC
);
end state;
--}} End of automatically maintained section
architecture state of state is
begin
mashine:process(clk,reset)
type TSS is (s0,s1,s2,s3,s4,s5,s6,s7,s8);
variable SS:TSS:=s0;
begin
if(reset='1') then
SS:=s0;
elsif clk='1' and clk'event then
if SS=s8 then
clk_out<='1';
else
clk_out<='0';
end if;
case SS is
when s0=> SS:=s1;
when s1=> SS:=s2;
when s2=> SS:=s3;
when s3=> SS:=s4;
when s4=> SS:=s5;
when s5=> SS:=s6;
when s6=> SS:=s7;
when s7=> SS:=s8;
when s8=> SS:=s1;
when others=>SS:=s0;
end case;
end if;
end process;
-- enter your statements here --
end state;
iosifk
Jan 23 2006, 08:42
Цитата(LeshiySoft @ Jan 23 2006, 01:19)

Вот написал автоматик:
xxxx
А Quartus мне и говорит:xxxx
В симуляции на clk_out вечный false, что за беда такая, может кто знает?
Специально для ленивого, которому лень поискать.
Там у них на сайте еще можно взять.
Удачи!
v_mirgorodsky
Jan 23 2006, 08:45
Цитата(des00 @ Jan 23 2006, 10:28)

Проблема в том, что так КА не пишут !!!!!!!!! используйте двух процессное описание с сигналом сброса КА. скачайте XST.pdf в разделе №3 там прекрасно написанно как правильно писать КА.
Желаю удачи
Ну не был бы я так категоричен в данном вопросе

Пишут так КА

Это называется полностью синхронный КА с регистровыми выходами. Несколько извращенный способ написания, но любители используют. К особенностям относится некоторая тормознутость реакции - 2 такта на реакцию на внешнее воздействие и полная синхронность выходов. Это все равно как в двухпроцессном описании поставить по регистру на каждый выход КА.
Цитата(v_mirgorodsky @ Jan 23 2006, 03:45)

Несколько извращенный способ написания, но любители используют. К особенностям относится некоторая тормознутость реакции - 2 такта на реакцию на внешнее воздействие и полная синхронность выходов. Это все равно как в двухпроцессном описании поставить по регистру на каждый выход КА.
Хмм, вот именно что извращенный, поэтому и глючный, когда состояний больше 10-15
2 такта на реакцию, это в зависимости от того МУР это или Мили. (выход по состоянию или по переходу).
Но у автора КА без входов, поэтому ему монописуально, хотя ИХМО лучше ВАН ХОТ и асинхроный выход (который в данном контексте будет синхронным)
может счетчик поставить?
Postoroniy_V
Jan 23 2006, 11:59
Цитата(vikk @ Jan 23 2006, 14:26)

может счетчик поставить?

угу или сдвиговый регистр
LeshiySoft
Feb 1 2006, 22:15
Postoroniy_V, огромное человечское спасибо, что не поленился и все отлично с примером объяснил. Сделал так как ты писал - работает. А по поводу счетчика и сдвигового регистра согласен, но мне хотелось узнать о создании конечного автома на VHDL вообще а не для данного примера. В AHDL все было как-то проще и конкретно:
TSS.reset = reset;
TSS.clk = clk;
и всего делов ясно понятно и просто, хотя это наверное дело привычки!
Postoroniy_V
Feb 2 2006, 08:20
Цитата(LeshiySoft @ Feb 2 2006, 01:15)

Postoroniy_V, огромное человечское спасибо, что не поленился и все отлично с примером объяснил. Сделал так как ты писал - работает. А по поводу счетчика и сдвигового регистра согласен, но мне хотелось узнать о создании конечного автома на VHDL вообще а не для данного примера. В AHDL все было как-то проще и конкретно:
TSS.reset = reset;
TSS.clk = clk;
и всего делов ясно понятно и просто, хотя это наверное дело привычки!
обращайтесь тогда с вопросом о книгах о VHDL
на фтп такие книги есть
nand_gates
Feb 2 2006, 09:44
Checkout this one!!!
This will work without reset!
library ieee;
use ieee.std_logic_1164.all;
entity shift_reg is
port (
clk_out : out bit;
clk : in bit);
end shift_reg;
architecture behave of shift_reg is
signal SS : bit_vector(8 downto 0) :=0;
signal SS_nx : bit_vector(8 downto 0) :=0;
begin
clk_out <= SS(8);
process
begin
wait until (clk'event and clk = '1');
SS <= SS_nx;
end process;
process(SS)
begin
SS_nx(0) <= not (SS(0) or SS(1) or SS(2) or SS(3) or SS(4) or SS(5) or SS(6) or SS(7) or SS(8));
SS_nx(1) <= not SS(1) and SS(0);
SS_nx(2) <= not SS(2) and SS(1);
SS_nx(3) <= not SS(3) and SS(2);
SS_nx(4) <= not SS(4) and SS(3);
SS_nx(5) <= not SS(5) and SS(4);
SS_nx(6) <= not SS(6) and SS(5);
SS_nx(7) <= not SS(7) and SS(6);
SS_nx(8) <= not SS(8) and SS(7);
end process;
end behave;
Люди добрые, чего вы паритесь?!
Ставим ActiveHDL и имеем щастье. Там есть превосходный графический редактор стейт-машин (ага, с зелеными кружочками и стрелочками). А потом он генерирует VHDL - исходник для нарисованной машины. Причем способ кодирования можно задать от ван-хот до Грэя. Внимательно изучаем полученный код - он 100% рабочий.
А вот уже через пол-года начнем и свои машины руками писать. Самое смешное, что они тоже начнут работать...
А при отладке-то!!!! Оно показывает на диаграмме с зелеными кружочками-состояниями текущее активное состояние!!!
Всем рекомендую.
А то устроили, понимаешь, балаган... А потом ракеты до Марса не...
Postoroniy_V
Feb 9 2006, 08:58
Цитата(Gorby @ Feb 8 2006, 15:37)

Люди добрые, чего вы паритесь?!
Ставим ActiveHDL и имеем щастье. Там есть превосходный графический редактор стейт-машин (ага, с зелеными кружочками и стрелочками). А потом он генерирует VHDL - исходник для нарисованной машины. Причем способ кодирования можно задать от ван-хот до Грэя. Внимательно изучаем полученный код - он 100% рабочий.
А вот уже через пол-года начнем и свои машины руками писать. Самое смешное, что они тоже начнут работать...
А при отладке-то!!!! Оно показывает на диаграмме с зелеными кружочками-состояниями текущее активное состояние!!!
Всем рекомендую.
А то устроили, понимаешь, балаган... А потом ракеты до Марса не...
Уважаемый, а вы прочитали весь тред? причем тут ActiveHDL?
был разве вопрос про него(ActiveHDL )?
Я совершенно согласен с Gorby - писать вручную стэйт-машины неразумно, разве только в образовательных целях. Попробуйте-ка написать sm на полсотни состояний, а потом вернутся к ней через месяц для редизайна - фиг разберетесь.
Я использую менторовский hdldesigner (не только для sm, а как интегратор проектов) - рекомендую.
Цитата(Gate @ Feb 9 2006, 10:23)

Я совершенно согласен с Gorby - писать вручную стэйт-машины неразумно, разве только в образовательных целях. Попробуйте-ка написать sm на полсотни состояний, а потом вернутся к ней через месяц для редизайна - фиг разберетесь.
Я использую менторовский hdldesigner (не только для sm, а как интегратор проектов) - рекомендую.
Хммм вы думаете что нарисовать стейт машину на 100 состояний легче ??
да еще и все переходы описать ?
Postoroniy_V
Feb 10 2006, 07:40
Цитата(Gate @ Feb 9 2006, 18:23)

Я совершенно согласен с Gorby - писать вручную стэйт-машины неразумно, разве только в образовательных целях. Попробуйте-ка написать sm на полсотни состояний, а потом вернутся к ней через месяц для редизайна - фиг разберетесь.
Я использую менторовский hdldesigner (не только для sm, а как интегратор проектов) - рекомендую.
равносильно сравнению - "как лучше вводить проект? схемный ввод или HDL?"
хочется рисовать? да ради бога! 50 состояний нарисовать - это не хухры мухры
а "вручную" ввести(нерисовать) куда проще, я так думаю.
Vjacheslav
Feb 10 2006, 08:30
Цитата(Gate @ Feb 9 2006, 18:23)

Я совершенно согласен с Gorby - писать вручную стэйт-машины неразумно, разве только в образовательных целях. Попробуйте-ка написать sm на полсотни состояний, а потом вернутся к ней через месяц для редизайна - фиг разберетесь.
Я использую менторовский hdldesigner (не только для sm, а как интегратор проектов) - рекомендую.
Да, Gorby дал правильный совет, но к сожалению не пояснил (придется сделать мне): в результате создания автомата в графическом виде (в Active_HDL) Вы получаете очень грамотный VHDL-код. Смотрите на него и изучаете как надо писать. Как показала практика это самый быстрый способ для понимания\написания автомата на VHDL вручную. Про остальные преимущества я уж писать не буду.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.