FPGA工程师面试资料【10】—— 序列检测的RTL实现

张开发
2026/4/15 6:56:46 15 分钟阅读

分享文章

FPGA工程师面试资料【10】—— 序列检测的RTL实现
FPGA工程师面试资料【10】—— 序列检测的RTL实现输入序列连续的序列检测不重叠序列检测状态机-非重叠的序列检测状态机-重叠序列检测被N整除的序列检测序列检测注意输入序列连续的序列检测请编写一个序列检测模块检测输入信号a是否满足01110001序列当信号满足该序列给出指示信号match当输入信号a满足目标序列该信号为1其余时刻该信号为0。timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input a, output reg match ); reg [7:0] a_temp; always (posedge clk or negedge rst_n) begin if(!rst_n) begin match 1b0; end else if(a_temp8b0111_0001) begin match 1b1; end else begin match 1b0; end end always (posedge clk or negedge rst_n) begin if(!rst_n) begin a_temp 8d0; end else begin a_temp {a_temp[6:0],a};//先收高位 end end endmodule一般情况下为先接收高位重叠的序列检测要检测几位数的序列就定义一个几位数的变量a_temp然后进行移位一直检测a_temp是否等于要检测的序列即可。不重叠序列检测请编写一个序列检测模块检测输入信号a是否满足011100序列 要求以每六个输入为一组不检测重复序列例如第一位数据不符合则不考虑后五位。一直到第七位数据即下一组信号的第一位开始检测。当信号满足该序列给出指示信号match。当不满足时给出指示信号not_match。timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input data, output reg match, output reg not_match ); reg [5:0] data_temp; reg [2:0] data_cnt; always (posedge clk or negedge rst_n) begin if(!rst_n) begin data_cnt 3d0; end else begin if(data_cnt3d5) begin data_cnt 3d0; end else begin data_cnt data_cnt 1b1; end end end always (posedge clk or negedge rst_n) begin if(!rst_n) begin data_temp 6d0; end else begin data_temp {data_temp[4:0],data}; end end always (posedge clk or negedge rst_n) begin if(!rst_n) begin match 1d0; not_match 1d0; end else begin if((data_cnt3d5)({data_temp[4:0],data}!6b011100)) begin match 1d0; not_match 1d1; end else if((data_cnt3d5)({data_temp[4:0],data}6b011100)) begin match 1d1; not_match 1d0; end else begin match 1d0; not_match 1d0; end end end endmodule一般情况下为先接收高位不重叠的序列检测要检测几位数的序列就定义一个几位数的变量然后进行移位同时定义一个计数器若是n位的序列则计数器计数值为0~n-1在计数值等于n-1时判断{data_temp[4:0],data}与待检测的序列是否一致即可。状态机-非重叠的序列检测设计一个状态机用来检测序列10111要求进行非重叠检测 即101110111只会被检测通过一次寄存器输出且同步输出结果module sequence_test1( input wire clk , input wire rst , input wire data , output reg flag ); parameter S00, S11, S22, S33, S44, S55; reg [2:0] state, nstate; always(posedge clk or negedge rst) begin if(!rst) state S0; else state nstate; end always (*) begin case (state) S0:nstate data ? S1 : S0; S1:nstate data ? S1 : S2; S2:nstate data ? S3 : S0; S3:nstate data ? S4 : S2; S4:nstate data ? S5 : S2; S5:nstate data ? S1 : S0; default:nstate S0; endcase end always (*) begin if(!rst) begin flag 0; end else begin flag (stateS5); end end endmodule状态机-重叠序列检测设计一个状态机用来检测序列1011要求进行重叠检测 即10110111会被检测通过2次寄存器输出在序列检测完成下一拍输出检测有效module sequence_test2( input wire clk , input wire rst , input wire data , output reg flag ); parameter S00, S11, S22, S33, S44; reg [2:0] state, nstate; always(posedge clk or negedge rst) begin if(!rst) state S0; else state nstate; end always (*) begin case (state) S0:nstate data ? S1 : S0; S1:nstate data ? S1 : S2; S2:nstate data ? S3 : S0; S3:nstate data ? S4 : S2; S4:nstate data ? S1 : S2; default :nstate S0; endcase end always (posedge clk or negedge rst) begin if(!rst) begin flag 0; end else begin flag (stateS4); end end endmodule被N整除的序列检测设计一个状态机用来检测是否可以被7整除检测是否可以被7整除实际就是对7求余数余数为0~6各赋一个状态定义状态S0-S6分别对应于余数为0-6。S0状态进00×200余0进10×211余1S1状态进01×202余2进11×213余3S2状态进02×204余4进12×215余5S3状态进03×206余6进13×217余0S4状态进04×208余1进14×219余2S5状态进05×2010余3进15×2111余4S6状态进06×2012余5进16×2113余6根据上述分析可以画出如下所述状态转移图10010101010101S0S1S2S3S4S5S6根据状态转移图用状态机实现即可。序列检测注意需要注意是检测到序列的下下一个周期拉高检测到序列的指示信号还是下一个周期拉高检测到序列的指示信号。上图是检测到序列的下下一个周期拉高检测到序列的指示信号在蓝线处已经检测到序列了但在红框位置才拉高序列检测指示信号此种情况一般是判断a_temp与待检测序列是否相等如输入序列连续的序列检测中的代码所示上图是检测到序列的下一个周期拉高检测到序列的指示信号在蓝线处已经检测到序列了在红框位置就拉高序列检测指示信号了此种情况一般是判断{data_temp[4:0],data}与待检测序列是否相等如不重叠序列检测中的代码所示对于状态机实现的序列检测可以先画出如上图所示的状态转移图然后根据状态转移图来修改代码注意是下一拍输出有效还是当前拍输出有效 ~ 本节完结 ~ 关注以下公众号了解更多

更多文章