EDA 技术实验报告
实验项目名称:7段数码显示译码器设计
实验日期:2012年6月4日实验成绩:
实验评定标准:
一、实验目的
学习7段数码显示译码器设计;学习VHDL的CASE语句应用及多层次设计方法。
二、实验器材
电脑一台、GW48 EDA/SOPC试验箱。
三、实验内容(实验过程)
实验内容1:说明程序中各语句的含义,以及该程序的整体功能。
在quartusII 上对该程序进行编辑、编译、综合、适配、仿真,给出其所有信号的时序仿真波形。
步骤:1)打开软件,选择菜单file—>new,在弹出的new对话框中选择Device Design Files 的VHDL File项,按OK键后进入VHDL文本编辑方式。
根据给出的7段数码显示译码器的参考程序。
2)将其另存为与实体名一致的文件,以确保后续的编译能够正常进行。
然后在将该文件置顶,并进行编译。
3)编译完成后,对其进行仿真,建立波形文件。
再次进行编译(否则进行仿真的时候会报错),编译完成后即可进行仿真。
分析得到的结果。
实验内容2:引脚锁定及硬件测试。
选用GW48 系统的实验电路模式6 用数码8 显示译码输出(P1046-PI040),键8、键7、键6 和键5 四位控制输入,硬件验证译码器的工作性能。
实验内容3:用元件例化语句,按下图的方式连接成顶层设计电路(用VHDL 表述),图中CNT4B 是一个4 为二进制加法器(也可利用实验五的加法计数器的程序,在实验中则利用后者),模块DECL7S 即该实验实体元件重复以上实验过程。
图中temp 是4 位总线,led 是7 位总线。
对于引脚和实验用模式6 用数码8 显示译码输出用键3 作为时钟输入或直接接时钟信号clock0。
四、实验程序
7端数码显示译码器的程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY DECL7S IS
PORT ( A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED7S:OUT
STD_LOGIC_VECTOR(6DOWNTO 0));
END DECL7S;
ARCHITECTURE one OF DECL7S IS BEGIN
PROCESS(A)
BEGIN
CASE A IS WHEN"0000"=>LED7S<="0111111"; WHEN"0001"=>LED7S<="0000110"; WHEN"0010"=>LED7S<="1011011"; WHEN"0011"=>LED7S<="1001111"; WHEN"0100"=>LED7S<="1100110"; WHEN"0101"=>LED7S<="1101101"; WHEN"0110"=>LED7S<="1111101"; WHEN"0111"=>LED7S<="0000111"; WHEN"1000"=>LED7S<="1111111"; WHEN"1001"=>LED7S<="1101111"; WHEN"1010"=>LED7S<="1110111"; WHEN"1011"=>LED7S<="1111100"; WHEN"1100"=>LED7S<="0111001";
WHEN"1101"=>LED7S<="1011110";
WHEN"1110"=>LED7S<="1111001"; WHEN"1111"=>LED7S<="1110001"; WHEN OTHERS=>NULL; END CASE; END PROCESS; END one;
实验五中加法计数器的代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity cnt10 is
port(
clk,rst,en :in std_logic;
cq :out std_logic_vector(3 downto 0);
cout :out std_logic);
end cnt10;
architecture behav of cnt10 is begin
process(clk,rst,en)
variable
cqi :std_logic_vector(3 downto 0); begin
if rst ='1' then cqi :=(others=>'0');
elsif clk'event and clk='1' then
if en='1' then
if cqi<9 then cqi:=cqi+1;
else
cqi:=(others=>'0');
end if;
end if;
end if;
if cqi =9 then cout<='1';
else cout<='0';
end if;
cq<=cqi;
end process;
end behav;
元件例化语句构成的顶层文件
library ieee;
use ieee.std_logic_1164.all; entity tan is
port(clock0:in std_logic;
rat0:in std_logic;
ena0:in std_logic;
led:out std_logic_vector (6 downto 0); cout0:out std_logic);
end tan;
architecture lang of tan is
signal tmp:std_logic_vector (3 downto 0);
component cnt10
port(
clk,rst,en :in std_logic;
cq :out std_logic_vector(3 downto 0);
cout :out std_logic);
end component;
component decl7s
port (a:in std_logic_vector(3 downto 0); led7s:out
std_logic_vector(6 downto 0));
end component;
begin
cnt4b:cnt10 port map(clock0,rat0,ena0,tmp,cout0);
decl7a:decl7s port map(tmp,led);
end lang;
五、实验仿真、结果及分析
1.7段数码显示译码器的仿真波形图。
波形分析:A[0]—A[3]是四个输入端,而LED7s[0]—LED7s[6]是7个输出端。
按照实验程序设置输入端口,如上图所示,分别从‘0000’到‘1111’。
例如当输入为‘0000’时,对应的输出如图中所示为‘0111111’,此时,数码管的7个段:g、f、e、d、c、b、a分别接0、1、1、1、1、1、1;接有高电平的段发亮,于是数码管显示‘0’。
以此类推,可以得到其他数字的显示情况。
2.利用元件例化语句设计的译码器
波形分析:图中的clock0是时钟脉冲输入端,ena0是使能端,rat0是清零端,count0是计数端,led[0]—led[6]是7个输出显示端。
图中的clock0设置为100MHz的脉冲。
开始时,让使能端为0,计数器不工作,如图中的A点所示,这时,计数为0,对应的输出为‘0111111’,显然这实验结果是正确的。
A点过后,使能端为1,计数器开始工作,当有一个脉冲时,输出显示为‘0000110’,如图所示,显然也是正确的。
当计数到图中的B点时,达到计数周期,此时进位端为1,此点过后,重新开始计数。
而当清零端为1时,如图中的C点,这时,计数为0,对应的输出端也就自然变成‘0111111’。