求助如何将rom宏模块内容读入nios ii?

嵌入式系统无疑是当前最热门,最有发展前途的IT应用领域之一。嵌入式系统是嵌入式计算机系统的简称,是相对于通用计算机系统而言的。其核心是微处理器(CPU),因此嵌入式系统的应用关键在于软件。随着半导体产业的发展,CPU的设计以处MCU/DSP为核心的集成电路级设计不断地转向集成系统级设计,提出了SOC的设计阶段,但是由于种种因素,对于一些仅为小批量的应用或处于开发阶段的SOC,若马上投入流片生产,则需要投入大量资金。因此最近兴起的以FPGA为载体的SOPC技术则成为了一种有效的解决方案。并且此技术既可以作为嵌入式系统直接应用,也可以作为SOC设计者的前端验证使用。知识产权核(IP_CORE)的概念也因此被提出,基于IP_CORE的开发流程能像软件移植一样将硬件移植到另一款ASIC或者FPGA上,当需要推出新产品的时候,SOC/SOPC开发人员可以很方便的使用已拥有的IP模块,转移到新的处理器上,或者只需要修改一小部分,就可以满足所有产品的需要。IP核的重复利用性大大缩短了产品的开发周期降低开发的复杂度。
随着大规模集成电路(VLSI)技术的发展,嵌入式计算机系统开始从MCU逐步过渡到SOC的新阶段。SOC有别于普通的IC,其设计从整个系统角度出发,以成熟的处理器IP_CORE为核心对其进行各种资源扩充,进而在单片上实现整个系统。其难度之大也给设计人员带来了前所未有的极大挑战。于是Altera公司针对SOC设计以及嵌入式系统的发展趋势提出了SOPC的概念。这个概念是基于现场可编程逻辑阵列FPGA快速发展提出的,在早期,由于半导体工艺的局限,FPGA只是数字IC的前端验证载体,利用它的硬件可修改性,来验证逻辑设计的正确性。之后随着半导体工艺的飞速发展,FPGA进入了实用阶段,越来越多的数字IC被其替代。直至今日,其门数达到百万门级,稳定运行频率也达到了200MHz以上,再加上其内嵌的大量ROM,RAM,PLL等模拟资源,已经足够构成一个SOC级的芯片,在对于SOC设计者而言大大缩短了设计时间的同时也给予嵌入式系统的应用设计人员带来了新的天地。严格来说,传统的嵌入式系统只存在软件设计和PCB电磁兼容设计,一旦方案确定下来,硬件几乎是固定不变的。而SOPC的出现让嵌入式系统进入了软硬件协同设计的时期,我们大可以利用已经设计好的MCU核(甚至自行扩充),再对其进行内部的数字硬件扩充,最后在对MCU核编写软件,这种协同设计的方法比其传统的嵌入式系统要灵活高效的多。
NiosII是Altera公司推出的32位精简指令集(RISC)嵌入式处理器核,与一般的单片机不一样,它只是个软核,没有固化在FPGA内部,其使用的灵活性则又上升了一个台阶,FPGA内部资源的应用合理性也能做到最大的优化。NiosII作为ALtera公司的SOPC技术的核心具有高性能,高灵活性,和超低成本的特点,由于其软核的特性,Altera将其使用权以免费的方式给予开发人员,其成本的消耗即FPGA内部资源的消耗,以门和FPGA器件的本身成本来看NiosII大约只有35-50美分。结合完善的配套开发工具QuantursII,SopcBuilder,NiosII_IDE可以在短短数日之间构成一个完整的片上系统。
简化的FPGA基本由6部分组成,分别为可编程输入/输出单元,基本可编程单元,嵌入式块RAM,丰富的布线资源,底层嵌入功能单元和内嵌专用硬核等。下面是对FPGA结构简单的介绍。如图1.1所示:
&&&&&&&&& &&&&&&&&&&&图1.1 FPGA的基本结构图
(1)编程输入/输出单元
I/O单元,它们是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配需求.为了使FPGA有风灵活的应用,目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可以适配不同的电器标准与I/O的物理特性;可以调整配阻抗特性,上下拉电阻;可以调整出驱动电流的大小等.可编程I/O单元支持的电气标准因工艺而异,不同器件商不同器件族的FPGA支持的I/O,常见的电气标准有LVTTL.LVCMOS,SSTL,HSTL,LVDS.LVPECL和PCI等。值得一提的是,随着ASIC工艺的飞速发展,目前可编程I/O支持的最高频率越来越高,一些高端FPGA通过DDR寄存器技术,甚至可以支持高达2Gbit/s的数据率。
(2)基本可编程逻辑单元
基本可编程逻辑单元是可编程逻辑的主体,可以根据设计灵活地改变其内部连接与配置,完成不同的逻辑功能。FPGA一般是基于SRAM工艺的,其基本可编程逻辑单元几乎都是由查找表(LUT,Look,Up ,Table)和寄存器(Register)组成的。FPGA内部查找表一般为4输入(注:Altera Stratix II 的自适应模块ALM结构比较特殊),查找表一般完成纯组合逻辑功能。FPGA内部寄存器结构相当灵活,可以配置为带同步/异步复位或置为,时钟使能的触发器,也可以配置成为锁存器(Latch).FPGA一般依赖寄存器完成同步时序逻辑设计.一般来说,比较经典的基本可编程单元的配置是一个寄存器加一个查找表的组合模式也不同.例如,ALTERA可编程逻辑单元通常被称为(Logic Element,逻辑单元),由一个Register 加一个LUT构成.Altera大多数FPGA将10个LE有机组合起来,构成更大功能单元---逻辑阵列模块, LAB除了LE还包含LE间的进位链.LAB控制信号,局部联线资源,LUT级联链,寄存器级联链等连线与控制资源.当然这些可编程单元的配置结构随着器件的发展也在不断更新,最新的一些可编程逻辑器件常常根据设计需求推出一些新的LUT和Register的配置比率,并优化起内部的连接构造。
(3)嵌入式RAM和ROM
&目前大多数FPGA都有内嵌的块RAM,FPGA内部嵌入可编程RAM模块,大大地拓展了FPGA的应用范围和使用灵活性.FPGA内嵌的块一般可以灵活配置为单端口等常用存储结构,RAM的概念和功能读者应该非常熟悉,在次不再多说.FPGA中其实并没有专用的ROM硬件资源,实现ROM的思路是对RAM赋予初值,并保持该初值.所谓CAM,即内容地址存储器.CAM这种存储器在其每个存储单元都包含一个内嵌的比较逻辑,写入CAM的数据会和其内部存储的每一个数据进行比较,并返回与端口数据相同的所有内部数据的地址.概括地讲,RAM是一种根据地址读写数据的存储单元;而CAM和RAM恰恰相反,它返回的是与端口数据相匹配的内部地址.CAM的应用也非常广泛,比如在路由器中的地址交换表等.FIFO是先进先出队列式存储结构.FPGA内部实现RAM,ROM,CAM,FIFO等存储结构都可以基于嵌入式块RAM单元,并根据需求自动生成相应的粘合逻辑(Glue Logic)以完成地址和片选等控制逻辑.
(4)丰富的布线资源
&布线资源连同FPGA内部所有单元,连线的长度和工艺决定着信号在连线上的驱动能力和传输速度.FPGA内部有着非常丰富的布线资源,这些布线资源根据工艺,长度,宽度,和分布位置的不同而划分为不同的等级,有一些是全局性的专用布线资源,用以完成器件内部的全局时钟和全局复位/置位的布线;一些叫做长线资源.用以完成器件Bank(分区)间的一些高速号和一些第二全局时钟信号(有时也被称为Low Skew 信号)的布线;还有一些叫做短线资源,用以完成基本逻辑单元之间的逻辑互联与布线;另外,在基本逻辑单元内部还有着各式各样的布线资源和专用时钟,复位等控制信号线.实现过程中,设计者一般不需要直接选择布线资源,而是由布局布线器自动根据输入的逻辑同表的拓补结构和约束条件选择可用的布线资源连通所用的单元层模块,所以设计者常常忽略布线资源.其实布线资源的优化与使用和设计的实现结果。
&底层嵌入功能单元和内嵌专用硬核都是FGPA内部的一些高级结构本设计并没有运用到。FPGA强大的内部结构为数字逻辑电路的设计提供很多方便和优越的条件。
VGA作为一种标准的显示接口得到了广泛的应用。VGA在任何时刻都必须工作在某一显示模式之下,其显示模式分为字符显示模式和图形显示模式。而在应用中,讨论的都是图形显示模式。VGA的图形模式分为三类:CGA、EGA兼容的图形模式;标准的VGA图形模式;VGA扩展图形模式。后两种图形模式统称为VGA图形模式。文中基于标准VGA模式来实现。工业标准的VGA显示模式为:640*480*16色*60HZ。常见的彩色显示器一般都是由CRT(阴极射线管)构成,每一个像素的色彩由R(红,Red)、G(绿,Green)、B(蓝,Blue)三基色构成。显示时采用的是逐行扫描的方式。由VGA显示模块产生的水平同步信号和垂直同步信号控制阴极射线管中的电子***产生电子束,轰击涂有荧光粉的屏幕,产生RGB三基色,于显示屏上合成一个彩色像素点。图1.2表示的是VGA显示模块与CRT显示器的控制框图。
&&&&&&&&&&&& &&&&&图1.2 VGA显示模块与CRT显示器控制框图
电子束扫描一幅屏幕图像上的各个点的过程称为屏幕扫描。现在显示器都是通过光栅扫描方式来进行屏幕扫描。在光栅扫描方式下,电子束按照固定的路径扫过整个屏幕,在扫描过程中通过电子束的通断强弱来控制电子束所经过的每个点是否显示或显示的颜色。电子***在VGA显示模块产生的行同步、场同步等控制信号的作用下进行包括水平扫描、水平回扫、垂直扫描、垂直回扫等过程。光栅扫描的路径通常为:从上到下扫过每一行,在每一行中从左到右地进行扫描。其过程如下:电子束从屏幕左上角开始向右扫,当到达屏幕的右边缘时,电子束关闭(水平消隐),并快速返回屏幕左边缘(水平回扫),然后在下一条扫描线上开始新的一次水平扫描。一旦所有的水平扫描均告完成,电子束在屏幕的右下角结束并关闭(垂直消隐),然后迅速返回到屏幕的左上角(垂直回扫),开始下一次光栅扫描。
***ALON交换总线方式是由ALtera为NiosII开发的总线结构,为了开发基于NiosII处理器的VGA IP核,首先需要了解***ALON总线的工作方式和性能。
(1)***ALON交换结构
***ALON交换结构是***ALON控制总线的主干,作用主要为负责对NiosII处理器和片
上外设IP之间的数据交换和通信,其交换结构由各种控制,数据和地址信号以及加载逻辑组成,并将构成系统的各种自定义外设逻辑连接起来。***ALON交换结构支持不同数据宽度的片内和片内外设互连,并且这些外设可以工作在不同的频率条件下。
(2)IP_CORE与***ALON交换结构的连接
&& IP_CORE对于NiosII的***ALON交换结构而言相当于***ALON外设,通常一个基于***ALON接口的典型系统都包括多个功能外设,这些外设通过***ALON交换结构和NiosII进行数据通信。***ALON外设包括存储器和处理器,还包括传统的外设,如UART,PIO,
定时器,DMA控制等。用户自定义的IP_CORE作为***ALON外设也可以直接加入使用,利用特定的***ALON信号表示名,在开发环境SOPC_BUILDER中可以智能的识别出IP_CORE与NiosII总线交换结构的衔接端口。信号分成两种模式,SALVE信号(从信号)和MASTER信号(主信号)从信号包括片选信号:chipselect,读使能信号:read,写使能信号:write,地址信号:address,写数据信号:writedata,读数据信号:readdata,主时钟信号clk,字节使能信号byteenable,中断请求信号:irq,外设复位信号:reset,
主信号包括:时钟信号:clk,地址信号:address,读使能信号read,读数据信号:
readdata,写信号:write,写数据信号:writedata,流控制信号:endofpacket,
双向数据口:data,流水线控制信号:flush,readdatavalid,中断请求优先级信号:
irqnumber,复位信号:reset。
根据NiosII的英文开发文档描述,在使用MASTER模式的情况下要与NiosII进行通信必需的信号有片选信号chipselect,以及地址选择信号address。
chipselec信号是从端口的片选信号。除非片选信号有效,否则从端口将忽略所有对此器件发出的***ALON信号,也就是说片选端信号是所有动作信号的必须标志。其作用类似与微处理器中的中断机制的总中断控制标志位,而其他信号相当与各种中断的控制标志。
Address信号是从***ALON交换结构到从端口的地址线,规定了从外设地址空间的一个地址偏移。即相当于基地址BASE+偏移地址OFFSET中的OFFSET,它的作用在于对于不同的address,我们可以找到对应的OFFSET,进而选择到IP_CORE的子功能。 &
由于***ALON接口信号可配置,对于特定的***ALON外设,可以只使用必要的交换信号。因此在设计VGA_IP CORE的时候,我尽量选择较少的信号,从而尽量减少系统复杂程度和逻辑单元消耗。对于数据的传输,使用的是writedata,readdata,以及分别控制它们的write和read信号。read,write,chipselect,writedata,readdata四个信号的使用方法如下。
(1)chipselect,read,write,为从端口的1位输入信号,用来指示新的读或写传输何时开始。如果chipselect无效,从端口将忽略除reset外的所有信号,根据从端口使用的信号组合,这些信号具有不同的行为:为此在使用read和write来控制读和写的时候,要和chipselect联合使用,通常用(chipselect && read)以及(write && chipselect)对应到硬件逻辑则是让write信号或者read信号和chipselect经过一个与逻辑门之后再输出来作为读写控制。
(2)readdata和writedata为用语传递与传输相关数据的从端口信号,从端口可以不使用,使用一个或全部使用这两个信号。信号宽度的范围为1至128位使用动态地址对齐的从端口,其数据宽度必须是8,16,32,64,或者128位。如果从端口同时支持读写readdata和writedata两个数据信号,则这两个信号应当拥有相同的位宽。
由于本设计要求VGA IP能够根据计算机的键盘来在CRT彩显上显示所以必定需要writedata信号和其控制信号write,并且因为不需要反溃给NiosII信息,所以不需要
readdata信号和其控制信号。设计中的chipselect,address,reset和clk 以及writedata和write信号为NiosII的***ALON交换结构发送给VGA_IP核的所有信号。VGA_IP核同过这几个信号与NiosII处理器的软件进行完全通信,而具体的工作由VGA_IP硬件单独完成。VGA_IP的一般方案如下
方案(1):采用DMA控制和外部SRAM显存的方法,先把数据图象存放在外部SRAM中,当数据标志来的时候,从SRAM中取得数据,并且由NiosII软件屏蔽掩码来达到我们想要的字符。并且由DMA控制SRAM和NiosII之间的传输以用来保证数据传输的速度。
此方案的最大缺陷是需要很大的外部SRAM,并且Altera提供的DMA控制IP也是需要消耗大量的On Chip Memory的。因此并不是很可取。并且在验证用的开发实验板上没有外接SRAM作为显存,此方案的示意图如图2.1。
图2.1 DMA传输的实现的方案图
,利用计数器功能根据得到的表示符在CRT彩显上显示对应的亮点。此方案的示意如图2.2所示
&&&&&&&&&&&&&&&&&&&&&&&&
图2.2 逻辑扫描实现的方案图
时序模块是实现整个VGA功能的核心,其功能相当与一个复杂的译码器,通过时序
模块,可以将任意MCU发出的标示性字码翻译成各种行为表示码,通过这个行为码,我们可以让VGA逻辑进行各种在CRT彩显或者带有VGA的液晶显示器上显示自定义的内容,
控制显示器显示图象,常见的彩色显示器的色彩是由号8种颜色信号线表示的,限于开发板的条件限制,只采用R,G,B(红:Red,绿Green,蓝 Blue)三中基本颜色。利用彩显的阴极射线***发出电子束打在涂有荧光粉的荧光屏上,产生RGB三基色,合成一个彩色的像素。扫描从屏的左上方开始,从左到右,从上到下,进行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行行同步:扫描完所有行,用场同步信号进行场同步,并使得扫描信号到屏幕的左上方,同时进行场消隐,预备下一场的扫描。
&& 对于一般的VGA显示器,有五个信号:R,G,B三基信号:HS:行同步信号;VS:场同步信号。
VGA的工业标准如下表3.1所以示:
&&&&&&&&&&&&&&&&&&&&&
表3.1 VGA的工业标准
时钟频率(Clock frequency)
25.175MHZ(像素输出的频率)
行频(Line frequency)
场频(Field frequency)
59.94HZ(每秒图像新频率)
VGA工业标准模式要求:行,场同步都为负极性,即同步头脉冲要求是负脉冲。
其工业时序如图3.1(a)(b)所示:
图3.1 a 行扫描时序扫描图
&&&&&&&&&&&&&&&&&&&&&&&&&&&
图3.2 b 行扫描时序扫描图
逻辑功能说明:parameter hsync_end& =10'd95, hdat_begin =10'd143, hdat_end&& =10'd783, hpixel_end =10'd799,vsync_end& =10'd1,vdat_begin =10'd34,vdat_end&& =10'd514,vline_end& =10'd524;
分别定义了时序图中的关键参数,根据时序图,各个参数的意义如下:
(1)hsync_end 表示行同步信号完结的时钟周期数(以25MHz工业标准算)
(2)hdat_end &表示行数据显示的完结时钟数。
(3)hdat_begin表示行数据显示的开始时钟数。
(4)hpixel_end表示行周期的完结时钟数。
(5)vsync_end 表示场同步信号的完结时钟数。
(6)vdat_end& 表示场数据显示完结时钟数
(7)vdat_begin表示场数据显示开始时钟数
(8)vline_end& 表示常扫描完结时钟数,也就是一桢画面扫描完毕的示时钟数
信号端口说明和基本原理:
此逻辑模块的基本思路是根据时序图,采用两个计数器hcount与vcount,分别
作为行,场扫描的计数器,并且以标准的25MHz时钟作为基准频率记数,当达到行同步脉冲的时候让模拟出行同步脉冲hsync的时序,然后给场计数器vcount+1,在进行行扫描,扫描到输出像素的时段后输出像素dat_out,一直到行周期结素后进行场同步脉冲
,进而周期性的扫完整个画面,在整个画面扫描完毕后,场同步脉冲vsync发出,之后再按照先前的规律扫描第二副图片。由此计算,扫描完一副680 X 480的图片需要的时间大约是60分之1秒,因此扫描的帧数为 60 Frame。其核心如下所示
assign hcount_ov=(hcount==hpixel_end)?1'b1:1'b0;
assign vcount_ov=(vcount==vline_end) ?1'b1:1'b0;
assign dat_act =((hcount&=hdat_begin)&&(hcount&hdat_end))
&&&&&&&&&&&&& &&((vcount&=vdat_begin)&&(vcount&vdat_end));
assign hsync = (hcount& hsync_end)?1'b1:1'b0;
assign vsync = (vcount& vsync_end)?1'b1:1'b0;
assign data_out = (dat_act)? data_temp :3'b000;
assign hcnt=
assign vcnt=
此段描述了各种时序的逻辑分界点,对照时序图可以清楚的看到逻辑时序的规则,hsync行同步脉冲是以hsync_end作为临界变化点,vsync场同步脉冲以vsyne_end作为临界点,数据输出则以hdat_begin,hdat_end,vdat_begin,vdat_end参数作为临界点,如此模拟出行场扫描的逻辑时序。
逻辑功能说明:
与NiosII处理器接口的信号有五个,片选chipselect,address,write,writedata,clk。clk为来自传输给NiosII的外部时钟,此时钟为接口模块和时序模块的公用时钟。asic_command =(chipselect && write && address)? writedata : 8'b,逻辑为连接NiosII交换结构和VGA IP核的主要语句。当片选& chipselect,写使能write以及确定功能的地址address信号共同有效时候,将Nios要写入的数据传输给VGA_IP核。由于此传输信号非常重要,并且为高速信号,因此使用
always @(posedge clk)
& asic_command_temp &= asic_
end 描述的触发器逻辑连接于asic_command_temp信号之后,以用来消除毛刺现象,保证关键信号的正确性。
&& 根据asic_command_temp信号进行译码,分别对不同的信号进行相应的处理,因此使用case语句生成多路器,根据时序逻辑模块输送过来的hcnt,vcnt两个计数器信号,输出对应的时间点信号反溃给时序逻辑模块,从而在VGA显示器的指定位置上显示出我们需要产生颜色的像素点,通过这些像素点的集合构成我们要显示的字符。
具体顶层逻辑模块请见附录中VGA_IP.v代码。
逻辑说明:
在QuantursII开发工具中支持对逻辑原理图实例化以及之间的相互连接。并且自动生成顶层逻辑模块的.v文件,其效果是相同的。
核的软件设计
&& 为了程序员使用方便,应该对提供的IP核的软件部分进行封装,提供头文件能够达到此效果,VGA.H的C程序如下:
#ifndef __VGA_H__
&& #define __VGA_H__/*define the .h file of this object*/
&& #include &io.h&
&& #define WriteRgb(base,data)&&& IOWR(base, 1 ,data)
#endif /* VGA_API */
在定义头文件的时候采用了宏函数的方式,io.h是NiosII处理器专用的IO头文件,定义了以不同地址对齐方式与Avalon总线互连的外设寄存器实际物理地址计算的方法,同时还定义了一系列用于读写IO口或者寄存器的宏。IOWR函数的定义在altera_avalon_pio_regs.h这个头文件中。其原形如下:IOWR(base,offset,data);& base为器件的片选地址,offset为偏移地址,此偏移动地址为1,实际上和niosinterface.v中的address==1时为功能选中是有相互关联的, base总是以SOPC_Builder中的器件名加上__BASE作为基地址:如图4.1所示。
图4.1 SOPC_BUILDER的器件选择图
在使用时候用WriteRgb(VGA_IP_BASE,data);即可data为我们想要写入的数据,其数据值和niosinterface.v中的writedata相互关联。
include &system.h&
value=IORD_ALTERA_***ALON_PIO_DATA(PIO_IN_BASE);来读取名为PIO_IN_BASE地址的数据,并且保存在value变量中。
键盘接口的逻辑设计
& &PS2键盘接口协议采用的是PS2传输协议其基本规范可以描述如下:从键盘/鼠标发送到主机的数据在时钟信号的下降沿,既当时钟从高变到低的时候被读取从主机发送
到键盘的数据在上升沿当时钟从低变到高的时候被读取,不管通讯的方向怎样键盘总
是产生时钟信号,如果主机要发送数据它必须首先告诉设备开始产生时钟信号这个过程。11 12 个位这些位的含义如下:
个起始位总是为0
8 个数据位低位在前
1 个校验位奇校验
1 个停止位总是为1
1 个应答位(仅在主机通信的时候使用)
如果数据位中包含偶数个1 校验位就会置1, 如果数据位中包含奇数个1 校验位就会置0 数据位中,1 的个数加上校验位总为奇数这就是奇校验这是用来错误检测。
&&& 当键盘等待发送数据时,首先检查时钟以确认是否是高电平,如果不是那么是主机抑制了通讯设备,必须缓冲任何要发送的数据直到重新获得总线的控制权键盘。有16 字节的缓冲区仅存储最后一个要发送的数据包,如果时钟线是高电平设备就可以开始传送数据。其传输协议图如图5.1
(a)在主机最初把数据线拉低后,设备开始产生时钟脉冲的时间,必须大于15ms,(b)数据包被发送的时间必须不大于2ms。如果这两个条件不满足,主机将产生一个错误。在包受到后,主机为了处理数据立刻把时钟线拉低来抑制通讯。如果主机发送的命令要求有一个辉映,这个辉映必须在书籍释放时钟线后20ms之内被收到。如果没有收到,则主机产生一个错误。在设备到主机通讯的情况中,时钟改变后的5微秒内不应该产生数据改变的情况。
键盘逻辑负责对PS2键盘按下的字符译为可以给NiosII的IO口识别的数据,具体代码请见附录中的key_interface.vhd
代码说明:中间的process(reset,k_clock,sys_clk) &&&&&到
enable&=PA&=&& when enable='1' else tmp(8 downto 1);
为核心逻辑,主要功能为将把键盘按下的通断码转换成相应的时序输出对应的键盘表示数据码。之后process(PA)描述的是一个多路器组合逻辑,其作用为将对应标志转换成IEEE协会规定的标准ANIS 码,以用来方便各种应用接口。
系统的调试
其中锁相环输出的时钟有三个,一个为SDRAM使用的时钟25M,一个为VGA_IP与NiosII公用的系统时钟25M。最后一个为键盘接口逻辑的40MHz时钟。
经过编译下载硬件系统后,运行NiosII测试程序其效果如图6.2所示
可以看到键盘接受一切正常,显示屏可以快速的响应键盘显示相应的字符在显示的时候出现的是流水灯的效果,仍然有改良的余地。仔细分析后采用了两种方式来改良:
(1)一种是在C语言编写的软件中用DMA快速传输的方式来持续的传输数据到端口,由于片内资源有限,DMA构成的FIFO不能设置很大,但其效果可以达到比现在更好的程度。其原理是基于一种推测:原本的C测试程序每执行一次WriteRgb()函数就使写到端口上的数据更新一次,而由于执行一次WriteRgb()函数(实际上为用来定义宏函数的IOWR(base,offset,data)函数)需要数个时钟周期,每执行一次就会有数段时钟内将数据改成0x00(对应的屏幕是全黑然)然后再输出真正我们需要的数据。由于扫描完一副图象要1/60秒,在还没有扫描完的时候又再次执了一次WriteRgb()函数,这样又给出了一个新的表示码,CRT显示屏幕将会再次重复刚才的步骤,也就是说会有连续不断的等间隔的空白周期,这个空白周期就是由于NiosII内部IOWR函数的写时序造成的。假如在传输的时候使用DMA的话,则数据将会连续不断的传到端口,消除空白周期。
一个基于DMA传输的方式的 C测试程序如下
#include &stdio.h&
#include &system.h&
#include &sys/alt_dma.h&
#include &VGA.h&
#include &alt_types.h&
#include &altera_avalon_pio_regs.h&
volatile int dma_tx_done = 0;//发送完成标志,1为完成,0为未完成
void dma_done(void*& handle)
& dma_tx_done = 1;
//回调函数,不用调用,DMA传输完毕一次后自动启动
int main(void)
& alt_u8 buffer[200];
& alt_dma_//定义一个DMA发送控制通道变量
& tx = alt_dma_txchan_open(&/dev/dma_0&); /* 打开一个DMA发送通道 */
& if(tx != NULL)
&&& alt_dma_txchan_ioctl(tx,ALT_DMA_SET_MODE_8,NULL);
&&& alt_dma_txchan_ioctl(tx,ALT_DMA_TX_ONLY_ON,(void*)(VGA_IP_BASE+1));
&&& while(1)
&&&&& for(number=0;number&200;number++)
&&&&&&& buffer[number]=IORD_ALTERA_***ALON_PIO_DATA(PIO_IN_BASE);
&&&& &rc = alt_dma_txchan_send(tx,buffer,200,dma_done,NULL);
&&&&& while(!dma_tx_done);
& return 0 ;
程序说明:NiosII支持三种DMA传输模式输入到存储器,存储器到存储器,存储器到输出,此为存储器到输出。
遗憾的是此程序的运行效果比之原来只能改善局部,而更多的是牺牲了原本平均分配的空白区域由于DMA的传输的关系只有在个别显示区域受到了改良,而剩余的部分则比原本模糊。
(2)采用中断的方式进行改良,这种改良的方式是让原本的在while(1)内无限循环的程序WriteRgb()函数在中断的时候只执行一次,这样试图让数据定在端口上,返回中断后不段的执行读数据,在下次进入到中断从新更新写数据前,试图让端口的数据保持不变,这样就能够得到稳定的译码表示符。
按此思路,可以有两种方式供选择,外部PIO中断和定时器中断,由于外部PIO中断涉及到NiosII如何采集外部中断信号的因素,故采用定时器中断的1秒进入中断一次来更新一次数据。
要使用定时器中断,要在SOPC_Builder中加入定时器HAL外设驱动,并且从新生成新的硬件系统。其测试程序如下。
#include &stdio.h&
#include &system.h&
#include &VGA.h&
#include &alt_types.h&
#include &altera_avalon_pio_regs.h&
#include &altera_avalon_timer_regs.h&
#include &sys/alt_irq.h&
static volatile alt_u8
static void timer_isr(void* base , alt_u32 id)
& IOWR_ALTERA_***ALON_TIMER_STATUS((alt_u32*) base , 0);
& WriteRgb(VGA_IP_BASE,value);
//中断服务子程序,把value写到VGA_IP上
void init_timer(void* base)
& IOWR_ALTERA_***ALON_TIMER_CO***OL((alt_u32*) base,
&&&&&& ALTERA_***ALON_TIMER_CO***OL_ITO_MSK |&
&&&&&& ALTERA_***ALON_TIMER_CO***OL_CONT_MSK |
&&&&&& ALTERA_***ALON_TIMER_CO***OL_START_MSK );
int main(void)
& static alt_u32
& init_timer((alt_u32*)TIMER_BASE);
& alt_irq_register(TIMER_IRQ , (alt_u32*)TIMER_BASE , timer_isr);//中断注册
& while(1)
&&& value=IORD_ALTERA_***ALON_PIO_DATA(PIO_IN_BASE);
& return 0;
运行之后无显示,进入中断调试,发现程序进入中断之后无法跳出,查阅英文原版资料后得知自定义的HAL外设若要在中断服务自程序中运行,必须要涉及到irq输入口的HDL设计。故采用软件模拟定时器的方法。
将while(1)内部程序修改为如下程序
& alt_u32 count=0;
& if(count&50000)
&&&& count++;
&&&& value=IORD_ALTERA_***ALON_PIO_DATA(PIO_IN_BASE);
& }//大约1秒左右,由于是软件定时,不精确。
&&& count=0;
WriteRgb(VGA_IP_BASE,value);
遗憾的是运行后,显示器上仍然没有画面,推测原因在于IOWR函数真正的执行方式是在每次执行完一次后数据不会像 51单片机那样在下次改写前数据会一直保留在端口上而是马上又恢复为默认值0,所以在进行写函数的时候,数据保留只有一瞬间。而人眼捕捉不到每隔1秒才一瞬间的变化效果,因此没有看见图象。
&&& 由于时间的关系,不能对NiosII更深入的研究,基于改良后效果和原本一样,因此采用最初的演示测试程序
经过两个多月的努力,终于基本完成了自己的毕业设计,虽然并非十分完美,但是经过这次毕业设计,我从中学习到了很多NiosII的应用知识与应用细节。
在刚拿到课题时对于NiosII处理器并不是十分的了解。为了能完成课题,我花费了大量的时间查找资料,但是由于NiosII并非像ARM那样很早就进入了中国市场,在这方面的资料极度缺乏让我遇到许多的困难,从最初的开发环境的熟悉,到其内部的软件架构了解,以及和逻辑设计的协同工作。还有那许多的API函数的应用。这些几乎都是直接阅读英文资料后在经过不断的实践而得来的。回响当初为了解决软件无法下到SDRAM里面的小错误就花费了大量时间的我,颇有感慨。对于这次的工程技术研究,我
也深刻体会到要实现一个达到指标的工程是非常不容易的。理论和显示的差距总是琢磨不定,就以我这次改良的经过为例,最后为了改良设计,前后总共花费了一个月左又的时间。虽然个人能力有限,改良未能成功,但在改良的过程中,我又学到了很多东西,像是DMA编程,定时器后台中断操作方式的编程,甚至由此扩展出的其他中断后台操作方式的编程,以及NiosII PIO口驱动运行的细节问题,可以说在改良中学到的东西甚至比设计时候的更多。
大学生活即将结束,在毕业设计完成的同时,我要特别感谢我的导师韦雪明。在课题的设计方案上韦老师都给了我耐心的指导和许多宝贵的意见,这让我在课题设计中少走了很多弯路。在改良的时候也一起想了很多方案改进,体会到了工程研究的喜悦。此外我也要感谢EDACN论坛上帮助我NiosII入门的一些网友,没有他们的回帖,可能仅仅入门就要花掉我更长的时间。
学院里也为我们提供了相当好的实验环境,这里也要感谢实验室教师们的细心指导,在设计中他们也提供了相当多的帮助。
参考文献:
[1] Samir Palnitkar 著.夏宇闻 胡燕祥等译. VerilogHDL数字设计与综合[M]. 北
京:电子工业出版社,2004。
[2] John Widrow 著.刁岚松译.数字设计原理与实践(第三版)[M]. 北京:人民邮电出版社2003。
[3] 谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,1999。
[4] Andrew Koenlg 著.高巍译.C陷阱与缺陷[M].北京:人民邮电出版社,2002。
[5] 蔡伟纲.NiosII软件架构解析[M].西安:西安电子科技大学出版社,2007。
[6] 彭澄廉.挑战SOC-基于NIOS的SOPC设计与实践[M] .北京:清华大学出版社,2004
[7] EDA先锋工作室.Altera FPGA/CPLD设计(基础篇)[M].北京:人民邮电出版社,2005。
[8] EDA先锋工作室.Altera FPGA/CPLD设计(高级篇)[M].北京:人民邮电出版社,2005。
[9] 范江,吴军辉,徐立鸿.基于Altera NiosII的信号高速采集系统[J] .计算机测量与控制,) :489 - 491。
[10] 李维言是 ,郭强. 液晶显示应用技术[M].北京:电子工业出版社,2000。
[11] Altera,Corp.NiosII Development Kit Getting Started User Guide.
[12] Altera, Corp.NiosII Processor Reference Handbook.
[13] Altera, Corp.NiosII Software Development Handbook.
[14] Altera, Corp.NiosII Avalon Interface Specification.
[15] Nios32-Bit Programmer&s Reference Manual[Z].Altera Corpora2tion. 2003
module vga_timing (hsync,vsync,data_out,clk,
&&&&&&&&&&&&&&&&&& data_temp,hcnt,vcnt);
output hsync,//行场同步信号
output [2:0] data_//输出到下一个处理模块的图象信号
output [9:0]hcnt,
//系统输入时钟50MHZ
input [2:0]data_//处理的数据缓存
wire dat_//图象输出控制有效信号
wire vcount_ov,hcount_
reg [9:0]hcount,//行,场记数器
parameter hsync_end& =10'd95,
&&&&&&&&& hdat_begin =10'd143,
&&&&&&&&& hdat_end&& =10'd783,
&&&&&&&&& hpixel_end =10'd799,
&&&&&&&&& vsync_end& =10'd1,
&&&&&&&&& vdat_begin =10'd34,
&&&&&&&&& vdat_end&& =10'd514,
&&&&&&&&& vline_end& =10'd524;
always @(posedge clk)
& if(hcount_ov)
&&& hcount&=10'd0;
&&& hcount&=hcount+10'd1;
always @(posedge clk)
& if(hcount_ov)
&&& if(vcount_ov)
&&&&& vcount&=10'd0;
&&&&& vcount&=vcount+10'd1;
&&& vcount&=
assign hcount_ov=(hcount==hpixel_end)?1'b1:1'b0;
assign vcount_ov=(vcount==vline_end) ?1'b1:1'b0;
assign dat_act =((hcount&=hdat_begin)&&(hcount&hdat_end))
&&&&&&&&&&&&& &&((vcount&=vdat_begin)&&(vcount&vdat_end));
assign hsync = (hcount& hsync_end)?1'b1:1'b0;
assign vsync = (vcount& vsync_end)?1'b1:1'b0;
assign data_out = (dat_act)? data_temp :3'b000;
assign hcnt=
assign vcnt=
module niosinterface(hcnt,vcnt,pixel_out,clk,
&&&&&&&&&&&&&&&&&&&& write,chipselect,address,writedata);
output [2:0]pixel_
input [9:0]hcnt,
input chipselect,write,
input [7:0]
reg [7:0]asic_command_
reg [2:0]pixel_temp,pixel_
wire [7:0]asic_
assign asic_command =(chipselect && write && address)
&&&&&&&&&&&&&&&&&&&& ? writedata : 8'b;
always @(posedge clk)
& asic_command_temp &= asic_
end&&&&&&&& //消除毛刺
always @(asic_command_temp or hcnt or vcnt)
& case(asic_command_temp)
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&
(hcnt&10'd550)&&(vcnt==10'd150)||
&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&(hcnt&10'd350)&&(hcnt&10'd550)
&&(vcnt==10'd500)||
&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&(hcnt==10'd350)&&(vcnt&10'd150)&&
(vcnt&10'd500)||(hcnt==10'd550)&&
(vcnt&10'd150)&&(vcnt&10'd500))
? 3'b101 : 3'b000;
&&&& &&&&&&&&&&&end &&//显示0
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp =((hcnt==10'd500)&&(vcnt&10'd150)
&&(vcnt&10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&& //显示1
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp= ((hcnt&10'd350)&& (hcnt&10'd550) &&
(vcnt==10'd150)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt&10'd150)&&(vcnt&10'd300)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt==10'd300)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&(vcnt&10'd300)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt==10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&& //显示2
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp =((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd325)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt==10'd325)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt==10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&& //显示3
& 8'b : begin
&&&&&& &&&&&&&&&&&pixel_temp =((hcnt==10'd350)&&(vcnt&10'd150) &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (vcnt&10'd325)||(hcnt&10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(hcnt&10'd550)&&(vcnt==10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd450)&&(vcnt&10'd150)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end& //显示4
&&8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd325)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&& //显示5
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd325)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd350)&&(vcnt&10'd325)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd500)||(hcnt&10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(hcnt&10'd550)&&(vcnt==10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&& //显示6
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&& //显示7
& 8'b : begin
&&&&&&&&&& &&&&&&&pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550) &&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd325)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd350)&&(vcnt&10'd325)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd500)||(hcnt&10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&(hcnt&10'd550)&&(vcnt==10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd550)&&(vcnt&10'd150)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&&&& //显示8
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd325)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&, ,&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd500)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&&& //显示9
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&(hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd325)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd350)&&(vcnt&10'd325)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd500)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&&&&& //显示 a
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt==10'd350)&&(vcnt&10'd150)&&
(vcnt&10'd325)||(hcnt&10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(hcnt&10'd550)&&(vcnt==10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd550)&&(vcnt&10'd325)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd500)||(hcnt==10'd350)&&
&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&&&&& //显示 b
& 8'b : begin
&&&&&&&&&&&&& &&&&pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd350)&&(vcnt&10'd325)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd500)||(hcnt&10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(hcnt&10'd550)&&(vcnt==10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&&&&& //显示c
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd325)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd350)&&(vcnt&10'd325)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd500)||(hcnt&10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(hcnt&10'd550)&&(vcnt==10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd550)&&(vcnt&10'd150)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&&&& //显示d
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd325)||(hcnt==10'd350)&&
&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&& //显示e
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd350)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd325)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325)&&(vcnt&10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&& //显示f
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd350)&&
&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&(vcnt&10'd150)&&(vcnt&10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt&10'd450)&&(hcnt&10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt==10'd325)||(hcnt==10'd550)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd350)&&(vcnt&10'd325)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd500)||(hcnt&10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(hcnt&10'd550)&&(vcnt==10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&&&&&&& //显示g
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp =((hcnt==10'd350)&&(vcnt&10'd150)&&
(vcnt&10'd325)||(hcnt&10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(hcnt&10'd550)&&(vcnt==10'd325)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(hcnt==10'd550)&&(vcnt&10'd325)&&
&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&(vcnt&10'd500)||(hcnt==10'd350)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt&10'd325)&&(vcnt&10'd500)||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hcnt==10'd550)&&(vcnt&10'd150)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(vcnt&10'd325))
? 3'b101 : 3'b000;
&&&&&&& &&&&&&&&end&& //显示h
& 8'b : begin
&&&&&&&&&&&&&&&&& pixel_temp = ((hcnt&10'd350)&&(hcnt&10'd550)&&
(vcnt==10'd150)||(hcnt==10'd450)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&(vcnt&10'd150)&&(vcnt&10'd500))
? 3'b101 : 3'b000;
&&&&&&&&&&&&&&& end&& //显示i
& default :& pixel_temp =& 3'b000; //无
always @(posedge clk)
& pixel_out &= pixel_ //触发器输出,消除毛刺和亚稳态
module VGA_IP( clk,write,chipselect,address,
&&& &&&&&&&&&&& writedata,hs,vs,rgb);
input& [7:0]
output [2:0]
wire&& [9:0]
wire&& [9:0]
wire&& [2:0] SYNTHESIZED_WIRE_0;
vga_timing b2v_inst(.clk(clk),
.data_temp(SYNTHESIZED_WIRE_0),.hsync(hs),.vsync(vs),.data_out(rgb),.hcnt(hcnt),.vcnt(vcnt));
defparam&& b2v_inst.hdat_begin = 'b;
defparam&& b2v_inst.hdat_end = 'b;
defparam&& b2v_inst.hpixel_end = 'b;
defparam&& b2v_inst.hsync_end = 'b;
defparam&& b2v_inst.vdat_begin = 'b;
defparam&& b2v_inst.vdat_end = 'b;
defparam&& b2v_inst.vline_end = 'b;
defparam&& b2v_inst.vsync_end = 'b;
niosinterface b2v_inst1(.clk(clk),
.write(write),.chipselect(chipselect),.address(address),.hcnt(hcnt),.vcnt(vcnt),.writedata(writedata),.pixel_out(SYNTHESIZED_WIRE_0));
library IEEE;
use IEEE.STD_LOGIC_1164.
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity key_interface is
&&&&&& sys_clk : in STD_LOGIC; --系统同步时钟
&&&&&& k_data : in STD_LOGIC; --键盘数据
&&&&&& k_clock : in STD_LOGIC; --键盘时钟
&&&&&& reset&&&& : in STD_LOGIC;
&&&&&& enable : buffer std_
&&&&&& ZHJS&&& : buffer STD_LOGIC& ; --扫描码转换结束信号
&&&&&& ascii&& : out STD_LOGIC_VECTOR(7 DOWNTO 0)
&architecture behav of key_interface is
&signal tmp : STD_LOGIC_VECTOR(11 downto 0) :=&&;--用来记录一帧
&--signal enable : std_logic :='0'; --输出使能
&signal now_kbclk,pre_kbclk : std_
&--signal data&&& : STD_LOGIC_VECTOR(7 DOWNTO 0); --扫描码输出
&signal&&&&& PA& :& STD_LOGIC_VECTOR(7 DOWNTO 0);
&signal started:STD_LOGIC ;
&process(reset,k_clock,sys_clk) --系统时钟(sys_clk)比键盘时钟(k_clock)快很多
variable counter :integer range 0 to 11 :=0;
&& if reset='0'
then ZHJS&='1';
counter:=0;
started&='1';
&& elsif rising_edge(sys_clk)
then pre_kbclk &= now_&
now_kbclk &= k_
if(pre_kbclk & now_kbclk)
then &tmp(counter)&=k_&&& &&&&&&&&&
if counter=11
then &counter:=1;
&&& &&&&&& else &counter:=counter+1;&&&&&&&&&&&
if(counter&10) then
&&& started&='0';
&&& started&='1';
if counter=10
&&& then ZHJS&='0'; --ZHJS=&0&表示接收结束
&else ZHJS&='1';
&PA&=&& when enable='1' else tmp(8 downto 1);
&process(PA)
&&& case PA is
&&& &&&when&&=& ascii&=&&;&&&&&&&&& --'0'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'1'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'2'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'3'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'4'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'5'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'6'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'7'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'8'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'9'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'a'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'b'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'c'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'d'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'e'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'f'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'g'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'h'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'i'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'j'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'k'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'l'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'m'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'n'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'o'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'p'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'q'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'r'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'s'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'t'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'u'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'v'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'w'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'x'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'y'
&&&&&& when&&=& ascii&=&&;&&&&&&&&& --'z'&&
&&&&&& when others=&&&& ascii&=&&;&&&&&&&&
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号

参考资料

 

随机推荐