当检测到hello的时候,led翻转
module Hello(Clk,Rst_n,data,led);
input Clk;//50M
input Rst_n;//低电平复位
input [7:0] data;//ascii码,八位
output reg led;
//接下来对状态进行定义
localparam//在文件内部使用,无法在外部被其他的文件修改
CHECK_H = 5'b0_0001,
CHECK_e = 5'b0_0010,
CHECK_la= 5'b0_0100,
CHECK_lb= 5'b0_1000,
CHECK_o = 5'b1_0000;
//定义状态所需要的寄存器
reg [4:0] state;
//状态机编写有三种方式:一段式状态机、两段式状态机、三段式状态机,其中三段式状态机的效率更高,所以我们现在使用一段式状态机进行学习哈哈哈。。。
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)begin
led<=1'b1;
state<=CHECK_H;//当系统复位的时候,让状态处于等待check_H的状态
end
else begin
case(state)
CHECK_H:
if(data=="H")
state<=CHECK_e;
else
state<=CHECK_H;
CHECK_e:
if(data=="e")
state<=CHECK_la;
else
state<=CHECK_H;
CHECK_la:
if(data=="l")
state<=CHECK_lb;
else
state<=CHECK_H;
CHECK_lb:
if(data=="l")
state<=CHECK_o;
else
state<=CHECK_H;
CHECK_o:
if(data=="o")begin
led=~led;//序列正确,led翻转
state<=CHECK_H;//进行新序列的检测
end
else
state<=CHECK_H;
//当电路出现问题,出现除以上状态的任何一种情况,那么led状态不发生变化,而且state回到check_H
default:state<=CHECK_H;
endcase
end
endmodule
`timescale 1ns/1ns
`define clock_period 20
module Hello_tb;
reg Clk;
reg Rst_n;
reg [7:0]ASCII;
wire led;
Hello Hello0(
.Clk(Clk),
.Rst_n(Rst_n),
.data(ASCII),
.led(led)
);
initial Clk=1;
always #(`clock_period/2)Clk=~Clk;
initial begin
Rst_n=0;
ASCII=0;
#(`clock_period*200);
Rst_n=1;
#(`clock_period*200);
repeat(10) begin
ASCII = "I";
#(`clock_period);
ASCII = "A";
#(`clock_period);
ASCII = "M";
#(`clock_period);
ASCII = "H";
#(`clock_period);
ASCII = "e";
#(`clock_period);
ASCII = "l";
#(`clock_period);
ASCII = "l";
#(`clock_period);
ASCII = "o";
end
end
endmodule
最后的结果是这样的