【Verilog】实验八 有限状态机设计

发布于:2024-12-19 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、实验目的

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型有限状态的输出看成是当前状态的函数。

  1. 设计并实现掌握检测连续接收“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