数字电路设计:两种序列检测方法详解
创作时间:
作者:
@小白创作中心
数字电路设计:两种序列检测方法详解
引用
CSDN
1.
https://m.blog.csdn.net/qq_45771963/article/details/139423484
在数字电路设计中,序列检测是一个常见的应用场景。本文将介绍两种实现方法:状态机法和序列缓存对比法。通过详细的Verilog代码实现、测试代码以及仿真波形图,帮助读者更好地理解这两种方法的原理和实现过程。
状态机法
状态机法是一种常用的序列检测方法,可以通过Moore型或Mealy型状态机实现。本文采用Moore型状态机实现非重叠检测。
代码实现
`timescale 1ns/1ns
module xulie(
input clk,
input rst_n,
input a,
output reg match
);
//Moore型状态机检测01110001序列
reg [3:0] state_c;
reg [3:0] state_n;
parameter IDLE=4'b0000;
parameter S1=4'b0001;
parameter S2=4'b0011;
parameter S3=4'b0010;
parameter S4=4'b0110;
parameter S5=4'b0111;
parameter S6=4'b0101;
parameter S7=4'b0100;
parameter S8=4'b1100;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
state_c<=IDLE;
end else begin
state_c<=state_n;
end
end
always @(*) begin
case(state_c)
IDLE:state_n=a?IDLE:S1;
S1:state_n=a?S2:S1;
S2:state_n=a?S3:S1;
S3:state_n=a?S4:S1;
S4:state_n=a?IDLE:S5;
S5:state_n=a?IDLE:S6;
S6:state_n=a?S2:S7;
S7:state_n=a?S8:S1;
S8:state_n=a?IDLE:S1;
default:state_n=IDLE;
endcase
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
match<=1'b0;
end else if(state_n==S8) begin
match<=1'b1;
end else begin
match<=1'b0;
end
end
endmodule
测试代码
`timescale 1ns/1ns
module xulie_tb();
reg clk,rst_n;
reg a;
wire match;
initial begin
clk = 0;
rst_n = 0;
#10;
rst_n=1;
forever #20 a=({$random}%2);
#1000;
$stop;
end
always #10 clk=~clk;
xulie dut(
.clk(clk),
.rst_n(rst_n),
.a(a),
.match(match)
);
endmodule
序列缓存对比法
序列缓存对比法通过将输入信号缓存到一个数组中,然后与目标序列进行对比,实现序列检测。
实现步骤
- 声明一个8位的寄存器数组,用于缓存输入信号。
- 通过位截取和位拼接操作实现数据的移位。
- 将缓存数组与目标序列进行对比。
代码实现
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
reg [7:0] rem_a;
parameter S=8'b01110001;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
rem_a<=8'b0;
end else begin
rem_a<={rem_a[6:0],a};
end
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
match<=1'b0;
end else if(rem_a==S) begin
match<=1'b1;
end else begin
match<=1'b0;
end
end
endmodule
测试代码
`timescale 1ns/1ns
module sequence_detect_tb();
reg clk,rst_n;
reg a;
wire match;
initial begin
$dumpfile("out.vcd");
$dumpvars(0,sequence_detect_tb);
clk = 0;
rst_n = 0;
#30;
rst_n=1;
forever #20 a=({$random}%2);
#1000;
$stop;
end
always #10 clk=~clk;
sequence_detect dut(
.clk(clk),
.rst_n(rst_n),
.a(a),
.match(match)
);
endmodule
仿真波形
遗留问题
在牛客网的在线编译环境中,可能会出现显示异常的问题,建议使用其他仿真工具进行验证。
热门推荐
酆都大帝与东岳大帝:中国神话中的生死主宰
一张饺子皮就能做!超简单的纸皮烧卖教程来啦
辩护律师的收费标准是什么
周日016欧国联:德国对战意大利,近期状态达到新的巅峰
流感采样检测的几种常见方法
白内障手术前需要做哪些检查和准备
四君子汤的副作用与禁忌:这一个经典方,有3类人群须慎用!
如何构建和谐的医患关系
德国法兰克福罗马广场:从混乱集市到文化地标
《黑神话:悟空》爆火,什么是3A游戏?
长期减肥催吐,当心这一疾病
青少年心理疏导的方法
独一无二的授粉植物——无花果
“烧烫伤”如何处理?
农村大力拆除空心房的原因是什么?拆迁补偿又是多少呢?
BBC纪录片《睡眠十律》:10种改善睡眠质量的科学方法
双龙戏珠是什么-它在中国传统文化中有哪些重要意义
如何明确工作中的职责范围和权限?
现代电脑主板为何设计四个内存插槽?解析性能、扩展与兼容性
最新发布!儿童流感防治指南→
固原交警持续整治违法停车,这些危害你必须知道!
职工社保中断怎么办理
武汉龙灵山景区的文化挖掘和形象定位
阎罗王原型之谜
如何运用投资策略降低风险?股票对冲的操作方法有哪些?
中国高考难?看看残酷却不一定公平的美国高考
房子有哪些属性:揭示不动产价值的关键要素
足球比赛进球数计算规则详解:加时赛、点球、补时进球是否计入?
ENFJ的官配是什么
梦幻西游时空结晶怎么弄:揭秘获取方法与技巧