FPGA状态机实验.docx
《FPGA状态机实验.docx》由会员分享,可在线阅读,更多相关《FPGA状态机实验.docx(13页珍藏版)》请在冰豆网上搜索。
FPGA状态机实验
状态机实现序列检测电路
一、实验目的
1、应用有限状态机的设计思路,检测从FPGA片上ROM读出的串行数据是否是特定的数据;
2、所需要检测的数据是所用的电脑编号+200后转换的8位二进制数;
3、用一个7段数码管作为检测结果的输出显示,如果串行序列为“100101”,显示A,否则显示b。
二、实验原理
1、序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出A,否则输出b。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
例如:
描述的电路完成对特定的序列数"11100101"的检测的部分HDL代码。
当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“A”,否则仍然输出“b”。
2、数码管按发光二极管单元衔接方式分为共阳极数码管和共阴极数码管。
本实验使用共阳数码管。
它是指将一切发光二极管的阳极接到一同构成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到电源VCC上,当某一字段发光二极管的阴极为低电平相应字段就点亮。
数码管原理图如图:
图1共阳数码管示意图
3、分析易知数码管显示A对应二进制码8’h88,显示b对应二进制码8’h03。
4、本次设计一共有11个端口:
输入信号:
CLK_IN--------待计数的时钟。
CLK_50M-------系统时钟。
CLR--------------异步清零信号,当clr=1,输出复位为0,当clr=0,正常计数。
输出信号:
LED[6:
0]---------驱动数码管,显示计数值的个位。
COM-------------数码管位选通信号。
三、实验步骤
1、整个系统主要设计的模块是:
数据读入模块、数据监测模块和数码管驱动模块,由于实验板的按键为实现硬件防抖,则需要将按键输入的时钟clk,先通过消抖模块消抖后,再输出至后续使用。
图2系统结构图
2、通过ISE的COREGENERATOR生成ROM模块,要求:
每个存储单元存储1bit数据,共有8个数据。
3、设计串行数据读出模块(read_rom.v),实现从ROM中循环读出数据,生成与时钟clk同步的串行数据流。
4、画出序列检测状态图,据此,编写由两个主控进程构成的有限状态机,生成序列检测模块(schk.v)。
图3序列检测状态图
5、编写数码管显示程序(decl7s.v),根据输入的4bits数据,输出7bits信号,驱动数码管显示A或b。
已知数码管为共阳级连接。
显示内容:
4’b10107’b0001000a
4’b10117’b0000011b
4’b00007’b10000000
提示:
可以在default分支选用显示“0”。
6、对各个模块进行仿真验证,确认无误后,编写顶层文件,将各个模块连接到一起。
7、根据板子锁定引脚,并生成下载文件。
CLK_IN选择按键0即是P57脚,CLK_50M为系统50M时钟即是P80脚,CLR复位信号选择拨码开关1,即P20脚,COM数码管位选信号锁定P128脚,LED[0:
6]即选择对应的数码管脚锁定即可。
四、实验结果
1、序列检测模块(schk.v)仿真测试
图4序列检测波形图
由图形可知,检测到输入为序列11010100时,输出变为1010,否则为1011。
2、读出模块(read_rom.v)仿真测试
图5从ROM中读取数据
由图形可知,每一个时钟上升沿到来便从ROM中读取一个数据,由于只有0,1状态便以低,高电平的方式显示出来。
由波形可知读取到的序列为11010100,即是事先存取到ROM中的数据。
3、数码管显示程序(decl7s.v)仿真测试
图6数码管显示
由图可以看出,当flag_out为0000时数码管显示00000000即全亮;当flag_out为1011时,数码管显示00000011即b;当flag_out为1010时,数码管显示10001000即A;当clr信号为低时正常计数,为高时数码管显示清零。
4、下载到实验板上面后的结果
数码管开始全亮,然后变为b,之后按8下按键0,数码管显示值变为A。
拨动拨码开关1到上面,数码管全亮,拨动到下面,数码管显示b。
图7检测显示
图8检测显示
5、电子琴下载实验效果
下载后,蜂鸣器开始按拍子鸣叫。
LED灯也按一定规律闪烁。
拨动拨码开关1,蜂鸣器停止鸣叫,LED灯固定显示。
可以发现LED[3:
0]显示的是当前音调的阶数,而LED5则表示其是否为高八度,亮为低八度,不亮为高八度。
图9高八度3音
图10低八度3音
五、思考题
1、什么是IPCORE?
本次设计中ROM模块是如何进行设计输入的?
IP核是指用于产品应用专用集成电路(ASIC)或者可编辑逻辑器件(PLD)的逻辑块或数据块。
ROM模块中的数据是事先用文本文档的方式编辑好的。
2、说明状态机代码表达的是什么类型的状态机,它的优点是什么?
详述其功能和对序列数检测的逻辑过程。
本状态机是Mealy型状态机,Mealy状态机的输出与当前状态和输入有关。
Mealy机“响应”速度快;Mealy机状态少,为此具有较少的触发器。
当数据到来时,判断当前状态,后根据数据判断下一状态。
六、代码
1、顶层模块代码:
`timescale1ns/1ps
modulexulieqi(CLK_50M,CLR,CLK_IN,COM,LED);
inputCLK_50M,CLK_IN,CLR;
outputCOM;
output[7:
0]LED;
wireCOM;
wire[7:
0]LED;
wireCLK_OUT;
wiredata_out;
wire[3:
0]flag_out;
debounce_moduledebounce(CLK_50M,CLR,CLK_IN,CLK_OUT);
read_romread(CLK_OUT,data_out);
schkschk(CLK_OUT,CLR,data_out,flag_out);
led7led(CLK_50M,CLR,flag_out,LED,COM);
endmodule
2、读出模块(read_rom.v)代码:
`timescale1ns/1ps
moduleread_rom(clk,data_out);//串行数据读出模块
inputclk;
outputdata_out;
reg[3:
0]counter=0;
always@(posedgeclk)
begin
if(counter>=4'b0111)
counter<=4'b0000;
else
counter<=counter+1'b1;
end
data_romdata_rom(.clka(clk),.addra(counter),.douta(data_out));
endmodule
3、序列检测模块(schk.v):
`timescale1ns/1ps
moduleschk(clk,clr,in,flag_out);//8'b11010100序列检测模
inputclk,clr;
inputin;
output[3:
0]flag_out;//a=4’b1010;b=4’b1011
reg[2:
0]cur_state,next_state;
reg[3:
0]flag_out;
parameters0=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)
begin
if(clr)
cur_state<=s0;
else
cur_state<=next_state;
end
always@(cur_stateorin)
begin
case(cur_state)
s0:
begin
flag_out=4'b1011;
if(in==1'b1)
next_state=s1;
else
next_state=s0;end
s1:
begin
flag_out=4'b1011;
if(in==1'b1)
next_state=s2;
else
next_state=s0;end
s2:
begin
flag_out=4'b1011;
if(in==1'b0)
next_state=s3;
else
next_state=s2;end
s3:
begin
flag_out=4'b1011;
if(in==1'b1)
next_state=s4;
else
next_state=s0;end
s4:
begin
flag_out=4'b1011;
if(in==1'b1)
next_state=s2;
else
next_state=s5;end
s5:
begin
flag_out=4'b1011;
if(in==1'b0)
next_state=s0;
else
next_state=s6;end
s6:
begin
flag_out=4'b1011;
if(in==1'b0)
next_state=s7;
else
next_state=s2;end
s7:
begin
if(in==1'b0)begin
next_state=s0;
flag_out=4'b1010;end
elsebegin
next_state=s1;
flag_out=4'b1011;endend
default:
beginnext_state=s0;flag_out=4'b0000;end
endcase
end
endmodule
4、LED显示模块:
`timescale1ns/1ps
moduleled7(clk,clr,flag_out,led,com);//数码管显示模块
inputclk,clr;
input[3:
0]flag_out;
outputcom;
output[7:
0]led;
reg[7:
0]led;
assigncom=0;
always@(posedgeclk)
begin
if(clr)
led<=8'h00;
else
begin
case(flag_out)
4'b1010:
led<=8'h88;//A
4'b1011:
led<=8'h03;//b
default:
led<=8'h00;
endcase
end
end
endmodule
5、引脚锁定:
NETCLK_INLOC=P57;
NETCLK_50MLOC=P80;
NETCOMLOC=P126;
NETLED<0>LOC=P102;
NETLED<1>LOC=P99;
NETLED<2>LOC=P107;
NETLED<3>LOC=P109;
NETLED<4>LOC=P112;
NETLED<5>LOC=P100;
NETLED<6>LOC=P106;
NETCLRLOC=P20;