用状态机实现序列检测器实验报告Word文档格式.docx
《用状态机实现序列检测器实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《用状态机实现序列检测器实验报告Word文档格式.docx(11页珍藏版)》请在冰点文库上搜索。
这里我要写入的是226,所以二进制是11100010,写入的内容如下,:
memory_initialization_radix=10;
memory_initialization_vector=1110001110101010;
保存并选择载入。
2.读取rom中的数据
根据时钟上升沿读取数据,所以可以写出rom读的代码,代码如下:
moduleread_rom(clk,da,rst);
inputclk;
inputrst;
outputda;
reg[3:
0]counter;
always@(posedgeclkorposedgerst)begin
if(rst)
counter<
=1'
b0;
elsecounter<
=counter+1'
b1;
end
data_romu1(
.clka(clk),//inputclka
.addra(counter),//input[3:
0]addra
.douta(da)//output[0:
0]douta
);
编写仿真激励文件,得到如下波形,分析可以知道,时钟上升沿数据被读取,读取的数据与我们在配置文件中写入的相同。
3.串行检测
本人的编号为226,转换为二进制数为11100010,根据二进制数,画出状态转移图,状态转移图如下:
根据状态转移图,编写verilog代码,代码如下:
//检测:
11100011
moduleser_read(
inputclk,
inputr_bit,
inputrst,
outputregout_flag
);
0]status;
always@(negedgeclk,posedgerst)begin
if(rst==1)begin
status<
=4'
out_flag<
endelsebegin
case(status)
4'
d0:
begin
if(r_bit)
d1;
d1:
d2;
else
d0;
d2:
d3;
else
d3:
if(!
r_bit)
d4;
d4:
d5;
//11100
d5:
d6;
//111000
//111001
d6:
d7;
//1110001
//1110000
d7:
if(r_bit)begin
//11100011
//11100010
endcase
Endmodule
编写仿真激励文件,得到如下波形,因为rom数据是上升沿读取,所以串行检测是在下降沿完成的,通过波形可以看出,当检测到11100010是,out_flag输出为高,反之输出为低,满足要求。
4.数码管显示
数码管显示代码如下:
(静态数码管)
moduledecled(ledin,ledout);
inputledin;
output[6:
0]ledout;
reg[6:
always@(ledin)
begincase(ledin)
1'
b1:
ledout<
=7'
b1110111;
//b
b0:
b0011111;
//a
default:
endcase
end
endmodule
5.顶层设计
顶层设计,按照之前的原理框图进行连接,连接完成后的代码如下:
moduletop(clk_50m,reset,data,clk_key);
inputclk_50m,reset,clk_key;
output[6:
0]data;
wirePin_Out;
wireflag_out;
debounce_moduleuut1(.CLK(clk_50m),.RSTn(reset),.Pin_In(clk_key),.Pin_Out(Pin_Out));
//消抖
decleduut2(.ledin(flag_out),.ledout(data));
//数码管显示
read_romuut3(.clk(Pin_Out),.da(da),.rst(reset));
//数据读取
schkuut4(.r_bit(da),.clk(Pin_Out),.rst(reset),.out_flag(flag_out));
//检测
编写仿真激励文件,得到如下波形,可以看到当,按键按下8次后,数码管输出a,当数码管又按下16次后,数码管输出b,满足要求。
6.引脚锁定
1.选择一个拨动开关为复位信号输入。
2.选择一个按键作为时钟输入。
3.50MHZ板上时钟为消抖计时时钟,引脚锁定是V10。
引脚锁定代码如下:
NET"
clk_key"
LOC="
G9"
|CLOCK_DEDICATED_ROUTE=FALSE;
clk_50m"
LOC=V10;
reset"
LOC=D14;
data[6]"
LOC=U5;
data[5]"
LOC=V5;
data[4]"
LOC=R5;
data[3]"
LOC=T5;
data[2]"
LOC=U8;
data[1]"
LOC=V8;
data[0]"
LOC=N6;
六、思考题
1、什么是IPCORE?
本次设计中ROM模块是如何进行设计输入的?
IP(IntellectualProperty)在嵌入式FPGA设计中,指的是某些设计好的模块,分为软件模块和硬件模块。
这些模块,一般都是已经测试好,所有功能完善的,由一些用户自己设计的。
有些模块是免费的,也有收费的模块。
所有用户都可以将这些IP核(IPCore)导入到自己的工程中,同样,所有用户也都可以定制自己的IP核。
本次设计中的rom的输入是通过.coe文件在配置ip核的使用进行指定的,编写规则按照xilinx官方给出的文档进行定义。
2、说明状态机代码表达的是什么类型的状态机,它的优点是什么?
详述其功能和对序列数检测的逻辑过程;
由于状态机输出与输入有关,所以该状态机为Mealy状态机。
状态机在系统时钟的控制下,电路按照预先设定的状态运行,有良好的同步时序,较好的解决了竞争冒险和毛刺现象。
状态的的结构使其在一个时钟周期内可以完成许多并行的运算和控制操作,与Moore有限状态机不同,Mealy有限状态机的输出不单与当前状态有关,而且与输入信号的当前值有关,Mealy有限状态机的输出直接受输入信号的当前值影响,而输入信号可能在一个时钟周期内任意时刻变化,这使得Mealy有限状态机对输入的响应发生在当前时钟周期,比Moore有限状态机对输入信号的响应要早一个周期。
七、实验体会
通过用状态机实现序列检测器的设计实验,初步熟悉和掌握了IPCORE的使用。
同时运用状态机实现序列检测器的设计,进一步掌握了课堂上所学到的知识,但同时充分的感觉到了自己的不足之处,今后一定要加强自己弱势方面的学习,用心学好EDA教科书上的知识,并抽时间在课外进行深入地学习,相信下次试验情况会有很大程度的改观。
附录
顶层模块激励文件如下:
moduletest_top;
//Inputs
regclk_50m;
regreset;
regclk_key;
//Outputs
wire[6:
0]data;
//InstantiatetheUnitUnderTest(UUT)
topuut(
.clk_50m(clk_50m),
.reset(reset),
.data(data),
.clk_key(clk_key)
initialbegin
//InitializeInputs
clk_50m=0;
reset=0;
clk_key=0;
#10reset=1;
#10reset=0;
//Wait100nsforglobalresettofinish
#10clk_50m=0;
clk_key=1;
;
forever
begin
#10clk_key=~clk_key;
end
//Addstimulushere