VHDL实验报告_vhdl实验报告

2020-02-27 其他范文 下载本文

VHDL实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“vhdl实验报告”。

《创新实验》实验报告

—基于VHDL的编程和硬件实现

一、实验目的 1.2.3.4.熟悉和掌握硬件描述语言VHDL的基本语法及编写; 掌握软件Xilinx ISE 10.1的使用; 熟悉SDZ-6电子技术实验箱的使用;

了解节拍脉冲发生器等基本电路的实现;

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.编写和编译代码

将事先编好的代码复制到源文件里,然后保存文件。选中左边的文件名,在窗体的左边出现如下编辑文档内容。

选择Synthesize —XST—》Check Syntax,双击Check Syntax,开始编译源文件。

4.软件仿真

其实仿真这一步可要可不要,很多程序都不需要仿真,有些程序即使仿真出错,但是最后结果却可以出来。因此,我们做实验时很少仿真,此处也不再赘述了。

5.综合首先根据实验箱的安排布局,找到程序中外部接口的对应实验箱上的接口,进行接口对应,双击如下图所示的选项。

出现接口窗口如下,进行设置(具体参见老师发的文档SDZ电子实验箱的使用说明文档)保存,关闭即可

然后如下图从Implement Design开始依次双击综合。

6.下载

双击Configure Target Device综合完成之后,就出现下载对话框。右击鼠标键盘选择Add Xilinx Device,选择.bit文件。然后右击选择Program,就将程序烧录到实验板上了。

五、节拍脉冲发生器电路实现

1、实验题目:

参照时标系统的设计方法,用组合逻辑方法设计一个简单的节拍脉冲发生器,产生图1-6所示的节拍脉冲,并用单脉冲验证设计的正确性。在实验报告中画出完整电路,写出W1、W0和N1的表达式。

图1-6 简单的节拍脉冲发生器一周期的波形

设计提示:

1、由波形图求出节拍脉冲W1和W0的表达式,进而组合成N1的表达式。

2、注意节拍电平T1和T0的翻转时刻应在M0下降沿与M的上升沿同时出现的时刻。

3、注意D触发器的触发翻转要求。

2、实验步骤:

1.根据题目确定输出结果的逻辑表达式

W1M*M0*T1

W0M*M0*T1*S

N1W1W0

2.画出电路图

3.确定输入输出的外部端口 输入端口:M(由时钟产生)输出端口:W1,W0,N1 4.根据电路图写代码 5.编译,调试

3、实验代码 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;——头文件

entity clk_div is

Port(clk : in STD_LOGIC;

w0 : out STD_LOGIC;

w1 : out STD_LOGIC;

N1 : out STD_LOGIC);end clk_div;

architecture Behavioral of clk_div is signal count : std_logic_vector(3 downto 0):=“0000”;signal a : std_logic;signal b : std_logic;signal temp : integer range 0 to 50;signal Q : std_logic;begin proce(clk,Q)

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

——对clk进行分频

temp

Q

end if;temp

if(count =“1111”)then

count '0');else

count

b

4、硬件实现与注意事项

硬件实现主要说的是外部端口和实验箱的对应问题。M:接的是时钟脉冲,即P150 W1:接LED灯显示结果,即P45 W0:接LED灯显示结果,即P44 N1:接LED灯显示结果,即P47 注意事项:

1.时钟脉冲频率太高,结果会显示的很快,因此首先对CLK进行50倍的分频。将频率降低以便观察结果。2.由于时钟频率过高,可能仿真不出来,因此就不必仿真。3.可能有些组编译通过但在综合时出现错误(是有关BUF的),这时就需要在CLK之前接入一个缓冲器。具体的加入代码如下: library UNISIM;

——头文件 use UNISIM.VComponents.all;entity test is

Port(clk : in STD_LOGIC;end test;

architecture Behavioral of test is signal ck:std_logic;

component IBUF

——定义缓冲器

port(I:in STD_LOGIC;

O:out STD_LOGIC);end component;begin UO:IBUF port map(I=>clk,O=>ck);——以后的ck代替clk 六、八位二进制计数器的实现 1. 实验题目

请用VHDL编写一个八位二进制计数器,具有异步清零功能、同步置数、计数功能。实验验证时,须用单脉冲进行验证。计数器的输出显示在显示器上。〖显示器可以是:①七段数码显示器,②LED发光二极管。〗

2. 实验代码

library IEEE;

——头文件 use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;library UNISIM;use UNISIM.VComponents.all;

entity Counter8 is

Port(set : in STD_LOGIC;

——低电平置数

reset : in STD_LOGIC;

——低电平异步清零

key : out STD_LOGIC;

——键盘输出口

clk : in STD_LOGIC;

——键盘的输入口,当成单脉冲使用

co : OUT STD_LOGIC;

——进位

architecture example of Counter8 is signal ck: std_logic;signal cc: std_logic;signal down : STD_LOGIC_VECTOR(7 DOWNTO 0):=“00000000”;signal kk : std_logic:='0';put : in STD_LOGIC_VECTOR(7 DOWNTO 0);——置数

load : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

——LED显示

end Counter8;

component IBUF

——设置缓冲器 port(I : in STD_LOGIC;

O : out STD_LOGIC);end component;

begin

key clk,O=>ck);p0:PROCESS(ck)begin if(ck' event and ck='0')then

IF(set ='0')THEN

——低电平置数 down

down

IF(reset ='0')then

——低电平异步清零 down

——进位设置 cc

3. 硬件实现与注意事项 硬件实现:

clk:接键盘的行或列,即P 29

key :接键盘的行或列与clk相对应,即P34 reset :接数字开关,即P62 set:接数字开关,即P61 co :接电平显示,即P45 put(0-7):全部接数字开关,即P73 P74 P70 P71 P68 P69 P63 P67 load(0-7):全部接电平显示,即P59 P60 P57 P58 P48 P49 P46 P47

注意事项: 1.由于在综合时出了问题,本实验在输入clk之前加入了一个缓冲器 2.在实验中发现数字开关的抖动比键盘大,就选用键盘作为单脉冲。3.本实验在题目的基础上,新增了进位显示功能。

七、键盘扫描及显示的实现 1.实验题目

请用VHDL编写一个键盘扫描程序,对实验箱上的4×4键盘(蓝色部分)进行扫描。当有某个键被按下时,该键的键值被显示在显示器上。〖显示器可以是:①七段数码显示器,②LED发光二极管。〗

2.实验代码

library IEEE;

——头文件 use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;library UNISIM;use UNISIM.VComponents.all;

ENTITY KEYDIS IS

PORT(clk

: IN std_logic;

——扫描时钟

row

: OUT std_logic_vector(3 DOWNTO 0);

column : IN std_logic_vector(3 DOWNTO 0);

dyp

: OUT std_logic_vector(7 DOWNTO 1));

——数码管显示 END KEYDIS;

ARCHITECTURE arch OF KEYDIS IS SIGNAL div_cnt : std_logic_vector(1 downto 0):=“00”;SIGNAL scan_key : std_logic_vector(3 DOWNTO 0):=“1110”;SIGNAL key_code : std_logic_vector(3 DOWNTO 0):=“0000”;

SIGNAL dyp_tmp : std_logic_vector(7 DOWNTO 1):=“0000001”;SIGNAL COUNT : INTEGER range 0 TO 30;signal ck : std_logic;component IBUF

——缓冲器的声明

port(I:in STD_LOGIC;

O:out STD_LOGIC);end component;BEGIN U1:IBUF port map(I=>clk,O=>ck);row

IF(ck' EVENT AND ck = '1')THEN

div_cnt

END IF;

IF(ck' EVENT AND ck = '1')THEN

COUNT

PROCESS(div_cnt(1 downto 0))

——扫描行(out)输出,和时钟频率一样

BEGIN

CASE div_cnt(1 downto 0)IS

WHEN “00”=>

scan_key scan_key scan_key

IF COUNT = 30 THEN COUNT

scan_key

WHEN OTHERS =>

NULL;

END CASE;END PROCESS;

PROCESS(ck)BEGIN IF(ck'EVENT AND ck='1')THEN

CASE scan_key IS

WHEN “1110” =>

CASE column IS

WHEN “1110” =>

key_code

——编码器输入

WHEN “1101” =>

key_code

WHEN “1011” =>

key_code

WHEN “0111” =>

key_code

WHEN OTHERS =>

NULL;

END CASE;

WHEN “1101” =>

CASE column IS

WHEN “1110” =>

key_code

WHEN “1101” =>

key_code

WHEN “1011” =>

key_code

WHEN “0111” =>

key_code

WHEN OTHERS =>

NULL;

END CASE;

WHEN “1011” =>

CASE column IS

WHEN “1110” =>

key_code

WHEN “1101” =>

key_code

WHEN “1011” =>

key_code

WHEN “0111” =>

key_code

WHEN OTHERS =>

NULL;

END CASE;

WHEN “0111” =>

CASE column IS

WHEN “1110” =>

key_code

WHEN “1101” =>

key_code

WHEN “1011” =>

key_code

WHEN “0111” =>

key_code

WHEN OTHERS =>

NULL;

END CASE;

WHEN OTHERS =>

key_code

END CASE;

END IF;

END PROCESS;

--显示键值

PROCESS(key_code)

BEGIN--延时防抖动

IF COUNT = 0 THEN--

IF key_code = NOT “0000” THEN

CASE key_code IS

WHEN “0000” =>

dyp_tmp

WHEN “0001” =>

dyp_tmp

WHEN “0010” =>

dyp_tmp

WHEN “0011” =>

dyp_tmp

WHEN “0100” =>

dyp_tmp

WHEN “0101” =>

dyp_tmp

WHEN “0110” =>

dyp_tmp

WHEN “0111” =>

dyp_tmp

WHEN “1000” =>

dyp_tmp

WHEN “1001” =>

dyp_tmp

WHEN “1010” =>

dyp_tmp

WHEN “1011” =>

dyp_tmp

WHEN “1100” =>

dyp_tmp

WHEN “1101” =>

dyp_tmp

WHEN “1110” =>

dyp_tmp

WHEN “1111” =>

dyp_tmp

WHEN OTHERS =>

NULL;

END CASE;

——编码器输出并且数码管显示

END IF;--END IF;

END PROCESS;END arch;

3.硬件实现与注意事项 硬件实现:

clk:接扫描时钟,即P150 column(0-3):对应于键盘的列值,即P34 P33 P36 P35 row(0-3): 对应于键盘的行值,即P30 P31 P27 P29 dyp(1-7):对应于数码管显示,即P123 P125 P127 P129 P132 P133 P134 注意事项:

1.扫描时钟与显示时钟是不对应的,扫描的时钟快一些,显示时钟是在扫描时钟基础上的延时,该功能由参数COUNT实现。扫描程序和显示程序是分开写的。2.行和列其实没什么区别,只要按照正确的秩序来排列column和row结果就出正确。从另一方面,要得到正确的,希望的扫描数值,就必须安排好这行和列。以上的硬件实现的安排,是我们组测试了几遍的结果。3.代码中有很多语法如When else、With select、Case,其中有很多的技巧值得我们举一反三的。比如,键盘扫描时如何显示1110 1101 1011 0111,我们可以用移位寄存器实现,也可以像程序代码那样引入一个变量div_cnt,让其跟着扫描脉冲自动循环四位。另外,显示部分引入了译码器的原理实现数码管的16数值的显示。

4.本实验使用静态数码管进行显示。首先用一个数码管显示16个键值0~f,然后再用双数码管显示键值,从01~16显示键盘的键值。

5.数码管显示参数从高位到地位分别对应实验箱数码管的a~f,最后一位是小数点,并且数码管是共阴的,即高电平是数码管对应的LED才会发光。实验箱上的数码管LED对应关系如下:

八、实验感想

经过这次的合作,我们深深的体会到团队合作的重要性。在本次实验中,我们组遇到了很多困难。不过,我们互帮互助,互相鼓励,最终我们组还是能在比较快的时间内把实验结果做出来。

第一次实验中也就是节拍脉冲发生器电路实现,由于实验箱上最慢的时钟频率是100Hz,结果显示的太快,就需要对时钟进行分频,我们组很快在写出了分频的代码,然后进行编译和仿真。但是仿真的结果怎么也出不来。当时我们组有三个人就有点不耐烦了,准备放弃下次再弄。但是另外一个同学坚持综合,下载的步骤,结果就在不经意间出来了。事后我们才知道这个实验仿真是出不来的,也就是不用仿真这一步的。只要编译,综合对了就能下载并且结果正确。我们当时想辛亏组里有一个坚持不懈的人,否则,我们还得拖一个星期才能检查。

第二次做八位二进制计数器的实现时,我们吸取上次的教训不做仿真。但是实验要求需要一个单脉冲,异步清零端,置数端,八个数值显示。这一算共需要十一个数字开关,但实验箱上却只有十个数字开关。不过我们首先先用试验箱上的100Hz接口代替单脉冲,并对他进行50倍分频,结果显示的非常好。然后我们将异步清零放在一个键盘上实现,单脉冲放在数字开关上实现,结果抖动的非常厉害。在和别的组同学交流之后,我们组将单脉冲放在键盘上实现,抖动现象明显缓解。另外我们组还在此基础上增加了一个进位显示的功能。

在实验显示这块,我们组希望尽可能多用实验箱上给我们提供的显示仪器(即LED电平显示和数码管显示)。我们把LED电平显示安排在八位二进制计数器的实现的实验上,把数码管显示安排在键盘扫描及显示的实现的实验上。

第三次做键盘扫描及显示的实现的实验是,由于这次程序比较复杂,我们组采取二种办法。一个人根据自己所学所看的资料写代码(前二个实验都是我们自己写的代码),另一个人在网上收资料。结果我们自己写的代码有些不够严谨,结果循环显示,显然代码没有编好,然后我们组四个就参考网上收的代码,先将代码的含义弄清楚,然后我们在对代码稍作修改,就完成了此次的代码编写。这次实验涉及的知识较前面二个实验都多一些。比如,如何扫描键盘,如何将结果显示在数码管上,如何使用数码管(是共阴的还是共阳的),如何防抖等等。具体看上面的键盘扫描及显示的实现的注意事项。

此次实验我们基本达到题目的要求,通过这次实验我们对VHDL有了更清晰的认识。虽然实验过程中我们成员之间有争论,综合、下载、调试时感觉很累,但挺一挺就过去了,困难过后才会感觉到成功的甘甜。

《VHDL实验报告.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
VHDL实验报告
点击下载文档
相关专题 vhdl实验报告 实验报告 VHDL vhdl实验报告 实验报告 VHDL
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文