实验报告
课程名称: FPGA技术
实验名称: 用状态机实现序列检测器的设计
姓 名:
学 号:
班 级:
指导教师:
实验题目
一、 实验原理
1、实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。
2、实验内容:应用有限状态机设计思路,检测输入的串行数据是否是“010000”,本次实验由顶层文件、串行检测、并行数据转串行、数码管显示四个模块组成。
图3.1整体模块方块图
3、序列检测器的原理说明:
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出A,否则输出b。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等都将回到初始状态重新开始检测。例3-1描述的电路完成对特定的序列数"100101"的检测的部分HDL代码。当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“A”,否则仍然输出“b”。
4、系统共包括4个模块:
4.1、并行数据转串行数据模块(xulie.v)
1)、输入端口:
clk-----系统时钟,由按键K2通过消抖模块后提供。
din6-----6bits输入数据,需在时钟控制下,串行输出。
reset----系统复位信号,当reset=1’b1时,系统输出复位,否则系统正常工作。
2)、输出端口:
din----------1bit输出信号
3)、操作要求及功能描述:
1、异步复位,在时钟控制下,将并行输入数据din6[5:0],按照din[5],din[4],din[3],din[2], din[1],din[0]的顺序输出至串行检测模块的输入端口din。
2、根据设计要求,先画出并行数据转串行数据模块的状态转移图,在此基础上写出HDL代码。
3、比较实验指导书提供并行数据转串行数据模块(xulie.v)的参考代码,总结有限状态机的HDL设计方法
4.2、串行检测模块(schk.v)
1)、输入信号:
DIN-----1bit的串行输入数据
CLK-----同步输入时钟
CLR ------异步清零信号,当CLR=1,系统输出置0,否则,系统正常工作
2)、输出信号:
AB--------4bits数据,如果系统检测到6’b100101的串行输入,AB=4’b1010,否则,AB=4’b1011。
3)、操作要求及功能描述:
1、根据设计要求,画出串行检测模块(schk.v)的状态转移图,并自行设计HDL源代码。
2、用Verilog HDL设计数码管驱动电路、系统顶层电路。
3、注意顶层系统中,应加入消抖模块,对K2输入的时钟clk进行消抖处理。
注:剩下两个模块在第二次实验中都已经运用过,在这里不另做说明。
二、 实验步骤
(一)新建一个工程,为工程命名、指定存储路径和目标芯片等。(在 E 盘或者 DATA 盘的根目录下, 以自己的学号为文件名建立工程)。建议工程名、路径名中不要使用中文,file->New Project。
(二)选择 Top-level 的类型是 HDL。
图3.2 Top-level操作界面
(三)做好器件、EDA工具的正确选择,才能使得正常完成锁定引脚、下载的操作。本次实验中仍采用ISE自带的综合和仿真工具。
图3.3器件和 EDA 工具选择界面
(四)建立新Verilog HDL模块编辑窗口,添加文件,选择Verilog Module,建立工程后建立工程后,开始分别设计:
1)并行数据转串行数据模块(xulie.v)
程序代码如下:
module xulie(clk, din6, reset, din);
input clk;
input[5:0] din6;
input reset;
output din;
parameter
s0 = 3'b000,
s1 = 3'b001,
s2 = 3'b010,
s3 = 3'b011,
s4 = 3'b100,
s5 = 3'b101;
reg[2:0] cur_state,next_state;
reg din;
always @ (posedge clk or posedge reset)
if(reset)
cur_state <= s0;
else
cur_state <= next_state;
always @ (cur_state or din6 or din )
begin
case (cur_state)
s0 : begin
din <= din6[5];
next_state <= s1;
end
s1 : begin
din <= din6[4];
next_state <= s2;
end
s2 : begin
din <= din6[3];
next_state <= s3;
end
s3 : begin
din <= din6[2];
next_state <= s4;
end
s4 : begin
din <= din6[1];
next_state <= s5;
end
s5 : begin
din <= din6[0];
next_state <= s0;
end
default : begin
din <= 1'b0;
next_state <= s0;
end
endcase
end
endmodule
2)串行检测模块(schk.v)
程序代码如下:
module schk(din,clk,reset,AB);
input din;
input clk;
input reset;
output[3:0]AB;
reg [3:0]AB;
reg[2:0] cur_state,next_state;
parameter
s0 = 3'b000,
s1 = 3'b001,
s2 = 3'b010,
s3 = 3'b011,
s4 = 3'b100,
s5 = 3'b101,
s6 = 3'b110;
always @ (posedge clk or posedge reset)
if(reset)
cur_state <= s0;
else
cur_state <= next_state;
always @ (cur_state or din)
begin
case(cur_state)
s0:begin AB<=4'b1011;next_state<=(din==0)?s1:s0;end
s1:begin AB<=4'b1011;next_state<=(din==1)?s2:s1;end
s2:begin AB<=4'b1011;next_state<=(din==0)?s3:s0;end
s3:begin AB<=4'b1011;next_state<=(din==0)?s4:s2;end
s4:begin AB<=4'b1011;next_state<=(din==0)?s5:s2;end
s5:begin if(din==0)begin AB<=4'b1010;next_state<=s6;end
else begin AB<=4'b1011;next_state<=s0;end end
s6:begin AB<=4'b1011;next_state<=(din==0)?s1:s0;end
endcase
end
endmodule
3)数码管显示模块(decled7s .v)
程序代码如下:
module decled7s(IN,OUT);
input [3:0]IN;
output [6:0]OUT;
reg [6:0]OUT;
wire [3:0]IN;
always @(IN)
begin
case(IN)
4'b1010: OUT<=7'b0001000;
4'b1011: OUT<=7'b0000011;
default: OUT<=0;
endcase
end
Endmodule
4)消抖模块(debounce_module.v)
程序代码如下:
module debounce_module ( CLK, RSTn, Pin_In, Pin_Out);
input CLK;
input RSTn;
input Pin_In;
output Pin_Out;
wire H2L_Sig;
wire L2H_Sig;
detect_module U1
(
.CLK( CLK ),
.RSTn( RSTn ),
.Pin_In( Pin_In ), // input - from top
.H2L_Sig( H2L_Sig ), // output - to U2
.L2H_Sig( L2H_Sig ) // output - to U2
);
delay_module U2
(
.CLK( CLK ),
.RSTn( RSTn ),
.H2L_Sig( H2L_Sig ), // input - from U1
.L2H_Sig( L2H_Sig ), // input - from U1
.Pin_Out( Pin_Out ) // output - to top
);
endmodule
(五)按照前述子模块的相同的设计步骤完成,用Verilog HDL将并行数据转串行数据模块(xulie.v)串行检测模块(schk.v)数码管显示模块(decled7s .v)组合为一个模块XULIEQI .v。
编写顶层文件将以上模块进行组合,程序代码如下:
`timescale 1ns / 1ps
module XULIEQI(CLK,RESET,din6, din, AB,LED7S);
input CLK,RESET;
input [5:0] din6;
output [6:0] LED7S;
output [3:0] AB;
output din;
wire din;
wire [3:0] AB;
xulie u1(CLK, din6, RESET, din);
schk u2(din,CLK,RESET,AB);
decled7s u3(AB,LED7S);
endmodule
(六)对XULIEQI .v进行综合,功能仿真,时序仿真。
(七)将XULIEQI .v文件和消抖模块,用Verilog HDL组合起来,建立顶层模块top.v, 该顶层模块不需要仿真。
程序代码如下:
`timescale 1ns / 1ps
module XULIEQI(CLK_50M,CLK,RESET,din6, din, AB,LED7S);
input CLK_50M,CLK,RESET;
input [5:0] din6;
output [6:0] LED7S;
output [3:0] AB;
output din;
wire din;
wire Pin_Out;
wire [3:0] AB;
debounce_module u0( CLK_50M, RESET, CLK, Pin_Out);
xulie u1(Pin_Out, din6, RESET, din);
schk u2(din,Pin_Out,RESET,AB);
decled7s u3(AB,LED7S);
Endmodule
(八)进行引脚锁定,然后验证程序后,下载,连接输入信号到FPGA,改变相应的拨动开关和按键,观察结果。
三、实验结果及分析
(一)、完成并行数据转串行数据模块(xulie.v)程序代码的编写之后,保存文件,然后对此模块进行综合。
方法为在sources窗口选中待综合模块(xulie.v),在process窗口双击Synthesize-XST,综合完后可以双击Synthesize-XST下的View RTL Schematic,得到综合后的电路图为:
图1、模块(xulie.v)的综合电路图
(二)、完成串行检测模块(schk.v)程序代码的编写之后,然后对此模块进行综合。由(一)同理可得:综合后的(schk.v)模块电路图为:
图2、模块(schk.v)的综合电路图
激励信号波形如下(序列号为010000):
添加Test Bench WaveForm文件,进行仿真仿真图如下:
根据激励波形和输出波形可得。当序列号为010000时,输出波形为1010,显示“A”,其他结果显示“B”,所以结果正确。
(三)、完成数码管显示模块(decled7s .v)程序代码的编写之后,然后对此模块进行综合。由(一)同理可得:综合后的(decled7s .v)模块电路图为:
图3、模块(decled7s .v)的综合电路图
添加Test Bench WaveForm文件,进行仿真仿真图如下:
(四)、完成消抖模块(debounce_module.v)程序代码的编写之后,然后对此模块进行综合。由(一)同理可得:综合后的(debounce_module.v)模块电路图为:
图4、模块(debounce_module.v)的综合电路图
(五)、将XULIEQI .v文件和消抖模块,用Verilog HDL组合起来,建立顶层模块top.v,然后进行整体综合,即综合后的整体模块电路图为:
图5、整体模块电路图
(六)进行引脚锁定,然后验证程序后,下载,连接输入信号到FPGA,改变相应的拨动开关和按键,观察结果。按下K5键,再连续点击K2键六下,发现在第六次按下之后,才开始显示的B变成了A,其设计结果正确。
四、实验思考题解答(实验指导书要求的思考题)
1、说明代码表达的是什么类型的状态机,它的优点是什么?详述其功能和对序列数检测的逻辑过程:
答:由于状态机输出AB与输入DIN有关,有一定的延时,所以该状态机为Mealy状态机。状态机在系统时钟的控制下,电路按照预先设定的状态运行,有良好的同步时序,较好的解决了竞争冒险和毛刺现象。状态的的结构使其在一个时钟周期内可以完成许多并行的运算和控制操作,与Moore有限状态机不同,Mealy有限状态机的输出不单与当前状态有关,而且与输入信号的当前值有关,Mealy有限状态机的输出直接受输入信号的当前值影响,而输入信号可能在一个时钟周期内任意时刻变化,这使得Mealy有限状态机对输入的响应发生在当前时钟周期,比Moore有限状态机对输入信号的响应要早一个周期。
状态图如下:
图6.状态图
五、体会
本次实验中,又对软件操作熟悉了一遍,操作过程更加熟悉了,加快实验的进展,不过在实验过程中,也遇到了很多问题,最主要的问题是在程序编写上面,特别是在编写序列检测时。要事先画状态图,根据状态图来进行编写关键检测部分,我觉得这是很关键的部分。
第二篇:FPGA实验报告——第二次
FPGA实验报告
第二次实验:
模块设计:新建模块文件
模块连接:
创建下层文件:
时钟产生模块:
数据抽取模块:
数据选择操作模块:
创建VHDL文件:程序
library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity DataGate is
Port(
Input : in std_logic_vector(7 downto 0);
Aclr , clk :in std_logic;
Output : out std_logic_vector(7 downto 0)
);
End entity;
Architecture datagate_arch of DataGate is
Begin
Process(aclr ,clk)
Begin
If aclr = '1'then
Output <= "ZZZZZZZZ";
Else
If clk'event and clk = '1' then
If (input < 7) then --smaller than 7
Output <= "00000000";
Else
If (input > 248) then --bigger than 248
Output <= "11111111"
Else
Output <= input;
End if;
End if;
End if;
End if;
End process;
End datagate_arch;