当前位置:文档之家› VHDL实验报告

VHDL实验报告

VHDL实验报告
VHDL实验报告

西安电子科技大学

实验报告

班级:

学号:

姓名:

地点: 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 74x138 3-8译码器

板上进行检验。

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

●资源使用要求:

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

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

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

●检验方法:

当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 完成该电路模块的设计,并生成原理图。

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

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

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

clr

en clk

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7

图4-1 可逆计数器原理图

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)对程序进行功能仿真;

clk

Y0(LED0)

Y3(LED3) Y4(LED4)

Y5(LED5) Y6(LED6) Y7(LED7)

图4-4 完整的可逆计数器

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 ;

去抖状态机模块

2选1模块

按键 选择 计数器核心进程

Y0(LED0) Y3(LED3) Y4(LED4) Y5(LED5) Y6(LED6) Y7(LED7)

Y1(LED1) Y2(LED2) up/dn 2.5Mhz 分频 clr

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)下载程序,进行验证。

(五)实验代码:

器件之间的连接图:

核心计数器件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;

VHDL实验报告

《创新实验》实验报告 —基于VHDL的编程和硬件实现

一、实验目的 1.熟悉和掌握硬件描述语言VHDL的基本语法及编写; 2.掌握软件Xilinx ISE 10.1的使用; 3.熟悉SDZ-6电子技术实验箱的使用; 4.了解节拍脉冲发生器等基本电路的实现; 5.了解八位二进制计数器的功能与设计; 6.学习键盘和七段数码管显示的控制和设计。 二、实验内容 1.Xilinx ISE 10.1软件的使用; 2.节拍脉冲发生器等基本电路的实现; 3.八位二进制计数器的实现 4.键盘扫描及显示的实现 三、实验器材 1、PC机 2、SDZ-6电子技术实验箱 3、正负5V电源 4、I/O接口线 四、软件的使用 在安装Xilinx10.1软件时,需要一个ID号,其实这个ID号是可以重复使用的,几个同学在官网注册后就可以共享ID号了。 安装完成之后就可以使用这个软件编写相应的VHDL的程序。 1.新建工程 File—>New Project 弹出下面的对话框 输入工程名后单击Next。然后根据本实验的实验箱进行以下设置。

以后的步骤一般都是单击Next(有些资料上会介绍有些这些步骤的具体功能,但对于本实验不必用到),最后单击Finish,完成新建一个工程。在窗口的左边会出现刚刚新建的工程,如下: 2.新建一个VHDL的源文件。 在上图中,右击工程选择New Source ,弹出如下对话框。

在对画框的左边选择VHDL Module,输入文件的名字(改名字最好是你定义的实体的名字)。单击Next。出现下面的对话框。 该对话框主要是对外部端口的编辑。可以直接跳过,即单击Next,在源文件上编辑端口。然后在接下来的对话框中单击Finish。完成建立一个源文件。窗口右边就会出现刚才编辑的源文件。 3.编写和编译代码 将事先编好的代码复制到源文件里,然后保存文件。 选中左边的文件名,在窗体的左边出现如下编辑文档内容。

VHDL实验报告03137

VHDL实验报告 60 庄炜旭实验三. 4位可逆计数器,4位可逆二进制代码-格雷码转换器设计 一.实验目的 学习时序电路的设计,仿真和硬件测试,进一步熟悉VHDL设计技术 1. 学习4位可逆计数器的设计 2. 学习4位可逆二进制代码-格雷码转换器设计 二.实验内容 设计4位可逆计数器,及4位可逆二进制代码-格雷码转换器,并仿真,下载。 [具体要求] 1.4位可逆计数器 a)使用CLOCK_50作为输入时钟,其频率为50MHz(对于频率大于50Hz的闪烁, 人眼会看到连续的光),因而,对其进行225的分频后,再用于时钟控制。(可 利用实验一) b)使用拨码开关SW17作为模式控制,置‘1’时为加法计数器,置‘0’时为减 法计数器,同时使用LEDR17显示SW17的值。 c)使用KEY3作为异步复位开关(按下时为0,不按为1),当为加法计数器时, 置“0000”,当为减法计数器时,置“1111”。 d)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高 位,LEDR0为低位。 2.4位可逆二进制代码――格雷码转换器 a)使用拨码开关SW17作为模式控制,置‘1’时为二进制代码―>格雷码转换, 置‘0’时为格雷码―>二进制代码,同时使用LEDR17显示SW17的值。 b)使用拨码开关SW3, SW2, SW1, SW0作为输入的被转换数,SW3为高位,SW0 为低位。 c)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高 位,LEDR0为低位。 三.管脚设定 SW[0]PIN_N25 SW[1]PIN_N26 SW[2]PIN_P25 SW[3] PIN_AE14 SW[17] PIN_V2 LEDR[0] PIN_AE23 LEDR[1] PIN_AF23 LEDR[2] PIN_AB21 LEDR[3] PIN_AC22 LEDR[17] PIN_AD12 KEY[3] PIN_W26

基于VHDL语言的EDA实验报告(附源码)

EDA 实验报告 ——多功能电子钟 姓名:张红义 班级:10级电科五班 学号:1008101143 指导老师:贾树恒

电子钟包括:主控模块,计时模块,闹钟模块,辅控模块,显示模块,蜂鸣器模块,分频器模块。 1.主控模块: 主要功能:控制整个系统,输出现在的状态,以及按键信息。 源代码: libraryieee; use ieee.std_logic_1164.all; useieee.std_logic_arith.all; useieee.std_logic_unsigned.all; entity mc is port(functionswitch,k,set,lightkey: in std_logic; chose21,setout: out std_logic; lightswitch:bufferstd_logic; modeout,kmodeout : out std_logic_vector(1 downto 0); setcs,setcm,setch,setas,setam,setah:outstd_logic); end mc; architecture work of mc is signalmode,kmode:std_logic_vector(1 downto 0); signal light,chose21buf:std_logic; signalsetcount:std_logic_vector(5 downto 0); begin process(functionswitch,k,set,lightkey) begin iffunctionswitch'event and functionswitch='1' then mode<=mode+'1'; end if; iflightkey'event and lightkey='1' then lightswitch<=not lightswitch; end if; if mode="01" thenchose21buf<='0'; else chose21buf<='1'; end if; ifk'event and k='1' then if mode="01" or mode="11" then kmode<=kmode+'1'; end if;end if; if set='1' then if mode = "01" then ifkmode="01" then setcount<="000001"; elsifkmode="10" thensetcount<="000010"; elsifkmode="11" then setcount<="000100";

VHDL实验报告论文

硬件描述语言期末实验报告 题目:硬件描述语言实现秒表功能 姓名xxxx 学号xxxxxxxxxx 年级专业xxxxxxxxxxxxx 指导教师xxxx 2012年6月20日

河北大学本科生VHDL硬件实验论文(设计) 硬件描述语言实现秒表功能 摘要 应用VHDL语言设计数字系统,很多设计工作可以在计算机上完成,从而缩短了数字系统的开发时间。我们尝试利用VHDL为开发工具设计数字秒表。 秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、数据选择器、和显示译码器等组成。在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外整个秒表还需有一个启动信号,暂停信号和一个清零信号,以便秒表能随意停止及启动。 关键词:VHDL语言数字秒表时序仿真图

目录 一、实验目的 (1) 二、硬件要求 (1) 三、引脚说明 (1) 四、模块介绍 (2) 4.1.计数器(六、十进制) (2) 4.2.蜂鸣器 (2) 4.3.译码器 (3) 4.4.控制器 (4) 五、整体连接图 (5) 六、实验结果 (6) 七、实验总结 (6) 八、谢辞 (7) 九、附录 (7)

一实验目的 学习使用VHDL语言,以及EDA芯片的下载仿真。 二硬件要求 (1)主芯片EPF10K10LC84-4。 (2)蜂鸣器。 (3)8位八段扫描共阴极数码显示管。 (4)二个按键(暂停,开关)。 三引脚说明 3.1引脚设置 3.2信号说明 signal q:std_logic_vector(3 downto 0); --q是用于分频的信号。 signal state: std_logic_vector(3 downto 0); --state为状态信号,state为1时为暂停记录状态,为0时为正常显示计数状态。signal led: std_logic_vector(3 downto 0); --led为数码管扫描信号,通过对d1~d6的选择使数码管发光。

VHDL实验报告

专用集成电路实验报告 13050Z01 1305024237 刘德文

实验一开发平台软件安装与认知实验 实验内容 1、本实验以三线八线译码器(LS74138)为例,在Xilinx ISE 9.2软件平台上完成设计 电路的VHDL文本输入、语法检查、编译、仿真、管脚分配和编程下载等操作。下载芯片选择Xilinx公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。 2、用1中所设计的的三线八线译码器(LS74138)生成一个LS74138元件,在Xilinx ISE 9.2软件原理图设计平台上完成LS74138元件的调用,用原理图的方法设计三线八线译 码器(LS74138),实现编译,仿真,管脚分配和编程下载等操作。 源程序: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all; entity ls74138 is Port ( g1 : in std_logic; g2 : in std_logic; inp : in std_logic_vector(2 downto 0); y : out std_logic_vector(7 downto 0)); end ls74138; architecture Behavioral of ls74138 is begin process(g1,g2,inp) begin if((g1 and g2)='1') then case inp is when "000"=>y<="00000001"; when "001"=>y<="00000010";

vhdl实验报告--蜂鸣器

VHDL 实验报告 一、实验目的 1、掌握蜂鸣器的使用; 2、通过复杂实验,进一步加深对VHDL语言的掌握程度。 二、实验原理乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让蜂鸣器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。 乐曲的12 平均率规定:每2 个八度音(如简谱中的中音1 与高音1)之间的频率相差1 倍。在2个八度音之间,又可分为12个半音。另外,音符A(简谱中的低音6)的频率为440Hz, 音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音I至高音1 之间每个音符的频率,如表所示。 音名频率/Hz 音名频率/Hz 音名频率/Hz 低音1 中音1 高音1 低音2 中音2 高音2 低音3 中音3 高音3 低音4 中音4 高音4 低音5 392 中音5 784 高音5 1568 低音6 440 中音6 880 高音6 1760 低音7 中音7 高音7 表简谱音名与频率的对应关系 产生各音符所需的频率可用一分频器实现, 由于各音符对应的频率多为非整数, 而分频系数又不能为小数, 故必须将计算得到的分频数四舍五入取整。若分频器时钟频率过低, 则由于分频系数过小, 四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但分频数将变大。实际的设计应综合考虑两方面的因素, 在尽量减小频率误差的前提下取合适的时钟频率。实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。 音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此, 要控制音符的音 长,就必须知道乐曲的速度和每个音符所对应的节拍数, 本例所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s 的话,那么一拍所应该持续的时间为秒,则只需要提供一个4HZ的时钟频率即可产生四分音符的时长。 本例设计的音乐电子琴选取40MHZ的系统时钟频率。在数控分频器模块,首先对时钟频率进行40分频,得到1MHZ的输入频率,然后再次分频得到各音符的频率。由于数控分频器 输出的波形是脉宽极窄的脉冲波, 为了更好的驱动蜂鸣器发声, 在到达蜂鸣器之前需要均衡占空比, 从而生成各音符对应频率的对称方波输出。这个过程实际上进行了一次二分频, 频率变为原来的二分之一即。 因此,分频系数的计算可以按照下面的方法进行。以中音1为例,对应的频率值为 523. 3Hz,它的分频系数应该为: 0.375MHZ 0.375 106 716 523.3 523.3

vhdl实验报告

福建农林大学计算机与信息学院 信息工程类 实验报告 2013年11 月13 日

实验项目列表

福建农林大学计算机与信息学院信息工程类实验报告 系:电子信息工程系专业:电子信息工程年级: 2010级 姓名:学号:实验课程: VHDL数字系统设计 实验室号:__ 田C407 实验设备号: 07 实验时间: 11.12 指导教师签字:成绩: 实验一数控分频器的设计 1.实验目的和要求 学习数控分频器的设计、分析和测试方法。 2.实验原理 信号有不同的分频比,数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可,详细设计程序如例1所示。 数控分频器的仿真波形如图1所示:输入不同的CLK频率和预置值D,给出如图1的时序波形。 100.0μs200.0μs300.0μs400.0μs 图1 当给出不同输入值D时,FOUT输出不同频率(CLK周期=50ns) 3.主要仪器设备(实验用的软硬件环境) 实验的硬件环境是: 微机一台 GW48 EDA实验开发系统一套 电源线一根 十芯JTAG口线一根 USB下载线一根 USB下载器一个 示波器 实验的软件环境是: Quartus II 9.0软件

4.操作方法与实验步骤 (1)创建工程,并命名位test。 (2)打开QuartusII,建立VHDL文件,并输入设计程序。保存为DVF. (3)选择目标器件。Acex1k—EP1K100QC208-3。 (4)启动编译。 (5)建立仿真波形图。 (6)仿真测试和波形分析。 (7)引脚锁定编译。 (8)编程下载。 (9)硬件测试 5.实验内容及实验数据记录 在实验系统上硬件验证例5-20的功能。可选实验电路模式1(第一章图4);键2/键1负责输入8位预置数D(PIO7-PIO0);CLK由clock0输入,频率选65536Hz 或更高(确保分频后落在音频范围);输出FOUT接扬声器(SPKER)。编译下载后进行硬件测试:改变键2/键1的输入值,可听到不同音调的声音。 6.实验数据处理与分析 1)实验代码 【例1】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DVF IS PORT ( CLK : IN STD_LOGIC; D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); FOUT : OUT STD_LOGIC ); END; ARCHITECTURE one OF DVF IS SIGNAL FULL : STD_LOGIC; BEGIN P_REG: PROCESS(CLK) VARIABLE CNT8 : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF CLK'EVENT AND CLK = '1' THEN IF CNT8 = "11111111" THEN CNT8 := D; --当CNT8计数计满时,输入数据D被同步预置给计数器CNT8 FULL <= '1'; --同时使溢出标志信号FULL输出为高电平 ELSE CNT8 := CNT8 + 1; --否则继续作加1计数 FULL <= '0'; --且输出溢出标志信号FULL为低电平 END IF; END IF; END PROCESS P_REG ; P_DIV: PROCESS(FULL) VARIABLE CNT2 : STD_LOGIC; BEGIN IF FULL'EVENT AND FULL = '1' THEN CNT2 := NOT CNT2; --如果溢出标志信号FULL为高电平,D触发器输出取反

VHDL实验报告一2选1多路选择器

实验一 实验目的: 熟悉quartus的vhdl文本设计流程全过程,学习简单的组合电路的设计,多层次的电路设计,仿真和硬件测试 二、实验内容 内容(一)用vhdl语言设计2选1多路选择器 参考例3-1程序设计如下: library ieee; use mux21a is port (a,b,s:in bit; y: out bit); end entity mux21a; architecture one of mux21a is begin y<=a when s='0' else b; end architecture one 全程编译后软件提示0错误,3警告,可以继续下面仿真操作。 程序分析: 这是一个2选1多路选择器,a和b分别为两个数字输入端的端口名,s为通道选择控制信号输入端的端口名,y为输出端的端口名。 时序仿真及分析: 时序仿真输入图: 时序仿真输出图: 时序分析: 由上面两图可以得知:当s=0时,y口输出a,当s=1时,y口输出b 下载和硬件测试: 引脚锁定图: 程序下载完成后,选择实验电路模式5,通过短路帽选择clock0接256Hz 信号,clock2接8Hz信号。通过键一控制s,当键一进行切换时,明显能听到扬声器发出两种不同音调的声音。 实验内容(二)双二选一多路选择器设计

程序设计: library ieee; use mux21a is port (a,b,s:in bit; y: out bit); end entity mux21a; architecture one of mux21a is begin y<=a when s='0' else b; end architecture one; entity muxk is port (a1,a2,a3,s0,s1:in bit; outy:out bit); end entity muxk; architecture bhv of muxk is component mux21a port (a,b,s:in bit; y:out bit); end component; signal tmp: bit; begin u1:mux21a port map(a=>a2,b=>a3,s=>s0,y=>tmp); u2:mux21a port map(a=>a1,b=>tmp,s=>s1,y=>outy); end architecture bhv; 全程编译后软件提示0错误,2警告 程序分析: 这是一个双2选1多路选择器,a1、a2和a3分别为两个数字输入端的端口名,s0、s1为通道选择控制信号输入端的端口名,outy为输出端的端口名。实体mux21a是一个2选一选通电路,实体muxk是元件的例化,其作用是将两个mux21a组合成一个3选1多路选择器。 时序仿真及分析: 时序仿真输入图 时序仿真输出图 时序分析: 从仿真出来的结果,我们不难发现,s0和s1做为a1、a2、a3的选通控制信号。当s0=0.、s1=0时,outy输出a1;当s0=0.、s1=1时,outy输出a2;当s0=1.、s1=0时,outy输出a1;当s1=1.、s2=1时,outy输出a3; 下载和硬件测试: 引脚锁定图

VHDL实验报告

VHDL实验报告 5080309563 李斌 实验三.4位可逆计数器,4位可逆二进制代码-格雷码转换器设计 [设计思路及步骤]: 一.需求: 设计4位可逆计数器,及4位可逆二进制代码-格雷码转换器,并仿真,下载。 [具体要求] 1.4位可逆计数器 a)使用CLOCK_50作为输入时钟,其频率为50MHz(对于频率大于50Hz的闪烁, 人眼会看到连续的光),因而,对其进行225的分频后,再用于时钟控制。(可 利用实验一) b)使用拨码开关SW17作为模式控制,置‘1’时为加法计数器,置‘0’时为减 法计数器,同时使用LEDR17显示SW17的值。 c)使用KEY3作为异步复位开关(按下时为0,不按为1),当为加法计数器时, 置“0000”,当为减法计数器时,置“1111”。 d)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高 位,LEDR0为低位。 2.4位可逆二进制代码――格雷码转换器 a)使用拨码开关SW17作为模式控制,置‘1’时为二进制代码―>格雷码转换, 置‘0’时为格雷码―>二进制代码,同时使用LEDR17显示SW17的值。 b)使用拨码开关SW3, SW2, SW1, SW0作为输入的被转换数,SW3为高位,SW0 为低位。 使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高位,LEDR0为低位。 二.变量解释: 4位可逆计数器: 1.clk为时钟输入,clkout为分频后的时钟,cnt为分频计数,ctr为SW17模式 控制,rst为KEY3异步复位开关,tem为输出结果的中间变量; 2.本实验的时钟输入为50MHz,定义为clk,为此设计时需要将其分频为50Hz, 需225分频,因此,代码中,需要有一个cnt作为一个225计数器,同时,定义 分频后的时钟为clkout; 3.建立process,检测key是否为0,为0则复位。否则,检测clkout,触发上升 沿则检测模式控制,对tem加1或减1,同时应检测是否达到最大或最小值, 达到最值则直接返回到最初值,否则继续操作; 4.最后,转换tem的值为相应的4位二进制数,并于LED上反映出来。 四位可逆二进制代码-格雷码转换器: 1.检测模式,进行相应的操作; 2.ctr为0则格雷码转换成二进制码;ctr为1则为二进制码转换为格雷码 [源代码]: 1)4位可逆计数器: library ieee; use ieee.std_logic_1164.all; entity cnt is

VHDL实验报告汇总

实验一4选一多路选择器 一:实验目的及实验环境 目的 1、熟悉ModelSim SE 6.5c的verilog 的文本设计流程,组合电路的设计、仿真和测试。 2、用verilog语言完成设计4选一多路选择器。 3、熟悉文本输入及仿真步骤。 4、初步了解可编程器件设计的全过程。 环境 1、P C 机一台 2、M odelSim SE 6.5c 二. 实验内容 1、用verilog语言完成设计4选一多路选择器, 2、用结构建模及数据流建模两种方法实现。 3、对于所设计的程序进行编译,检查纠错。 4、程序完善之后进行程序的仿真并进行波形的记录与分析 三.实验步骤 1、建立工程 2、添加文件到工程 3、编译文件 4、查看编译后的设计单元 5、将信号加入波形窗口 6、运行仿真 四.运行结果

五.总结 本次实验让我更加的熟悉modelsim使用方法,以及使用时应该注意的问题。在试验中也学习到了Verilog语法。在实验中我们应该注意verilog的格式要求,在用编程语言编程的时候,要自习留意语法标准,整理好逻辑思维的同时保证格式的正确。否则就会浪费大量的时间来完成实验。试验开始到结束这一过程中,我遇到了很多困难,后来都在同学的提醒和帮助下克服了。相信有了这次对这个语言和这个软件的接触,我们都有了更加深入的理解。 六.源代码 module mux41(a,b,c,d,s1,s0,out); input[1:0] a,b,c,d; input s1,s0; output[1:0] out; reg[1:0] out; always @(a or b or c or d or s 1 or s0) begin :mux41 case({s1,s0}) 2'b00: out<=a; 2'b01: out<=b; 2'b10: out<=c; 2'b11: out<=d; default: out=a; endcase end endmodule module sti; reg[1:0] a,b,c,d; reg s0,s1; wire[1:0] out; mux41 dtg(a,b,c,d,s0,s1,out); initial begin a=3'd0;b=3'd1;c=3'd2;d=3'd3; s0=0;s1=0; #100 a=3'd0;b=3'd1;c=3'd2;d= 3'd3;s0=0;s1=1; #100 a=3'd0;b=3'd1;c=3'd2;d= 3'd3;s0=1;s1=0; #100 a=3'd0;b=3'd1;c=3'd2;d= 3'd3;s0=1;s1=1; end endmodule

VHDL硬件描述语言实验报告

硬件描述语言实验附录 姓名:xxx 学号:xxx 指导教师:xxx 目录 硬件描述语言实验附录 (1) 实验1.三输入与门电路实验 (2) 实验2. 三—八译码器实验 (3) 实验3. D触发器实验 (4) 实验4. 分频器实验 (5) 实验5. 状态机实验 (8)

实验1.三输入与门电路实验 --三输入与门电路threeinput --姓名:王定 --学号:1306034248 --中北大学 LIBRARY IEEE; --调用库 USE IEEE.STD_LOGIC_1164.ALL;--库文件 -------------------------------------------------------------- ENTITY threeinput IS --定义实体名,其名称必须与VHDL文本文件名称相同PORT( A: IN STD_LOGIC; --输入端口,时钟输入 B: IN STD_LOGIC; --输入端口,个位写入使能 C: IN STD_LOGIC; --输入端口,十位写入使能 CO: OUT STD_LOGIC); --输出端口,溢出标志 END ENTITY threeinput; --结束端口定义 -------------------------------------------------------------- ARCHITECTURE RTL OF threeinput IS--定义结构体 BEGIN PROCESS(A,B,C) IS --开始,必须带上 BEGIN CO<=A AND B AND C ; END PROCESS; END ARCHITECTURE RTL; --结束结构体 表1. 三输入与门电路VHDL实验代码 图1. 三输入与门电路仿真波形图,A,B,C输入,CO输出

北邮数电VHDL实验报告

2009级数字电路实验报告 实验名称:EDA基础实验 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 【实验目的】 1.熟悉用QuartusII原理图输入法进行电路设计和仿真; 2.掌握QuartusII图形模块单元的生成与调用; 3.熟悉用VHDL语言设计组合逻辑电路和时序电路的方法; 4.熟悉用QuartusII文本输入法和图形输入法进行电路设计; 5.熟悉不同的编码及其之间的转换; 6.掌握触发器的逻辑功能及使用方法; 7.熟悉计数器、寄存器、锁存器、分频器、移位寄存器的设计方法 8.掌握VHDL语言的语法规范,掌握时序电路描述方法; 9.掌握多个数码管动态扫描显示的原理及设计方法。 【实验所用仪器及元器件】 1.计算机 2.直流稳压电源 3.数字系统与逻辑设计实验开发板 【实验内容】 1.用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。 2.用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功 能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信 号。

3.用3线-8线译码器(74LS138)和逻辑门设计实现函数F,仿真验证其功能,并下 载到实验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。 4.用VHDL语言设计实现一个3位二进制数值比较器,仿真验证其功能,并下载到实 验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。 5.用VHDL语言设计实现一个4选1的数据选择器;一个8421码转换为格雷码的代码 转换器;一个举重比赛裁判器;一个带同步置位和同步复位功能的D触发器;一个 带异步复位的4位二进制减计数器;一个带异步复位的8421码十进制计数器;一 个带异步复位的4位自启动环形计数器;一个带控制端的8位二进制寄存器,当控 制端为‘1’时,电路正常工作,否则输出为高阻态;一个分频系数为12,分频输 出信号占空比为50%的分频器。仿真验证其功能,并下载到实验板测试。要求用拨 码开关和按键开关设定输入信号,发光二极管显示输出信号。(注:有几个不需要 下载到实验板测试) 2.程序分析 全加器: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT(a,b:IN STD_LOGIC; co,so:OUT STD_LOGIC); END ENTITY h_adder; ARCHITECTURE a OF h_adder IS BEGIN so<= a XOR b; co<= a AND b; END;

VHDL实验报告一2选1多路选择器

实验目的: 熟悉quartus的vhdl文本设计流程全过程,学习简单的组合电路的设计,多层次的电路设计,仿真和硬件测试 二、实验内容 内容(一)用vhdl语言设计2选1多路选择器 参考例3-1程序设计如下: library ieee; use mux21a is port (a,b,s:in bit; y: out bit); end entity mux21a; architecture one of mux21a is begin y<=a when s='0' else b; end architecture one 全程编译后软件提示0错误,3警告,可以继续下面仿真操作。 程序分析: 这是一个2选1多路选择器,a和b分别为两个数字输入端的端口名,s为通道选择控制信号输入端的端口名,y为输出端的端口名。 时序仿真及分析: 时序仿真输入图: 时序仿真输出图: 时序分析: 由上面两图可以得知:当s=0时,y口输出a,当s=1时,y口输出b 下载和硬件测试: 引脚锁定图: 程序下载完成后,选择实验电路模式5,通过短路帽选择clock0接256Hz 信号,clock2接8Hz信号。通过键一控制s,当键一进行切换时,明显能听到扬声器发出两种不同音调的声音。 实验内容(二)双二选一多路选择器设计 程序设计: library ieee;

use mux21a is port (a,b,s:in bit; y: out bit); end entity mux21a; architecture one of mux21a is begin y<=a when s='0' else b; end architecture one; entity muxk is port (a1,a2,a3,s0,s1:in bit; outy:out bit); end entity muxk; architecture bhv of muxk is component mux21a port (a,b,s:in bit; y:out bit); end component; signal tmp: bit; begin u1:mux21a port map(a=>a2,b=>a3,s=>s0,y=>tmp); u2:mux21a port map(a=>a1,b=>tmp,s=>s1,y=>outy); end architecture bhv; 全程编译后软件提示0错误,2警告 程序分析: 这是一个双2选1多路选择器,a1、a2和a3分别为两个数字输入端的端口名,s0、s1为通道选择控制信号输入端的端口名,outy为输出端的端口名。实体mux21a是一个2选一选通电路,实体muxk是元件的例化,其作用是将两个mux21a组合成一个3选1多路选择器。 时序仿真及分析: 时序仿真输入图 时序仿真输出图 时序分析: 从仿真出来的结果,我们不难发现,s0和s1做为a1、a2、a3的选通控制信号。当s0=0.、s1=0时,outy输出a1;当s0=0.、s1=1时,outy输出a2;当s0=1.、s1=0时,outy输出a1;当s1=1.、s2=1时,outy输出a3; 下载和硬件测试: 引脚锁定图 程序下载完成后,选择实验电路模式5,通过短路帽选择clock0接256Hz

VHDL实验报告

实验者:黄成勇学号:3110008723 班级:电子(4)班日期:2012年12月30日 实验一:应用Quart us II 完成基本组合电路设计 (1) 实验目的:熟悉QuartusⅡ的VHDL文本设计流程全过程,学习简单组合电路的设计、多层次电路设计、仿真和硬件测试。 (2) 实验容1:首先利用QuartusⅡ完成2选1多路选择器的文本编辑输入(mux21a.vhd)和仿真测试等步骤,给出仿真波形。最后在实验系统上进行硬件测试,验证本项设计的功能。 2选1多路选择器: LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY mux21a IS PORT ( a, b, s: IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN PROCESS (a,b,s) BEGIN IF s = '0' THEN y <= a ; ELSE y <= b ;

END IF; END PROCESS; END ARCHITECTURE one ; 双2选1多路选择器 2选1多路选择器功能时序波形 (3) 实验容2:将此多路选择器看成是一个元件mux21a,利用元件例化语句。 例化程序: LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY mux31a IS PORT ( a1, a2,a3, s0,s1: IN STD_LOGIC; outy : OUT STD_LOGIC );

VHDL第一次实验报告

VHDL第一次实验报告 深圳大学实验报告 课程名称:EDA技术 实验项目名称:基本电路行为的描述 学院:信息工程学院 专业:电子信息工程 指导教师: 报告人:学号:班级: 2 实验时间: 实验报告提交时间:2014年5月9日 教务部制 实验内容:1 多路选择器(习题2.1)2 ROM(习题3.4)3 简易加法器(习题3.5)4 通用译码器(习题4.4)5 第五章习题5.1、5.5、5.6、5.7、5.8 实验要求:1.依次完成各电路功能的VHDL代码编写 2.完成相应电路仿真,并对仿真结果截图,截图中要求尽可能多的体现不同输入信号对应的输入结果 3.完成实验报告,并按时提交至Blackboard,实验报告见实验报告模板,要求按模板各项内容完成。4.特别提示:实验报告按模板内容逐项填写,要求有完整的VHDL代码、仿真测试文件(VHDL test bench)、仿真结果截图、仿真结果分析、实验结论(或对实验的总结、心得体会)等内容。实验过程及内容:2.1 多路选择器多路选择器的顶层电路如图P2.1所示。根据真值表,如果输入sel=“01”或者sel=“10”,那么输出将等于对应的某一输入(c=a或c=b).然而如果输入sel=“00”或者sel=“11”,那么输出将分别为‘0’和‘Z’(高阻)。(a)填写表格,完成下

面的代码。(b)是对你的解答给出相关的注释。(c)将代码编译后进行仿真,验证其正确性。实验完整VHDL代码:library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity mux is Port ( a : in STD_LOGIC_VECTOR(7 DOWNTO 0); b : in STD_LOGIC_VECTOR(7 DOWNTO 0); sel : in STD_LOGIC_VECTOR(1 DOWNTO 0); c : out STD_LOGIC_VECTOR(7 DOWNTO 0)); end mux; architecture example of mux is begin PROCESS (a,b,sel) begin IF (sel=\ c ‘U’); END IF; END PROCESS; end EXAMPLE; 仿真测试文件代码:LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Test_Mux IS END Test_Mux; ARCHITECTURE behavior OF Test_Mux IS COMPONENT mux PORT( a : IN std_logic_vector(7 downto 0); b : IN std_logic_vector(7 downto 0); sel : IN std_logic_vector(1 downto 0); c : OUT std_logic_vector(7 downto 0) ); END COMPONENT; --Inputs signal a : std_logic_vector(7 downto 0) := (others => ‘0’); signal b : std_logic_vector(7 downto 0) := (others => ‘0’); signal sel : std_logic_vector(1 d ownto 0) := (others => ‘0’); --Outputs signal c : std_logic_vector(7 downto 0); -- No clocks detected in port list. Replace below with -- appropriate port name BEGIN -- Instantiate the Unit Under Test (UUT) uut: mux PORT MAP ( a => a, b => b, sel => sel, c => c ); -- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. a<=\ b<=\ sel <=\ wait for 100 ns; sel <=\ wait for 100 ns; sel <=\ wait for 100 ns; sel <=\ wait for 100 ns; -- insert stimulus here wait; end process; END; 仿真结果:如图,当输入信号sel为“00”时,输出信号c为“00000000”;当输入信号sel为“01”时,输出信号c等于a即为“10101010”;当输入信号sel为“10”时,输出信号c等于b即为“11110000”;当输入信号sel 为其他情况时,输出信号c等于自己设定的值,在此处即为“U”。习题3.4 ROM 试用1*1维常数来实现只读存储器ROM(read-only memory),假设一个ROM由许多深度为8,位宽为4的块组成。提示:首先建立一个名为rom的数组,然后定义一个rom类型的信号来实现ROM,用常数值填充到ROM块中:CONSTANT my_rom:rom:=(values);。实验完整VHDL代码:library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity ROM is Port ( addr :

VHDL乐曲演奏实验报告

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。设计性实验报告 班级: 姓名(学号): 实验项目名称:乐曲演奏实验 实验项目性质:设计性 实验所属课程:EDA基础 实验室(中心): 指导教师: 实验完成时间:2009 年12 月13 日

教师评阅意见: 签名:年月日实验成绩: 一、实验目的 1、熟悉QuartusII 软件的使用。 2、熟悉EDA实验开发系统的基本使用。 3、学习VHDL基本单元电路的设计应用。进一步掌握EDA的多层次设计方法。 4、学习音乐发生器的设计。 二、实验内容及要求 1、实验内容 利用可编程逻辑器件FPGA,设计乐曲硬件电路,可自动演奏乐曲。 2、实验要求 要求能够演奏出《友谊天长地久》的曲调或可另选一段较完整的曲调(扩展要 求:能够从数码管上显示出当前曲调的简谱和频率),我们组演奏出的是实验 要求上的《友谊天长地久》曲调。 三、实验原理 1、乐曲硬件电路产生音乐是和音乐频率和音乐的持续时间有关;音符的持续时间需 根据乐曲的速度和每个音符的节拍数来确定。其简谱中音符和频率的关系如下: 2、该演奏电路演奏的乐曲是《友谊天长地久》片段,其最小的节拍为1拍,将1拍

的时长定位0.25S,则只需要再提供一个4hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。对于占用时间较长的节拍,(一定是节拍的整数倍),如全音符为4拍,2/4音符为2拍,1/4音符为1拍。 3、乐曲硬件演奏电路系统主要有数控分频器和乐曲存储模块两个部分组成,其余还有 音乐节拍发生器等等。数控分频器对FPGA 的基准频率进行分频,得到与各个音节对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中存放一个乐曲曲谱真值表(实验中用的ROM存储),由一个计数器来控制此真值表的输出,而由计数器的技术时钟信号作为乐曲节拍控制信号。 4、要求演奏时能循环进行,必须需另外设置一个时长计数器,当乐曲演奏完成时,保 证能自动从头开始演奏。该计数器控制真值表按顺序输出简谱。 四、实验仪器、材料 计算机一台、GW48 EDA/SOPC实验箱一台 QuartusII软件、实验箱连接线一根 五、方案设计 这个实验中采用层次化的设计思路,因此我们把此乐曲硬件演奏电路分为3个主要模块,即音乐发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频Speakera 模块。分好层次之后,编写每个模块的程序,分别生成项目符号,最后把生成的个项目符号用原理图的方式连接起来,然后编译、下载即可。由图例表示如下: 此实验设计中,我主要负责音乐发生器NoteTabs模块(ROM的定制过程)和最后的连接原理图部分。 六、实验过程及原始记录 1、音乐节拍发生器NoteTabs模块 这个模块用FPGA的片内ROM存放乐曲的简谱真值表,由一个二进制计数器为乐曲数据存储ROM的地址发生器随着NoteTabs中计数器按时钟频率做加法计数时,乐曲数据存储器ROM中的音符数据,将从ROM中的输出口输向音符译码电路Tonetaba ,所存储的乐曲就开始连续自然地演奏起来。

相关主题
文本预览
相关文档 最新文档