题解 | #输入序列连续的序列检测#
输入序列连续的序列检测
https://www.nowcoder.com/practice/d65c2204fae944d2a6d9a3b32aa37b39
// `timescale 1ns/1ns
// module sequence_detect(
// input clk,
// input rst_n,
// input a,
// output reg match
// );
// reg [7:0] a_tem;
// always @(posedge clk or negedge rst_n)
// if (!rst_n)
// begin
// match <= 1'b0; a_tem <= 8'b0;
// end
// else if (a_tem == 8'b01110001)
// begin
// match <= 1'b1;a_tem <= {a_tem[6:0],a};
// end
// else
// begin
// match <= 1'b0;a_tem <= {a_tem[6:0],a};
// end
// endmodule
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
reg [4:0] state,next_state;
parameter IDLE = 4'd0,
S1 = 4'd1,S2 = 4'd2,
S3 = 4'd3,S4 = 4'd4,
S5 = 4'd5,S6 = 4'd6,
S7 = 4'd7,S8 = 4'd8;
//第一段用同步时序逻辑来描述状态的变化
always@(posedge clk or negedge rst_n)
if(!rst_n)
state <= IDLE;
else
state <= next_state;
//第二段用组合逻辑来描述状态变化的条件
always@(*)
begin
next_state = IDLE;
case(state)
IDLE:next_state = a?IDLE:S1;
S1:next_state = a?S2:S1;
S2:next_state = a?S3:S1;
S3:next_state = a?S4:S1;
S4:next_state = a?IDLE:S5;
S5:next_state = a?S2:S6;
S6:next_state = a?S2:S7;
S7:next_state = a?S8:S1;
S8:next_state = a?IDLE:S1;
endcase
end
//第三段用时序逻辑来表达输出
always@(posedge clk or negedge rst_n)
if(!rst_n)
match <= 1'd0;
else if(state == S8)
match <= 1'd1;
else
match <= 1'd0;
endmodule
查看9道真题和解析
联想公司福利 1500人发布