专栏前言
本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网
题目要求检测a的序列,a为单bit输入,每个时刻可能具有不同的值, 当连续的六个输入值符合目标序列表示序列匹配,当六个输入值的一个或多个不符合则表示序列不匹配。
值得注意的是:题目要求以六位数据为一组,不同于常见的序列检测,要求检测重复序列,在画状态转移图时要注意,例如第一位不匹配,不应该返回到初始状态去进行第一位的判断,因为此时的输入是第二位数值,题目要求不对该数值做判断,而需要等到六个时钟周期之后,即第七位数据(第二组数值的第一位)再判断是否匹配目标序列的第一位。
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
// 011100
reg [3:0] pstate, nstate ; // 当前状态、下一状态
parameter idle = 4'b0,
s1 = 4'd1,
s2 = 4'd2,
s3 = 4'd3,
s4 = 4'd4,
s5 = 4'd5,
s6 = 4'd6,
sf1 = 4'd7,
sf2 = 4'd8,
sf3 = 4'd9,
sf4 = 4'd10,
sf5 = 4'd11,
sf6 = 4'd12 ;
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) pstate <= idle ;
else pstate <= nstate ;
end
always @ (pstate or data) begin // 对应状态转移图
case (pstate)
idle :
if (data == 0) nstate = s1 ; //0
else nstate = sf1 ;
s1 :
nstate = data ? s2 : sf2 ; //1
s2 :
nstate = data ? s3 : sf3 ; //1
s3 :
nstate = data ? s4 : sf4 ; //1
s4 :
nstate = data ? sf5 : s5 ; //0
s5 :
nstate = data ? sf6 : s6 ; //0
s6 :
nstate = data ? sf1 : s1 ;
sf1 :
nstate = sf2 ;
sf2 :
nstate = sf3 ;
sf3 :
nstate = sf4 ;
sf4 :
nstate = sf5 ;
sf5 :
nstate = sf6 ;
sf6 :
nstate = data ? sf1 : s1 ;
default :
nstate = idle ;
endcase
end
always @ (pstate or data or rst_n) begin // 输出
if (!rst_n) begin
match <= 1'b0 ;
not_match <= 1'b0 ;
end
else if (pstate == s6) begin
match <= 1'b1 ;
not_match <= 1'b0 ;
end
else if (pstate == sf6) begin
match <= 1'b0 ;
not_match <= 1'b1 ;
end
else begin
match <= 1'b0 ;
not_match <= 1'b0 ;
end
end
endmodule