基于FPGA的状态机的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
序列检测有限状态机的实现
一、有限状态机
有限状态机是绝大部分控制电路的核心结构,是表示有限个状态以及在这些状态之间转移和动作等行为的数学模型。有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。一般来说,除了输入部分和输出部分外,有限状态机还含有一组具有“记忆”功能的寄存器,这些寄存器的功能是记忆有限状态机的内部状态,它们常被称为状态寄存器。在有限状态机中,状态寄存器的的下一个状态不仅与输入信号有关,而且还与该寄存器的当前状态有关,因此有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。
在实际的应用中,根据有限状态机是否使用输入信号,可将其分为Moore型有限状态机和Mealy型有限状态机两种类型。Moore型有限状态机其输出信号仅与当前状态有关,即可以把Moore型有限状态的输出看成是当前状态的函数。Mealy型有限状态机其输出信号不仅与当前状态有关,而且还与所有的输入信号有关,即可以把Mealy型有限状态机的输出看成是当前状态和所有输入信号的函数。
二、问题描述
1、Moore型序列检测状态机的设计
利用Verilog设计一个电路,对输入的一串二进制数用于检测序列中3个或者3个以上的1,其状态描述如下表所示。
2、Mealy型序列检测状态机的设计
利用Verilog设计一个电路,对输入的一串二进制数用于检测序列中3个或者3个以上的1,当检测到第三个1出现的时候,输出立刻变1,否则输出为0。
三、设计准备
本设计通过ISE软件硬件描述语言方式设计。定义一个输入端,一个清零端和一个时钟,输入端用来表示一串二进制数,清零端用来将状态机初始化,时钟用来更新当前状态。定义四个状态,分别表示当前无1输入、有一个1输入、有连续两个1输入以及连续三个或三个以上1输入。定义一个输出,用于检测序列中3个或者3个以上的1。
四、硬件描述语言输入
1、Moore型状态机源程序
module Moore(
input din,
input clk,
input rst,
output reg op
);
reg [1:0] current,next;
parameter S0 = 2'b00,S1 = 2'b01,S2 = 2'b10,S3 = 2'b11;
always@(posedge clk or negedge rst)
begin
if(!rst)
current <= 2'b00;
else
current <= next;
end
always@(current or din)
begin
case(current)
S0:begin
op = 0;
if(din == 0)
next = S0;
else
next = S1;
end
S1:begin
op = 0;
if(din == 0)
next = S0;
else
next = S2;
end
S2:begin
op = 0;
if(din == 0)
next = S0;
else
next = S3;
end
S3:begin
op = 1;
if(din == 0)
next = S0;
else
next = S3;
end
default:begin
op = 0;
next = S0;
end
endcase
end
endmodule
2、Mealy型状态机源程序
module Mealy(
input clk,
input rst,
input din,
output reg op
);
reg [1:0] current,next;
parameter S0 = 2'b00,S1 = 2'b01,S2 = 2'b10,S3 = 2'b11;
always@(posedge clk or negedge rst)
begin
if(!rst)
current <= 2'b00;
else
current <= next;
end
always@(current or din)
begin
case(current)
S0:begin
op = 0;
if(din == 0)
next = S0;
else
next = S1; end
S1:begin
op = 0;
if(din == 0)
next = S0;
else
next = S2; end
S2:begin
if(din == 0)
next = S0;
else
begin
next = S3;
op = 1;
end
end
S3:begin
if(din == 0)
begin
next = S0;
op = 0;
end
else
next = S3; end