【芯片前端】保持代码手感——不重叠序列检测

博主分享了一次通过Verilog实现序列检测模块的经历,旨在找回编码手感。模块需检测输入信号是否符合特定011100序列,每次检测6位,不连续错误不影响后续检测。博主在实现过程中遇到问题,经过多次修改最终成功。文章包含代码实现、逻辑解释及测试结果。
摘要由CSDN通过智能技术生成

前言

最近一直在做方案,挺长时间没有专注的写过rtl,感觉手很生需要写点代码找找手感。恰好最近看到了评论(不知道是不是做推广的啊):

想了下反正周末闲着也是闲着,那刷两个题找找写rtl的手感吧。于是乎我信心满满的打开了这个题目,看了下觉得这不是手拿把掐么,结果吧:

 就我也没想到这么几十行的代码我能改3次,看来我写bug的能力是一点没减。

题目

请编写一个序列检测模块,检测输入信号(a)是否满足011100序列, 要求以每六个输入为一组,不检测重复序列,例如第一位数据不符合,则不考虑后五位。一直到第七位数据即下一组信号的第一位开始检测。当信号满足该序列,给出指示信号match。当不满足时给出指示信号not_match

解题

我的思路比较简单,把输入的data按位置摆放在6bit寄存器的对应位置,从高到低就这么循环摆放,凑够6个数后用6bit寄存器的值去和对应的值比较,比上了就输出match,比不上就输出not_match。

循环转的msk信号,对应位置1表示这拍的data放置位置,为什么不使用count呢是因为相比于选择逻辑我更喜欢与或逻辑,映射的电路结构更加清晰:

reg[5:0]msk;
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)begin
		msk <= 6'b100000;
	end
	else if (msk == 6'b000001)begin
		msk <= 6'b100000;
	end
	else begin
		msk <= (msk>>1);
	end
end

6bit的seq寄存器,与或逻辑产生seq的D端,seq的复位值我用的匹配序列取反值: 

parameter MATCH_SEQ = 6'b011100;
parameter NOT_MATCH_SEQ = ~MATCH_SEQ;
reg[5:0]seq;
wire[5:0]seq_d = (msk & {6{data}}) | (~msk & seq);
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)begin
		seq <= NOT_MATCH_SEQ;
	end
	else begin
		seq <= seq_d;
	end
end

因为示意图时序里,第6个data的下一拍就要出match/not_match,所以用seq的D端来做逻辑:

wire match_d = (seq_d == MATCH_SEQ);
wire not_match_d = (seq_d != MATCH_SEQ);
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)begin
		match        <= 1'b0;
		not_match <= 1'b0;
	end
	else if (msk == 6'b000001)begin
		match <= match_d;
		not_match <= not_match_d;
	end
	else begin
		match <= 1'b0;
		not_match <= 1'b0;
	end
end

 结果

结果还是好的o(╥﹏╥)o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值