学了很久终于把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条评论)
登录后参与讨论