序列检测器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

序列检测器功能:将一个指定序列从数字码流中识别出来。本例中将设计一个“10010”序列的检测器。设X为数字码流的输入,Z为检测出标记输出,高电平表示发现指定的序列10010.考虑码流为110010010000100101....则,如表有:

夏宇闻老师教材序列检测器

夏宇闻老师教材序列检测器

moduleseqdet

(

input wire x,

input wire clk,

input wire rst,

output wire z

);

reg [2:0] state;

localparam IDLE = 3'd0,

A = 3'd1,

B = 3'd2,

C = 3'd3,

D = 3'd4,

E = 3'd5,

F = 3'd6,

G = 3'd7;

assign z = (state == D && x==0)?1'b1:1'b0;//状态为D时又收到输入0,表明10010已经收到,输出为1

always @ (posedgeclk,negedgerst)

if(!rst)

begin

state<= IDLE;

end

else

casex(state)

IDLE:

if(x==1)

state <= A; //状态A记住第一位正确高电平1来过

else

state <= IDLE; //输入的是低电平,不符合要求,所以状态保留不变A:

if(x==0)

state <= B; //状态B记住第二位正确低电平0来过

else

state <= A; //输入的是低电平,不符合要求,所以状态保留不变B:

if(x==0)

state <= C; //状态C记住第三位正确低电平0来过

else

state <= F; //输入高电平,不符合要求,F记住只有1位对过

C:

if(x==1)

state <= D; //状态D记住第四位正确高电平1来过

else

state <= G; //输入低电平,不符合要求,G记住没有1为曾经对过D:

if(x==0)

state <= E; //状态E记住第五位正确低电平0来过

else

state <= A; //输入的是高电平,不符合要求,记住只有一位来过,回到状

态A

E:

if(x==0)

state <= C; //用状态记住100正确来过

else

state <= A;//输入是高电平,只有1位正确,状态是A F:

if(x==1)

state <= A;//输入是高电平,只有1位正确,状态是A else

state <= B;//输入是低电平,有2位正确,状态是B G:

if(x==1)

state <= F;//输入又是高电平,只有1位正确,状态是F else

state <= G;//输入是低电平,不符合要求,没有1位正确default:

state<=IDLE;

endcase

endmodule

测试文件:

`timescale 1ns/1ns

moduleseqdet_tb;

localparam T =20;

regclk,rst;

reg [23:0] data;

wirez,x;

assign x = data[23];

initial

begin

clk =0;

rst =1;

#2 rst =0;

#30 rst =1;

data =20'b1100_1001_0000_1001_0100; #(T*1000) $stop;

end

always #T clk = ~clk;

always @ (posedgeclk)

#2 data = {data[22:0],data[23]};//输入数据左移

seqdet U1//调用序列检测器模块

(

.x(x),

.z(z),

.clk(clk),

.rst(rst)

);

endmodule

相关文档
最新文档