FPGA|VHDL入门实践第三发:使用VHDL编写FPGA数码管显示

[TOC]

数码管实验报告

一、实验目的与要求

​ 通过此实验让用户逐步了解、熟悉和掌握FPGA开发软件Quartus II的使用方法及VHDL的编程方法。学习用VHDL语言编写程序做7段数码管显示译码器的设计,进一步掌握和了解EDA软件。

二、实验设备

  1. SmartSOPC+实验箱
  2. 装有QuartusⅡ的PC机
  3. JTAG下载器

三、实验内容

​ Smart实验箱上有2个4位动态共阳数码管LEDI2和LED13,其中8个位码DIG0DIG7和8位段码SEG0 SEG7分别与FPGA相应的引脚相连。这样,只要DIG0~ -DIG7.上一直输出低电平“0”,则8个数码管将显示相同的数码(因为8个LED数码管的段码线分别接到了同一引脚上),这样8位动态LED数码管就变成了静态LED。本实验的内容是建立7段译码显示模块,用于控制LED数码管的静态显示。要求在Smart实验箱上的数码管依次显示0-9,而动态数码管则是建立数码管动态扫描显示模块,具体内容如下:
​ (1)在Smart实验箱上完成LED数码管的动态显示“1”-“8”这8个数字
​ (2)放慢扫描速度演示动态显示的原理过程。

数码管数字对应的2进制值:

1
2
3
4
5
6
7
8
9
10
constant data0 : std_logic_vector(7 downto 0):="11000000";
constant data1 : std_logic_vector(7 downto 0):="11111001";
constant data2 : std_logic_vector(7 downto 0):="10100100";
constant data3 : std_logic_vector(7 downto 0):="10110000";
constant data4 : std_logic_vector(7 downto 0):="10011001";
constant data5 : std_logic_vector(7 downto 0):="10010010";
constant data6 : std_logic_vector(7 downto 0):="10000010";
constant data7 : std_logic_vector(7 downto 0):="11111000";
constant data8 : std_logic_vector(7 downto 0):="11000000";
constant data9 : std_logic_vector(7 downto 0):="10010000";

四、实验步骤

  1. 启动QuartusII建立一个空白工程,然后命名为dig_show.qpf。
  2. 新建VHDL源程序文件dig_show.vhl,输人程序代码并保存,然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直至编译成功为止,并生成图形符号文件dig_show.bdf。
  3. 波形仿真验证:(注意此处仿真波形时序要调整仿真)
    1. 静态一位显示结果如下:
      静态一位显示
    2. 动态显示波形如下:
      动态波形
  4. 分配各个引脚,下载程序,观察实验现象

五、设计程序

​ 静态数码管显示较为简单,显示只需要把需要显示的数码管拉低,其他保持为高,显示段码则直接根据需要的值选择seg输出的值就可以,主程序核心代码如下:

1
2
dig<="01111111";
seg<=data1;

​ 动态数码管则是在静态数码管的基础上增加动态扫描的功能,添加时钟分频计数,根据计数结果选择不同DIG位数拉低即可,核心程序如下:

分频代码:

1
2
3
4
5
6
7
8
9
10
process(sys_clk)
variable num:integer range 1 to 10000;
begin
if rising_edge(sys_clk) then
if num=10000
then num:=1;trig<=not trig;
else num:=num+1;
end if;
end if;
end process;

扫描显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
process(trig)
variable n:integer range 0 to 7;
constant data_none : std_logic_vector(7 downto 0):="11111111";
constant data0 : std_logic_vector(7 downto 0):="11000000";
constant data1 : std_logic_vector(7 downto 0):="11111001";
constant data2 : std_logic_vector(7 downto 0):="10100100";
constant data3 : std_logic_vector(7 downto 0):="10110000";
constant data4 : std_logic_vector(7 downto 0):="10011001";
constant data5 : std_logic_vector(7 downto 0):="10010010";
constant data6 : std_logic_vector(7 downto 0):="10000010";
constant data7 : std_logic_vector(7 downto 0):="11111000";
constant data8 : std_logic_vector(7 downto 0):="11000000";
constant data9 : std_logic_vector(7 downto 0):="10010000";
begin
if rising_edge(trig)then
if n=7 then n:=0;
else n:=n+1;
end if;
end if;
case n is
when 0=> dig<="01111111";seg<=data1;
when 1=> dig<="10111111";seg<=data_none;
when 2=> dig<="11011111";seg<=data_none;
when 3=> dig<="11101111";seg<=data_none;
when 4=> dig<="11110111";seg<=data_none;
when 5=> dig<="11111011";seg<=data_none;
when 6=> dig<="11111101";seg<=data_none;
when 7=> dig<="11111110";seg<=data_none;
when others=>seg<="11111111";
end case;
end process;

六、实验结果及分析

实验图片:

  1. 静态显示1
    在这里插入图片描述

  2. 动态显示0-7
    在这里插入图片描述

结果分析:

​ 对下载后程序进行测试,动态和静态数码管显示符合预期要求