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