【Verilog】实验八 有限状态机设计
一、实验目的
1. 掌握有限状态机原理和设计方法。
2. 掌握ModelSim和VIVADO工具软件。
3. 掌握基本的测试代码编写和FPGA开发板使用方法。
二、实验环境
1. 装有ModelSim和VIVADO的计算机。
2. Sword实验系统。
三、实验原理
有限状态机是时序电路的通用模型,任何时序电路都可以表示为有限状态机。在由时序电路表示的有限状态机中,各个状态之间的转移总是在时钟的触发下进行的,状态信息存储在寄存器中。因为状态的个数是有限的,所以称为有限状态机。有限状态机可以分为同步和异步两种,
状态机的同步置位与复位:
always@(posedge clk )
if(!rst)
…
状态机的异步置位与复位:
always@(posedge clk or negedge rst)
…
我们主要讨论有限同步状态机。有限状态机也是由两部分组成:存储电路和组合逻辑电路。存储电路用来生成状态机的状态,组合逻辑电路用来提供输出以及状态机跳转的条件。
根据输出信号的产生方式,有限状态机可以分为Mealy型和Moore型两类。Mealy型状态机的输出信号不仅与当前状态有关,而且还与输入信号有关,即可以把Mealy型有限状态机的输出看成是当前状态和输入信号的函数。Moore型状态机的输出仅与当前状态有关,即可以把Moore型有限状态的输出看成是当前状态的函数。
- 设计并实现掌握检测连续接收“1111”的Moore型和Mealy型状态机设计。
要求:画出Moore型和Mealy型的状态转移图,并编写代码在modelsim上仿真
xc7k160tffg676-1
top.v
`timescale 1ns / 1ps
module TOP(input wire clk_100mhz,
input wire[15:0]SW,
output wire led_clk,
output wire led_clrn,
output wire led_sout,
output wire LED_PEN
);
wire[31:0]Div;
wire[15:0]LED_DATA;
wire CK;
clk_div U8(clk_100mhz,1'b0,SW[2],Div,CK);
LED_P2S #(.DATA_BITS(16),.DATA_COUNT_BITS(4))
PLED (clk_100mhz,
1'b0,
Div[20],
LED_DATA,
led_clk,
led_clrn,
led_sout,
LED_PEN
);
wire dout;
seqdata1111_moore U1(Div[26],SW[1],SW[2],dout);
assign LED_DATA = ~{dout,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,Div[26]};
endmodule
seqdata1111_moore.v
module seqdata1111_moore(
input wire clk,
input wire clr,
input wire din,
output reg dout
);
reg[2:0] present_state,next_state;
parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100;
always@(posedge clk)
begin
if(clr==1) present_state<=s0;
else present_state<=next_state;
end
always@(*)
begin
case(present_state)
s0: if(din==1) next_state=s1;
else next_state=s0;
s1: if(din==1) next_state=s2;
else next_state=s0;
s2: if(din==1) next_state=s3;
else next_state=s0;
s3: if(din==1) next_state=s4;
else next_state=s0;
s4: if(din==1) next_state=s4;
else next_state=s0;
default: next_state=s0;
endcase
end
always@(*)
begin
if(present_state==s4) dout=1;
else dout=0;
end
endmodule