FPGA系统性学习笔记连载_Day18【线性系列机】之【110110 二进制包头检测实验】篇
本系列为FPGA系统性学习学员学习笔记整理分享,如有学习或者购买开发板意向,可加交流群联系群主。
连载《叁芯智能fpga设计与研发-第18天》【线性系列机】之【110110 二进制包头检测实验】篇
原创作者:紫枫术河 转载请联系群主授权,否则追究责任
本实验利用状态机知识,做一个线性系列机包头检测。
实验要求:检测特定的包头 110110,当检测到输出一个clk的脉冲信号出来。
一、分析110110的状态转移图
1.1、状态转移图如下表
1.2、状态转移表
二、verilog代码实现
代码语言:javascript复制module FSM_bin_seqence_check(
input clk,
input rst_n,
input bin,
output reg flag
);
//检测指定的系列 110110
parameter S0 = 3'd0;
parameter S1 = 3'd1;
parameter S2 = 3'd2;
parameter S3 = 3'd3;
parameter S4 = 3'd4;
parameter S5 = 3'd5;
parameter S6 = 3'd6;
reg [2:0] status;
always@(posedge clk,negedge rst_n)begin
if(!rst_n)
begin
status <= S0;
flag <= 1'b0;
end
else
begin
case(status)
S0:
begin
if(bin == 1'b1)
status <= S1;
else
status <= S0;
end
S1:
begin
if(bin == 1'b1)
status <= S2;
else
status <= S0;
end
S2:
begin
if(bin == 1'b1)
status <= S2;
else
status <= S3;
end
S3:
begin
if(bin == 1'b1)
status <= S4;
else
status <= S0;
end
S4:
begin
if(bin == 1'b1)
status <= S5;
else
status <= S0;
end
S5:
begin
if(bin == 1'b1)
status <= S2;
else
begin
//拉高脉冲,检测到指定系列
flag <= 1'b1;
status <= S6;
end
end
S6:
begin
//拉低脉冲,脉冲只给一个周期
flag <= 1'b0;
if(bin == 1'b1)
status <= S1;
else
status <= S0;
end
default:status <= S0;
endcase
end
end
endmodule
三、仿真文件
代码语言:javascript复制`timescale 1ns/1ps
module FSM_bin_seqence_check_tb();
reg clk;
reg rst_n;
reg bin;
wire flag;
FSM_bin_seqence_check FSM_bin_seqence_check_inst(
.clk (clk),
.rst_n (rst_n),
.bin (bin),
.flag (flag)
);
always #10 clk = ~clk;
initial begin
clk = 0;
rst_n = 0;
bin = 0;
#30;
rst_n = 1;
repeat(10000)begin
bin = {$random}%2;
#20;
end
#500000;
bin = 0;
#500000;
#10;
bin = 1;
#20;
bin = 1;
#20;
bin = 0;
#20;
bin = 1;
#20;
bin = 1;
#20;
bin = 0;
#20;
repeat(10000)begin
bin = {$random}%2;
#20;
end
end
initial begin
#50000000;
$stop;
end
endmodule
四、仿真效果
从仿真结果看,我们设计的代码正确。