实验三用状态机实现序列检测器的设计Verilog.docx
《实验三用状态机实现序列检测器的设计Verilog.docx》由会员分享,可在线阅读,更多相关《实验三用状态机实现序列检测器的设计Verilog.docx(9页珍藏版)》请在冰豆网上搜索。
实验三用状态机实现序列检测器的设计Verilog
实验三_用状态机实现序列检测器的设计Verilog
实验三用状态机实现序列检测器的设计
一、实验目的:
用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。
二、原理说明:
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出a,否则输出b。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
例3-1述的电路完成对序列数"11100101"的。
当这一串序列数高位在前(左移)串行进入检描
测器后,若此数与预置的密码数相同,则输出“a”,否则仍然输出“b”。
【例3-1】
//顶层文件:
moduleXULIEQI(clk,reset,din18,LED7S);
inputclk;
inputreset;
input[17:
0]din18;
output[6:
0]LED7S;
wire[3:
0]AB;
wire[17:
0]din18;
xulieu1(clk,din18,reset,din);
schku2(din,clk,reset,AB);
decl7su3(AB,LED7S);
endmodule
//串行检测:
moduleschk(DIN,CLK,CLR,AB);
inputDIN,CLK,CLR;
output[3:
0]AB;
reg[3:
0]AB;
reg[7:
0]Q;
parameter
idle=8'b00000000,
a=8'b00000001,
b=8'b00000010,
c=8'b00000100,
d=8'b00001000,
e=8'b00010000,
f=8'b00100000,
g=8'b01000000,
h=8'b10000000;
parameterdata=8'b11100101;
always@(posedgeCLKornegedgeCLR)
if(!
CLR)
begin
Q<=idle;
end
else
begin
case(Q)
idle:
begin
if(DIN==data[7])Q<=a;
elseQ<=idle;
end
a:
begin
if(DIN==data[6])Q<=b;
elseQ<=idle;
end
b:
begin
if(DIN==data[5])Q<=c;
elseQ<=idle;
end
c:
begin
if(DIN==data[4])Q<=d;
elseQ<=c;
end
d:
begin
if(DIN==data[3])Q<=e;
elseQ<=a;
end
e:
begin
if(DIN==data[2])Q<=f;
elseQ<=idle;
end
f:
begin
if(DIN==data[1])Q<=g;
elseQ<=b;
end
g:
begin
if(DIN==data[0])Q<=h;
elseQ<=idle;
end
h:
begin
if(DIN==data[7])Q<=a;
elseQ<=idle;
end
default:
Q<=idle;
endcase
end
always@(Q)
begin
if(Q==h)AB<=4'b1010;
elseAB<=4'b1011;
end
endmodule
//前端预置8位数据输入:
modulexulie(clk,din18,reset,din);
inputclk;
input[17:
0]din18;
inputreset;
outputdin;
regdin;
parameter
s0=5'b00000,
s1=5'b00001,
s2=5'b00010,
s3=5'b00011,
s4=5'b00100,
s5=5'b00101,
s6=5'b00110,
s7=5'b00111,
s8=5'b01000,
s9=5'b01001,
s10=5'b01010,
s11=5'b01011,
s12=5'b01100,
s13=5'b01101,
s14=5'b01110,
s15=5'b01111,
s16=5'b10000,
s17=5'b10001;
reg[4:
0]cur_state,next_state;
always@(posedgeclkornegedgereset)
if(!
reset)
cur_state<=s17;
else
cur_state<=next_state;
always@(cur_stateordin18ordin)
begin
case(cur_state)
s17:
begin
din<=din18[17];
next_state<=s16;
end
s16:
begin
din<=din18[16];
next_state<=s15;
end
s15:
begin
din<=din18[15];
next_state<=s14;
end
s14:
begin
din<=din18[14];
next_state<=s13;
end
s13:
begin
din<=din18[13];
next_state<=s12;
end
s12:
begin
din<=din18[12];
next_state<=s11;
end
s11:
begin
din<=din18[11];
next_state<=s10;
end
s10:
begin
din<=din18[10];
next_state<=s9;
end
s9:
begin
din<=din18[9];
next_state<=s8;
end
s8:
begin
din<=din18[8];
next_state<=s7;
end
s7:
begin
din<=din18[7];
next_state<=s6;
end
s6:
begin
din<=din18[6];
next_state<=s5;
end
s5:
begin
din<=din18[5];
next_state<=s4;
end
s4:
begin
din<=din18[4];
next_state<=s3;
end
s3:
begin
din<=din18[3];
next_state<=s2;
end
s2:
begin
din<=din18[2];
next_state<=s1;
end
s1:
begin
din<=din18[1];
next_state<=s0;
end
s0:
begin
din<=din18[0];
next_state<=s17;
end
default:
begin
din<=1'b0;
next_state<=s0;
end
endcase
end
endmodule
提示:
1.若对于D<="11100101",电路需记忆:
初始状态、1、11、111、1110、11100、111001、1110010、11100101共9种状态。
三、实验内容:
1.编写由两个主控进程构成的有限状态机。
画出状态图,并给出其仿真测试波形;2.自己编写数码管显示程序(decl7s.v)来显示A或B状态。
已知数码管为共阳级连接。
输入(4bits)输出(7bits)显示内容
4’b10107’b0001000a
4’b10117’b0000011b
4’b00007’b10000000
提示:
可以在default分支选用显示“0”。
3.利用QuartusII对文本编辑输入、仿真测试并给出仿真波形,了解控制信号的时序。
最后进行引脚锁定并完成硬件测试实验。
建议用KEY3(PIN_W26)控制复位信号RESET;KEY2(PIN_P23)控制状态机工作时钟
CLK;指示输出AB接数码管HEX0(PIN_AF10,PIN_AB12,PIN_AC12,PIN_AD11,PIN_AE11,
PIN_V14,PIN_V13)。
5.下载后,按以下提示进行操作:
1)、按实验板“系统复位”键;
2)、用SW17-SW0键输入包含待测序列数"11100101"的18位数据;
3)、按下RESET键;
4)、按KEY2键(时钟clk输入)18次,这时若串行输入的18位二进制序列码中包含有"11100101",则数码管HEX0应从原来的B变成A,表示序列检测正确,否则仍为B。
四、思考题:
说明代码表达的是什么类型的状态机,它的优点是什么,详述其功能和对序列数检
测的逻辑过程;
五、实验报告:
根据以上的实验内容写出实验报告,包括设计原理、程序设计、程序分析、仿真分析、硬件测试和详细实验过程。