首页 基于FPGA点阵显示屏设计

基于FPGA点阵显示屏设计

举报
开通vip

基于FPGA点阵显示屏设计东 华 理 工 大 学 长 江 学 院 毕  业  论  文 题 目:基于FPGA点阵显示屏设计(软件) Title: Design of Dot Matrix Screen based on FPGA 二 零 一  贰 年 六 月 摘  要 本设计是一16×16点阵LED电子显示屏的设计。整机以EP2C5T144C8N为主控芯片,介绍了以它为控制系统的LED点阵电子显示屏的动态设计和开发过程。通过该芯片控制一个行驱动器74HC154和两个列驱动器74HC595来驱动显示屏显示。该电子显示屏可以显示各种文字或单色...

基于FPGA点阵显示屏设计
东 华 理 工 大 学 长 江 学 院 毕  业  论  文 题 目:基于FPGA点阵显示屏设计(软件) Title: Design of Dot Matrix Screen based on FPGA 二 零 一  贰 年 六 月 摘  要 本设计是一16×16点阵LED电子显示屏的设计。整机以EP2C5T144C8N为主控芯片,介绍了以它为控制系统的LED点阵电子显示屏的动态设计和开发过程。通过该芯片控制一个行驱动器74HC154和两个列驱动器74HC595来驱动显示屏显示。该电子显示屏可以显示各种文字或单色图像,采用4块8 x 8点阵LED显示模块来组成16x16点阵显示模式。显示采用动态显示,使得图形或文字能够实现静止、移入移出等多种显示方式。文中详细介绍了LED点阵显示的硬件设计思路、硬件电路各个部分的功能及原理、相应软件的程序设计,以及使用说明等。 控制系统程序采用FPGA编辑,通过编程控制各显示点对应LED阳极和阴极端的电平,就可以有效的控制各显示点的亮灭。所显示字符的点阵数据可以自行编写(即直接点阵画图),也可从标准字库中提取。 LED显示以其组构方式灵活、显示稳定、功耗低、寿命长、技术成熟、成本低廉等特点在车站、证券所、运动场馆、交通干道及各种室内/外显示场合的信息发布,公益宣传,环境参数实时,重大活动倒计时等等得到广泛的应用。 设计结果证明,该系统性能稳定,结构合理,具有横向扩展拼接功能。 关键词: LED    FPGH  硬件描述语言 ABSTRACT The design is a 16 × 16 dot matrix LED display design. The machine to EP2C5T144C8N as the main chip, LED dot-matrix electronic display for the control system it dynamic design and development process. Through the chip to control a line drive 74HC154 and two drive 74HC595 to drive the display shows. The electronic screen can display text or monochrome images, four 8 x 8 dot matrix LED display module to form a 16x16 dot matrix display mode. Displays the dynamic display, graphics or text to achieve stationary, moved out of the other display. LED dot matrix display hardware design ideas, features and principles of the various parts of the hardware circuit, the corresponding software programming, and instructions for use, etc. in detail. Control system using FPGA Editor, by programming the control point corresponds to the LED anode and cathode level, can effectively control the display point bright off. Shows the character of the lattice data can write your own (ie, direct dot drawing) can also be extracted from the standard font.LED display with its group structure is flexible, showing a stable, low power consumption, long life, mature technology, low cost and other characteristics of the station, securities, sports venues, major trunk roads and a variety of indoor / outdoor occasions, information dissemination, public promotion, environmental parameters in real time, the major activities of the countdown has been widely used.The design results show that the system is stable performance, reasonable structure, with horizontal expansion splicing. Keywords: LED  FPGH  hardware description language 目  录 第一章 绪论    1 1.1 FPGA的发展历史和发展方向    1 1.2 FPGA的应用    3 1.3 LED的定义和特点    4 1.4 LED简介    5 1.5 LED显示屏的分类    7 第二章 系统整体设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载     8 2.1 需要实现的功能    8 2.2 显示模式方案论证    8 2.3 显示数据传输方案论证    9 第三章 硬件设计    10 3.1 FPGA最小系统    10 3.2  FPGA硬件系统的设计技巧    14 3.4  列驱动电路    14 3.5  行驱动电路    17 3.6 点阵LED电子显示屏电路    18 第四章 系统程序的设计    20 4.1 系统主程序    20 第五章 调试及仿真    22 5.1系统开发工具介绍    22 5.2调试与仿真    22 5.3编译    24 5.4时序仿真    25 结  论    27 致  谢    28 参考文献    29 附录一    30 第一章 绪论 随着FPGA的不断发展,应用于生活当中屡见不鲜。以其简单,便捷,低成本及低功耗的特点逐渐取代了以往中、小规模的集成电路产品。只要写入不同的程序,同一片FPGA能够完成不同的工作,FPGA极高的可靠性,微型性和智能性(需编写不同的程序后就能够完成不同的控制工作),FPGA已成为工业控制领域中普遍采用的智能化控制工具,已经深深地渗入到日常生活当中。                                                          1.1 FPGA的发展历史和发展方向 每一个后看来很成功的新事物,从诞生到发展壮大都不可避免地经历过艰难的历程,并可能成为被研究的案例,FPGA也不例外。 1985年,当全球首款FPGA产品——XC2064诞生时,注定要使用大量芯片的PC机刚刚走出硅谷的实验室进入商业市场,因特网只是科学家和政府机构通信的神秘链路,无线电话笨重得像砖头,日后大红大紫的BillGates正在为生计而奋斗,创新的可编程产品似乎并没有什么用武之地。 事实也的确如此。最初,FPGA只是用于胶合逻辑(GlueLogic),从胶合逻辑到算法逻辑再到数字信号处理、高速串行收发器和嵌入式处理器,FPGA真正地从配角变成了主角。在以闪电般速度发展的半导体产业里,22年足够改变一切。“在未来十年内每一个电子设备都将有一个可编程逻辑芯片”的理想正成为现实。 1985年,Xilinx公司推出的全球第一款FPGA产品XC2064怎么看都像是一只“丑小鸭”——采用2μm工艺,包含64个逻辑模块和85000个晶体管,门数量不超过1000个。22年后的2007年,FPGA业界双雄Xilinx和Altera公司纷纷推出了采用最新65nm工艺的FPGA产品,其门数量已经达到千万级,晶体管个数更是超过10亿个。一路走来,FPGA在不断地紧跟并推动着半导体工艺的进步——2001年采用150nm工艺、2002年采用130nm工艺,2003年采用90nm工艺,2006年采用65nm工艺。 在上世纪80年代中期,可编程器件从任何意义上来讲都不是当时的主流,虽然其并不是一个新的概念。可编程逻辑阵列(PLA)在1970年左右就出现了,但是一直被认为速度慢,难以使用。1980年之后,可配置可编程逻辑阵列(PAL)开始出现,可以使用原始的软件工具提供有限的触发器和查找表实现能力。PAL被视为小规模/中等规模集成胶合逻辑的替代选择被逐步接受,但是当时可编程能力对于大多数人来说仍然是陌生和具有风险的。20世纪80年代在“megaPAL”方面的尝试使这一情况更加严重,因为“megaPAL”在功耗和工艺扩展方面有严重的缺陷,限制了它的广泛应用。 然而,Xilinx公司创始人之一—FPGA的发明者RossFreeman认为,对于许多应用来说,如果实施得当的话,灵活性和可定制能力都是具有吸引力的特性。也许最初只能用于原型设计,但是未来可能代替更广泛意义上的定制芯片。事实上,正如Xilinx公司亚太区营销董事郑馨南所言,随着技术的不断发展,FPGA由配角到主角,很多系统设计都是以FPGA为中心来设计的。FPGA走过了从初期开发应用到限量生产应用再到大批量生产应用的发展历程。从技术上来说,最初只是逻辑器件,现在强调平台概念,加入数字信号处理、嵌入式处理、高速串行和其他高端技术,从而被应用到更多的领域。“过去20年来,PLD产品的终极目标一直瞄准速度、成本和密度三个指标,即构建容量更大、速度更快和价格更低的FPGA,让客户能直接享用。”Actel司总裁兼首席执行官JohnEast如此总结可编程逻辑产业的发展脉络。 当1991年Xilinx公司推出其第三代FPGA产品—XC4000系列时,人们开始认真考虑可编程技术了。XC4003包含44万个晶体管,采用0.7μm工艺,FPGA开始被制造商认为是可以用于制造工艺开发测试过程的良好工具。事实证明,FPGA可为制造工业提供优异的测试能力,FPGA开始用来代替原先存储器所扮演的用来验证每一代新工艺的角色。也许从那时起,向最新制程半导体工艺的转变就已经不可阻挡了。最新工艺的采用为FPGA产业的发展提供了机遇。 Actel公司相信,Flash将继续成为FPGA产业中重要的一个增长领域。Flash技术有其独特之处,能将非易失性和可重编程性集于单芯片解决方案中,因此能提供高成本效益,而且处于有利的位置以抢占庞大的市场份额。Actel以Flash技术为基础的低功耗IGLOO系列、低成本的ProASIC3系列和混合信号Fusion FPGA将因具备Flash的固有优势而继续引起全球广泛的兴趣和注意。 Altera公司估计可编程逻辑器件市场在2006年的规模大概为37亿美元,Xilinx公司的估计更为乐观一些,为50亿美元。虽然两家公司合计占据该市场90%的市场份额,但是作为业界老大的Xilinx公司在2006年的营收不过18.4亿美元,Altera公司则为12.9亿美元。PLD市场在2000年达到41亿美元,其后两年出现了下滑,2002年大约为23亿美元。虽然从2002年到2006年,PLD市场每年都在增长,复合平均增长率接近13%,但是PLD终究是一个规模较小的市场。而Xilinx公司也敏锐地意识到,FPGA产业在经历了过去几年的快速成长后将放慢前进的脚步,那么,未来FPGA产业的出路在哪里? Altera公司总裁兼首席执行官John Daane认为,FPGA及PLD产业发展的最大机遇是替代ASIC和专用标准产品(ASSP),主要由ASIC和ASSP构成的数字逻辑市场规模大约为350亿美元。由于用户可以迅速对PLD进行编程,按照需求实现特殊功能,与ASIC和ASSP相比,PLD在灵活性、开发成本以及产品及时面市方面更具优势。然而,PLD通常比这些替代方案有更高的成本结构。因此,PLD更适合对产品及时面市有较大需求的应用,以及产量较低的最终应用。PLD技术和半导体制造技术的进步,从总体上缩小了PLD和固定芯片方案的相对成本差,在以前由ASIC和ASSP占据的市场上,Altera公司已经成功地提高了PLD的销售份额,并且今后将继续这一趋势。“FPGA和PLD供应商的关键目标不是简单地增加更多的原型客户,而是向大批量应用最终市场和客户渗透。”John Daane为FPGA产业指明了方向。 Xilinx公司认为,ASIC SoC设计周期平均是14个月到24个月,用FPGA进行开发时间可以平均降低55%。而产品晚上市六个月5年内将少33%的利润,每晚四周等于损失14%的市场份额。因此,郑馨南雄心勃勃地预言:“FPGA应用将不断加快,从面向50亿美元的市场扩展到面向410亿美元的市场。”其中,ASIC和ASSP市场各150亿美元,嵌入式处理和高性能DSP市场各30亿美元。 虽然没有像蒸汽机车发明之初备受嘲笑被讥讽为“怪物”,但是FPGA在诞生之初受到怀疑是毫无疑问的。当时,晶体管逻辑门资源极为珍贵,每个人都希望用到的晶体管越少越好。不过,Ross Freeman挑战了这一观念,他大胆预言:“在未来,晶体管将变得极为丰富从而可以‘免费’使用。”如今,这一预言成为现实。 “FPGA非常适用于原型设计,但对于批量DSP系统应用来说,成本太高,功耗太大。”这是业界此前的普遍观点,很长时间以来也为FPGA进入DSP领域设置了观念上的障碍。而如今,随着Xilinx公司和Altera公司相关产品的推出,DSP领域已经不再是FPGA的禁区,相反却成了FPGA未来的希望所在。 FPGA对半导体产业最大的贡献莫过于创立了无生产线(Fabless)模式。如今采用这种模式司空见惯,但是在20多年前,制造厂被认为是半导体芯片企业必须认真考虑的主要竞争优势。然而,基于过去和关系和直接、清晰的业务模式,Xilinx创始人之一Bernie Vonderschmitt成功地使日本精工公司(Seiko)确信利用该公司的制造设施来生产Xilinx公司设计的芯片对双方都是有利的,于是,无生产线模式诞生了。 未来,相信FPGA还将在更多方面改变半导体产业! 1.2 FPGA的应用 1.2.1 电路设计中FPGA的应用 连接逻辑,控制逻辑是FPGA早期发挥作用比较大的领域也是FPGA应用的基石.事实上在电路设计中应用FPGA的难度还是比较大的这要求开发者要具备相应的硬件知识(电路知识)和软件应用能力(开发工具)这方面的人才总是紧缺的,往往都从事新技术,新产品的开发成功的产品将变成市场主流基础产品供产品设计者应用在不远的将来,通用和专用IP的设计将成为一个热门行业!搞电路设计的前提是必须要具备一定的硬件知识.在这个层面,干重于学,当然,快速入门是很重要的,越好的位子越不等人电路开发是黄金饭碗. 1.2.2 产品设计 把相对成熟的技术应用到某些特定领域如通讯,视频,信息处理等等开发出满足行业需要并能被行业客户接受的产品这方面主要是FPGA技术和专业技术的结合问题,另外还有就是与专业客户的界面问题产品设计还包括专业工具类产品及民用产品,前者重点在性能,后者对价格敏感产品设计以实现产品功能为主要目的,FPGA技术是一个实现手段在这个领域,FPGA因为具备接口,控制,功能IP,内嵌CPU等特点有条件实现一个构造简单,固化程度高,功能全面的系统产品设计将是FPGA技术应用最广大的市场,具有极大的爆发性的需求空间产品设计对技术人员的要求比较高,路途也比较漫长不过现在整个行业正处在组建"首发团队"的状态,只要加入,前途光明产品设计是一种职业发展方向定位,不是简单的爱好就能做到的!产品设计领域会造就大量的企业和企业家,是一个近期的发展热点和机遇 1.2.3 系统级应用 系统级的应用是FPGA与传统的计算机技术结合,实现一种FPGA版的计算机系统如用Xilinx V-4, V-5系列的FPGA,实现内嵌POWER PC CPU, 然后再配合各种外围功能,实现一个基本环境,在这个平台上跑LINUX等系统这个系统也就支持各种标准外设和功能接口(如图象接口)了这对于快速构成FPGA大型系统来讲是很有帮助的。这种"山寨"味很浓的系统早期优势不一定很明显,类似ARM系统的境况但若能慢慢发挥出FPGA的优势,逐渐实现一些特色系统也是一种发展方向。若在系统级应用中,开发人员不具备系统的扩充开发能力,只是搞搞编程是没什么意义的,当然设备驱动程序的开发是另一种情况,搞系统级应用看似起点高,但不具备深层开发能力,很可能会变成爱好者,就如很多人会做网页但不能称做会编程类似以上是几点个人开发,希望能帮助想学FPGA但很茫然无措的人理一理思路。这是一个不错的行业,有很好的个人成功机会。但也肯定是一个竞争很激烈的行业,关键看的就是速度和深度当然还有市场适应能力。 1.3 LED的定义和特点 Light Emitting Diode,即发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。但这两种半导体连接起来的时候,它们之间就形成一个P-N结。当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED发光的原理。而光的波长也就是光的颜色,是由形成P-N结的材料决定的。 1、 LED特点和优点 : LED的内在特征决定了它是最理想的光源去代替传统的光源,它有着广泛的用途。 2、体积小 : LED基本上是一块很小的晶片被封装在环氧树脂里面,所以它非常的小,非常的轻。 3、耗电量低 : LED耗电非常低,一般来说LED的工作电压是2-3.6V。工作电流是0.02-0.03A。这就是说:它消耗的电不超过0.1W。 4、使用寿命长 : 在恰当的电流和电压下,LED的使用寿命可达10万小时 5、高亮度、低热量 6、环保 : LED是由无毒的材料作成,不像荧光灯含水银会造成污染,同时LED也可以回收再利用。 7、坚固耐用 : LED是被完全的封装在环氧树脂里面,它比灯泡和荧光灯管都坚固。灯体内也没有松动的部分,这些特点使得LED可以说是不易损坏的。 LED发光技术的原理是某些半导体材料在通以电流的情况下会发出特定波长的光,这种电到光的转换效率非常高,对所用材料进行不同的化学处理,就可以得到各种亮度和视角。 LED散发出电磁波(一种振动极高的频率),当这些波达到380nm(nanometer)以上及在780nm以下,在这中间的波长是可见光,一种能被人的眼睛看到的可视光。LED是一种非常有用及有效率的光源,它的光学构造体实在已将发出的光几无损失的集合起来,经狭小的结构投射出来,它的颜色是根据它使用的半导体成份造成,目前大约有红、黄、绿及白光等等。 1.4 LED简介 LED电子显示屏是由几万至几十万个半导体发光二极管像素点均匀排列组成。利用不同的材料可以制造不同色彩的LED像素点。 目前应用最广的是红色、绿色、黄色。而蓝色和纯绿色LED的开发已经达到了。LED显示屏可以显示变化的数字、文字、图形图像;不仅可以用于室内环境还可以用于室外环境,具有投影仪、电视墙、液晶显示屏无法比拟的优点。 LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。在我国改革开放之后,特别是进入90年代国民经济高速增长,对公众场合发布信息的需求日益强烈,LED显示屏的出现正好适应了这一市场形势,因而在LED显示屏的设计制造技术与应用水平上都得到了迅速的提高,生产也得到了迅速的发展,并逐步形成产业,成为光电子行业的新兴产业领域。LED显示屏经历了从单色、双色图文显示屏,到图像显示屏的发展过程。 显示技术是一种将反映外界客观事物的信息(光学的。电学的。声学的、化学的等),经过变换处理,以适当的形式(主要有图像、图形、数码、字符)加以显示,供人观看、分析、利用的一种技术。现在所谓的显示技术,可以称作电子信息显示技术,它是建立在光学、化学、电子学、机械学、声学等科学技术基础上的具有某种程度综合性的技术。电子显示技术的应用与研究涉及的范围很广,包括各种发光材料的发光机理的研究、实验;各种显示方式的基本原理及其结构形式,显示用的材料与器件的选择和制作工艺;显示信息的输入、变换、处理和控制,等等。随着科学技术的发展,随着经济、军事、社会与人们生活的发展,信息的种类和数量不断增加。 和很多应用术语一样,LED图文显示屏并没有一个公认的严格的定义,一般把显示图形和/或文字的LED显示屏称为图文屏。这里所说的图形,是指由单一亮度线条组成的任意图形,以便于不同亮度(灰度)点阵组成的图像相区别。图文显示屏的主要特征是只控制LED点阵中各发光器件的通断(发光或熄灭),而不控制LED的发光强弱。LED图文显示屏的外观可以做成条形,叫做条形图文显示屏(简称条屏),也可以按一定高度比例做成矩形的平面图文显示屏。其实条屏只不过是其宽度远大于高度的平面显示屏,在显示与控制的原理上并无区别。 从理论上说,不论显示图形还是文字,都是控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光。通常事先把需要显示的图形文字转换成点阵图形,再按照显示控制的要求以一定的格式形成显示数据。对于只控制通断的图文显示屏来说,每个LED发光器件占据数据中的1位(1bit),在需要该LED器件发光的数据中相应的位填1,否则填0。当然,根据控制电路的安排,相反的定义同样是可行的。这样依照所需显示的图形文字,按显示屏的各行各列逐点填写显示数据,就可以构成一个显示数据文件。显示图形的数据文件,其格式相对自由,只要能够满足显示控制的要求即可。文字的点阵格式比较 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 ,可以采用现行计算机通用的字库字模。组成一个字的点阵,其大小也可以有8×8、16×16、24×24、等不同规格。汉字的点阵结构相应的显示数据是用16进制格式以字节为单位表示的。 用点阵方式构成图形或文字,是非常灵活的,可以根据需要任意组合和变化,只要设计好合适的数据文件,就可以得到满意的显示效果。因而采用点阵式图文显示屏显示经常需要变化的信息,是非常有效的。 点阵显示方式适应信息变化的优点,是以点阵显示器的价格和其复杂的控制电路为代价的。点阵显示器在整个显示单元的所有位置上都布置了LED器件,而像数码管一类的显示器件只在需要发光的七段位置上布置LED器件,其它位置是空白的。因此,点阵显示器在相同面积情况下,价格要贵些。但是,数码管可显示的信息有限,只有0~9或单个的英文字符,由于组合形成的字符不多,所以其显示数据和控制电路都比较简单。点阵显示器则不然,它要对点阵上全部LED进行控制,并能生成所有可能显示的图形文字,其显示数据和控制电路自然要复杂得多。因此,根据不同的场合,不同的显示特点和格式可以分别采用数码管器件或点阵显示方式,有的情况可以采用两者搭配的混合屏显示方式。 图文显示屏的颜色,有单色、双色、和多色几种。最常用的是单色图文屏。单色屏多使用红色、橘红色或橙色LED点阵单元。双色图文屏和多色图文屏,在LED点阵的每一个“点”上布置有两个或多个不同颜色的LED发光器件。换句话说,对应于每种颜色都有自己的显示矩阵。显示的时候,各颜色的显示点阵是分开控制的。事先设计好各种颜色的显示数据,显示时分别送到各自的显示点阵,即可实现预期效果。每一种颜色的控制方法和单色的完全相同,因此掌握了单色图文显示屏的原理,双色屏和多色屏就不难理解了。 1.5 LED显示屏的分类 1、按颜色基色可以分为: 单基色显示屏:单一颜色(红色或绿色)。 双基色显示屏:红和绿双基色,256级灰度、可以显示65536种颜色。 全彩色显示屏:红、绿、蓝三基色,256级灰度的全彩色显示屏可以显示一千六百多万种颜色。 2、按显示器件分类: LED数码显示屏:显示器件为7段码数码管,适于制作时钟屏、利率屏等,显示数字的电子显示屏。 LED点阵图文显示屏:显示器件是由许多均匀排列的发光二极管组成的点阵显示模块,适于播放文字、图像信息。 第二章 系统整体设计方案 2.1 需要实现的功能 设计一个16×16点阵LED图文显示屏,要求在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形或文字应稳定、清晰无串扰。图形或文字显示有静止、移入移出、横向扩展拼接等显示方式。 2.2 显示模式方案论证 为了吸引观众增强显示效果,可以有多种显示模式,最简单的显示模式是静态显示。这里所说的“静态显示模式”不同于静态驱动方式。与静态显示模式相对应,就有各种动态显示模式,它们所显示的图文都是能够动的。按照图文运动的特点又可以分为闪烁、平移、旋转、缩放等多种显示模式。产生不同显示模式的方法,并不意味着一定要重新编写显示数据,可以通过一定的算法从原来的显示数据直接生成。例如,按顺序调整行号,可以使显示图文产生上下平移;而顺序调整列显示数据的位置,就可以达到左右平移的目的;同时调整行列顺序,就能得到对角线平移的效果。其它模式的数据刷新,也可找到相应的算法。不过当算法太复杂,太浪费时间的话,也可以考虑预先生成刷新数据,存储备用。刷新的时间控制,要考虑运动图形文字的显示效果。刷新太慢,动感不显著;刷新太快了,中间过程看不清。一般刷新周期可控制在几十毫秒范围之内。 从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制LED显示屏的各个发光点亮灭的方法称为静态驱动显示方式。16×16的点阵共有256个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,16×16的点阵需要256/8=32个锁存器。这个数字很庞大,因为我们仅仅是16×16的点阵,在实际应用中的显示屏往往要大得多,这样在锁存器上花的成本将是一个很庞大的数字。因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。 动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套列驱动器,每行有一个行驱动器,具体就16×16的点阵来说,把所有同一行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第一行发光管亮灭的数据并锁存,然后选通第一行使其燃亮一定的时间,然后熄灭;再送出第二行的数据并锁存,然后选通第二行使其燃亮相同的时间,然后熄灭;……第十六行之后,又重新燃亮第一行,反复轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形了。 2.3 显示数据传输方案论证 采用扫描方式进行显示时,每行有一个行驱动器,各行的同名列共用一个列驱动器。显示数据通常存储在单片机的存储器中,按8位一个字节的形式顺序排放。显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输方式的问题。从控制电路到列驱动器的数据传输可以采用并行方式或串行方式。显然,采用并行方式时,从控制电路到列驱动器的线路数量大,相应的硬件数目多。当列数很多时,并行传输的方案是不可取的。 采用串行传输的方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器。只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解列数据准备和列数据显示两个部分。对于串行传输方式来说,列数据准备时间可能相当长,在行扫描周期确定的情况下,留给行显示的时间就太少了,以至影响到LED的亮度。 解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。即在显示本行各列数据的同时,准备下一行的列数据。为了达到重叠处理的目的,列数据的显示就需要具有锁存功能。 经过上述分析,可以归纳出列驱动器电路应具备的主要功能。对于列数据准备来说,它应能实现串入并出的移位功能;对于列数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据打入并行锁存器进行显示时,串并移位寄存器准备下一行的列数据,而不会影响本行的显示。 第三章 硬件设计 3.1 FPGA最小系统 FPGA最小系统是可以使FPGA最小的系统。它的外围电路尽量减少,只包括FPGA必要的控制电路。 一般FPGA的最小系统主要包括:FPGA芯片、 下载 课程表模板下载资产负债表下载英语单词下载学习机资料下载励志文章下载 电路、外部时钟、复位电路和电源。如果需要使用NIOSII软嵌入式处理器还要包括:SDRAM和FLASH。一把以上这些组件是FPGA最小系统的组成部分。CycloneII系列EP2C5T144C8芯片框图如图3-1所示: 图3-1 EP2C5T144C8N芯片框图 3.1.1 FPGA的管脚设计 FPGA的管脚主要包括:用户I/O(UserI/O)、配置管脚、电源、时钟及特殊应用管脚等。其中某些管脚可有多种用途,所以在设计FPGA之前,需要认真的阅读相应FPGA的芯片 手册 华为质量管理手册 下载焊接手册下载团建手册下载团建手册下载ld手册下载 。 下面以Altera公司的CycloneII系列FPGA为例,介绍FPGA的功能管脚。 用户I/O I/Onum:可用作输入或输出,或者双向口,同时可作为LVDS差分对的负端。其中num表示管脚序号。 配置管脚 DATA: FPGA串行数据输入,连接至配置器件的串行数据输出管脚。 DCLK: FPGA串行时钟输出,为配置器件提供串行时钟。 nCS(I/O) : FPGA片选信号输出,连接至配置器件的nCS管脚。 ADSI(I/O) : FPGA串行数据输出,连接至配置器件的ADSI管脚。 图3-2  FPGA配置管脚原理图 特殊管脚 VCCPD:用于选择驱动电压 VCCSEL:用于配置控制管脚和锁相环相关的输入缓冲电压。 PORSEL:上电复位选项 NIOPULLUP: 用于配置控制时所使用的用户I/O的内部上拉电阻是否工作。 TEMPDIODEn/p:用于关联温度二极管。 3.1.2 下载配置与调试接口电路设计 FPGA是SRAM型结构,本身并不能固化程序。因此FPGA需要Flash结构的配置芯片来存储逻辑配置信息,用于进行上电配置。 以Altera公司的FPGA为例,配置芯片可分为串行(EPCSx系列)和并行(EPCx系列)两种。其中EPCx系列为老款配置芯片,体积较大,价格高。而EPCSx系列芯片与之相比,体积小、价格低。 在把程序固化到配置芯片之前,一般先选用JTAG模式去调试程序,也就是把程序下载到FPGA芯片上运行。虽然这种方式在掉电后程序会丢失,但是充分利用了FPGA的无限擦写性。所以一般FPGA有两个下载接口:JTAG调试接口和AS(或PS)模式下载接口。所不同的是前者下载至FPGA,后者是编程配置芯片(如EPCSx),然后再配置FPGA。 图3-3 JTAG模式原理图 图3-4  AS模式原理图 3.1.3 电源电路设计 电源是整个系统能够正常运行的基本保证,如果电源电路设计的不好,系统有可能不能工作,或者即使能工作但是散热条件不好,导致系统不稳定等异常情况。所以如何选用合适的电源芯片,以及如何合理的对待电源进行布局布线,都是值得下大功夫研究的。 在选用电源之前要仔细阅读FPGA的芯片手册,一般来说FPGA用到的管脚和资源多,那么所需要的电流就越大,当电路启动时FPGA的瞬间电流也比较大。通过数据手册中提供的电气参数,确定了FPGA最大需要多大的电流才能工作。下面是几种常使用的FPGA参考电源: AS117可以提供1A电流,线性电源(适用144管脚以下,5万逻辑门以下的FPGA) AS2830(或LT1085)可以提供3A电流,线性电源(适用240管脚以下,30万逻辑门以下的FPGA) TPSFPGA可以提供3A电流,开关电源(适用大规模大封装的高端FPGA) 图3-5 EP2C5T144C8N芯片电源电路图 3.1.4 复位电路设计 一般复位电路采用的是低电平复位,只有个别单片机采用高电平复位方式。常见的电平复位电路分为芯片复位和阻容复位。前者的复位信号比较稳定,而后者容易出现抖动,因此在成本允许的条件下我们推荐使用芯片复位。 常用的复位芯片有MAX708S/706S系列,它可以提供高低电平两种复位方式和电源检测能力(监控电源电压低到一定程度自动复位)。IMP811是一款比较低廉的复位芯片,只有低电平复位功能,但是其体积非常小。 图5-6 复位电路图 3.2  FPGA硬件系统的设计技巧 FPGA的硬件设计不同于和系统,比较灵活和自由。只要设计好专用管脚的电路,通用I/O的连接可以自己定义。因此,FPGA的电路设计中会有一些特殊的技巧可以参考 3.2.1 稳压电源技术指标 稳压电源的技术指标可以分为两大类:一类是特性指标,如输出电压、输出电流及电压调节范围;另一类是质量指标,反映一个稳压电源的优劣,包括稳定度、等效内阻(输出电阻)、波纹电压及温度系数等。对稳压电源的性能,主要有以下四个方面的要求: 稳定性好  当输入电压Usr(整流、滤波输出电压)在规定范围内变动时,输出电压Usc的变化一般要求很小。 输出电阻小  负载变化时(从空载到满载),输出电压Usr应基本保持不变。 电压温度系数小  当环境温度变化时,会引起输出电压的漂移。良好的稳压电源,应在环境温度变化时,有效地抑制输出电压的漂移,保持输出电压稳定。 输出电压纹波小  所谓纹波电压,是指输出电压中50Hz或100Hz的交流分量,通常用有效值或峰值表示。 3.4  列驱动电路 3.4.1 74HC595芯片简介 集成电路74HC595,它具有一个8位串行输入/输出或者并行输出的移位寄存器和一个8位输出锁存器的结构,而且移位寄存器的和输出锁存器的控制是各自独立的,可以实现在显示本行各列数据的同时,传送下一行的列数据,即达到重叠处理的目的。 74HC595的管脚及内部结构形式如图3-5所示。它的输入侧有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SER是串行数据的输入端。引脚SRCLK是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SER的下一个数据打入最低位。移位后的各位信号出现在个移位寄存器的输出端,也就是输出锁存器的输入端。RCLK是输出锁存器的输入信号,其上升沿将移位寄存器的输出输入到输出锁存器。引脚 是输出三态门的开放信号,只有当其为低电平时锁存器的输出才开放,否则为高阻态。 信号是移位寄存器的清零输入端,当其为低时移位寄存器的输出全部为0,由于SRCLK和RCLK两个信号是互相独立的,所以能够做到输入串行移位与输出锁存互不干扰。芯片的输出端为QA~QH,最高位QH可作为多片74HC595级连应用时,向上一级的级连输出。但因QH受输出锁存器打入控制,所以还从输出锁存器前引出了QH′,作为与移位寄存器完全同步的级连输出。移位寄存和输出锁存的时序波形如图3-6所示。 图3-6 移位寄存和输出锁存的时序波形图 表3-2引脚 符号 引脚 描述 Q0…Q7 15 , 1 , 7 并行数据输出 GND 8 地 Q7’ 9 串行数据输出 MR 10 主复位(低电平) SHCP 11 移位寄存器时钟输入 STCP 12 存储寄存器时钟输入 OE 13 输出有效(低电平) DS 14 串行数据输入 VCC 16 电源       表3.3功能表 输入 输出 功能 SHCP STCP OE MR DS Q7’ Qn × × L ↓ × L NC MR 为低电平时紧紧影响移位寄存器 × ↑ L L × L L 空移位寄存器到输出寄存器 × × H L × L Z 清空移位寄存器,并行输出为高阻状态 ↑ × L H H Q6’ NC 逻辑高电平移入移位寄存器状态 0 ,包含所有的移位寄存器状态移入,例如,以前的状态 6 (内部 Q6” )出现在串行输出位。 × ↑ L H × NC Qn’ 移位寄存器的内容到达保持寄存器并从并口输出 ↑ ↑ L H × Q6’ Qn’ 移位寄存器内容移入,先前的移位寄存器的内容到达保持寄存器并输出。                 H =高电平状态 L =低电平状态 ↑=上升沿 ↓=下降沿 Z =高阻 NC =无变化 ×=无效 3.4.2 列驱动电路的构成 74HC595组成的列驱动器示于图3-7中。该图由两片74HC595组成16列的驱动,由16个行驱动器驱动16行。第一片列驱动器的SER端连接单片机输出的串行列显示数据,其    QH′端连接第二片的SER端,采用这样的方法组成两片的级连。两片相应的SRCLK、 、RCLK端分别并联,作为统一的串行数据移位信号、串行数据清除信号和输出锁存器输入信号。这样的结构,使得各片串行移位能把16列的显示数据依次输入到相应的移位寄存器输出端。移位过程结束之后,控制器输出RCLK打入信号,16列显示数据一起打入相应的输出锁存器。然后选通相应的行,该行的各列就按照要求进行显示。 图3-7  显示驱动电路 3.5  行驱动电路 3.5.1 74HC154芯片简介 图3.7 74HC154芯片 译码器是一个多输入、多输出的组合逻辑电路。其功能是将给定的输入码组进行“翻译”,变换成对应的输入信号,对每一种可能的输入组合,使输出通道中相应的一路有信号输出,一个且仅一个输出信号为有效电位。74HC154为变量译码器,也称二进制译码器,它是一种四线—十六线译码器, 译码的输入端有4个,输出端有24=16个,并有两个选通端(使能端),它的管脚形式如图3-8所示,当选通端 1、 2均为低电平时,译码器处于工作状态,可将地址输入端(A0~A3)的二进制编码在一个对应的输出端以低电平译出。否则,译码器被禁止。 3.5.2 行驱动电路原理 行驱动电路相对简单。行选通信号来源于单片机按照时序要求所给出的二进制信号,每次更新行号(开始扫描新的一行)时,由单片机输出4位二进制行号,行号经4/16线译码器译码后,生成16条行选通信号线,再经过驱动器驱动对应的行线。采用译码器的方案,还可以保证同一时刻只选通一条行线,从而达到显示的稳定性。行驱动电路原理如图。 行选通信号从74HC154的 ~ 端输出,某一端输出低电平即为有效,而其它端输出均为高电平的信号无效。如 端输出低电平,此信号传至相应的PNP型三极管Q1,此时,三极管的基极为低电平,因此,发射结正向偏置,集电结反向偏置,三极管导通,其集电极再将高电平加于LED阵列的对应的行上,即将此行选通;而同时74HC154的其它端输出高电平而致使该行对应三极管截止,从而所对应LED行线不被选通。行选通按顺序从 ~ ,全部各行都选通一遍之后又从新开始,这就是行驱动电路的逐行扫描过程。行信号A、B、C、D的顺序变化范围从0000、0001、0010、至l111,来一个选通信号,行信号顺序就变化一次,其频率由扫描电路决定。 由于行驱动电路一条行线上要带动16列的LED进行显示,按每一LED器件20mA电流计算,16个LED同时发光时,就需要16×20=320mA的驱动电流,选用三极管8550作为驱动管可以在逻辑功能和驱动能力上符合了LED的驱动要求。 3.6 点阵LED电子显示屏电路 LED显示屏是将发光二极管按行按列布置的,驱动时也就按行按列驱动。在扫描驱动方式下可以按行扫描按列控制,当然也可以按列扫描按行控制。LED显示屏现多采用多块8X8点阵显示单元拼接而成。本文的实验模块就是使用4块SBM1388组成16×16点阵,以满足汉字显示的要求。8X8 LED点阵是最基本的点阵显示模块,理解8X8 LED点阵的工作原理就可以基本掌握LED点阵显示技术。8X8点阵LED结构如图3-10所示,其等效电路如图3-11所示 图3-10  8X8点阵LED结构图 图3-11 8X8点阵LED等效电路图 从图中(本图的LED阵列采用共阳的接法)可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上。要实现显示图形或字体,只需考虑其显示方式,通过编程控制各显示点对应LED阳极和阴极端的电平,就可以有效的控制各显示点的亮灭。当采用按行扫描按列控制的驱动方式时,LED显示屏8行的同名列共用一套列驱动器。行驱动器一行的行线连接到电源的一端,列驱动器一列的列线连接到电源的另一端。应用时还应在各条行线或列线上接上限流电阻。扫描中控制电路将行线的1到 8轮流接通 高电位,使连接到各该行的全部LED器件接通正电源,但具体那一个LED导通,还要看它的负电源是否接通,这就是列控制的任务了。当对应的某一 列置0电平,则相应的二极管就亮;反之则不亮。例如:如果想使屏幕左上角LED点亮,左下角LED熄灭的话,在扫描到第一行时,第一列的电位就应该为低,而扫描到第八行时第一列的电位就应该为高。这样行线上一行一行的轮流导通,列线上进行通断控制,实现了行扫描列控制的驱动方式。 第四章 系统程序的设计 显示屏软件的主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。根据软件分层次设计的原理,可把显示屏的软件系统分成两大层:第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向屏体送显示数据,并负责产生行扫描信号和其它控制信号,配合完成LED显示屏的扫描显示工作。显示驱动程序由定时器T0中断程序实现。系统应用程序完成系统环境设置(初始化)、显示效果处理等工作,由主程序来实现。 从有利于实现语言的直观,易于记忆和检查,可读性较好和使语言程序占用较少的单片机存储空间,实时处理系统可以快速的执行指令的角度考虑,本设计中显示屏程序采用汇编语言编写。 4.1 系统主程序 系统的主程序开始以后,首先是对系统环境初始化,包括设置串口、定时器、中断和端口;然后LED显示屏进入开机状态,转入正常的显示。首先是向上滚动显示“单片机是工业中最基本的应用方式”15个汉字,每个字停留时间约1.6s;接着再向上滚动显示“我爱单片机”这5个汉字。由于单片机没有停机指令,所以可以设置系统程序不断地循环执行上述显示效果。系统主程序的总体结构如图4-2所示。 系统程序结构属中断方式,绝大多数功能在中断服务子程序中完成。根据总体结构,可将程序划分为几个功能化模块:串行口中断服务程序、多字滚动显示子程序、单字显示子程序、扫描程序。各个模块可进行独立设计、调试和查错,最终再连接成一个整体。这样可方便程序调用,程序整体层次清晰,结构一目了然,方便阅读。系统程 序清单见附录一。 图4-2 系统主程序的总体结构 第五章 调试及仿真 5.1系统开发工具介绍 Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、Veril-ogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。 Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。 此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。 5.2调试与仿真 5.2.1创建工程 在Quartus II 中新建一个VHDL File文件,将VHDL代码输入这个文件,并保存到工作目录,名为led.vhd。 利用new preject wizard 工具创建一个工程,工程名为led,顶层文件实体名为 led,并将上面创建的led.vhd文件加入到工程中。 5.2.2编译前设置 (1)选择目标芯片。用assignmemts-settings命令,弹出settings对话框,选择目标芯片为EP2C5T144C8N。 图5-1 选择目标器件 (2)选择工作方式,编程方式,及闲置引脚状态单击上图中的device&pin options按钮,弹出device&pin options窗口。 在General项中选中auto-restart configuration after error,使对FPGA的配置失败后能自动重新配置,并加入JTAG用户编码。 图6-2 选择配置器件工作方式 在Configuration项中,其下方的Generate compressed bitstreams处打勾,这样就能产生用于EPCS的POF压缩配置文件。 在Configuration 选项页,选择配置器件为EPCS1,其配置模式选择为active serial。 图6-3选择编程方式 在Unused pins项,将目标器件闲置引脚状态设置高阻态,即选择As input,tri-stated。 图6-4 设置闲置引脚状态 5.3编译 设置好前面的内容之后,就可以进行编译了。选择Processing菜单中start compilation,在窗口的下方processing栏中显示编译信息。 图6-5 全程编译成功完成 完成后在工程管理窗口左是角显示了工程led 的层次结构和其中结构模块耗用的逻辑宏单元数。此栏的右边是编译处理流程,包括数据网表建立、逻辑综合、适配、配置文件装配和时序分析等。 5.4时序仿真 (1)新建一个矢量波形文件,同时打开波形编辑器。设置仿真时间为50us,保存波形文件为led.vwf。 (2)将工程yz_ok的端口信号名选入波形编辑器中,所选的端口有clk,enable及总线h0和h8。设置clk的时钟周期为2us,占空比为50%。 图6-6 选择仿真控制 仿真器参数设置。选择菜单Assignment中的Settings,在Settings窗口下选择Simulator,在右侧的simulation mode项下选择timing,即选择时序仿真,并选择仿真激励文件名yz_ok.vwf。选择simulation options栏,确认选定simulation coverage reporting; 毛刺检测Glitch detection 为1ns 宽度;选中Run simulation until all vector stimuli 全程仿真。 现在所有设置进行完毕,在菜单processing项下选择start simulation,直到出现simulation was successful,仿真结束 。仿真文件simulation report 通常会自动弹出,否则选择processingsimulation report 。 图6-7 仿真波形输出 结  论 经过了两个多月的学习和工作,我终于完成了《基于FPGA点阵显示屏设计》的论文。从开始接到论文题目到系统的实现,再到论文文章的完成,每走一步对我来说都是新的尝试与挑战,这也是我在大学期间独立完成的最大的项目。在这段时间里,我学到了很多知识也有很多感受,从对FPGA,LED等相关技术不太了解的状态,我开始了独立的学习和试验,查看相关的资料和 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 籍,让自己头脑中模糊的概念逐渐清晰,使自己非常稚嫩作品一步步完善起来,每一次改进都是我学习的收获,每一次试验的成功都会让我兴奋好一段时间。从中我也充分认识到了单片机技术给我们生活带来的乐趣。 虽然我的论文作品不是很成熟,还有很多不足之处,但我可以自豪的说,这里面的每一段代码,都有我的劳动。当看着自己的程序,自己成天相伴的系统能够健康的运行,真是莫大的幸福和欣慰。这次做论文的经历也会使我终身受益,我感受到做论文是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。希望这次的经历能让我在以后学习中激励我继续进步。 致  谢 本论文是在导师朱志甫老师的悉心指导下完成的。感谢朱老师对我的辛勤培育。从论文的立题到实验的设计以及论文的撰写整个过程无不浸透着老师的心血。他广博的学识,严肃的科学态度,严谨的治学精神,灵活的思维方式,耐心细致的言传身教深深感染激励着我,将使我终身受益。导师不但在学习上给予我耐心细致的指导,在生活中也给了我莫大的关怀,这份师恩我将终身难忘。 此外,我的论文也得了很多人的帮助,在此对他们表示深深的感谢。 感谢机械与电子工程学院所有同届的同学对我生活和学习的关心和帮助,特别是08级电信二班的同学在写论文和编辑word方面给与我的帮助。我为自己能够在这样一个温暖和谐的班级体中学习工作,深感温暖、愉快和幸运。 参考文献 [1] 张毅刚  主编    《FPGA原理及应用》              高等教育出版社,2006 [2] 李光飞  编著    《FPGA课程设计实例指导》        北京航空航天出版社,2004 [3] 姜雪松,吴玉春,王鹰 . 设计实例与仿真[M]. 北京:机械工业出版社,2010.3 [4] 徐光军,徐光辉. CPLD/FPGA的开发与应用[M]. 北京:电子工业出版社,2009.10 [5] 周润雅等. 基于QuartusII FPGA /CPLD的数字系统设计实例 [M]. 北京:电子工业出版社.2009.5 [6] 谭伟泽,徐畅.面向FPGA器件的VHDL语言优化设计方法[J].南宁职业技术学院学报.2010.10 [7] 宋潇,李佩佩,韩莹莹.自动售货机控制设计[J],科技信息:机械与电子出版社.2011.2 [8] 张凯,林伟.VHDL实例剖析[M],北京:国防工业出版社,2010 [9] 郑亚明,董晓舟.可编程逻辑开发软件QuartusII [M],北京:国防工业出版社,2011 [10] 李衍,王行.EDA技术入门与提高[M],西安:西安电子科技大学出版社,2010 [11] 姚远,李晨.FPGA应用技术开发入门与实例[M],北京:人民邮电出版社,2011 [12] PETER R. WILSON. UNDERSTANDING THE FPGA DESIGN FLOW, Electronics world,2008(1865):32-35 [13] L.M. Wu; W.B. Hu; N.H. Lai; G.T. Wang The Reconfigurable Embedded NcSystem Based On Fpga .Key Engineering Materials ,2009(1):703-708. [14]  Adec Inc.Henderson .VHDL Language Reference Guide. NV USA,1999 附录一 程序清单: // synthesis translate_off `timescale 1ns / 100ps // synthesis translate_on module led_pio ( // inputs: address, chipselect, clk, reset_n, write_n, writedata, // outputs: out_port ); output  [  7: 0] out_port; input  [  1: 0] address; input            chipselect; input            clk; input            reset_n; input            write_n; input  [  7: 0] writedata; wire            clk_en; reg    [  7: 0] data_out; wire    [  7: 0] out_port; assign clk_en = 1; //s1, which is an e_avalon_slave always @(posedge clk or negedge reset_n) begin if (reset_n == 0) data_out <= 0; else if (chipselect && ~write_n && (address == 0)) data_out <= writedata[7 : 0]; end assign out_port = data_out; Endmodule Module led_point ( // inputs: address, chip_select, clock, read, reset_n, write, write_data, // outputs: read_data, spi_clk, spi_mosi, spi_ncs ); output  [ 31: 0] read_data; output          spi_clk; output          spi_mosi; output          spi_ncs; input  [  3: 0] address; input            chip_select; input            clock; input            read; input            reset_n; input            write; input  [ 31: 0] write_data; wire    [ 31: 0] read_data; wire            spi_clk; wire            spi_mosi; wire            spi_ncs; led_point_avalon_interface the_led_point_avalon_interface ( .address    (address), .chip_select (chip_select), .clock      (clock), .read        (read), .read_data  (read_data), .reset_n    (reset_n), .spi_clk    (spi_clk), .spi_mosi    (spi_mosi), .spi_ncs    (spi_ncs), .write      (write), .write_data  (write_data) ); Endmodule module led_point_task_logic( clock, reset_n, clock_divide, disp_dat, spi_clk,spi_mosi,spi_ncs); //输出引脚 input          clock;              //时钟信号48MHz input          reset_n;            //复位信号,低电平有效 input [31:0]    clock_divide; input [255:0]  disp_dat;  //显示数据16*16,数据为从上到下,从左到右,纵向上高位下低位 //输出引脚 output          spi_clk;    //SPI时钟,3.3V时频率最好小于8MHz output          spi_mosi;  //SPI串行数据线 output          spi_ncs;    //SPI片选,低电平选通,上升沿锁存数据 //寄存器 reg [31:0]  counter;        //行扫描时间计数器 reg        shift;          //行扫结束状态 reg [3:0]  lcount; reg [15:0]  line_dat_r,row_dat_r; reg [2:0]  spi_sta; reg        spi_ncs_r,spi_clk_r; reg [5:0]  spi_count; reg[3:0]    clk_count; reg clk_r; wire clk; wire [31:0] spi_dat_w; //parameter clock_divide = 16'd5000;    //行扫时间比较值 //parameter data_init = 256'h0802_0844_0fa8_f810_0828_0fc6_0100_4100_4102_4101_47fe_4900_5100_6300_0100_0000; //"好" //10分频 //输入clock:48MHz,输出clk:4.8MHz always @(posedge clock) begin if(clock) begin if(clk_count >= 4'd9) begin clk_count <= 4'd0; clk_r <= 1'b0; end else if(clk_count >= 4'd4) begin clk_r <= 1'b1; clk_count <= clk_count + 4'd1; end else clk_count <= clk_count + 4'd1; end end assign clk = clk_r; //行扫描时间计数 //timer = clock_divide * clk //时间大约1ms always @(posedge clk or negedge reset_n)        begin if (~reset_n) counter <= 32'h0; else begin shift <= 1'b0; if (counter >= clock_divide) begin shift <= 1'b1; counter <= 32'h0; end else counter <= counter + 32'h1; end end //行扫描状态机 always @(posedge clk) begin if (~reset_n) lcount <= 0; if (shift) lcount <= lcount + 4'h1; end //行显示数据 always @(lcount or disp_dat) begin case (lcount) 4'h0:  line_dat_r <= disp_dat[15:0]; 4'h1:  line_dat_r <= disp_dat[31:16]; 4'h2:  line_dat_r <= disp_dat[47:32]; 4'h3:  line_dat_r <= disp_dat[63:48]; 4'h4:  line_dat_r <= disp_dat[79:64]; 4'h5:  line_dat_r <= disp_dat[95:80]; 4'h6:  line_dat_r <= disp_dat[111:96]; 4'h7:  line_dat_r <= disp_dat[127:112]; 4'h8:  line_dat_r <= disp_dat[143:128]; 4'h9:  line_dat_r <= disp_dat[159:144]; 4'ha:  line_dat_r <= disp_dat[175:160]; 4'hb:  line_dat_r <= disp_dat[191:176]; 4'hc:  line_dat_r <= disp_dat[207:192]; 4'hd:  line_dat_r <= disp_dat[223:208]; 4'he:  line_dat_r <= disp_dat[239:224]; 4'hf:  line_dat_r <= disp_dat[255:240]; endcase end //行扫描选通 always @(lcount) begin case (lcount) 4'h0:  row_dat_r <= 16'hfffe; 4'h1:  row_dat_r <= 16'hfffd; 4'h2:  row_dat_r <= 16'hfffb; 4'h3:  row_dat_r <= 16'hfff7; 4'h4:  row_dat_r <= 16'hffef; 4'h5:  row_dat_r <= 16'hffdf; 4'h6:  row_dat_r <= 16'hffbf; 4'h7:  row_dat_r <= 16'hff7f; 4'h8:  row_dat_r <= 16'hfeff; 4'h9:  row_dat_r <= 16'hfdff; 4'ha:  row_dat_r <= 16'hfbff; 4'hb:  row_dat_r <= 16'hf7ff; 4'hc:  row_dat_r <= 16'hefff; 4'hd:  row_dat_r <= 16'hdfff; 4'he:  row_dat_r <= 16'hbfff; 4'hf:  row_dat_r <= 16'h7fff; endcase end parameter      idle            = 3'h0, spi_shift0      = 3'h1, spi_shift1      = 3'h2, spi_shift_comp  = 3'h3, spi_loop        = 3'h4; always @(posedge clk) begin if (shift) begin spi_sta <= idle; spi_ncs_r <= 1'b1; spi_clk_r <= 1'b0; spi_count <= 6'h0; end else begin spi_ncs_r <= 1'b1; spi_clk_r <= 1'b0; case(spi_sta) idle: begin spi_count <= 6'h0; spi_sta <= spi_shift0; end spi_shift0: begin spi_ncs_r <= 1'b0; spi_sta <= spi_shift1; end spi_shift1: begin spi_clk_r <= 1'b1;            //上升沿锁住数据 spi_ncs_r <= 1'b0; spi_count <= spi_count + 6'h1; spi_sta <= spi_shift_comp; end spi_shift_comp: begin spi_ncs_r <= 1'b0; if (spi_count == 6'h20)        //连续发送32位数据 spi_sta <= spi_loop; else spi_sta <= spi_shift0; end spi_loop:                            //数据送完,等待行扫描结束 begin spi_sta <= spi_loop; end endcase end end assign spi_dat_w = {line_dat_r,row_dat_r}; assign spi_clk = spi_clk_r; assign spi_ncs = spi_ncs_r; assign spi_mosi = spi_dat_w[spi_count]; Endmodule module led_point_register_file( //Avalon Signals clock, reset_n, chip_select, address, write, write_data, read, read_data, clock_divide, disp_dat ); //Parameters parameter clock_divide_reg_init = 32'd5000; parameter data_init = 256'h0802_0844_0fa8_f810_0828_0fc6_0100_4100_4102_4101_47fe_4900_5100_6300_0100_0000; //"好" input          clock;              //System Clock input          reset_n;            //System Reset input          chip_select;        //Avalon Chip select signal input [3:0]    address;            //Avalon Address bus input          write;              //Avalon Write signal input [31:0]    write_data;        //Avalon Write data bus input          read;              //Avalon read signal output [31:0]  read_data;          //Avalon read data bus output [31:0]  clock_divide;  //PWM clock divide drive signals output [255:0]  disp_dat; //Signal Declarations  reg [31:0]      clock_divide_r;    //Clock divider register reg [255:0]    disp_dat_r; reg [31:0]  read_data_r;            //Read_data bus wire        write_act,read_act; //determine if a vaild transaction was initiated assign write_act = chip_select & write;    assign read_act  = chip_select & read; parameter      set_divide      = 4'h0, disp_dat_0      = 4'h1, disp_dat_1      = 4'h2, disp_dat_2      = 4'h3, disp_dat_3      = 4'h4, disp_dat_4      = 4'h5, disp_dat_5      = 4'h6, disp_dat_6      = 4'h7, disp_dat_7      = 4'h8; //write always @(posedge clock or negedge reset_n) begin if (~reset_n) begin //initializtion clock_divide_r <= clock_divide_reg_init; disp_dat_r <= data_init; end else if (write_act) begin case (address) set_divide: begin clock_divide_r <= write_data; end disp_dat_0: begin disp_dat_r[31:0]  <= write_data; end disp_dat_1: begin disp_dat_r[63:32]  <= write_data; end disp_dat_2: begin disp_dat_r[95:64]  <= write_data; end disp_dat_3: begin disp_dat_r[127:96]  <= write_data; end disp_dat_4: begin disp_dat_r[159:128]  <= write_data; end disp_dat_5: begin disp_dat_r[191:160]  <= write_data; end disp_dat_6: begin disp_dat_r[223:192]  <= write_data; end disp_dat_7: begin disp_dat_r[255:224]  <= write_data; end default: begin end endcase end        end            always @(read_act or address or clock_divide_r) begin          if (read_act) begin case (address) set_divide: begin read_data_r <= clock_divide_r; end default: begin read_data_r <= 32'h0; end endcase end else read_data_r <= 32'h0; end assign clock_divide = clock_divide_r; assign disp_dat = disp_dat_r; assign read_data = read_data_r; Endmodule module led_point_avalon_interface( //Avalon Signals clock, reset_n, chip_select, address, write, write_data, read, read_data, //led_point Output Signals spi_clk,spi_mosi,spi_ncs ); //Avalon_Slave_led_point Avalon I/O input          clock;          //System clock - tied to all blocks input          reset_n;        //System reset - tied to all blocks input          chip_select;    //Avalon Chip select input [3:0]    address;        //Avalon Address bus input          write;          //Avalon Write signal input [31:0]    write_data;    //Avalon Write data bus input          read;          //Avalon Read signal output [31:0]  read_data;      //Avalon Read data bus //Avalon_Slave_led_point Exported I/O output          spi_clk; output          spi_mosi; output          spi_ncs; wire [31:0] clock_divide; wire [255:0] disp_dat; //led_point Instance led_point_task_logic u1( .clock(clock ), .reset_n(reset_n), //******************** .clock_divide(clock_divide), .disp_dat(disp_dat), //******************** .spi_clk(spi_clk), .spi_mosi(spi_mosi), .spi_ncs(spi_ncs) ); //Register File instance led_point_register_file u2( .clock(clock), .reset_n(reset_n), .chip_select(chip_select), .address(address), .write(write), .write_data(write_data), .read(read), .read_data(read_data), //******************** .clock_divide(clock_divide), .disp_dat(disp_dat) ); Endmodule
本文档为【基于FPGA点阵显示屏设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_589748
暂无简介~
格式:doc
大小:156KB
软件:Word
页数:65
分类:互联网
上传时间:2019-02-21
浏览量:30