资源描述
湖北大学本科课程设计
题 目 16*16点阵显示
姓 名 学 号
专业年级
指导教师 职 称
2016年 12月 18日
目录
一、设计内容 2
1.1功能描述 2
1.2实现目标 3
二、逻辑电路图 3
三、功能模块的划分 4
3.1 系统的总体框图 4
四、主要功能的实现 4
4.1 1 8进制加法器设计 4
4.2 2 16进制计数器设计 4
4.3 列驱动设计 4
4.4 字体显示控制器 5
4.5 顶层文件设计 5
五、系统调试与仿真 5
5.1 程序仿真图 5
5.2 16*16 LED点阵显示引脚分配 6
5.3 程序运行结果 7
六、附件 8
一、设计内容
1.1功能描述
本实验主要完成汉字字符在LED 上的显示,16*16 扫描LED 点阵的工作原理与8 位扫描数码管类似,只是显示的方式与结果不一样而已。下面就本实验系统的16*16 点阵的工件原理做一些简单的说明。16*16 点阵由此256 个LED 通过排列组合而形成16 行*16 列的一个矩阵式的LED 阵列,俗称16*16 点阵。单个的LED 的电路如下图11-1 所示:
图11-1 单个LED 电路图
由上图可知,对于单个LED 的电路图当Rn 输入一个高电平,同时Cn 输入一个低电平时,电路形成一个回路,LED 发光。也就是LED 点阵对应的这个点被点亮。16*16 点阵也就是由16 行和16 列的LED 组成,其中每一行的所有16 个LED的Rn 端并联在一起,每一列的所有16 个LED 的Cn 端并联在一起。通过给Rn 输入一个高电平,也就相当于给这一列所有LED 输入了一个高电平,这时只要某个LED 的Cn 端输入一个低电平时,对应的LED 就会被点亮。具体的电路如下图11-2所示:
图11-2 16*16 点阵电路原理图
在点阵上显示一字符是根据其字符在点阵上的显示的点的亮灭来表示的,如下图11-3 所示:
图11-3 字符在点阵上的显示
在上图中,显示的是一个“汉”字,只要将被“汉”字所覆盖的区域的点点亮,则在点阵中就会显示一个“汉”字。根据前面我们所介绍的点阵显示的原理,当我们选中第一列后,根据要显示汉字的第一列中所需要被点亮的点对应的Rn置为高电平,则在第一列中需要被点亮的点就会被点亮。依此类推,显示第二列、第三列……第N 列中需要被点亮的点。然后根据人眼的视觉原理,将每一列显示的点的间隔时间设为一定的值,那么我们就会感觉显示一个完整的不闪烁的汉字。同时也可以按照这个原理来显示其它的汉字。下图11-4 是一个汉字显示所需要的时序图:
图11-4 显示时序图
1.2实现目标
本实验的示例程序依次显示的是“考试必过”,要求每隔一秒换下一个字显示。
二、逻辑电路图
此程序分为五个模块,两个计数器和一个行驱动程序和一个显示字体控制程序,最后再加上一个顶层文件,用来连接前四个模块,程序简图如下:
CLK1
Q1
HANG
CNT16
W1
XIANSHI
CLK
CNT8
图2-2 电路连接简图
字体显示驱动
行驱动程序
16
进制计数器
8
进制
计数器
顶层文件设计
三、功能模块的划分
3.1 系统的总体框图
图
3-1 模块图
四、主要功能的实现
4.1 1 8进制加法器设计
CNT8.vhd是8进制的计数器,其每计一次数,输出一个字。例如当计数为“000B”时显示“湖”,当计数为“001B”时显示“南”。给其脉冲周期为1S。
4.2 2 16进制计数器设计
CNT16.vhd是16进制的计数器,其输出端控制行和列驱动控制器的输出数据;
4.3 列驱动设计
HANG.vhd为列驱动控制器,该模块控制所亮的行,当输出为0001H时,给点阵的第一行高电平,输出为0010H时,给点阵的第二行高电平,依次类推,逐次给每行高电平。
4.4 字体显示控制器
XIANSHI.vhd为字体显示控制器,SHI控制的是所显示的字。例如当SHI为00H时,表示显示第一个字;当SHI为01H时,表示显示第二个字,依次类推。WEI控制所显示的为字的第几行,例如当WEI为0000B时,表示输出字的第一行文字信息;WEI为0001B时,表示输出字的第二行文字信息,依次类推。
4.5 顶层文件设计
JUZHEN16.vhd是顶层文件设计,文件在实体中首先定义了顶层设计元件的端口信号,然后在architecture和begin之间利用component语句对准备调用的元件做了声明,并定义了c,d两个信号作为器件内部的连接线。最后利用端口映射语句PORT MAP()将两个计数器和列驱动,字体显示驱动连接起来构成一个完整的器件。
五、系统调试与仿真
5.1 程序仿真图
图5-1 CNT16.vhd仿真波形图
图5-2 HANG.vhd仿真波形图
图5.3 顶层仿真图
5.2 16*16 LED点阵显示引脚分配
16×16 点阵信号名称
FPGA 引脚
说明
DOC-C0
F7
列
DOT-C1
E8
列
DOT-C2
J8
列
DOT-C3
G9
列
DOT-C4
G10
列
DOT-C5
F11
列
DOT-C6
F9
列
DOT-C7
F10
列
DOT-C8
G2
列
DOT-C9
F1
列
DOT-C10
E1
列
DOT-C11
E2
列
DOT-C12
D1
列
DOT-C13
D2
列
DOT-C14
C2
列
DOT-C15
B2
列
DOT-R0
B3
行选择
DOT-R1
C3
行选择
DOT-R2
H1
行选择
DOT-R3
J2
行选择
DOT-R4
L2
行选择
DOT-R5
J13
行选择
DOT-R6
H15
行选择
DOT-R7
V11
行选择
DOT-R8
E10
行选择
DOT-R9
F12
行选择
DOT-R10
E12
行选择
DOT-R11
F13
行选择
DOT-R12
F14
行选择
DOT-R13
E15
行选择
DOT-R14
F15
行选择
DOT-R015
F16
行选择
时钟:
Clk
N1
图5.4 引脚分配
5.3 程序运行结果
程序仿真完全正确后,线封锁引脚,然后连接硬件,再次编译,没有错误后下载程序到硬件之中,当拨码开关闭合时,得到点阵LED显示结果,其中每个汉字显示时间为一秒,一秒过后自动换下一个汉字,直到显示完“考试必过”,再循环显示以上内容;当拨码开关断开时,点阵LED不显示任何内容
六、附件
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT8 IS
PORT( CLK1: IN STD_LOGIC;
QOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END ENTITY CNT8;
ARCHITECTURE BEHV OF CNT8 IS
SIGNAL CQI : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
PROCESS(CLK1)
BEGIN
IF (CLK1'EVENT AND CLK1='1') THEN
CQI<=CQI+1;
END IF;
QOUT<=CQI;
END PROCESS;
END ARCHITECTURE BEHV;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT16 IS
PORT( CLK : IN STD_LOGIC;
QOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END ENTITY CNT16;
ARCHITECTURE BEHV OF CNT16 IS
SIGNAL CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(CLK)
BEGIN
IF (CLK'EVENT AND CLK='1') THEN
CQI<=CQI+1;
END IF;
QOUT<=CQI;
END PROCESS;
END ARCHITECTURE BEHV;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY HANG IS
PORT(DATAIN : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
ROW : OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END ENTITY HANG;
ARCHITECTURE BEHV OF HANG IS
SIGNAL HANG : STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
PROCESS(DATAIN)
BEGIN
CASE DATAIN IS
WHEN "0000"=> ROW<="1000000000000000";
WHEN "0001"=> ROW<="0100000000000000";
WHEN "0010"=> ROW<="0010000000000000";
WHEN "0011"=> ROW<="0001000000000000";
WHEN "0100"=> ROW<="0000100000000000";
WHEN "0101"=> ROW<="0000010000000000";
WHEN "0110"=> ROW<="0000001000000000";
WHEN "0111"=> ROW<="0000000100000000";
WHEN "1000"=> ROW<="0000000010000000";
WHEN "1001"=> ROW<="0000000001000000";
WHEN "1010"=> ROW<="0000000000100000";
WHEN "1011"=> ROW<="0000000000010000";
WHEN "1100"=> ROW<="0000000000001000";
WHEN "1101"=> ROW<="0000000000000100";
WHEN "1110"=> ROW<="0000000000000010";
WHEN "1111"=> ROW<="0000000000000001";
WHEN OTHERS=> ROW<="0000000000000000";
END CASE;END PROCESS;
END ARCHITECTURE BEHV;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY XIANSHI IS
PORT( WEI : IN STD_LOGIC_VECTOR(3 downto 0);
SHI : IN STD_LOGIC_VECTOR(2 downto 0);
Q : OUT STD_LOGIC_VECTOR(15 downto 0));
END XIANSHI;
ARCHITECTURE XIANSHI_architecture OF XIANSHI IS
BEGIN
process(shi,wei)
variable b:std_logic_vector(15 downto 0);
begin
case shi is
When "000"=>
case wei is
when "0000" =>b:="1111111111111111";
when "0001" =>b:="1011111111110111";
when "0010" =>b:="1101111111110000";
when "0011" =>b:="1110111011101110";
when "0100" =>b:="1111111101110110";
when "0101" =>b:="1000000001110000";
when "0110" =>b:="0010011111111001";
when "0111" =>b:="1110111101110110";
when "1000" =>b:="1111111101110000";
when "1001" =>b:="1111110000010110";
when "1010" =>b:="1111010111010110";
when "1011" =>b:="1110110111010110";
when "1100" =>b:="1101110000010110";
when "1101" =>b:="1011111111011110";
when "1110" =>b:="1011111111011110";
when "1111" =>b:="1111111111111111";
when others=>null; end case;
When "001"=>
case wei is
when "0000" =>b:="1111111111111111";
when "0001" =>b:="1111111110111111";
when "0010" =>b:="1111111101111111";
when "0011" =>b:="1110000000000111";
when "0100" =>b:="1111110111111111";
when "0101" =>b:="1111101111111111";
when "0110" =>b:="1111000000000111";
when "0111" =>b:="1111011011010111";
when "1000" =>b:="1111011010110111";
when "1001" =>b:="1111010000010111";
when "1010" =>b:="1111011101110111";
when "1011" =>b:="1111010000010111";
when "1100" =>b:="1111011101110111";
when "1101" =>b:="1111011101110111";
when "1110" =>b:="1111111111111111";
when "1111" =>b:="1111111111111111";
when others=>null; end case;
When "010"=>
case wei is
when "0000" =>b:="1111111111111111";
when "0001" =>b:="1111111111110111";
when "0010" =>b:="1000000000000011";
when "0011" =>b:="1111111011111111";
when "0100" =>b:="1111111011111111";
when "0101" =>b:="1111111011111111";
when "0110" =>b:="1111111011111111";
when "0111" =>b:="1111111011111111";
when "1000" =>b:="1111111011111111";
when "1001" =>b:="1111111011111111";
when "1010" =>b:="1111111011111111";
when "1011" =>b:="1111111011111111";
when "1100" =>b:="1111111011111011";
when "1101" =>b:="0000000000000001";
when "1110" =>b:="1111111111111111";
when "1111" =>b:="1111111111111111";
when others=>null; end case;
When "011"=>
case wei is
when "0000" =>b:="1111111111111111";
when "0001" =>b:="1111101111111111";
when "0010" =>b:="1111011111111111";
when "0011" =>b:="1110111100000111";
when "0100" =>b:="1000111101110111";
when "0101" =>b:="1110111101110111";
when "0110" =>b:="1110111100000111";
when "0111" =>b:="1000000111111111";
when "1000" =>b:="1110111000000011";
when "1001" =>b:="1100011111011111";
when "1010" =>b:="1010101000000011";
when "1011" =>b:="0110101111011111";
when "1100" =>b:="0110110111011111";
when "1101" =>b:="1110111000000011";
when "1110" =>b:="1110111111111111";
when "1111" =>b:="1111111111111111";
when others=>null; end case;
When "100"=>
case wei is
when "0000" =>b:="1101110111110111";
when "0001" =>b:="1110111011110111";
when "0010" =>b:="1111111111111111";
when "0011" =>b:="1111111111011111";
when "0100" =>b:="1000000000000001";
when "0101" =>b:="1011111111111101";
when "0110" =>b:="0111111111111011";
when "0111" =>b:="1110000000011111";
when "1000" =>b:="1111111110111111";
when "1001" =>b:="1111111001111011";
when "1010" =>b:="0000000000000001";
when "1011" =>b:="1111111011111111";
when "1100" =>b:="1111111011111111";
when "1101" =>b:="1111111011111111";
when "1110" =>b:="1111101011111111";
when "1111" =>b:="1111110111111111";
when others=>null; end case;
When "101"=>
case wei is
when "0000" =>b:="1111111111111111";
when "0001" =>b:="1111011110011111";
when "0010" =>b:="1110101111101111";
when "0011" =>b:="1101110100000001";
when "0100" =>b:="1101110011111110";
when "0101" =>b:="1100001011000110";
when "0110" =>b:="1101001111111111";
when "0111" =>b:="1101110100000001";
when "1000" =>b:="1100010111010111";
when "1001" =>b:="1101101111010111";
when "1010" =>b:="1101111111010111";
when "1011" =>b:="1101111110010111";
when "1100" =>b:="1101111110110101";
when "1101" =>b:="1101111101110000";
when "1110" =>b:="1111111111111111";
when "1111" =>b:="1111111111111111";
when others=>null; end case;
when others=>null;
end case;
q<=b;
end process;
END XIANSHI_architecture;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY JUZHEN16 IS
PORT (a,b : IN STD_LOGIC ;
Q1,W1: OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END ENTITY JUZHEN16;
ARCHITECTURE JZ16 OF JUZHEN16 IS
COMPONENT CNT8
PORT( CLK1: IN STD_LOGIC;
QOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END COMPONENT;
COMPONENT CNT16
PORT( CLK : IN STD_LOGIC;
QOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT;
COMPONENT HANG
PORT(DATAIN : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
ROW : OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END COMPONENT;
COMPONENT XIANSHI
PORT( WEI : IN STD_LOGIC_VECTOR(3 downto 0);
SHI : IN STD_LOGIC_VECTOR(2 downto 0);
Q : OUT STD_LOGIC_VECTOR(15 downto 0));
END COMPONENT;
SIGNAL c: STD_LOGIC_VECTOR(3 downto 0);
SIGNAL d: STD_LOGIC_VECTOR(2 downto 0);
BEGIN
U1: CNT8 PORT MAP( CLK1=>b,QOUT=>d );
U2: CNT16 PORT MAP( CLK=>a,QOUT=>c );
U3: HANG PORT MAP(datain=>c,ROW=>Q1);
U4: XIANSHI PORT MAP (wei=>c,shi=>d,Q=>W1);
END ARCHITECTURE JZ16;
展开阅读全文