题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
https://www.nowcoder.com/practice/f96d0e94ec604592b502b0f1800ed8aa
看到许多人都不是用的状态机,我来写一个简洁的状态机吧(附上仿真):
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
reg [2:0] state,next_state;
always@(*)begin
case(state)
0: next_state = (data_valid)?(!data?1:0):0;
1: next_state = (data_valid)?( data?2:1):1;
2: next_state = (data_valid)?( data?3:1):2;
3: next_state = (data_valid)?(!data?4:0):3;
4: next_state = (data_valid)?(!data?1:0):0;
default:next_state = 0;
endcase
end
always@(posedge clk,negedge rst_n)begin
if(!rst_n)begin
state <= 0;
match <= 0;
end
else begin
state <= next_state;
end
end
always@(*)begin
match = state==4;
end
endmodule
`timescale 1ns / 1ps
module tb_sequence_detect;
// sequence_detect Parameters
parameter PERIOD = 10;
// sequence_detect Inputs
reg clk = 0 ;
reg rst_n = 0 ;
reg data = 0 ;
reg data_valid = 0 ;
// sequence_detect Outputs
wire match ;
initial
begin
forever #(PERIOD/2) clk=~clk;
end
initial
begin
$dumpfile ("HDL_bit_wave.vcd");
$dumpvars;
#(PERIOD*2) rst_n = 1;
end
sequence_detect u_sequence_detect (
.clk ( clk ),
.rst_n ( rst_n ),
.data ( data ),
.data_valid ( data_valid ),
.match ( match )
);
initial
begin
#(PERIOD) data = 1;
#(PERIOD) data = 1;
#(PERIOD) data = 0;
#(PERIOD) data = 0;
#(PERIOD) data = 1;
#(PERIOD) data = 1;
#(PERIOD) data = 0;
#(PERIOD) data = 0;
#(PERIOD) data = 1;
#(PERIOD) data = 1;
#(PERIOD) data = 0;
#(PERIOD) data = 0;
#(PERIOD) data = 1;
#(PERIOD) data = 1;
#(PERIOD) data = 0;
#(PERIOD) data = 0;
#(PERIOD) data = 1;
$finish;
end
initial begin
#(PERIOD) data_valid = 0;
#(PERIOD) data_valid = 0;
#(PERIOD) data_valid = 1;
#(PERIOD) data_valid = 1;
#(PERIOD) data_valid = 1;
#(PERIOD) data_valid = 1;
#(PERIOD) data_valid = 0;
#(PERIOD) data_valid = 1;
#(PERIOD) data_valid = 0;
#(PERIOD) data_valid = 1;
#(PERIOD) data_valid = 1;
#(PERIOD) data_valid = 0;
#(PERIOD) data_valid = 0;
#(PERIOD) data_valid = 1;
end
endmodule
联想公司福利 1528人发布