微智科技网
您的当前位置:首页点阵设计

点阵设计

来源:微智科技网


目 录

1 基本概要......................................................................................................................................1 1.1 EDA的基本特征和设计流程................................................................................................1 1.2 LED点阵显示特点................................................................................................................1 1.3 FPGA基本特点和设计的特点..............................................................................................1 2 总体设计原理及原理框图...........................................................................................................2 2.1 设计原理................................................................................................................................2 3 单元电路设计..............................................................................................................................3 3.1 时钟信号控制模块设计.........................................................................................................4 3.1.1 时钟信号控制模块的源程序及其实体图.......................................................................4 3.1.2 时钟信号控制模块仿真.................................................................................................4 3.2 时序控制模块设计................................................................................................................5 3.2.1 时序控制模块的源程序及其实体图..............................................................................5 3.2.2 时序控制模块仿真.........................................................................................................6 3.3 扫描控制模块设计................................................................................................................6 3.3.1 扫描控制模块源程序及其实体图..................................................................................6 3.3.2 扫描控制模块仿真.........................................................................................................7 3.4 显示控制模块设计................................................................................................................8 3.4.1 显示控制模块源程序及其实体图..................................................................................8 3.4.2 显示控制模块仿真.......................................................................................................12 4 总体设计....................................................................................................................................13 4.1 顶层文件设计......................................................................................................................13 3.2 总体仿真图..........................................................................................................................14 4.3 管脚锁定图..........................................................................................................................15 4.4 实验箱显示结果..................................................................................................................16 5 心得体会....................................................................................................................................17

点阵设计

1 基本概要

1.1 EDA的基本特征和设计流程

EDA技术是采用高级语言描述,具有系统级仿真和综合能力,它主要采用并行工程(Concurrent Engineering)设计和自顶向下(Top-down)设计方法,其基本思想是从系统总体要求出发,分为行为描述、寄存器传输级描述、逻辑综合三个层次,将设计内容逐步细化,最后完成整体设计,这是一种全新的设计思想与设计理念。 EDA技术是将传统的“电路设计——硬件搭试——调试焊接”模式变为“功能设计——软件模拟——编程下载”方式,设计人员只需一台微机和相应的开发工具即可研制出各种功能电路。EDA技术将电子产品设计从软件编译、 逻辑化简、 逻辑综合、 仿真优化、 布局布线、 逻辑适配、 逻辑影射、 编程下载 、生成目标系统的全过程在计算机及其开发平台上自动处理完成。

1.2 LED点阵显示特点

1. 可以显示各种数字、文字、图表、曲线、图形;

2. 采用纯红、高绿作双基色发光器件,发光亮度高,色彩鲜艳、丰富; 3. 显示效果清晰、稳定、功耗低、寿命长;

4. 优质铝合金结构,磨沙、银镜或钛金不锈钢包边。尺寸和规格可根据需要灵活组合;

5. 支持各种计算机网络,编辑软件丰富、易用;

6. 适用于室内、外所有信息发布及广告宣传场所。如:银行、证券交易所、商场、市场、宾馆、洒楼、电信、邮政、医院、车站、机场等。

1.3 FPGA基本特点和设计的特点

基本特点:

1)采用FPGA设计ASIC电路(专用集成电路),用户不需要投。

1

点阵设计

片生产,就能得到合用的芯片。

2)FPGA可做其它全定制或半定制ASIC电路的中试样片。 3)FPGA内部有丰富的触发器和I/O引脚。

4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。

5) FPGA采用高速CMOS工艺,功耗低,可以与CMOS、TTL电平兼容。 FPGA的主要特点是:寄存器数目多,采用查找表计数,适合时序逻辑设计 但是互连复杂,由于互连采用开关矩阵,因而使得延时估计往往不十分准确。FPGA 也有其自身的局限性,其一就是器件规模的,其二就是单元延迟比较大。所以,在设计者选定某一FPGA器件后,要求设计者对器件的结构、性能作深入的了解,在体系结构设计时,就必须考虑到器件本身的结构及性能,尽可能使设计的结构满足器件本身的要求。这样就增加了设计的难度。离开对FPGA结构的详细了解,设计人员就不可能优化设计。因而设计人员必须了解FPGA器件的特性和,熟悉FPGA的结构。在了解FPGA结构特点的基础上,就可以利用VHDL语言描写出高效的电路描述实现性能优化的电路。

2 总体设计原理及原理框图

2.1 设计原理

首先我们设计要正确显示这些字,显示屏上的灯的亮暗情况具体应如何。如第一个字‘祝’:

2

点阵设计

图2.1 显示屏字体显示

如果高电平‘1’ 时表示灯是亮的,低电平‘0’时灯是暗的,这样上面的灯呈现在我们眼前的就是‘祝’字了。依次类推,我们就可以设计出所有要显示的字了。其设计原理图框图如下。

图2.2 总体设计框图

使用FPGA设计一个16×16的点阵显示的控制器,使点阵显示“祝陈老师新年快乐”这些字。

这样这些字就好象是被我们当作了固定模型了。但如何点亮这些灯呢,这就要求有一个脉冲循环扫描的电路,我们采用列扫描,当扫描的和我们先设计好的字模型的高电平相匹配时,灯就相应的点亮。由于扫描的速度很快,我们人的眼睛并不会感到灯的闪烁,所以每扫描完16列就会显示在我们眼中一个字了。但要所有的字母就可以依次的显示出来并不停的循环显示,就还要再有一个时序控制电路来控制。此时序控制电路象一个计数器,有自动清零的功能,这样就可以实现循环的效果了。

3 单元电路设计

3

点阵设计

3.1 时钟信号控制模块设计

3.1.1 时钟信号控制模块的源程序及其实体图

源程序如下:

library ieee; use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity lcd1 is

port(clk1 : in std_logic; clk2 : in std_logic; set : in std_logic; a : out std_logic; b : out std_logic); end lcd1;

architecture one of lcd1 is begin

process(clk1,clk2) begin

if set='1' then a<='0';b<='0';

else a<=clk1;b<=clk2; end if; end process; end one;

图3.1 时钟信号控制模块

此模块用来控制时钟信号,使得时钟信号可以进行延迟,使时钟信号clk1和clk2保持低电平。

3.1.2 时钟信号控制模块仿真

图3.2为时钟信号控制模块,即lcd1的仿真波形。

4

点阵设计

图3.2 时钟信号控制模块仿真图

由图可知:当set为低电平的时候,输出a输出clk1的波形;当set为高电平时,输出a将输出为低电平,这样使得时钟信号得到了延迟。

3.2 时序控制模块设计

3.2.1 时序控制模块的源程序及其实体图

源程序如下:

library ieee; use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity lcd2 is

port( en : in std_logic; clk : in std_logic;

q : out std_logic_vector(2 downto 0)); end lcd2;

architecture one of lcd2 is begin

process(clk)

variable tmp : std_logic_vector(2 downto 0); begin

if en='0' then tmp:=\"000\";

elsif clk'event and clk='1' then if tmp=\"111\" then tmp:=\"000\"; else

tmp:=tmp+1; end if; end if; q<=tmp; end process;

5

点阵设计

end one;

图3.3 时序控制模块

此模块用来控制每个字的显示时间,一共有8个字(祝,陈,老,师,新,年,快,乐。)tmp作为中间变量作为循环周期,当tmp达到最大值111时,tmp自动清零,此后是这些字显示的下一个循环。如此不停的循环显示各个字。tmp的上限值就是字的循环个数,修改tmp的上限值也就达到了修改循环周期。

模块的输入信号为时钟信号,时钟信号的周期为每个字显示的时间。输出为选择第几个字的二进制表示,作为下一级的输入。 3.2.2 时序控制模块仿真

图3.4为时序控制模块,即lcd2的仿真波形。

图3.4 时序控制模块仿真图

由图可知:当使能端en为高电平时,每当时钟信号CLK产生一个上升沿的时候,作为计数功能的输出端Q就会加1,当达到最大计数7时,再来一个时钟上升沿则会从0开始重新计数。因此总共计数为8个数,即8个字完成一次循环;而当使能端en为低电平的时候,输出则会被清零,并保持此状态。

3.3 扫描控制模块设计

3.3.1 扫描控制模块源程序及其实体图

源程序如下:

6

点阵设计

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity lcd3 is

port(clk : in std_logic;

so : out std_logic_vector(3 downto 0)); end lcd3;

architecture one of lcd3 is begin

process(clk)

variable tmp : std_logic_vector(3 downto 0); begin

if clk'event and clk='1' then if tmp=\"1111\" then tmp:=\"0000\"; else tmp:=tmp+1; end if; end if; so<=tmp; end process; end one;

图3.5 扫描控制模块

此模块用来实现列扫描控制,CLK依旧为时钟输入信号,每个周期为扫描的时间。每来一个时钟信号,SO输出端就会对上所次选中列的下一列进行选中、扫描。其输出的值为列号的二进制码作为下一级的输入和实验箱上点阵的列选择信号。因为实验箱点阵的规模为16×16,故每扫描完16列,tmp自动清零,这样就提供了一个行循环扫描的功能,这样就可以循环的是各个字。 3.3.2 扫描控制模块仿真

图3.6为扫描控制模块,即lcd3的仿真波形图

7

点阵设计

图3.6 扫描控制模块仿真图

由图知:时钟输入信号CLK每来一个上升沿,输出信号SO就加1,依次加到最大值15时从0开始重新计数。 SO计数最大为15,总共16个,从而控制从第一列到第16列的扫描。当时钟信号频率较高时,可近似看成所有列同时都被选中扫描。

3.4 显示控制模块设计

3.4.1 显示控制模块源程序及其实体图

源程序如下:

library ieee;

use ieee.std_logic_11.all;

entity lcd4 is

port(hs : in std_logic_vector(2 downto 0); gs : in std_logic_vector(3 downto 0); qo : out std_logic_vector(15 downto 0)); end lcd4;

architecture one of lcd4 is begin

process(hs,gs) begin

case hs is

when\"000\"=> case gs is

when\"0000\"=>qo<=\"0010000000000000\"; when\"0001\"=>qo<=\"0001001111111000\"; when\"0010\"=>qo<=\"0001001000001000\"; when\"0011\"=>qo<=\"0000001000001000\"; when\"0100\"=>qo<=\"1111111000001000\"; when\"0101\"=>qo<=\"0000101000001000\"; when\"0110\"=>qo<=\"0001001000001000\";

8

点阵设计

when\"0111\"=>qo<=\"0011101111111000\"; when\"1000\"=>qo<=\"0101010010100000\"; when\"1001\"=>qo<=\"1001000010100000\"; when\"1010\"=>qo<=\"0001000010100000\"; when\"1011\"=>qo<=\"0001000100100000\"; when\"1100\"=>qo<=\"0001000100100010\"; when\"1101\"=>qo<=\"0001001000100010\"; when\"1110\"=>qo<=\"0001010000011110\"; when\"1111\"=>qo<=\"0001100000000000\"; when others=>null; end case; when\"001\"=> case gs is

when\"0000\"=>qo<=\"0000000001000000\"; when\"0001\"=>qo<=\"0111100001000000\"; when\"0010\"=>qo<=\"0100100001000000\"; when\"0011\"=>qo<=\"0101011111111110\"; when\"0100\"=>qo<=\"0101000010000000\"; when\"0101\"=>qo<=\"0110000010100000\"; when\"0110\"=>qo<=\"0101000100100000\"; when\"0111\"=>qo<=\"0100101000100000\"; when\"1000\"=>qo<=\"0100101111111100\"; when\"1001\"=>qo<=\"0100100000100000\"; when\"1010\"=>qo<=\"0110100100101000\"; when\"1011\"=>qo<=\"0101000100100100\"; when\"1100\"=>qo<=\"0100001000100110\"; when\"1101\"=>qo<=\"0100010000100100\"; when\"1110\"=>qo<=\"0100000010100000\"; when\"1111\"=>qo<=\"0100000001000000\"; when others=>null; end case; when\"010\"=> case gs is

when\"0000\"=>qo<=\"0000001000000000\"; when\"0001\"=>qo<=\"0000001000000000\"; when\"0010\"=>qo<=\"0000001000001000\"; when\"0011\"=>qo<=\"0011111111011000\"; when\"0100\"=>qo<=\"0000001000100000\"; when\"0101\"=>qo<=\"0000001001000000\"; when\"0110\"=>qo<=\"1111111111111110\"; when\"0111\"=>qo<=\"0000000100000000\"; when\"1000\"=>qo<=\"0000001000000000\"; when\"1001\"=>qo<=\"0000010000010000\"; when\"1010\"=>qo<=\"0000110000110000\";

9

点阵设计

when\"1011\"=>qo<=\"0001010011000000\"; when\"1100\"=>qo<=\"0010011100000000\"; when\"1101\"=>qo<=\"0100010000000100\"; when\"1110\"=>qo<=\"1000010000000100\"; when\"1111\"=>qo<=\"0000001111111100\"; when others=>null; end case; when\"011\"=> case gs is

when\"0000\"=>qo<=\"0000100000000000\"; when\"0001\"=>qo<=\"0000101111111110\"; when\"0010\"=>qo<=\"0100100000100000\"; when\"0011\"=>qo<=\"0100100000100000\"; when\"0100\"=>qo<=\"0100100111111100\"; when\"0101\"=>qo<=\"0100100100100100\"; when\"0110\"=>qo<=\"0100100100100100\"; when\"0111\"=>qo<=\"0100100100100100\"; when\"1000\"=>qo<=\"0100100100100100\"; when\"1001\"=>qo<=\"0100100100100100\"; when\"1010\"=>qo<=\"0100100100100100\"; when\"1011\"=>qo<=\"0100100100100100\"; when\"1100\"=>qo<=\"0001000100110100\"; when\"1101\"=>qo<=\"0001000100101000\"; when\"1110\"=>qo<=\"0010000000100000\"; when\"1111\"=>qo<=\"0100000000100000\"; when others=>null; end case; when\"100\"=> case gs is

when\"0000\"=>qo<=\"0001000000000100\"; when\"0001\"=>qo<=\"0000100000001100\"; when\"0010\"=>qo<=\"0111111100110000\"; when\"0011\"=>qo<=\"0000000001000000\"; when\"0100\"=>qo<=\"0010001001000000\"; when\"0101\"=>qo<=\"0001010001000000\"; when\"0110\"=>qo<=\"1111111111111110\"; when\"0111\"=>qo<=\"0000100001001000\"; when\"1000\"=>qo<=\"0111111101001000\"; when\"1001\"=>qo<=\"0000100001001000\"; when\"1010\"=>qo<=\"0000101001001000\"; when\"1011\"=>qo<=\"0010100010001000\"; when\"1100\"=>qo<=\"0100100010001000\"; when\"1101\"=>qo<=\"1000100100001000\"; when\"1110\"=>qo<=\"0010101000001000\";

10

点阵设计

when\"1111\"=>qo<=\"0001000000001000\"; end case; when\"101\"=> case gs is

when\"0000\"=>qo<=\"0000100000000000\"; when\"0001\"=>qo<=\"0000100000000000\"; when\"0010\"=>qo<=\"0001111111111100\"; when\"0011\"=>qo<=\"0001000100000000\"; when\"0100\"=>qo<=\"0010000100000000\"; when\"0101\"=>qo<=\"0100000100000000\"; when\"0110\"=>qo<=\"0001111111111000\"; when\"0111\"=>qo<=\"0001000100000000\"; when\"1000\"=>qo<=\"0001000100000000\"; when\"1001\"=>qo<=\"0001000100000000\"; when\"1010\"=>qo<=\"1111111111111110\"; when\"1011\"=>qo<=\"0000000100000000\"; when\"1100\"=>qo<=\"0000000100000000\"; when\"1101\"=>qo<=\"0000000100000000\"; when\"1110\"=>qo<=\"0000000100000000\"; when\"1111\"=>qo<=\"0000000100000000\"; when others=>null; end case; when\"110\"=> case gs is

when\"0000\"=>qo<=\"0001000000000000\"; when\"0001\"=>qo<=\"0001000010000000\"; when\"0010\"=>qo<=\"0001000010000000\"; when\"0011\"=>qo<=\"0001000010000000\"; when\"0100\"=>qo<=\"0101111111111100\"; when\"0101\"=>qo<=\"0101000010001000\"; when\"0110\"=>qo<=\"0101000010001000\"; when\"0111\"=>qo<=\"1001000010001000\"; when\"1000\"=>qo<=\"0001000010001000\"; when\"1001\"=>qo<=\"0001111111111110\"; when\"1010\"=>qo<=\"0001000010000000\"; when\"1011\"=>qo<=\"0001000101000000\"; when\"1100\"=>qo<=\"0001000100100000\"; when\"1101\"=>qo<=\"0001001000010000\"; when\"1110\"=>qo<=\"0001010000001110\"; when\"1111\"=>qo<=\"0001100000000100\"; when others=>null; end case; when\"111\"=> case gs is

11

点阵设计

when\"0000\"=>qo<=\"0000000001000000\"; when\"0001\"=>qo<=\"0000000110000000\"; when\"0010\"=>qo<=\"0000111000000000\"; when\"0011\"=>qo<=\"0001000000000000\"; when\"0100\"=>qo<=\"0001000100000000\"; when\"0101\"=>qo<=\"0001000100000000\"; when\"0110\"=>qo<=\"0010000100000000\"; when\"0111\"=>qo<=\"0111111111111110\"; when\"1000\"=>qo<=\"0000000100000000\"; when\"1001\"=>qo<=\"0000000100000000\"; when\"1010\"=>qo<=\"0000100100100000\"; when\"1011\"=>qo<=\"0000100100010000\"; when\"1100\"=>qo<=\"0001000100001000\"; when\"1101\"=>qo<=\"0010000100001100\"; when\"1110\"=>qo<=\"0100010100000100\"; when\"1111\"=>qo<=\"0000001000000000\"; when others=>null; end case;

when others=>null; end case; end process; end one;

图3.7 显示控制模块

此模块用来实现显示出相应的字。以LCD2的输出信号作为输入信号HS,用来控制显示第几个字。以LCD3的输出信号作为LCD3输入信号GS,用来控制扫描第几列。只有当字选择与列选择同时存在时,对某一个字的某一行其对应应该点亮的灯进行点亮。当列扫描频率GS远大于字选择频率HS时,也就是在字选中期间,列完成了在点阵上的多次周期扫描并同时进行点亮相应的灯,就实现了对字在LED阵上的显示。 3.4.2 显示控制模块仿真

如图3.8为显示控制模块,即LCD4的部分仿真波形图

12

点阵设计

图3.8 显示控制模块仿真图

由图知:HS输入0000即选择第1个字时,GS输入0000~1111,QO逐行输出第一个字所对应的字的字库,即“祝”。GS与HS的频率输入比至少要大于8:1。因为在选中一个字的时候至少要对列进行一个周期的扫描输出,若小于此比例,模块没有最所有的列进行扫描和输出,则字的显示不能完全,只能显示前一部分。GS与HS的频率比越大,字的显示越清晰。

4 总体设计

4.1 顶层文件设计

顶层文件来实现循环显示各个字的功能。它由时钟信号控制模块,时序控制模块,扫描模块和字母显示控制模块组成。

具体电路的顶层文件设计如下图:

13

点阵设计

图 4.1 顶层电路图

要实现显示“祝陈老师新年快乐”这些字,结合实际,模块LCD1,LCD2, LCD3,LCD4分别实现时钟信号控制模块,时序控制模块,扫描模块和显示控制模块。时序控制模块利用脉冲来控制每个字的显示时间。扫描控制模块利用列扫描脉冲产生列扫描信号。而字显示控制模块用时序控制模块和扫描控制模块所提供的脉冲信号来点亮各个字模型中相应的灯。在时钟信号模块和时序模块的控制下(此设计中每8个字为一个循环)实现了各个字循环显示的功能。

3.2 总体仿真图

图4.2 第一个字设计仿真图

14

点阵设计

如图所示:当使能端en为低电平时,所有的输出将被清零,且保持此状态;当使能端en为高电平时,循环得以进行。当set为高电平时,所有输出将保持此前状态;当set为低电平时,正常按循环输出。当en为高电平、set为低电平时,在一个CLK1的周期信号中,CLK2经过了16个周期,输出信号SO在选中某一列的同时,QO也对这一行进行了相应字的点亮。在字的选中时间内(即CLK1的一个周期),SO对所有列进行了扫描,QO也进行了相应的点亮,从整体看来,字的点亮已经得到初步实现。

4.3 管脚锁定图

图4.3 顶层文件管脚锁定图

如图所示,输入信号有EN和SET两个拨键开关信号以及CLK1和CLK2两个时钟脉冲信号。其中EN控制的是字体循环显示与否,SET控制是否维持某个字

15

点阵设计

持续下去,CLK1控制的是字的显示速度,CLK2控制的是列的扫描速度。因此在选择频率时,CLK2选择的时钟频率应该远大于CLK1选择的时钟频率。输出端为QO[0..15]和SO[0..3]。QO[0..15]所接的管脚为对应的点阵的列信号输入管脚,用来点亮每一列相应的灯。SO[0..3]所接的是点阵模块自带的4线16线译码器,译码器的输出为相应的列选信号,即对应的列选择。

4.4 实验箱显示结果

设计的正确与否,还得经过实际的验证。经实验箱验证的结果如下图组3.4所示。

图组4.4 实验箱显示结果

由上图组实验结果所示,实验箱点阵模块成功的显示了“祝陈老师新年快乐”

16

点阵设计

这几个字,说明本次设计成功完成。

5 心得体会

实话说,刚看到课题的时候,感觉很迷茫,不知到应该从哪里入手,感觉和课本上的差别很大,没有明确的目标。我找了些关于EDA入门和电子设计的书来看。一看就是几天,但还是没能构建出整体思路。于是便找来了几个一起做相同课题的同学一起商量,并且上网查资料,终于了解了什么是点阵设计。头脑中隐隐看到了思路,心里有了底。

经过了几天的查资料和与同伴的讨论,终于写出了程序,并到实验室进行了调试。当LED显示灯如愿以偿的显示出我们想要的字后,心中感到由衷的高兴,感觉很有成就感和自豪感。

经过这次课题实践,发现我自己的操作能力有待进一步的提高,自己还需要更多的锻炼。期待下一次的设计机会。

17

因篇幅问题不能全部显示,请点此查看更多更全内容