名称:计数状态机设计VHDL代码Quartus仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
计数状态机
1功能描述
内容:状态机有三个状态,IDLE,S1和S2。在IDLE状态如果en=1,则跳到S1状态,否则保持不变;在S1状态时,统计en=1的次数,如果达到5次,则跳到S2状态,否则保持不变;在S2状态,统计en=1的次数,如果达到7次,则跳回到IDLE状态,否则保持不变。(注:全部信号都是同步信号,即与时钟同步)(en可以是单周期脉冲,也可是多周期脉冲)
2信号列表
clk:50MHz的工作时钟,输入
rstn:系统复位信号,输入,低电平有效。
en:1位,输入,状态转换信号,高电平有效
state current:2位,输出,当前状态机的值。
1. 工程文件
2. 程序文件
3. 程序编译
4. 仿真图
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --计数状态机设计 ENTITY FSM IS PORT ( clk,rst_n: IN STD_LOGIC;--时钟,复位 en: IN STD_LOGIC;--输入 state_current : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)--状态值 ); END FSM; ARCHITECTURE RTL OF FSM IS --定义状态机 SIGNAL c_state : STD_LOGIC_VECTOR(1 DOWNTO 0):="00";--定义当前状态 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 count : STD_LOGIC_VECTOR(2 DOWNTO 0):="000";--en计数次数 BEGIN --状态机控制--状态转移 PROCESS (clk, rst_n) BEGIN IF (rst_n = '0') THEN c_state <= IDLE;--复位 ELSIF (clk'EVENT AND clk = '1') THEN CASE c_state IS WHEN IDLE =>--IDLE状态 IF (en = '1') THEN c_state <= S1;--跳转 ELSE c_state <= IDLE;--保持 END IF; WHEN S1 =>--S1状态 IF (count = "101") THEN--计数5次,跳转 c_state <= S2;--跳转 ELSE c_state <= S1;--保持 END IF; WHEN S2 =>--S2状态 IF (count = "111") THEN--计数7次,跳转 c_state <= IDLE;--跳转 ELSE c_state <= S2;--保持 END IF; WHEN OTHERS => c_state <= IDLE;--初始状态 END CASE; end IF; END PROCESS;
源代码
点击下方的公众号卡片获取