FPGA用状态机实现序列检测器的设计Word格式文档下载.docx
《FPGA用状态机实现序列检测器的设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《FPGA用状态机实现序列检测器的设计Word格式文档下载.docx(16页珍藏版)》请在冰点文库上搜索。
系统主要包括3个模块:
1)并行数据转串行数据模块(xulie.v)
2)串行检测模块(schk.v)
3)数码管显示模块(decled7s.v)
于需要用按键V16作为时钟输入,按键D18作为系统复位输入,所以需调用实验二中应用的消抖模块,对两个按键输入信号进行消抖。
•并行数据转串行数据模块(xulie.v),串行检测模块(schk.v)均采用有限状态机的描述方式。
•并行数据转串行数据模块(xulie.v)功能描述:
可以异步复位,可以在时钟控制下,将并行输入数据din[7:
0],按照din[7],din[6],din[5],din[4],din[3],din[2],din[1],din[0]的顺序输出至串行检测模块的输入端口din。
•根据设计要求,先画出并行数据转串行数据模块的状态转移图,并写出HDL代码。
•比较实验指导书提供并行数据转串行数据模块的参考代码,总结有限状态机的HDL设计方法。
•串行检测模块(schk.v)
输入信号:
DIN-----1bit的串行输入数据
CLK-----同步输入时钟
CLR------异步清零信号,当CLR=1,系统输出置0,否则,系统正常工作
输出信号:
AB--------4bits数据,如果系统检测到“01111000”这8bit的输入,AB=4’b1010,否则,AB=4’b1011.
•画出串行检测模块(schk.v)的状态转移图,并自行设计HDL源代码。
•用VerilogHDL设计数码管驱动电路、系统顶层电路。
3、数码管显示驱动模块(led.v)
输入:
AB[3:
0]-------待显示的数值
输出:
Q[6:
0]----------驱动数码管的七位数值
表2-1共阳极数码管驱动模块输入与输出关系表
输入(4bits)
输出(7bits)
显示内容
4’b1010
7’b1110111
a
4’b1011
7’b1111100
b
4’b0000
7’b1000000
0
4、消抖
(1)按键抖动的产生原因:
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
图2-3按键抖动波形图
(2)本次实验提供的消抖模块简介
图2-4消抖模块框图
电平检查模块:
检测输入的按键是否被按下或者释放,并分别将H2L_Sig,L2H_Sig拉高,并随后拉低,给出按键的操作信息。
延时模块:
对输入的信号变化时刻进行计时并观察信号的变换情况,对输出端口进行恰当地赋值。
二、实验步骤
1、建立工程:
file->
NewProject。
2、建立新VerilogHDL模块编辑窗口,按并行数据转串行数据模块(xulie.v),串行检测模块(schk.v),数码管显示模块(decled7s.v)的目标要求进行设计,模块在综合后,采用画波形的方式编辑测试激励波形,对相关模块进行功能仿真,实现模块的验证、修正。
3、L组合为一个模块,完成综合、功能仿真,分析波形,修正设计。
4、拷贝消抖模块代码:
debounce_module.v,delay_module.v,detect_module.v,组合完成消抖模块。
5、将消抖模块组合入系统综合,不仿真。
6、硬件测试平台设计。
7、顶层模块完成后,双击ImplementDesign,进行布局布线,双击GenerateProgrammingFile生成下载文件,双击ConfigureTargetDevice,按照提示完成下载。
8、下载后,改变拨动开关和按键,观察结果。
9、使用chipscope片内逻辑分析仪对设计进行硬件调试,验证设计是否正确。
掌握该调试方法和调试步骤。
三、实验结果及分析
1、数码管驱动模块(led.v)
moduledecled7s(AB,Q);
input[3:
0]AB;
output[6:
0]Q;
reg[6:
0]Q=7'
b1000000;
always@(AB)
begin
if(AB==4'
b1010)Q<
=7'
b1110111;
//输出A
elseQ<
b1111100;
//输出B
end
endmodule
1.1数码管驱动综合
1.2数码管驱动仿真
2、并行数据转串行数据模块(xulie.v)
modulexulie(DIN8,CLK,CLR,DIN);
inputCLK,CLR;
input[7:
0]DIN8;
outputDIN;
reg[2:
0]cur_state,next_state;
regDIN;
parameter
s0=3'
b000,
s1=3'
b001,
s2=3'
b010,
s3=3'
b011,
s4=3'
b100,
s5=3'
b101,
s6=3'
b110,
s7=3'
b111;
always@(posedgeCLKorposedgeCLR)
if(CLR)cur_state<
=s0;
elsecur_state<
=next_state;
always@(cur_stateorDIN8orDIN)
case(cur_state)
s0:
DIN<
=DIN8[7];
next_state<
=s1;
s1:
=DIN8[6];
=s2;
s2:
=DIN8[5];
=s3;
s3:
=DIN8[4];
=s4;
s4:
=DIN8[3];
=s5;
s5:
=DIN8[2];
=s6;
s6:
=DIN8[1];
=s7;
s7:
=DIN8[0];
default:
DIN<
=1'
b0;
next_state<
endcase
2.1并行数据转串行数据综合
2.2并行数据转串行数据仿真
3、串行检测模块(schk.v)
moduleschk(DIN,CLK,CLR,AB);
inputDIN,CLK,CLR;
output[3:
0]AB;
reg[3:
0]AB=4'
b0000;
idle=4'
b0000,
s1=4'
b0001,
s2=4'
b0010,
s3=4'
b0011,
s4=4'
b0100,
s5=4'
b0101,
s6=4'
b0110,
s7=4'
b0111,
s8=4'
b1000;
always@(posedgeCLKorposedgeCLR)
=idle;
always@(cur_stateorDIN)
case(cur_state)
idle:
AB<
=4'
b1011;
if(DIN==1'
b0)next_state<
elsenext_state<
end
s1:
AB<
b1)next_state<
end
s2:
s3:
s4:
s5:
s6:
s7:
b0)
begin
AB<
b1010;
next_state<
=s8;
elsebegin
next_state<
s8:
default:
endcase
3.1串行检测模块综合仿真
4、xulieqi组合模块
modulexulieqi(DIN8,CLK,CLR,Q);
0]DIN8;
0]Q;
wire[3:
xulieu1(.DIN8(DIN8),.CLK(CLK),.CLR(CLR),.DIN(DIN));
schku2(.CLR(CLR),.DIN(DIN),.AB(AB));
decled7su3(.AB(AB),.Q(Q));
4.1xulieqi组合模块综合仿真
5、加入消抖模块
moduleStaMachine(CLK_50,CLK,CLR,DIN8,Q);
inputCLK_50,CLK,CLR;
wireCLK_OUT;
debounce_moduleu1(CLK_50,CLR,CLK,CLK_OUT);
xulieqiu2(DIN8,CLK_OUT,CLR,Q);
5.1加入消抖模块后综合结果
四、实验思考题解答
1.说明代码表达的是什么类型的状态机,它的优点是什么?
详述其功能和对序列数检测的逻辑过程。
答:
由于状态机输出AB与输入DIN有关,有一定的延时,所以该状态机为Mealy状态机。
状态机在系统时钟的控制下,电路按照预先设定的状态运行,有良好的同步时序,较好的解决了竞争冒险和毛刺现象。
状态的的结构使其在一个时钟周期内可以完成许多并行的运算和控制操作。
五、体会