我的思路比较简单,把输入的data按位置摆放在6bit寄存器的对应位置,从高到低就这么循环摆放,凑够6个数后用6bit寄存器的值去和对应的值比较,比上了就输出match,比不上就输出not_match。
循环转的msk信号,对应位置1表示这拍的data放置位置,为什么不使用count呢是因为相比于选择逻辑我更喜欢与或逻辑,映射的电路结构更加清晰:
6bit的seq寄存器,与或逻辑产生seq的D端,seq的复位值我用的匹配序列取反值:
因为示意图时序里,第6个data的下一拍就要出match/not_match,所以用seq的D端来做逻辑:
循环转的msk信号,对应位置1表示这拍的data放置位置,为什么不使用count呢是因为相比于选择逻辑我更喜欢与或逻辑,映射的电路结构更加清晰:
reg[5:0]msk; always @(posedge clk&nbs***bsp;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&nbs***bsp;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&nbs***bsp;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