序列信号检测器论文

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

Y_da<=1'b0; end ss4:if(Data_in==0)begin //11010
stage1<=ss0; //检测到 0 跳转到状态 0 Y_da<=1'b0; end else begin //11011 stage1<=ss5; //检测到 1 跳转到下一状态 Y_da<=1'b0; end ss5:if(Data_in==0)begin //110110 stage1<=ss6; //检测到 0 跳转到下一状态 Y_da<=1'b0; end else begin //110111 stage1<=ss2; //检测到 1 跳转到 状态 ss2 Y_da<=1'b0; end ss6:if(Data_in==0)begin //1101100 stage1<=ss0; //检测到 0 跳转到状态 0 Y_da<=1'b0; end else begin //1101101 stage1<=ss7; //检测到 1 跳转到下一状态 Y_da<=1'b0; end ss7:if(Data_in==0)begin //11011010 stage1<=ss0; //跳转到状态 0 继续下一个码流检测 Y_da<=1'b1; //检测到一个码流 11011010 置 1 保持一 个时钟周期 Num_da<=Num_da+1'b1;//检测到一个码流 Num_da 累加一 次 $display("Num_serial2:Num_da=%d counts.",Num_da);// 显示检测到的序列,并输出检测到的次数 $display("Num_serial2_time:time=%d ns.",10*cnt);// 显示检测到的时间 if(Num_da>=255)begin
一个 2 进制的输入数据
1
检测到码流 10011110 的输出信号,高有效
1
检测到码流 11011010 的输出信号,高有效
8
检测到码流 10011110 的次数
持续一个时钟周期 持续一个时钟周期
8
检测到码流 11011010 的次数
1
检测到码流 10011110 的次数超过 255 次, 高有效
1
parameter Num_serial2="11011010";
reg [10:0]i; reg mem[0:4095];//位宽 1bit,深度为 4096 的存取器
integer fp_write;
sequence DUT(.clk(clk),.rst(rst),.Data_in(Data_in),.Y_9e(Y_9e),
三、实验原理
图 3.1 序列检测器顶层原理图
序列检测器在数据通讯,雷达和遥测等领域中用与检测同步识别 标志。它是一种用来检测一组或多组序列信号的电路,一旦检测到所 需信号就输出高电平,这在数字通信领域有广泛的应运。
1. 检测码流 10011110 的设计步骤 首先,划分 8 个状态 s0、s1、s2、s3、s4、s5、s6、s7;画出状 态转换图如图 3.2 所示。
always @(posedge clk)begin //进程 2 检测码流 11011010 if(!rst)begin //同步复位 Y_da<=1'b0; Err_da<=1'b0; Num_da<=8'd0; stage1<=ss0; //状态 0 end else begin case(stage1) ss0:if(Data_in==0)begin //0 stage1<=ss0; Y_da<=1'b0; end else begin //1 stage1<=ss1; //检测到 1 跳转到下一个状态 Y_da<=1'b0; end ss1:if(Data_in==0)begin //10 stage1<=ss0; //检测到 0 跳转到状态 0 Y_da<=1'b0; end else begin //11 stage1<=ss2; //检测到 1 跳转到下一状态 Y_da<=1'b0; end ss2:if(Data_in==0)begin //110 stage1<=ss3; //检测到 0 跳转到下一状态 Y_da<=1'b0; end else begin //111 stage1<=ss2; //检测到 1 等待检测下一个值 Y_da<=1'b0; end ss3:if(Data_in==0)begin //1100 stage1<=ss0; //检测到 0 跳转到状态 0 Y_da<=1'b0; end else begin //1101 stage1<=ss4; //检测到 1 跳转到下一状态
end
s1:if(Data_in==0)begin //10
stage0<=s2;//检测到 0 跳转到下一状态
Y_9e<=1'b0;
end
else begin
//11
stage0<=s1;//检测到 1 等待下一个值
Y_9e<=1'b0;
end
s2:if(Data_in==0)begin //100
stage0<=s5;//检测到 1 跳转到下一状态
Y_9e<=1'b0;
end
s5:if(Data_in==0)begin //100110
stage0<=s2;//检测到 0 跳转到状态 2
Y_9e<=1'b0;
end
else begin
//100111
stage0<=s6;//检测到 1 跳转到下一状态
实验课程名称
序列信号检测器
姓名:殷富有 学号:GS12062448 院系:Computer school of NUDT 专业:微电子
一、 实验目的
1.熟悉使用 Verilog Hdl 语言; 2.熟悉使用 Modelsim、Design Compiler、Ise 等工具; 3.掌握用 Verilog Hdl 语言实现状态机的方法; 4.利用状态机设计一个序列检测器。
检测到的序列,并输出检测到的次数
$display("Num_serial1_time:time=%d ns.",10*cnt);// 显 示
检测到的时间
if(Num_9e>=255)begin
Num_9e<=8'd0;
Err_9e<=1'b1; //高有效 保持一个时钟
end
else begin
Err_9e<=1'b0; //没溢出 保持低电平
Num_da<=8'd0; Err_da<=1'b1; //高有效 超过 255 个 置 1 保持 一个时钟 end else begin Err_da<=1'b0; end
end else begin //11011011
stage1<=ss2; //检测到 1 跳转到 状态 ss2 Y_da<=1'b0; end default:begin Y_da<=1'b0; Err_da<=1'b0; Num_da<=8'd0; stage1<=ss0; end endcase end end
Y_9e<=1'b0;
end
s6:if(Data_in==0)begin //1001110
stage0<=s2;//检测到 0 跳转到状态 2
Y_9e<=1'b0;
end
else begin
//1001111
stage0<=s7;//检测到 1 跳转到下一状态
Y_9e<=1'b0;
end
s7:if(Data_in==0)begin //10011110
名称 clk rst
input output output output output output output
Data_in Y_9e Y_da Num_9e Num_da Err_9e Err_da
位宽 描述
备注
1
标准时钟信号,周期为 10ns
1
同步复位信号,低有效
维持有效至少两个 时钟周期
1
stage0<=s3;//检测到 0 跳转到下一状态
Y_9e<=1'b0;
end
else begin //101
stage0<=s1;//检测到 1 跳转到状态 1
Y_9e<=1'b0;
end
s3:if(Data_in==0)begin //1000
stage0<=s0;//检测到 0 跳转到状态 0
二、实验要求
设计序列信号检测器,具体要求:当检出输入码流为 10011110 或 11011010 时输出检出信号为 1,否则为 0,同时输出检出该码流的 个数(最大计数值可不超过 255,否则给出计数溢出信号为 1,要求 验证时输入码流来自 Sequence.txt 文件,在 testbench 中使用系统 函数读入,并把输出的信息写入 Outcome.txt 文件,输出信息包括在 什么时候,哪个码流,第几次被检测)。
Num_9e<=8'd0;
stage0<=s0;
end
else begin
case(stage0)
//10011110
s0:if(Data_in==0)begin
stage0<=s0;
Y_9e<=1'b0;
end
else begin
stage0<=s1; //检测到 1 跳转到洗衣状态
Y_9e<=1'b0;
检测到码流 11011010 的次数超过 255 次, 高有效
2.检测码流 10011110 的Verilog Hdl源代码
always @(posedge clk)begin //进程 1 检测码流 10011110 if(!rst)begin //同步复位 Y_9e<=1'b0;
Err_9e<=1'b0;
end
end
else begin //10011111
stage0<=s1;//检测到 1 跳转到状态 1
Y_9e<=1'b0;
end
default:begin
stage0<=s0;
Y_9e<=1'b0;
Err_9e<=1'b0;
Num_9e<=8'd0;
end
endcase end end
3.检测码流 11011010 的Verilog Hdl源代码
表 3.5 检测码流 11011010 的状态转换表
次态 Sn+1 A=0 A=1
现态 Sn
次态 Sn+1
A=0
A=1
SS0
SS1
SS1
SS2
SS0
SS2
SS3
SS2
SS4
SS0
SS5
SS6
SS0
SS7
SS3
SS0
SS4
SS5
SS6
SS2
SS7
SS0
SS2
四、程序设计
1.接口说明
类型 input input
//元件例化
Leabharlann Baidu
.Y_da(Y_da),.Err_9e(Err_9e),.Err_da(Err_da),.Num_9e(Num_9e),.Num_da(Num_da));
stage0<=s0;//检测到 0 跳转到状态 0 继续检测下一个码流
Y_9e<=1'b1;//检测到一个码流
Num_9e<=Num_9e+1'b1;//检测到一个码流 Num_9e 累加一次
$display("Num_serial1:Num_9e=%d counts.",Num_9e);//显示
S2
S0
2、检测码流 11011010 的设计步骤
首先,划分 8 个状态 ss0、ss1、ss2、ss3、ss4、ss5、ss6、ss7;
画出状态转换图如图 3.4 所示。
图 3.4 检测码流 11011010 的状态转换图
画出检测码流 11011010 的状态转换表如表 3.5 所示。
现态 Sn SS0
4.Testbench源代码
`timescale 10ns/1ns //时间单位
module seq_test;
//测试激励模块
reg
clk,rst,Data_in;
wire
Y_9e,Y_da,Err_9e,Err_da;
wire [7:0]Num_9e,Num_da;
parameter Num_serial1="10011110";
图 3.2 检测码流 10011110 的状态转换图
画出状态转换表如表 3.3 所示。
现态 Sn S0
表 3.3 检测码流 10011110 的状态转换表
次态 Sn+1
现态
次态 Sn+1
A=0 A=1
Sn
A=0
A=1
S0
S1
S1
S2
S1
S2
S0
S3
S4
S2
S5
S6
S2
S7
S3
S0
S4
S5
S2
S6
S7
Y_9e<=1'b0;
end
else begin //1001
stage0<=s4;//检测到 1 跳转到下一状态
Y_9e<=1'b0;
end
s4:if(Data_in==0)begin //10010
stage0<=s2;//检测到 0 跳转到状态 2
Y_9e<=1'b0;
end
else begin //10011
相关文档
最新文档