VHDL实验报告

时间:2024.3.31

西安电子科技大学

实验报告

班 级:        

学 号:    

姓 名:      

地 点:    E-505     

批 次:     第二批     

时 间:星期五下午、晚上

          实验一 3-8译码器电路设计实验

(一)实验名称:

3-8译码器电路设计

(二)实验目的:

1)掌握ISE开发工具的使用,掌握FPGA开发的基本步骤;

2)掌握组合逻辑电路设计的一般方法;

3)掌握程序下载方法,了解UCF文件的格式;

4)初步了解开发板资源,掌握开发板使用方法。重点了解滑动开关和LED显示灯的使用方法。

5)理解并掌握VHDL程序的结构,掌握输入输出端口的含义;

(三)实验内容:

(1)用VHDL实现3-8译码器模块

译码器电路如图3-1所示。其功能如表3-1所示。试用VHDL完成该译码器的设计,并在开发板上进行检验。


                           表3-1 译码器功能表

(2)将程序下载到FPGA并进行检验

l  资源使用要求:

n  用滑动开关SW0~SW4作为输入A,B,C,G1;

n  滑动开关BTN_EAST,BTN_WEST作为控制端G2A,G2B;

n  8个LED灯表示8个输出。

l  检验方法:

当SW0处于OFF(G1=1)或者SW1处于ON(G2A=1)或者SW2处于ON(G2B=1)位置时,所   有LED灯灭;

当SW0处于ON(G1=1),且BTN_EAST,BTN_WEST均处于OFF状态时,反映当前输入的译码输出在LED灯上显示,即当输入为000(滑动开关SW0-SW2处于OFF状态),LED0亮,其它灯灭,等等。

(四)实验步骤:

1)启动ISE,新建工程文件,编写3-8译码器的VHDL模块;

2)新建UCF文件,输入位置约束;

3)完成综合、实现,生成下载文件;

4)连接开发板USB下载线,开启开发板电源;

5)下载到FPGA;

6)拨动开关,验证结果是否正确。

(五)实验代码:

  entity decode38 is

    Port ( A : in  STD_LOGIC;

           B : in  STD_LOGIC;

           C : in  STD_LOGIC;

           G1 : in  STD_LOGIC;

           G2A : in  STD_LOGIC;

           G2B : in  STD_LOGIC;

           Y : out  STD_LOGIC_VECTOR (7 downto 0));

end decode38;

architecture Behavioral of decode38 is

signal din: std_logic_vector(2 downto 0);

begin

    din <= C&B&A;

    PROCESS(din,G1,G2A,G2B)

    begin

       if (G1='1' AND G2A='0' AND G2B='0') THEN

           case din is

              when "000" => Y<="00000001";

              when "001" => Y<="00000010";

               when "010" => Y<="00000100";

              when "011" => Y<="00001000";

              when "100" => Y<="00010000";

              when "101" => Y<="00100000";

              when "110" => Y<="01000000";

              when "111" => Y<="10000000";

              when others => Y<="00000000";

           end case;

       elsif(G1='0' OR G2A='1' OR G2B='1')THEN

          Y <= "00000000";

       else

          null;

       end if;

    end process;

end Behavioral;

约束性文件

NET "A" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP;

NET "B" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP;

NET "C" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP;

NET "G1" LOC = "N17" | IOSTANDARD = LVTTL | PULLUP;

NET "Y<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "G2A" LOC = "H13" | IOSTANDARD = LVTTL | PULLdown;

NET "G2B" LOC = "D18" | IOSTANDARD = LVTTL | PULLdown;

           实验二 可逆计数器设计实验

(一)实验名称:

八位可逆计数器电路设计

(二)实验目的:

1)进一步熟练ISE开发工具,巩固FPGA开发的基本步骤;

2)掌握设计仿真方法;

3)掌握时序逻辑电路设计的一般方法,掌握时钟分频程序设计方法;

4)理解VHDL的层次结构设计,掌握原理图输入方法;

5)巩固程序下载方法;

6)了解开发板时钟资源,以及时钟分频方法。

(三)实验内容:

本实验分多个模块实现,采用原理图输入方法完成设计输入。

(1)实现如下八位可逆计数器

可逆计数器电路图及功能表如图4-1和表4-1所示。用VHDL完成该电路模块的设计,并生成原理图。


                     表4-1 可逆计数器功能表

(2)资源使用要求及实现方法:

1)用LED0~LED7作为计数器输出显示,LED7为高位,LED0为低位;

2)SW0为计数方向up/dn控制;

3)SW1为计数允许EN控制端;

4)BTN_EAST为clr按钮;

5)计数时钟频率为1Hz,通过对50Mhz系统时钟分频得到,分频电路独立编写一个模块,如图4-2所示。完成模块设计,并生成原理图;

 

图4-2 1/5000000分频器

6)计数器扩展:可以对按键次数进行计数(按键为BTN_SOUTH),即通过SW2选择计数源。即当S='1'时,输出In1,当S='0'时,输出In2。

二选一电路如图4-3所示。

 

图4-3 二选一电路

7)将图4-1~图4-3三个模块连接起来,构成一个完整计数器。如图4-4所示。

(四) 实验步骤:

1)建立工程文件,顶层文件为原理图;

2)编写分频模块程序:输入50MHz系统时钟,输出为1Hz计数时钟;

3)编写2选1模块,输入为按键、1Hz时钟和开关SW2,输出为计数源;

4)编写计数器模块主程序模块;

5)在原理图中,将各个模块连接,使用pinhead分配引脚资源;

6)对程序进行功能仿真;

7)下载程序,进行验证。

(五)实验代码:

计数器COUNTER:

entity COUNTER is

    Port ( clr : in  STD_LOGIC;

           en : in  STD_LOGIC;

           updown : in  STD_LOGIC;

           clk : in  STD_LOGIC;

           y : out  STD_LOGIC_VECTOR (7 downto 0));

end COUNTER;

architecture Behavioral of COUNTER is

signal sum:STD_LOGIC_VECTOR (7 downto 0):="00000000";

begin

  process(sum,clr,en,updown,clk)

    begin

       if(clk'event and clk ='1')then    

         if(clr='1')then

           sum<="00000000";

           y<="00000000";

         elsif(en='0')then

           y<=sum;

         elsif(updown='1')then

           sum<=sum+1;

            y<=sum;

         else

           sum<=sum-1;

            y<=sum;

         end if;

       end if;

  end process;

end Behavioral;

分频器FREQ:

entity FREQ is

    Port ( clk50M : in  STD_LOGIC;

           clk1hz : out  STD_LOGIC);

end FREQ;

architecture Behavioral of FREQ is

begin

  process(clk50M)

  variable num:INTEGER range 0 to 50000002:=0;

  begin

     if(clk50M'event and clk50M ='1')then

       num:=num+1;

       if(num<25000000)then

           clk1hz<='1';

       else

           clk1hz<='0';

           if (num>50000000)then

              num:=0;

           end if;

       end if;

    end if;

  end process;

end Behavioral;

2选1数据选择器SEL:

entity SEL is

    Port ( in1 : in  STD_LOGIC;

           in2 : in  STD_LOGIC;

           S : in  STD_LOGIC;

           Dout : out  STD_LOGIC);

end SEL;

architecture Behavioral of SEL is

begin

  process(in1,in2,S)

  begin

    if(S = '0')then

       Dout <= in1;

     else

       Dout <= in2;

     end if;

  end process;

end Behavioral;

顶层文件TOP:

entity TOP is

    Port ( BTN_EAST : in  STD_LOGIC;

           SW1 : in  STD_LOGIC;

           SW0 : in  STD_LOGIC;

           CLK : in  STD_LOGIC;

           BTN_SOUTH : in  STD_LOGIC;

           SW2 : in  STD_LOGIC;

           Y : out  STD_LOGIC_VECTOR (7 downto 0));

end TOP;

architecture Behavioral of TOP is

    COMPONENT FREQ

    PORT(

       clk50M : IN std_logic;         

        clk1hz : OUT std_logic

       );

    END COMPONENT;

    COMPONENT SEL

    PORT(

       in1 : IN std_logic;

       in2 : IN std_logic;

       S : IN std_logic;         

       Dout : OUT std_logic

       );

    END COMPONENT;

    COMPONENT COUNTER

    PORT(

       clr : IN std_logic;

       en : IN std_logic;

       updown : IN std_logic;

       clk : IN std_logic;         

       y : OUT std_logic_vector(7 downto 0)

       );

    END COMPONENT;

signal CLKOUT:STD_LOGIC;

signal JIX:STD_LOGIC;

begin

Inst_FREQ: FREQ PORT MAP(

       clk50M =>CLK ,

       clk1hz =>CLKOUT

);

Inst_SEL: SEL PORT MAP(

    in1 =>CLKOUT,

    in2 =>BTN_SOUTH,

    S =>SW2,

    Dout =>JIX

);

Inst_COUNTER: COUNTER PORT MAP(

    clr =>BTN_EAST,

    en =>SW1,

    updown =>SW0,

    clk =>JIX,

    y =>Y

);

约束性文件

NET "clr" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP;

NET "en" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP;

NET "updown" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP;

NET "Y<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "clk" LOC = "C9" | IOSTANDARD = LVCMOS33 ;

NET "clk" PERIOD = 20.0ns HIGH 40%;

NET "SW2" LOC = "V4" | IOSTANDARD = LVTTL | PULLdown;

        实验三  按键抖动消除及验证电路设计

(一)实验名称:

按键抖动消除及验证电路设计

(二)实验目的:

1)进一步熟练ISE开发工具,巩固FPGA开发的基本步骤,掌握功能仿真方法;

2)了解按键抖动的原因,抖动消除方法;

3)掌握状态机的设计方法;

4)掌握消除抖动的状态机设计方法;

5)巩固程序下载方法。

(三)实验内容:

(1) 原理简介


按键动作发生时,按键的输出会出现不稳定的逻辑’0’和逻辑’1’的跳变。该信号直接输入到计数器之类电路,会发生计数错误。如图5-1所示。去抖的目的是根据抖动信号产生如图5-2所示的信号。

图5-1 信号抖动(pushbtn)


                                  图5-2 去抖后的信号(key_out)

(2) 提示:状态机设计思路

设置六个状态:S0,S1,S2,S3,S4,S5。

电路启动时,进入复位状态S0,在S0状态下,去抖输出信号key_out为‘0’,时钟信号divclk(频率为2.5Mhz,通过50Mhz系统时钟20分频得到)以一定频率采样按键输入信号pushbtn,如果采样到pushbtn = ‘0’,则停留在S0状态,并继续采样,一旦采样到pushbtn=’1’,则转入S1延时状态,进行消抖延时(延时可以用计数器来完成,比如50个divclk周期),当延时结束时,Delay_end=’1’,则转入S2状态,在此状态下,时钟信号divclk以一定频率采样按键输入pushbtn,如果pushbtn = ‘0’则转入S0,否则转入S3;状态S3,S4的转换过程和条件与S2相同,在状态S4下,如果pushbtn=’1’,则转入S5状态,当进入S5时,表示经过S2,S3,S4三个连续状态检测按键输入pushbtn都为‘1’,则认为按键处于稳定状态,在S5输出按键确认信号key_out =’1’。

同时在状态S5下,时钟信号divclk检测按键输入pushbtn,如果pushbtn = ‘1’,表示按键未释放,继续停留在S5,检测输入信号,如果检测到pushbtn= ‘0’,表示按键已经释放,输出key_out= ‘0’, 返回到状态S0,等待下一次按键操作。


(3)完成验证电路设计

设计一个按键计数器,通过选择开关,对未去抖的信号和去抖后的信号分别进行计数。验证设计的正确性。完整的原理图如图5-3所示。

提示,去抖电路的采样时钟最好通过50Mhz进行分频后产生。


图5-3 完整电路


实际设计电路如下图所示:

资源使用要求:

1)用LED0~LED7作为计数输出。资源约束为:

NET "y<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "y<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "y<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "y<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "y<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "y<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "y<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "y<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

2)BTN_SOUTH作为待计数的按键。资源约束为:

NET "pushbtn" LOC = "K17" | IOSTANDARD = LVTTL | PULLDOWN;   #BTN_SOUTH

3)对去抖信号还是直接按键计数选择用SW1开关控制。即当SW1处于‘1’状态,对去抖后的信号计数,否则直接对按键btn_south计数。资源约束为:

NET "jitteren" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP ;      #SW1

4)SW0用来控制加1计数还是减1计数,当up/dn = '1'时,加1计数。资源约束为:

NET "updown" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP ;        #SW0

5)BTN_EAST作为计数器清0控制,当按下时,对计数器清0,资源为:

NET "clr" LOC = "H13" | IOSTANDARD = LVTTL | PULLDOWN ;         #BTN_EAST

6)系统时钟为50Mhz,资源为:

NET "clk55Mhz" LOC = "C9" | IOSTANDARD = LVCMOS33 ;

注:状态机使用对系统时钟进行分频后的时钟信号。

(四)实验步骤:

1)画出电路的状态转换图;

2)编写完整的VHDL程序;

3)下载程序,进行验证

(五)实验代码:

  器件之间的连接图:


消抖电路的设计

entity xiaoxiao is

    Port ( clk : in  STD_LOGIC;

           rst : in  STD_LOGIC;

           keyin : in  STD_LOGIC;

           keyout : out  STD_LOGIC);

end xiaoxiao;

architecture Behavioral of xiaoxiao is

    TYPE states IS (S0,S1,S2,S3,S4,S5);

    SIGNAL next_state: states;

BEGIN

PROCESS (clk,rst,keyin)

variable count:integer:= 1000;

begin

    IF (rst = '1') THEN

      next_state <= s0;

    ELSIF (clk'EVENT AND clk = '1')THEN

      CASE next_state IS

          when s0 =>

           if (keyin = '1')then

              next_state <= s1;

           else null;

           end if;

          when s1=>

           count := count -1;

           if (count = 0) then

              count := 1000;

              next_state <= s2;

           else null;

           end if;

when s2=>

           if (keyin='0') then

                 next_state <= s0;

           else  next_state <= s3;

           end if;

          when s3=>

           if (keyin='0') then

                  next_state <= s0;

           else   next_state <= s4;

           end if;

          when s4=>

           if (keyin='0') then

               next_state <= s0;

           else

               next_state <= s5;

               keyout <= '1';

           end if;

          when s5=>

           if (keyin='0') then

               keyout <= '0';

               next_state <= s0;

           end if;

         end case;

       end if;

    End process;

end Behavioral;

约束性文件

NET "clr" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP;

NET "updn" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP;

NET "sel" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP;

NET "Y<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "Y<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;

NET "divclk" LOC = "C9" | IOSTANDARD = LVCMOS33 ;

NET "divclk" PERIOD = 20.0ns HIGH 40%;

NET "but" LOC = "V4" | IOSTANDARD = LVTTL | PULLdown;

           实验四  两人乒乓球游戏

一)实验名称:

两人乒乓球游戏

(二)实验目的:

1)进一步熟练ISE开发工具,巩固FPGA开发的基本步骤,掌握功能仿真方法;

2)巩固状态机的设计方法;

3)巩固按键消抖电路设计方法;

4)掌握多进程程序设计方法;

5)巩固程序下载方法;

6)了解开发板时钟资源,以及时钟分频方法。

(三)实验内容:

(1) 原理简介

两人乒乓游戏机用8个发光二极管代表乒乓球台,中间两个发光二极管作为乒乓球网,用点亮的发光二极管按照一定的方向移动来表示球的运动。在游戏机的两侧各设置发球和击球开关,甲乙双方按乒乓球比赛规则来操作开关。当甲方按动发球开关时,靠近甲方的第一个发光二极管亮,然后发光二极管由甲方向乙方依次点亮,代表乒乓球的移动,当球过网后,按照设计者规定的球位乙方就可以击球。若乙方提前击球或者未击到球,则甲方得分。然后重新发球比赛,直到一方达到21分为止,记分清0,重新开始新一局比赛。

(2) 提示:状态机设计思路

设置七个状态:“等待发球状态”、“第一盏灯亮状态”、“第八盏灯亮状态”、“球向乙移动状态” 、“球向甲移动状态”、“允许甲击球状态” 、“允许乙击球状态”。开始的时候处于“等待发球状态”,若甲发球则状态转移到“第一盏灯亮状态”,若乙发球则转移到“第八盏灯亮状态”。以甲发球为例:若发球后乙没有提前击球(规定球移动到对方第一个发光二极管时允许击球),那么状态机从“第一盏灯亮状态”转移到“球向乙移动状态”,若此时乙依然没有提前击球,状态就转移到“允许乙击球状态”,在此状态下,如果乙击球了,那么状态就转移到“球向甲移动状态”。在“第一盏灯亮状态”、“球向乙移动状态”中,如果乙击球了,就算提前击球,这样甲得分,状态转移到“等待发球状态”等待发球。“球向甲移动状态”之后的过程和前面的过程只不过是甲乙角色的调换而已,状态转移规则一样。状态转换图如图5-1所示。


图6-1 乒乓球游戏状态转换图

(3)实体设计提示

在输入端口上:

1)考虑一个异步置位端口reset,用于在系统不正常时回到初始常态;

2)两个发球输入端serve1和serve2,逻辑‘1’分别标识甲方和乙方发球;

3)两个击球输入端hit1和hit2,逻辑‘1’分别标识甲方和乙方击球;

4)一个开始游戏按钮startbtn,处于逻辑‘1’标识可以游戏;

5)时钟输入端口clk;

输出端口:

   8个二极管,标识乒乓球台。

(4)资源使用要求

1)用LED0~LED7作为乒乓球台,其中LED3,LED4作为球网,总是点亮;

2)BTN_EAST作为开始游戏按钮,按下一次,重新开始游戏;

3)BTN_SOUTH,BTN_EAST分别作为甲乙发球按钮;

4)SW0作为甲击球开关,SW3作为乙击球开关。击球的动作为ON-OFF。

(四)实验步骤:

1)画出游戏的状态转换图;

2)建立程序工程;

3)编写按键去抖进程

4)编写状态机进程;

5)下载程序,进行验证。

(五)实验代码:

QQ图片20160105191529
器件之间的连接图:

核心计数器件pingpang:

entity pingping is

    Port ( reset : in  STD_LOGIC;

           clk : in  STD_LOGIC;

           hit1 : in  STD_LOGIC;

           hit2 : in  STD_LOGIC;

           sever : in  STD_LOGIC_VECTOR (1 downto 0);

           start : in  STD_LOGIC;

           light : out  STD_LOGIC_VECTOR (7 downto 0));

end pingping;

architecture Behavioral of pingping is

type

pingpong is(waitserve,light1on,ballmoveto8,allow2hit,light8on,ballmoveto1,allow1hit);

signal state:pingpong;

signal i:integer range 0 to 9;

signal count1,count2:std_logic_vector(1 to 4):="0000";

signal count:std_logic_vector(1 to 8);

begin

main:process(clk,reset)

begin

if (reset='1') then

   i<=0;count1<="0000";count2<="0000";

elsif (clk'event and clk='1')then

  if(count1="0101"or count2="0101")then

         count<=count1&count2;

          i<=9;--结束时显示总比分

--count1<="0000";count2<="0000";

  else

     case state is

     when waitserve=> --发球状态

    if (start='1') then

      case serve is

           when "10"=> i<=1;state<=light1on;

           when "01"=> i<=8;state<=light8on;

           when "11"=> i<=0;

           when others=> i<=0;

      end case;

    else

       count<=count1&count2;i<=9;  --暂停时显示当前比分

    end if;

     when light1on=>  --第一盏灯亮状态

   i<=2;

    if hit2='1' then

      i<=0;

      count1<=count1+1;state<=waitserve;

    else

      state<=ballmoveto8;

    end if;

      when light8on=> --第八盏灯亮状态

     i<=7;

    if hit1='1' then

      i<=0;

      count2<=count2+1;state<=waitserve;

    else

      state<=ballmoveto1;

    end if;

      when ballmoveto1=>  --球向甲方方向移动状态;

    if hit1='1' then

       i<=0;

       count2<=count2+1;state<=waitserve;

    elsif i=2 then i<=1;

          state<=allow1hit;

    else i<=i-1;

    end if;

      when ballmoveto8=>  --球向乙方方向移动状态;

    if hit2='1'then

       i<=0;

       count1<=count1+1;state<=waitserve;

    elsif i=7 then i<=8;

       state<=allow2hit;

    else i<=i+1;

    end if;

      when allow1hit=>  --允许甲方击球状态

    if hit1='1' then i<=2;

       state<=ballmoveto8;

        else count2<=count2+1;i<=0;

          state<=waitserve;

        end if;

      when allow2hit=>  --允许乙方击球状态

    if hit2='1' then i<=7;

          state<=ballmoveto1;

    else count1<=count1+1;i<=0;

         state<=waitserve;

    end if;

   end case;

    end if;

    end if;

   end process main;

led:process(clk)

begin

   if(clk'event and clk='1')then

if(i=1) then light<="10011000" ;

elsif(i=2) then light<="01011000" ;

elsif(i=3) then light<="00111000" ;

elsif(i=4) then light<="00011000" ;

elsif(i=5) then light<="00011000" ;

elsif(i=6) then light<="00011100" ;

elsif(i=7) then light<="00011010" ;

elsif(i=8) then light<="00011001" ;

elsif(i=9) then light<=count;

elsif(i=0) then light<="00011000" ;

else null;

end if;

end if;

end process led;

end Behavioral;

2.5M分频器件qwqw:

entity qwqw is

    Port ( clk50m : in  STD_LOGIC;

           clk : out  STD_LOGIC);

end qwqw

architecture Behavioral of qwqw is

begin

process(clk50m)

variable n : INTEGER RANGE 0 to 50000000;

begin

if (clk50m'event and clk50m='1') then

n:=n+1;

if n<=25000000 then

clk<='0';

elsif n=50000000 then

n:=0;

else

clk<='1';

end if;

end if;

end process;

end Behavioral;

1HZ分频器件wwww:

entity wwww is

    Port ( clk50m : in  STD_LOGIC;

           clk1 : out  STD_LOGIC);

end wwww;

architecture Behavioral of wwww is

begin

process(clk50m)

variable n : INTEGER RANGE 0 to 20;

begin

if (clk50m'event and clk50m='1') then

n:=n+1;

if n<=10 then

clk1<='0';

elsif n=20 then

n:=0;

else

clk1<='1';

end if;

end if;

end process;

end Behavioral;

消抖器件xiaoxiao:

entity xiaoxiao is

    Port ( clk : in  STD_LOGIC;

           rst : in  STD_LOGIC;

           keyin : in  STD_LOGIC;

           keyout : out  STD_LOGIC);

end xiaoxiao;

architecture Behavioral of xiaoxiao is

    TYPE states IS (S0,S1,S2,S3,S4,S5);

    SIGNAL next_state: states;

BEGIN

PROCESS (clk,rst,keyin)

variable count:integer:= 1000;

begin

    IF (rst = '1') THEN

      next_state <= s0;

    ELSIF (clk'EVENT AND clk = '1')THEN

      CASE next_state IS

          when s0 =>

           if (keyin = '1')then

              next_state <= s1;

           else null;

           end if;

          when s1=>

           count := count -1;

           if (count = 0) then

              count := 1000;

              next_state <= s2;

           else null;

           end if;

when s2=>

           if (keyin='0') then

                 next_state <= s0;

           else  next_state <= s3;

           end if;

          when s3=>

           if (keyin='0') then

                  next_state <= s0;

           else   next_state <= s4;

           end if;

          when s4=>

           if (keyin='0') then

               next_state <= s0;

           else

               next_state <= s5;

               keyout <= '1';

           end if;

          when s5=>

           if (keyin='0') then

               keyout <= '0';

               next_state <= s0;

           end if;

         end case;

       end if;

    End process;

end Behavioral;

约束性文件

NET "sever<0>" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP ;

NET "sever<1>" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP ;

NET "start" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP ;

NET "hit1" LOC = "H13" | IOSTANDARD = LVTTL | PULLDOWN ;

NET "reset" LOC = "V4" | IOSTANDARD = LVTTL | PULLDOWN ;

NET "hit2" LOC = "K17" | IOSTANDARD = LVTTL | PULLDOWN ;

NET "light<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "light<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "light<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "light<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "light<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "light<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "light<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "light<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;

NET "clk" LOC = "C9" | IOSTANDARD = LVCMOS33 ;

实验感悟:

    本次实验让我们熟悉了ISE软件的使用以及硬件描述语言的基础使用。学会了设计时序逻辑电路,状态机的设计以及相关流程。在这些实验中学会了分频器的设计,二选一的设计,消抖电路的设计。学会了FPGA开发板的简单使用。总之受益匪浅。

更多相关推荐:
3d实验报告

实验报告实验报告院系信息科学与技术学院课程名称三维动画设计日期实验报告九江学院实验报告实验报告实验报告实验报告实验报告实验报告院系信息科学与技术学院课程名称三维动画设计日期九江学院3D王燕信A1131实验报告

3D实验报告

景德镇陶瓷学院设计艺术学院实验报告课程名称计算机辅助设计三维设计姓名戈瑞琪教师董翠专业班级08陶设4班成绩日期实验项目名称1基础工具2建模3材质4灯光摄影机5渲染实验学时1基础工具8学时2建模32学时3材质16...

3d实习报告

前言所谓三维设计就是利用电脑进行设计与创作以产生真实的立体场景与动画虽然在这个学期对3DSMAX的接触才知道3DSMAX是一个广泛应用于游戏开发后期制造影视特效及专业视觉设计领域的一款功能强大的三维设计软件它是...

unity 3d实验报告

江南大学Unity3D实验报告实验题目班级姓名学号日期一目的与要求1理解使用Unity3D制作游戏的基本过程和方法2理解Unity3D软件的操作界面3掌握地形的创建和简单编辑方法4掌握游戏场景中光源的添加和设置...

3D打印实验报告

姓名:学号:指导教师:20xx年x月x日一、技术介绍3D打印是一种通过材料逐层添加制造三维物体的变革性、数字化增材制造技术,它将信息、材料、生物、控制等技术融合渗透,将对未来制造业生产模式与人类生活方式产生…

3D MAX过程训练实验报告

3D MAX过程训练实验报告,内容附图。

3d实验报告建筑材质 灯光

本科学生综合性实验报告项目组长郭恺学号0094326成员郭恺专业09环艺2班实验项目名称建筑材质灯光设计指导教师及职称陈茜讲师开课学期20xx至20xx学年二学期上课时间20xx年3月30日学生实验报告一实验综...

C语言实验报告顺序结构(程序代码)

C语言实验顺序结构实验报告程序代码顺序结构第一题includeltstdiohgtincludeltconiohgtmainfloathcprintfquot请输入相应的华氏温度hquotscanfquotfq...

人机交互实验报告

实验一实验名称最新人机交互技术实验目的了解最新人机交互的研究内容实验内容通过网络查询最新人机交互相关知识人机交互人机互动英文HumanComputerInteraction或HumanMachineIntera...

3ds max实验报告一

3ds max实验报告一,内容附图。

AE提高性实验报告

提高型实验报告实验课题KobeBryant设计型应用型实验类型综合型实验课程非线性编辑专业名称教育技术学实验班级教育技术学1101实验者周洁实验时间20xx12教育科学与技术学院一实验目的1熟悉3D层的操作2掌...

unity实验报告

安徽科技学院unity课程实习报告所在专业地理信息系统组长姓名杨明明220xx10124组内成员刘德旺220xx10114所在院系指导教师日期一实验目的及要求本次实验的总的目的是通过具体的程序的编写与unity...

3d实验报告(35篇)