|
楼主 |
发表于 2023-4-1 07:56:44
|
显示全部楼层
本帖最后由 dodoee 于 2023-4-1 21:04 编辑
// test for checking 101101101
module test_101(
input clk,
input reset_n,
input a,
output b
);
parameter [2:0] IDLE = 3'b110;
parameter [2:0] STATE_0 = 3'b0;
parameter [2:0] STATE_1 = 3'b001;
parameter [2:0] STATE_2 = 3'b010;
parameter [2:0] STATE_3 = 3'b011;
parameter [2:0] STATE_4 = 3'b100;
parameter [2:0] STATE_5 = 3'b101;
reg reg_a;
always@(posedge clk)
begin
if(reset_n == 0)
reg_a <= 1'b0;
else reg_a <= a;
end
reg [2:0] state,next_state;
reg [2:0] state_1,next_state_1;
always@(posedge clk)
begin
if(reset_n == 0)
state <= IDLE ;
else state <= next_state;
end
always @(*)
begin
case(state)
IDLE : if(reg_a) next_state = STATE_0; else next_state = IDLE ;
STATE_0 : if(reg_a) next_state = STATE_0; else next_state = STATE_1;
STATE_1 : if(reg_a) next_state = STATE_2; else next_state = IDLE;
STATE_2 : if(reg_a) next_state = STATE_3; else next_state = IDLE;
STATE_3 : if(reg_a) next_state = STATE_0; else next_state = STATE_4;
STATE_4 : if(reg_a) next_state = STATE_5; else next_state = IDLE;
STATE_5 : next_state = IDLE;
default : next_state = IDLE;
endcase
end
//____ state_1 ___
always@(posedge clk)
begin
if(reset_n == 0)
state_1 <= IDLE;
else state_1 <= next_state_1;
end
always @(*)
begin
case(state_1)
IDLE : if(reg_a && (state==2)) next_state_1 = STATE_0; else next_state_1 = IDLE;
STATE_0 : if(reg_a) next_state_1 = STATE_0; else next_state_1 = STATE_1;
STATE_1 : if(reg_a) next_state_1 = STATE_2; else next_state_1 = IDLE;
STATE_2 : if(reg_a) next_state_1 = STATE_3; else next_state_1 = IDLE;
STATE_3 : if(reg_a) next_state_1 = STATE_0; else next_state_1 = STATE_4;
STATE_4 : if(reg_a) next_state_1 = STATE_5; else next_state_1 = IDLE;
STATE_5 : next_state_1 = IDLE;
default : next_state_1 = IDLE;
endcase
end
//____________
reg [5:0] reg_shift;
always@(posedge clk)
begin
if(reset_n == 0)
reg_shift <= 6'b0;
else reg_shift <= {reg_shift[4:0],reg_a};
end
assign b = reg_shift ==6'b101101;
endmodule
用状态机只要3个寄存器,但是不能检测嵌套的101,用两个状态机实现类似流水线操作,要6个寄存器,即可检测嵌套的101;
用移位寄存器至少要6个寄存器。
testbench
// tb for test_101
module tb_test_101();
reg tb_clk,tb_reset_n ,tb_a;
test_101 inst_test_101(
.clk (tb_clk ),
.reset_n(tb_reset_n),
.a (tb_a ),
.b ( )
);
always #10 tb_clk = !tb_clk ;
reg [21:0] reg_in= 22'b0001_1001_1011_0110_1000_00;
reg [7:0] i ;
initial
begin
tb_clk = 0;
tb_reset_n =0 ;
tb_a =0;
#50;
tb_reset_n =1 ;
#1;
for(i=0; i<22; i=i+1) begin
@(posedge tb_clk);
tb_a = reg_in;
end
#100;
$stop;
end
endmodule
|
|