原创 学习Moore状态机

2010-11-16 15:26 2092 10 10 分类: FPGA/CPLD

学了很久终于把VHDL的语法过了一遍了,开始学习状态机


Moore状态机:在时钟cp的跳沿来到的时候,根据当前状态currentstate 和输入状态din,来确定输出dout状态和下一个状态nextcurrent


很重要的一点就是,定义状态类型 type state_m is [ s0,s1,......,sn],后面的currentstate和nextstate的判断就顺其自然了。


感觉就像C里面的判断全局标志位一样,是什么标志就执行什么操作,将读取输入状态和确定下一状态以及执行输出都看做是‘什么操作’。


哈哈,菜鸟又进步了一点


代码如下:


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


entity state is
port(
  cp,rd :in std_logic;
  din :in std_logic;
  dout :out std_logic_vector(1 downto 0)
 );
end state;
--*************
architecture bhv of state is
type state_m is (s0,s1,s2,s3);
signal currentstate :state_m;
signal nextstate :state_m;
begin
--*************
 p1:process(rd,cp)
 begin
  if rd='0' then
   currentstate<=s0;
  elsif cp'event and cp='1'then
   currentstate<=nextstate;
  end if;
end process p1;
--*************
p2:process(din,currentstate)
begin
 case currentstate is
  when s0=>
   if din='0'then
    nextstate <=s0;
   else
    nextstate <= s1;
   end if;
   dout <="00";
  when s1=>
   if din='0'then
    nextstate <=s0;
   else
    nextstate <= s2;
   end if;
   dout <="01";
  when s2=>
   if din='0'then
    nextstate <=s0;
   else
    nextstate <= s3;
   end if;
   dout <="10";
  when s3=>
   if din='0'then
    nextstate <=s0;
   else
    nextstate <= s0;
   end if;
   dout <="11";
 end case;
end process p2;
end bhv;

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条