软件:Quartus
语言:VHDL
代码功能:
计数状态机
1.功能描述
内容:状态机有三个状态,IDLE,S1和S2。在IDLE状态如果en=1,则跳到S1状态,否则保持不变;在S1状态时,统计en=1的次数,如果达到5次,则跳到S2状态,否则保持不变;在S2状态,统计en=1的次数,如果达到7次,则跳回到DLE状态,否则保持不变。(注:全部信号都是同步信号,即与时钟同步)(en可以是单周期脉冲,也可是多周期脉冲。
2.信号列表
ck:50MHz的工作时钟,输入。
en:1位,输入,状态转换信号,高电平有效。
state current:2位,输出,当前状态机的值。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. 仿真图
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY statemachine IS PORT ( clk : IN STD_LOGIC;--时钟 rst_n : IN STD_LOGIC;--复位 en : IN STD_LOGIC;--输入 state_current : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)--状态值 ); END statemachine; ARCHITECTURE behave OF statemachine IS constant IDLE : STD_LOGIC_VECTOR(1 DOWNTO 0):="00"; -- IDLE constant S1 : STD_LOGIC_VECTOR(1 DOWNTO 0):="01"; --S1 constant S2 : STD_LOGIC_VECTOR(1 DOWNTO 0):="10"; --S2 SIGNAL state : STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL en_cnt : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000"; BEGIN --en计数 PROCESS (clk, rst_n) BEGIN IF (rst_n = '0') THEN en_cnt <= "0000";--复位 ELSIF (clk'EVENT AND clk = '1') THEN IF (state = S1) THEN--S1状态计数 IF (en_cnt >= "0101") THEN--计数到5 en_cnt <= "0000"; ELSIF(en='1')THEN en_cnt <= en_cnt + "0001";--计数 END IF; ELSIF (state = S2) THEN--S2状态计数 IF (en_cnt >= "0111") THEN--计数到7 en_cnt <= "0000"; ELSIF(en='1')THEN en_cnt <= en_cnt + "0001";--计数 END IF; ELSE en_cnt <= "0000";--清零 END IF; END IF; END PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1002
阅读全文
797