Moore型状态机设计代码分析
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SCHK IS
PORT(DIN,CLK,RST:IN STD_LOGIC;
SOUT:OUT STD_LOGIC);
END SCHK;
ARCHITECTURE BEHAV OF SCHK IS
TYPE SATES IS(S0,S1,S2,S3,S4,S5,S6,S7,S8);
SIGNAL ST,NST:STATES :=0;
BEGIN
COM: PROCESS(ST,DIN) BEGIN
CASE ST IS --11010011
WHEN S0=>IF DIN='1' THEN NST<=S1;ELSE NST<=S0;END IF;
WHEN S1=>IF DIN='1' THEN NST<=S2;ELSE NST<=S0;END IF;
WHEN S2=>IF DIN='0' THEN NST<=S3;ELSE NST<=S0;END IF;
WHEN S3=>IF DIN='1' THEN NST<=S4;ELSE NST<=S0;END IF;
WHEN S4=>IF DIN='0' THEN NST<=S5;ELSE NST<=S0;END IF;
WHEN S5=>IF DIN='0' THEN NST<=S6;ELSE NST<=S0;END IF;
WHEN S6=>IF DIN='1' THEN NST<=S7;ELSE NST<=S0;END IF;
WHEN S7=>IF DIN='1' THEN NST<=S8;ELSE NST<=S0;END IF;
WHEN S8=>IF DIN='0' THEN NST<=S3;ELSE NST<=S0;END IF;
WHEN OTHERS=>NST<=S0;
END CASES;
REG:PROCESS(CLK,RST) BEGIN
IF RST='1'THEN ST<=S0;
ELSIF CLK'EVENT AND CLK='1 THEN ST<=NST; END IF;
END PROCESS REG;
SOUT<='1'WHEN ST=S8 ELSE '0';
END BEHAV;
这个代码的工作是对8位序列数“11010011”序列的检测,当着一串序列数高位在前(左移)串行进入检测器后,若此数与预置的“密码”数相同,则输出1,否则输出0。
实验步骤:
-
画状态图
-
编辑SCHK.VHD文件
-
创建工程FILe->New Project Wizard
-
全程综合和编译Processing -> Start Complication
-
仿真测试Processing -> Start Simulation,给出仿真波形
-
使用状态机观察器观察序列检测状态机的状态图
分析代码:
代码分为两部分:实体和结构体。
实体的 port map 定义端口:DIN,CLK,RST 串行输入数据位 / 工作时钟 / 复位信号
SOUT 检测结果输出
结构体,首先用户自定义枚举型数据类型,8位序列数一共定义了9个状态,因为Moore型是异步输出状态机。
结构体内包含组合进程和时序进程。
组合进程:
9种情况:
当S0的输出值是1时,S1赋给次态,否则,S0赋给次态
当S1的输出值是1时,S2赋给次态,否则,S0赋给次态
当S1的输出值是0时,S3赋给次态,否则,S0赋给次态
当S1的输出值是1时,S4赋给次态,否则,S0赋给次态
当S1的输出值是0时,S5赋给次态,否则,S0赋给次态
当S1的输出值是0时,S6赋给次态,否则,S0赋给次态
当S1的输出值是1时,S7赋给次态,否则,S0赋给次态
当S1的输出值是1时,S8赋给次态,否则,S0赋给次态
当S1的输出值是0时,S3赋给次态,否则,S0赋给次态
其他情况:次态变成S0
时序进程:
当RST=‘1’时,复位
当RST=‘0’时,在上升沿时刻,次态的值赋给现态
当现态为S8时,SOUT输出8否则输出0。
主要内容还是状态图,根据状态图编辑VHD文件。
- 点赞
- 收藏
- 关注作者
评论(0)