看到了一些interesting的题,和大家分享一下,如果大家有什么额外的见解欢迎大家公众号后台留言!
这类题一般有两种做法,状态机和移位寄存器。
一、状态机实现
状态机:
代码:
module det(
input clk,
input rst_n,
input d, //数据输入
output reg y //检测结果输出
);
/*
检测101101
*/
//状态编码
parameter idle=3'b000; //空闲状态
parameter s1=3'b001; //检测到1
parameter s2=3'b010; //检测到10
parameter s3=3'b011; //检测到101
parameter s4=3'b100; //检测到1011
parameter s5=3'b101; //检测到10110
parameter s6=3'b110; //检测到101101
reg[2:0]cur_state,nxt_state;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cur_state<=idle;
else
cur_state<=nxt_state;
always@(cur_state,d)
begin
case(cur_state)
idle:
begin
if(d==1'b1)
nxt_state<=s1;
else
nxt_state<=idle;
end
s1:
begin
if(d==1'b0)
nxt_state<=s2;
else
nxt_state<=idle;
end
s2:
begin
if(d==1'b1)
nxt_state<=s3;
else
nxt_state<=idle;
end
s3:
begin
if(d==1'b1)
nxt_state<=s4;
else
nxt_state<=idle;
end
s4:
begin
if(d==1'b0)
nxt_state<=s5;
else
nxt_state<=idle;
end
s5:
begin
if(d==1'b1)
nxt_state<=s6;
else
nxt_state<=idle;
end
s6:
begin
if(d==1'b1)
nxt_state<=s1;
else
nxt_state<=idle;
end
default:;
endcase
end
always@(posedge clk or negedge rst_n)
if(~rst_n)
y<=1'b0;
else if(nxt_state==s6)
y<=1'b1;
else
y<=1'b0;
endmodule
二、移位寄存器实现
这种方式通过流水线操作,感觉简单粗暴而且有用,其核心为:
//移位寄存器实现特定序列检测 101101
always @(posedge clk or negedge rst_n)
if(!rst_n)
data <= 0;
else
data <= {data[4:0],din};
祝大家520快乐,也不知道是什么节也没对象也没问,反正快乐就完了!到了学校一堆事要做,可能以后不能天天更新了,请理解~~~~
~~~~感谢阅读~~~~谢谢!