《创新实验》实验报告—基于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.编写和编译代码将事先编好的代码复制到源文件里,然后保存文件。
选中左边的文件名,在窗体的左边出现如下编辑文档内容。
选择Synthesize —XST—》Check Syntax,双击Check Syntax,开始编译源文件。
4.软件仿真其实仿真这一步可要可不要,很多程序都不需要仿真,有些程序即使仿真出错,但是最后结果却可以出来。
因此,我们做实验时很少仿真,此处也不再赘述了。
5.综合首先根据实验箱的安排布局,找到程序中外部接口的对应实验箱上的接口,进行接口对应,双击如下图所示的选项。
出现接口窗口如下,进行设置(具体参见老师发的文档SDZ电子实验箱的使用说明文档)保存,关闭即可然后如下图从Implement Design开始依次双击综合。
6.下载双击Configure Target Device综合完成之后,就出现下载对话框。
右击鼠标键盘选择Add Xilinx Device,选择.bit文件。
然后右击选择Program,就将程序烧录到实验板上了。
五、节拍脉冲发生器电路实现1、实验题目:参照时标系统的设计方法,用组合逻辑方法设计一个简单的节拍脉冲发生器,产生图1-6所示的节拍脉冲,并用单脉冲验证设计的正确性。
在实验报告中画出完整电路,写出W、1W和1N的表达式。
图1-6 简单的节拍脉冲发生器一周期的波形设计提示:1、由波形图求出节拍脉冲1W 和0W 的表达式,进而组合成1N 的表达式。
2、注意节拍电平1T 和0T 的翻转时刻应在0M 下降沿与M 的上升沿同时出现的时刻。
3、注意D 触发器的触发翻转要求。
2、实验步骤:1.根据题目确定输出结果的逻辑表达式1*0*1T M M W =S T M M W *1*0*0=011W W N +=2.画出电路图3.确定输入输出的外部端口 输入端口:M (由时钟产生) 输出端口:W1,W0,N14.根据电路图写代码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 isPort ( clk : in STD_LOGIC; w0 : out STD_LOGIC; w1 : out STD_LOGIC; N1 : out STD_LOGIC); end clk_div;architecture Behavioral of clk_div issignal 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;beginprocess(clk,Q)beginif(clk'event and clk='1')then ——对clk进行分频temp <= temp+1;if (temp =49) thenQ <= not Q;temp <= 0;end if;end if;if(Q'event and Q='1')thenif(count ="1111") thencount <=(others =>'0');elsecount <=count+1;end if;end if;a <= (not clk and count(0))and count(1);b <= (not clk and count(0))and(not count(1) and count(2));end process;w1 <= a;w0 <= b;N1 <=a or b;end Behavioral;4、硬件实现与注意事项硬件实现主要说的是外部端口和实验箱的对应问题。
M:接的是时钟脉冲,即P150W1:接LED灯显示结果,即P45W0:接LED灯显示结果,即P44N1:接LED灯显示结果,即P47注意事项:1.时钟脉冲频率太高,结果会显示的很快,因此首先对CLK进行50倍的分频。
将频率降低以便观察结果。
2.由于时钟频率过高,可能仿真不出来,因此就不必仿真。
3.可能有些组编译通过但在综合时出现错误(是有关BUF的),这时就需要在CLK之前接入一个缓冲器。
具体的加入代码如下:library UNISIM; ——头文件use UNISIM.VComponents.all;entity test isPort ( clk : in STD_LOGIC;end test;architecture Behavioral of test issignal ck:std_logic;component IBUF ——定义缓冲器port(I:in STD_LOGIC;O:out STD_LOGIC);end component;beginUO: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 isPort ( set : in STD_LOGIC; ——低电平置数reset : in STD_LOGIC; ——低电平异步清零key : out STD_LOGIC; ——键盘输出口clk : in STD_LOGIC; ——键盘的输入口,当成单脉冲使用co : OUT STD_LOGIC; ——进位put : in STD_LOGIC_VECTOR (7 DOWNTO 0); ——置数load : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); ——LED显示end Counter8;architecture example of Counter8 issignal ck: std_logic;signal cc: std_logic;signal down : STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000";signal kk : std_logic:='0';component IBUF ——设置缓冲器port(I : in STD_LOGIC;O : out STD_LOGIC);end component;beginkey <=kk;load <=down;co <=cc;U0:IBUF port map(I=>clk,O=>ck);p0:PROCESS(ck)beginif(ck' event and ck='0') thenIF(set ='0') THEN ——低电平置数down <=put;ELSEdown <=down+1;END IF;END IF;IF(reset ='0') then ——低电平异步清零down <="00000000";END IF;if(down="11111111" ) then ——进位设置cc <='1';elsecc <='0';end if;end process p0;end example;3.硬件实现与注意事项硬件实现:clk:接键盘的行或列,即P 29key :接键盘的行或列与clk相对应,即P34reset :接数字开关,即P62set:接数字开关,即P61co :接电平显示,即P45put(0-7) :全部接数字开关,即P73 P74 P70 P71 P68 P69 P63 P67load(0-7) :全部接电平显示,即P59 P60 P57 P58 P48 P49 P46 P47注意事项:1.由于在综合时出了问题,本实验在输入clk之前加入了一个缓冲器2.在实验中发现数字开关的抖动比键盘大,就选用键盘作为单脉冲。