关于状态机的一点疑问
时间:10-02
整理:3721RD
点击:
process(clk,state,flag1,flag2,...)
begin
if clk'event and clk='1' then
case state is
when 00 =>
if flag1='0' then
...
else
...
end if;
when 01 =>
...
when 10 =>
...
when others
...
end case;
end if;
end process;
为何此状态机的运行一定要有时钟clk的约束?而如下的程序则不能运行?
process(state,flag1,flag2,...)
begin
case state is
when 00 =>
if flag1='0' then
...
else
...
end if;
when 01 =>
...
when 10 =>
...
when others
...
end case;
end process;
begin
if clk'event and clk='1' then
case state is
when 00 =>
if flag1='0' then
...
else
...
end if;
when 01 =>
...
when 10 =>
...
when others
...
end case;
end if;
end process;
为何此状态机的运行一定要有时钟clk的约束?而如下的程序则不能运行?
process(state,flag1,flag2,...)
begin
case state is
when 00 =>
if flag1='0' then
...
else
...
end if;
when 01 =>
...
when 10 =>
...
when others
...
end case;
end process;
两个程序都能运行,前面一个是采用时序逻辑,也就是状态机的状态执行输出都是寄存器输出,后一个采用的组合逻辑的方式,输出都是组合逻辑输出。
采用组合逻辑还是时序逻辑,看设计需要了,这个不一定的.如果状态机执行的输出还要做其它信号的输入,而对速度又有一定要求的话,最好就用时序逻辑的
您的意思是,后面一个程序的组合逻辑输出状态不寄存吗?我觉得后一个程序的执行速率为FPGA的系统频率,应该比clk更快呀。
对啊,你可以自己综合一下,后面一个是组合逻辑的输出,并不是说组合逻辑的输出就一定降低系统速度,看在什么情况下.
状态机是通过使用寄存器和触发器实现的。而触发器和寄存器的启动需要时钟上升沿或下降沿来触发。所以舒服一定要加一个时钟信号。
根据需要来吧,这个问题其实和状态机关系不大,主要是时序逻辑和组合逻辑的区别,第二种写法我不知道有没有语法错误,好像没这样写过。
