当前位置:文档之家› 有限状态机设计

有限状态机设计

实验七有限状态机设计
一、实验目的
1、掌握利用有限状态机实现一般时序逻辑分析的方法;
2、掌握用VHDL或Verilog编写可综合的有限状态机的标准模板;
3、掌握用VHDL或Verilog编写序列检测器以及其他复杂逻辑电路的设计;
二、实验内容
1、用MOORE型状态机设计一个具有双向步进电动机控制实验:该控制电路有三个输入信号:clk时钟信号,clr复位信号,dir方向控制信号。

输出信号为phase[3..0]用来控制步进电机的动作。

当dir=1时要求phase[3..0]按照“0001”,“0010”,“0100”,“1000”的顺序变化;当dir=0时要求phase[3..0]按照“0001”,“1000”,“0100”,“0010”的顺序变化。

2、设计一个简单的状态机,功能是检测一个5位的二进制序列“10010”。

3、设计一个串行数据检测器,要求是:连续4个或4个以上为1时输出为1,其他输入情况为0。

(选做)
4、根据状态图,写出对应于结构图b,分别由主控组合进程和主控时序进程组成的VERILOG 有限状态机描述。

(选做)
三、实验步骤
实验一:
1、建立工程
2、创建Verilog HDL文件
3、输入程序代码并保存
module moore1(clk,clr,dir,phase);
input clk,clr,dir;
output[3:0] phase;
reg[3:0] phase;
reg[1:0] state;
parameter s0='b00,s1='b01,s2='b10,s3='b11;
always@(posedge clk)
begin
if(clr)begin
phase<='b0000;state<=s0;end
else
begin
case(state)
s0:if(dir) begin
phase<='b0010;state<=s1;end
else
begin
phase<='b1000;state<=s3;end
s1:if(dir) begin
phase<='b0100;state<=s2;end
else begin
phase<='b0001;state<=s0;end
s2:if(dir) begin
phase<='b1000;state<=s3;end
else begin
phase<='b0010;state<=s1;end
s3:if(dir) begin
phase<='b0001;state<=s0;end
else begin
phase<='b0100;state<=s2;end
endcase
end
end
endmodule
4、进行综合编译
5、新建波形文件
6、导入引脚,设置信号源并保存
7、功能仿真,结果分析
由仿真波形图可以看出当dir=1时,phase[3..0]按照0001,0010,0100,1000的顺序变化,当dir=0时phase[3..0]按照0001,1000,0100,0010的顺序变化。

所以设计正确。

实验二:
1、建立工程
2、创建Verilog HDL文件
3、输入程序代码并保存
module seqdet(x,z,clk,rst,state);
input x,clk,rst;
output z;
output [2:0] state;
reg [2:0] state;
wire z;
parameter IDLE='d0,A='d1,B='d2,C='d3,D='d4,E='d5,F='d6,G='d7;
assign z=(state==E&&x==0)?1:0;
always @(posedge clk)
if(!rst)
begin
state<=IDLE;
end
else
casex(state)
IDLE:if(x==1)
begin
state<=A;
end
A:if(x==0)
begin
state<=B;
end
B:if(x==0)
begin
state<=C;
end
else
begin
state<=F;
end
C:if(x==1)
begin
state<=D;
end
else
begin
state<=G;
end
D:if(x==0)
begin
state<=E;
end
else
begin
state<=A;
end
E:if(x==0)
begin
state<=C;
end
else
begin
state<=A;
end
F:if(x==1)
begin
state<=A;
end
else
begin
state<=B;
end
G:if(x==1)
begin
state<=F;
end
default:state<=IDLE; endcase
endmodule
//测试代码
`timescale 1ns/1ns module seqdet_Top;
reg clk,rst;
reg [23:0]data;
wire [2:0]state;
wire z,x;
assign x=data[23];
always #10 clk=~clk; always @(posedge clk) data={data[22:0],data[30]}; initial
begin
clk=0;
rst=1;
#2 rst=0;
#30 rst=1;
data='b1100_1001_0000_1001_0100;
#500 $stop; end
seqdet m(x,z,clk,rst,state);
endmodule
4、进行综合编译
5、新建波形文件
6、导入引脚
7、设置信号源并保存
8、功能仿真
9、仿真结果分析
由波形图可以看出状态由000->001->010->011->100,即对应IDLE->A->B->C->D->E的状态转换即10010.所以设计正确。

实验三:
1、建立工程
2、创建Verilog HDL文件
3、输入程序代码并保存
module jiance_ljj(clk,clr,a,out);
input clk,clr,a;
output out;
reg out;
reg[2:0] t;
always@(posedge clk or posedge clr)
begin
if (clr)
begin
t<=0;
out<=0;
end
else
begin
case(t)
'b000:begin
if(a)
t<='b001;
else
t<='b000;
out<=0;
end
'b001:begin
if(a)
t<='b010;
else
t<='b000;
out<=0;
end
'b010:begin
if(a)
t<='b011;
else
t<='b000;
out<=0;
end
'b011:begin
if(a)
t<='b100;
else
t<='b000;
out<=0;
end
'b100:begin
t<='b000;
if(a)
out<=1;
else
out<=0;
end
endcase
end
end
endmodule
4、进行综合编译
5、新建波形文件
6、导入引脚
7、设置信号源并保存
8、生成网表
9、仿真结果分析
由仿真波形可知结果正确。

相关主题