资源描述
JIANGSU TEACHERS UNIVERSITY OF TECHNOLOGY
数字电路课程设计报告
基于FPGA的点阵显示控制器的设计
学 院 名 称: 电气信息工程学院
专 业: 测控技术与仪器
班 级: 08测控1W
姓 名: 顾晓艳
学 号: 08314112
合作者姓名: 袁佳
指导教师姓名: 翟丽芳、樊寅逸
2010 年 12 月
目 录
序言 …………………………………………………………………… 2
第1章 课题要求……………………………………………………… 2
1.1 技术要求………………………………………………………………… 2
1.1.1 EDA技术………………………………………………………………… 2
1.1.2 VHDL语言……………………………………………………………… 3
1.1.3 层次化设计……………………………………………………………… 4
1.2功能要求. ………………………………………………………………… 5
1.3本人的工作. ………………………………………………………………… 5
第2章 设计方案…………………………………………………… 6
第3章 单元电路设计和仿真结果分析………………………… 6
第4章 顶层电路设计………………………………………………… 14
(第三、四章借鉴袁佳)
第5章 硬件电路设计与安装图………………………………… 15
第6章 硬件电路安装与调试………………………………… 18
第7章 调试结果……………………………………………………… 19
第8章 收获与体会…………………………………………………… 20
参考文献……………………………………………………… 21
序言
随着我国经济的高速发展,对公共场合发布信息的需求日益增长,利用LED点阵显示汉字的出现正好适应了这一市场需求,已经成为信息传播的一种重要的手段。
采用传统方式设计的汉字显示器,通常需要使用单片机、存储器和制约逻辑电路来进行PCB半的系统集成。尽管这种方案有单片机软件的支持较为灵活,但是由于受硬件资源的限制,未来对设计的变更和升级,总是难以避免要付出较多的研发经费和较长投放市场周期的代价。随着电子设计自动化(EDA)技术的进展,基于可编程FPGA器件进行系统芯片集成的新设计方法,也正在快速地取代基于PCB板的传统设计方式。因此,本文阐述了基于FPGA和VHDL语言实现在8*8点阵上显示汉字的问题。
第一章 课题要求
1.1 技术要求
1.1.1 EDA技术
20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
现在对EDA的概念或范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。
EDA在教学、科研、产品设计与制造等各方面都发挥着巨大的作用。在教学方面,几乎所有理工科(特别是电子信息)类的高校都开设了EDA课程。主要是让学生了解EDA的基本概念和基本原理、掌握用HDL语言编写规范、掌握逻辑综合的理论和算法、使用EDA工具进行电子电路课程的实验验证并从事简单系统的设计。一般学习电路仿真工具(如multiSIM、PSPICE)和PLD开发工具(如Altera/Xilinx的器件结构及开发系统),为今后工作打下基础。
科研方面主要利用电路仿真工具(multiSIM或PSPICE)进行电路设计与仿真;利用虚拟仪器进行产品测试;将CPLD/FPGA器件实际应用到仪器设备中;从事PCB设计和ASIC设计等。
在产品设计与制造方面,包括计算机仿真,产品开发中的EDA工具应用、系统级模拟及测试环境的仿真,生产流水线的EDA技术应用、产品测试等各个环节。如PCB的制作、电子设备的研制与生产、电路板的焊接、ASIC的制作过程等。
从应用领域来看,EDA技术已经渗透到各行各业,如上文所说,包括在机械、电子、通信、航空航航天、化工、矿产、生物、医学、军事等各个领域,都有EDA应用。另外,EDA软件的功能日益强大,原来功能比较单一的软件,现在增加了很多新用途。如AutoCAD软件可用于机械及建筑设计,也扩展到建筑装璜及各类效果图、汽车和飞机的模型、电影特技等领域。
1.1.2 VHDL语言
VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于 1982 年。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用 , 它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来 ,VHDL 语言主要具有以下优点:
(1) VHDL 语言功能强大 , 设计方式多样
VHDL 语言具有强大的语言结构, 只需采用简单明确的VHDL语言程序就可以描述十分复杂的硬件电路。同时, 它还具有多层次的电路设计描述功能。此外 ,VHDL 语言能够同时支持同步电路、异步电路和随机电路的设计实现, 这是其他硬件描述语言所不能比拟的。VHDL 语言设计方法灵活多样 , 既支持自顶向下的设计方式, 也支持自底向上的设计方法; 既支持模块化设计方法, 也支持层次化设计方法。
(2) VHDL 语言具有强大的硬件描述能力
VHDL 语言具有多层次的电路设计描述功能,既可描述系统级电路 , 也可以描述门级电路;描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。同时,VHDL 语言也支持惯性延迟和传输延迟,这样可以准确地建立硬件电路的模型。VHDL 语言的强大描述能力还体现在它具有丰富的数据类型。VHDL 语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。
(3) VHDL 语言具有很强的移植能力
VHDL 语言很强的移植能力主要体现在: 对于同一个硬件电路的 VHDL 语言描述 , 它可以从一个模拟器移植到另一个模拟器上、从一个综合器移植到另一个综合器上或者从一个工作平台移植到另一个工作平台上去执行。
(4) VHDL 语言的设计描述与器件无关
采用 VHDL 语言描述硬件电路时, 设计人员并不需要首先考虑选择进行设计的器件。这样做的好处是可以使设计人员集中精力进行电路设计的优化, 而不需要考虑其他的问题。当硬件电路的设计描述完成以后 ,VHDL 语言允许采用多种不同的器件结构来实现。
(5) VHDL 语言程序易于共享和复用
VHDL 语言采用基于库 ( library) 的设计方法。在设计过程中 , 设计人员可以建立各种可再次利用的模块 , 一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计 , 而是一些模块的累加。这些模块可以预先设计或者使用以前设计中的存档模块, 将这些模块存放在库中 , 就可以在以后的设计中进行复用。
由于 VHDL 语言是一种描述、模拟、综合、优化和布线的标准硬件描述语言 , 因此它可以使设计成果在设计人员之间方便地进行交流和共享, 从而减小硬件电路设计的工作量, 缩短开发周期。
1.1.3 层次化设计
我们在设计时为了提高最后结果的正确性和修改的方便性,往往采用层次化的设计,硬件描述语言设计可以描述(合成)为一个大的模块,或多个小的模块。每种方法都有其优点和不利之处。随着更高密度的FPGA器件的产生,使得层次化设计的优点远超过其不利之处。下面是分层设计的一些优点:
(1)提供更简单快捷的验证与仿真
(2)允许多个工程师同时进行设计
(3)加快设计编辑
(4)产品设计更易于理解
(5)高效的管理设计流程
分层设计也有其一定的缺点:通过分层约束,FPGA中的映射设计可能不是最佳,这可能会降低设备利用率和设计性能。对此加强注意,可使影响减少到最小。
1.2 功能要求
(1)基本功能
基于FPGA设计一个8*8的点阵显示控制器,基本要求为能够静态显示一个汉字。
(2)扩展功能
但在此基础上,我们组做了一定的扩展功能,点阵显示可显示一个静态的“王”字,一屏一屏的“亚运会”,和一个滚动的“王”字,显示方式可由开关K1,K2,K3控制,K1为静态的“王”字,K2为显示一屏一屏的“亚运会”,K3为显示一个滚动的“王“字,滚动的方向为向左。
1.3 本人的工作
本人负责硬件的设计,安装和调试,主要进行如下工作:
(1)根据模块化的思想进行设计,画出设计原理图
(2)确定每个元器件的参数
(3)按照设计的硬件原理图进行排版布局
(4)焊接元器件
(5)进行硬件的调试
(6)与下载好程序的FPGA板连接,与软件结合后进行再一次的调试
第二章 设计方案
本文设计的LED点阵模块,共由8*8=64个LED发光二极管组成。如何在该点阵模块上显示汉字是本文设计的关键技术。本文的系统设计是采用一种动态分时扫描技术来实现的。由于显示器为行共阳、列用阴的结构,因此不可能在同一时刻显示整个汉字。为了显示出整个汉字,首先分布好汉字排列,以行给汉字信息;然后以1Hz频率的时序逐一点亮每一列,即每列逐一加高电平,同时行给汉字信息,根据人眼的视觉残留特性,使之形成整个汉字的显示。
本次设计采用模块化的设计方式,原理如图:
列控制
扫描电路
分频电路
时钟输入
8*8矩阵显示屏
行控制
扫描电路
第三章 单元电路设计(参照袁佳)
①下面的程序是实现静态显示“王”字。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_Unsigned.all;
use ieee.std_logic_ARITH.all;
ENTITY peng is
port(clk,en:in std_logic;
lie:out std_logic_vector(7 downto 0); --列
com:out std_logic_vector(7 downto 0));--行
End peng;
Architecture a of peng is
signal st1:std_logic_vector(7 downto 0);
signal osc:std_logic;
signal osd:std_logic;
signal d_ff:std_logic_vector(27 downto 0);
signal data:std_logic_vector(7 downto 0);
signal d0,d1,d2,d3,d4,d5,d6,d7:std_logic_vector(7 downto 0);
signal lie0:std_logic_vector(6 downto 0);
Begin
com<=data;
lie<=st1;
d0<="10000000";
d1<="10010001";
d2<="10010001";
d3<="10010001";
d4<="11111111";
d5<="10010001";
d6<="10010001";
d7<="10000000";--字库 王
First:process
begin
wait until clk='1';--分频
if(d_ff(27 downto 0)>=2e8)then
d_ff(27 downto 0)<="0000000000000000000000000000";
else
d_ff(27 downto 0)<=d_ff+1;
end if;
osc<=not d_ff(10);
end process first;
second:process(osc)
begin
if(osc='1' and osc'event and en='0')then
if st1(7 downto 0)="00000000"or st1(7 downto 0)="01111111"then
st1(7 downto 0)<="11111110";data<=d0;--逐列扫描方式
elsif st1(7 downto 0)="11111110"then
st1(7 downto 0)<="11111101";data<=d1;
elsif st1(7 downto 0)="11111101"then
st1(7 downto 0)<="11111011";data<=d2;
elsif st1(7 downto 0)="11111011"then
st1(7 downto 0)<="11110111";data<=d3;
elsif st1(7 downto 0)="11110111"then
st1(7 downto 0)<="11101111";data<=d4;
elsif st1(7 downto 0)="11101111"then
st1(7 downto 0)<="11011111";data<=d5;
elsif st1(7 downto 0)="11011111"then
st1(7 downto 0)<="10111111";data<=d6;
elsif st1(7 downto 0)="10111111"then
st1(7 downto 0)<="01111111";data<=d7;
end if;
end if;
end process second;
end a;
②以下程序是实现一屏一屏显示“亚运会”
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_arith.all;
Entity weng is
Port(
Clk,en:in std_logic;
lie:out std_logic_vector(7 downto 0);--列
Com:out std_logic_vector(7 downto 0));--行
End weng;
Architecture a of weng is
signal st1:std_logic_vector(7 downto 0);
signal osc:std_logic;
signal osd:std_logic;
signal d_ff:std_logic_vector(27 downto 0);
signal data:std_logic_vector(7 downto 0);
signal d0,d1,d2,d3,d4,d5,d6,d7:std_logic_vector(7 downto 0);
signal lie0:std_logic_vector(6 downto 0);
begin
com<=data;
lie<=st1;
D0<=
"10000000"when lie0(6 downto 0)="0000000"else
"10000100"when lie0(6 downto 0)="0000001"else
"00010000"when lie0(6 downto 0)="0000010"else
"00000000";
D1<=
"10001001"when lie0(6 downto 0)="0000000"else
"11111111"when lie0(6 downto 0)="0000001"else
"00001000"when lie0(6 downto 0)="0000010"else
"00000000";
D2<=
"10010001"when lie0(6 downto 0)="0000000"else
"10000000"when lie0(6 downto 0)="0000001"else
"01010100"when lie0(6 downto 0)="0000010"else
"00000000";
D3<=
"11111111"when lie0(6 downto 0)="0000000"else
"10101010"when lie0(6 downto 0)="0000001"else
"01111010"when lie0(6 downto 0)="0000010"else
"00000000";
D4<=
"10000001"when lie0(6 downto 0)="0000000"else
"10111010"when lie0(6 downto 0)="0000001"else
"01011011"when lie0(6 downto 0)="0000010"else
"00000000";
D5<=
"11111111"when lie0(6 downto 0)="0000000"else
"10101010"when lie0(6 downto 0)="0000001"else
"01110100"when lie0(6 downto 0)="0000010"else
"00000000";
D6<=
"10010001"when lie0(6 downto 0)="0000000"else
"10111000"when lie0(6 downto 0)="0000001"else
"01001000"when lie0(6 downto 0)="0000010"else
"00000000";
D7<=
"10001000"when lie0(6 downto 0)="0000000"else
"10101000"when lie0(6 downto 0)="0000001"else
"10010000"when lie0(6 downto 0)="0000010"else
"00000000";--以上为字库“亚运会”
first:process
begin
wait until clk='1';
if(d_ff(27 downto 0)>=2e8)then
d_ff(27 downto 0)<="0000000000000000000000000000";
else
d_ff(27 downto 0)<=d_ff+1;
end if;
osc<=not d_ff(10);
osd<=not d_ff(26);
end process first;
second:process(osc)
begin
if(osc='1' and osc'event)then
if st1(7 downto 0)="00000000"or st1(7 downto 0)="01111111"then
st1(7 downto 0)<="11111110";data<=d0; --逐列扫描方式
elsif st1(7 downto 0)="11111110"then
st1(7 downto 0)<="11111101";data<=d1;
elsif st1(7 downto 0)="11111101"then
st1(7 downto 0)<="11111011";data<=d2;
elsif st1(7 downto 0)="11111011"then
st1(7 downto 0)<="11110111";data<=d3;
elsif st1(7 downto 0)="11110111"then
st1(7 downto 0)<="11101111";data<=d4;
elsif st1(7 downto 0)="11101111"then
st1(7 downto 0)<="11011111";data<=d5;
elsif st1(7 downto 0)="11011111"then
st1(7 downto 0)<="10111111";data<=d6;
elsif st1(7 downto 0)="10111111"then
st1(7 downto 0)<="01111111";data<=d7;
end if;
end if;
end process second;
third:process(osd)
begin
if(osd='1' and osd'event and en='0')then
if lie0(6 downto 0)="0000010"then
lie0(6 downto 0)<="0000000";
else lie0(6 downto 0)<=lie0+1;
end if;
end if;
end process third;
end a;
③以下程序实现滚动显示“王”
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity gun is
PORT(
clk,en:IN STD_LOGIC;
lie:out STD_LOGIC_VECTOR(7 DOWNTO 0);--列
com:out STD_LOGIC_VECTOR(7 DOWNTO 0));--行
END gun;
ARCHITECTURE a OF gun IS
SIGNAL st1,st2:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL osc:STD_LOGIC;
SIGNAL osd:STD_LOGIC;
SIGNAL d_ff:STD_LOGIC_VECTOR(27 DOWNTO 0);
SIGNAL data:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL d0,d1,d2,d3,d4,d5,d6,d7:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL lie0,lie1,lie2,lie3,lie4,lie5,lie6,lie7:STD_LOGIC_VECTOR(6 DOWNTO 0);
Begin
Com<=data;
lie<=st1;
D0<=
"10000000"when lie0="0000000"else--王字第0列
"10010001"when lie0="0000001"else--王字第1列
"10010001"when lie0="0000010"else--王字第2列
"10010001"when lie0="0000011"else--王字第3列
"11111111"when lie0="0000100"else--王字第4列
"10010001"when lie0="0000101"else--王字第5列
"10010001"when lie0="0000110"else--王字第6列
"10000000"when lie0="0000111"else--王字第7列
"00000000"; --以上为字库0
D1<=
"10010001"when lie0="0000000"else--王字第1列
"10010001"when lie0="0000001"else--王字第2列
"10010001"when lie0="0000010"else--王字第3列
"11111111"when lie0="0000011"else--王字第4列
"10010001"when lie0="0000100"else--王字第5列
"10010001"when lie0="0000101"else--王字第6列
"10000000"when lie0="0000110"else--王字第7列
"10000000"when lie0="0000111"else--王字第0列
"00000000";--以上为字库1
D2<=
"10010001"when lie0="0000000"else--王字第2列
"10010001"when lie0="0000001"else--王字第3列
"11111111"when lie0="0000010"else--王字第4列
"10010001"when lie0="0000011"else--王字第5列
"10010001"when lie0="0000100"else--王字第6列
"10000000"when lie0="0000101"else--王字第7列
"10000000"when lie0="0000110"else--王字第0列
"10010001"when lie0="0000111"else--王字第1列
"00000000";--以上为字库2
D3<=
"10010001"when lie0="0000000"else--王字第3列
"11111111"when lie0="0000001"else--王字第4列
"10010001"when lie0="0000010"else--王字第5列
"10010001"when lie0="0000011"else--王字第6列
"10000000"when lie0="0000100"else--王字第7列
"10000000"when lie0="0000101"else--王字第0列
"10010001"when lie0="0000110"else--王字第1列
"10010001"when lie0="0000111"else--王字第2列
"00000000";--以上为字库3
D4<=
"11111111"when lie0="0000000"else--王字第4列
"10010001"when lie0="0000001"else--王字第5列
"10010001"when lie0="0000010"else--王字第6列
"10000000"when lie0="0000011"else--王字第7列
"10000000"when lie0="0000100"else--王字第0列
"10010001"when lie0="0000101"else--王字第1列
"10010001"when lie0="0000110"else--王字第2列
"10010001"when lie0="0000111"else--王字第3列
"00000000";--以上为字库4
D5<=
"10010001"when lie0="0000000"else--王字第5列
"10010001"when lie0="0000001"else--王字第6列
"10000000"when lie0="0000010"else--王字第7列
"10000000"when lie0="0000011"else--王字第0列
"10010001"when lie0="0000100"else--王字第1列
"10010001"when lie0="0000101"else--王字第2列
"10010001"when lie0="0000110"else--王字第3列
"11111111"when lie0="0000111"else--王字第4列
"00000000";--以上是字库5
D6<=
"10010001"when lie0="0000000"else--王字第6列
"10000000"when lie0="0000001"else--王字第7列
"10000000"when lie0="0000010"else--王字第0列
"10010001"when lie0="0000011"else--王字第1列
"10010001"when lie0="0000100"else--王字第2列
"10010001"when lie0="0000101"else--王字第3列
"11111111"when lie0="0000110"else--王字第4列
"10010001"when lie0="0000111"else--王字第5列
"00000000";--以上是字库6
D7<=
"10000000"when lie0="0000000"else--王字第7列
"10000000"when lie0="0000001"else--王字第0列
"10010001"when lie0="0000010"else--王字第1列
"10010001"when lie0="0000011"else--王字第2列
"10010001"when lie0="0000100"else--王字第3列
"11111111"when lie0="0000101"else--王字第4列
"10010001"when lie0="0000110"else--王字第5列
"10010001"when lie0="0000111"else--王字第6列
"00000000";--以上为字库7
First:process
begin
wait until clk='1';
If d_ff(27 downto 0)>=2e8 then
d_ff(27 downto 0)<="0000000000000000000000000000";
else
d_ff(27 downto 0)<=d_ff+1;
end if;
osc<=not d_ff(10);
osd<=not d_ff(26);
end process first;
second:process(osc)
begin
if(osc='1'and osc'event)then
if st1(7 downto 0)="00000000"or st1(7 downto 0)="01111111"then
st1(7 downto 0)<="11111110";data<=d0; --逐列扫描方式
elsif st1(7 downto 0)="11111110"then
st1(7 downto 0)<="11111101";data<=d1;
elsif st1(7 downto 0)="11111101"then
st1(7 downto 0)<="11111011";data<=d2;
elsif st1(7 downto 0)="11111011"then
st1(7 downto 0)<="11110111";data<=d3;
elsif st1(7 downto 0)="11110111"then
st1(7 downto 0)<="11101111";data<=d4;
elsif st1(7 downto 0)="11101111"then
st1(7 downto 0)<="11011111";data<=d5;
elsif st1(7 downto 0)="11011111"then
st1(7 downto 0)<="10111111";data
展开阅读全文