一、10010序列信号检测器设计
将指定的序列 10010 从串行的二进制数字码流中检测出来。
需求说明:设 x 为二进制数字码流,z 为输出的标记输出。 当 z 为高电平时表示发现指定的序列 10010;低电平则表示没 有发现指定的序列。
举例分析:设数字码流为“1100100100000100010010” 时钟:clock;输入:x;输出:z; 在时钟 2-6,码流 x 中出现序列 10010,则输出 z 在第 6 个时 钟变为高电平“1”,表示发现序列 10010,同样的,在时钟 18-22, 码流中再次检测到 10010,z 输出为 1。
开发平台:vivado
语言:Verilog HDL
实验代码:
module decimal_counter(
input clk,
input rst,
input x,
output reg z
);
reg[5:0] state;
parameter S0=6'b100000,
Sa=8'b010000,
Sb=8'b001000,
Sc=8'b000100,
Sd=8'b000010,
Se=8'b000001;
always@(posedge clk)
if(!rst)
begin
state<=S0;
z<=0;
end
else
case(state)
S0://0
begin
z<=0;
if(x==1)
state<=Sa;
else
state<=S0;
end
Sa://1
begin
z<=0;
if(x==0)
state<=Sb;
else
state<=Sa;
end
Sb://10
begin
z<=0;
if(x==0)
state<=Sc;
else
state<=Sa;
end
Sc://100
begin
z<=0;
if(x==1)
state<=Sd;
else
state<=S0;
end
Sd://1001
begin
z<=0;
if(x==0)
state<=Se;
else
state<=Sa;
end
Se://10010
begin
z<=1;
if(x==1)
state<=Sa;
else
state<=S0;
end
default:
begin
state<=S0;
z<=0;
end
endcase
endmodule
module test;
reg clk,rst;
reg[21:0] data;
wire z,x;
decimal_counter u0(.x(x),.z(z),.clk(clk),.rst(rst));
assign x=data[21];
initial
begin
clk<=0;
rst<=1;
#2 rst<=0;
#30 rst<=1;
data=22'b1100100100000100010010;
end
always
begin
#10 clk=~clk;
end
always @(posedge clk)
begin
data={data[20:0],data[21]};
end
endmodule
实验结果: