基于FPGA的PS2键盘鼠标控制电子琴Word格式文档下载.docx
《基于FPGA的PS2键盘鼠标控制电子琴Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的PS2键盘鼠标控制电子琴Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
2、Xilinx
3、Actel
4、Lattice
其中Altera作为世界老牌可编程逻辑器件的厂家,是当前世界范围内市场占有率最大的厂家,它和Xilinx主要生产一般用途FPGA,其主要产品采用RAM工艺。
Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺。
目前以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。
这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。
在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。
系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。
一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。
FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。
但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。
厂商也可能会提供便宜的但是编辑能力差的FPGA。
因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。
另外一种方法是用CPLD(复杂可编程逻辑器件备)。
FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输出输入模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。
1.2 FPGA芯片结构
目前主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM、时钟管理和DSP)的硬核(ASIC型)模块。
如图1-1所示(注:
图1-1只是一个示意图,实际上每一个系列的FPGA都有其相应的内部结构),FPGA芯片主要由6部分完成,分别为:
可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件模块。
图1-1FPGA芯片的内部结构
FPGA芯片的内部结构
每个模块的功能如下:
1.可编程输入输出单元(IOB)
可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求,其示意结构如图1-2所示。
FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。
通过软件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大小,可以改变上、下拉电阻。
目前,I/O口的频率也越来越高,一些高端的FPGA通过DDR寄存器技术可以支持高达2Gbps的数据速率。
图1-2典型的IOB内部结构示意图
典型的IOB内部结构示意图
外部输入信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入FPGA内部。
当外部输入信号经过IOB模块的存储单元输入到FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为0。
为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank的接口标准由其接口电压VCCO决定,一个bank只能有一种VCCO,但不同bank的VCCO可以不同。
只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。
2. 可配置逻辑块(CLB)
CLB是FPGA内的基本逻辑单元。
CLB的实际数量和特性会依器件的不同而不同,但是每个CLB都包含一个可配置开关矩阵,此矩阵由4或6个输入、一些选型电路(多路复用器等)和触发器组成。
开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或RAM。
在Xilinx公司的FPGA器件中,CLB由多个(一般为4个或2个)相同的Slice和附加逻辑构成,如图1-3所示。
每个CLB模块不仅可以用于实现组合逻辑、时序逻辑,还可以配置为分布式RAM和分布式ROM。
图1-3典型的CLB结构示意图
典型的CLB结构示意图
Slice是Xilinx公司定义的基本逻辑单位,其内部结构如图1-4所示,一个Slice由两个4输入的函数、进位逻辑、算术逻辑、存储逻辑和函数复用器组成。
算术逻辑包括一个异或门(XORG)和一个专用与门(MULTAND),一个异或门可以使一个Slice实现 2bit全加操作,专用与门用于提高乘法器的效率;
进位逻辑由专用进位信号和函数复用器(MUXC)组成,用于实现快速的算术加减法操作;
4输入函数发生器用于实现4输入LUT、分布式RAM或16比特移位寄存器(Virtex-5系列芯片的Slice中的两个输入函数为6输入,可以实现6输入LUT或64比特移位寄存器);
进位逻辑包括两条快速进位链,用于提高CLB模块的处理速度。
图1-4典型的4输入Slice结构示意图
典型的4输入Slice结构示意图
3.数字时钟管理模块(DCM)
业内大多数FPGA均提供数字时钟管理(Xilinx的全部FPGA均具有这种特性)。
Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。
相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。
4. 嵌入式块RAM(BRAM)
大多数FPGA都具有内嵌的块RAM,这大大拓展了FPGA的应用范围和灵活性。
块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器(CAM)以及FIFO等常用存储结构。
RAM、FIFO是比较普及的概念,在此就不冗述。
CAM存储器在其内部的每个存储单元中都有一个比较逻辑,写入CAM中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。
除了块RAM,还可以将FPGA中的LUT灵活地配置成RAM、ROM和FIFO等结构。
在实际应用中,芯片内部块RAM的数量也是选择芯片的一个重要因素。
单片块RAM的容量为18k比特,即位宽为18比特、深度为1024,可以根据需要改变其位宽和深度,但要满足两个原则:
首先,修改后的容量(位宽 深度)不能大于18k比特;
其次,位宽最大不能超过36比特。
当然,可以将多片块RAM级联起来形成更大的RAM,此时只受限于芯片内块RAM的数量,而 不再受上面两条原则约束。
5.丰富的布线资源
布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。
FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别。
第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;
第二类是长线资源,用以完成芯片 Bank间的高速信号和第二全局时钟信号的布线;
第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;
第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。
在实际中设计者不需要直接选择布线资源,布局布线器可自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。
从本质上讲,布线资源的使用方法和设计的结果有密切、直接的关系。
6.底层内嵌功能单元
内嵌功能模块主要指DLL(DelayLocked Loop)、PLL(Phase LockedLoop)、DSP和CPU等软处理核(SoftCore)。
现在越来越丰富的内嵌功能单元,使得单片FPGA成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC平台过渡。
DLL和PLL具有类似的功能,可以完成时钟高精度、低抖动的倍频和分频,以及占空比调整和移相等功能。
Xilinx公司生产的芯片上集成了 DLL,Altera公司的芯片集成了PLL,Lattice公司的新型芯片上同时集成了PLL和DLL。
PLL和DLL可以通过IP核生成的工具方便地进行管理和配置。
DLL的结构如图1-5所示。
图1-5 典型的DLL模块示意图
典型的DLL模块示意图
7.内嵌专用硬核
内嵌专用硬核是相对底层嵌入的软核而言的,指FPGA处理能力强大的硬核(HardCore),等效于ASIC电路。
为了提高FPGA性能,芯片生产商在芯片内部集成了一些专用的硬核。
例如:
为了提高FPGA的乘法速度,主流的FPGA中都集成了专用乘法器;
为了适用通信总线与接口标准,很多高端的FPGA内部都集成了串并收发器(SERDES),可以达到数十Gbps的收发速度。
Xilinx公司的高端产品不仅集成了Power PC系列CPU,还内嵌了DSP Core模块,其相应的系统级设计工具是EDK和PlatformStudio,并依此提出了片上系统(System onChip)的概念。
通过PowerPC、Miroblaze、Picoblaze等平台,能够开发标准的DSP处理器及其相关应用,达到SOC的开发目 的。
1.3 FPGA的基本特点
FPGA的基本特点:
1)采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC电路的中试样片。
3)FPGA内部有丰富的触发器和I/O引脚。
4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。
用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。
掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。
FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。
当需要修改FPGA功能时,只需换一片EPROM即可。
这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。
因此,FPGA的使用非常灵活。
FPGA配置模式
FPGA有多种配置模式:
并行主模式为一片FPGA加一片EPROM的方式;
主从模式可以支持一片PROM编程多片FPGA;
串行模式可以采用串行PROM编程FPGA;
外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。
如何实现快速的时序收敛、降低功耗和成本、优化时钟管理并降低FPGA与PCB并行设计的复杂性等问题,一直是采用FPGA的系统设计工程师需要考虑的关键问题。
如今,随着FPGA向更高密度、更大容量、更低功耗和集成更多IP的方向发展,系统设计工程师在从这些优异性能获益的同时,不得不面对由于FPGA前所未有的性能和能力水平而带来的新的设计挑战。
例如,领先FPGA厂商Xilinx最近推出的Virtex-5系列采用65nm工艺,可提供高达33万个逻辑单元、1,200个I/O和大量硬IP块。
超大容量和密度使复杂的布线变得更加不可预测,由此带来更严重的时序收敛问题。
此外,针对不同应用而集成的更多数量的逻辑功能、DSP、嵌入式处理和接口模块,也让时钟管理和电压分配问题变得更加困难。
幸运地是,FPGA厂商、EDA工具供应商正在通力合作解决65nmFPGA独特的设计挑战。
不久以前,Synplicity与Xilinx宣布成立超大容量时序收敛联合工作小组,旨在最大程度地帮助系统设计工程师以更快、更高效的方式应用65nmFPGA器件。
设计软件供应商Magma推出的综合工具BlastFPGA能帮助建立优化的布局,加快时序的收敛。
最近FPGA的配置方式已经多元化!
第二章 FPGA工作原理
FPGA工作原理
FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个概念,内部包括可配置逻辑模块CLB(ConfigurableLogic Block)、输出输入模块IOB(Input OutputBlock)和内部连线(Interconnect)三个部分。
2.1查找表(Look-Up-Table)的原理与结构
采用这种结构的PLD芯片我们也可以称之为FPGA:
如altera的ACEX,APEX系列,xilinx的Spartan,Virtex系列等。
查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。
目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的16x1的RAM。
当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
下面是一个4输入与门的例子,
实际逻辑电路
LUT的实现方式
a,b,c,d 输入
逻辑输出
地址
RAM中存储的内容
0000
0
0000
0001
0001
....
...
1111
1
1111
1
一.基于查找表(LUT)的FPGA的结构
我们看一看xilinxSpartan-II的内部结构,如下图:
xilinxSpartan-II芯片内部结构
Slices结构
Spartan-II主要包括CLBs,I/O块,RAM块和可编程连线(未表示出)。
在spartan-II中,一个CLB包括2个Slices,每个slices包括两个LUT,两个触发器和相关逻辑。
Slices可以看成是SpartanII实现逻辑的最基本结构(xilinx其他系列,如SpartanXL,Virtex的结构与此稍有不同,具体请参阅数据手册)altera的FLEX/ACEX等芯片的结构如下图:
altera FLEX/ACEX芯片的内部结构
逻辑单元(LE)内部结构
FLEX/ACEX的结构主要包括LAB,I/O块,RAM块(未表示出)和可编程行/列连线。
在FLEX/ACEX中,一个LAB包括8个逻辑单元(LE),每个LE包括一个LUT,一个触发器和相关的相关逻辑。
LE是FLEX/ACEX芯片实现逻辑的最基本结构(altera其他系列,如APEX的结构与此基本相同,具体请参阅数据手册)
二.查找表结构的FPGA逻辑实现原理
我们还是以这个电路的为例:
A,B,C,D由FPGA芯片的管脚输入后进入可编程连线,然后作为地址线连到到LUT,LUT中已经事先写入了所有可能的逻辑结果,通过地址查找到相应的数据然后输出,这样组合逻辑就实现了。
该电路中D触发器是直接利用LUT后面D触发器来实现。
时钟信号CLK由I/O脚输入后进入芯片内部的时钟专用通道,直接连接到触发器的时钟端。
触发器的输出与I/O脚相连,把结果输出到芯片管脚。
这样PLD就完成了图3所示电路的功能。
(以上这些步骤都是由软件自动完成的,不需要人为干预)
这个电路是一个很简单的例子,只需要一个LUT加上一个触发器就可以完成。
对于一个LUT无法完成的的电路,就需要通过进位逻辑将多个单元相连,这样FPGA就可以实现复杂的逻辑。
由于LUT主要适合SRAM工艺生产,所以目前大部分FPGA都是基于SRAM工艺的,而SRAM工艺的芯片在掉电后信息就会丢失,一定需要外加一片专用配置芯片,在上电的时候,由这个专用配置芯片把数据加载到FPGA中,然后FPGA就可以正常工作,由于配置时间很短,不会影响系统正常工作。
也有少数FPGA采用反熔丝或Flash工艺,对这种FPGA,就不需要外加专用的配置芯片。
第三章 PS2键盘通信
3.1 PS2背景
PS2背景
PS/2接口是目前最常见的鼠标接口,最初是IBM公司的专利,俗称“小口”。
这是一种鼠标和键盘的专用接口,是一种6针的圆型接口。
但鼠标只使用其中的4针传输数据和供电,其余2个为空脚。
PS/2接口的传输速率比COM接口稍快一些,而且是ATX主板的标准接口,是目前应用最为广泛的鼠标接口之一,但仍然不能使高档鼠标完全发挥其性能,而且不支持热插拔。
在BTX主板规范中,这也是即将被淘汰掉的接口。
需要注意的是,在连接PS/2接口鼠标时不能错误地插入键盘PS/2接口(当然,也不能把PS/2键盘插入鼠标PS/2接口)。
一般情况下,符合PC99规范的主板,其鼠标的接口为绿色、键盘的接口为紫色,另外也可以从PS/2接口的相对位置来判断:
靠近主板PCB的是键盘接口,其上方的是鼠标接口。
PS2设备有主从之分,主设备采用Female插座,从设备采用Male插头,现在广泛实用的PS2键盘鼠标均在从设备方式下工作。
PS2接口的时钟与数据线都是集电极开路结构。
主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生。
a.从设备到主设备的通信
当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平。
如果是高电平,从设备就可以开始传输数据;
反之,从设备要等待获得总线的控制权,才能开始传输数据。
传输的每一帧由11位组成,发送时序及每一位的含义如图2所示。
每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1。
从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读入数据线状态。
如表1所示:
3.2PS2键盘通信
目前,键盘有许多种,PS2键盘是当今PC机最常用的种类,这里仅涉及最常用的键盘,也就是6引脚发送数据的键盘。
键盘通信时需要四根连接线:
电源线、地线、时钟线CLK、数据线DATA。
DATA和CLK是可双向通信的I/O线,也就是说,通过这两根线,即可以把主机的数据发送到PS2设备,又可以把设备的数据发向主机。
在无键按下时,DATA和CLK一直处于高电平状态。
但有键按下时,键盘先检查CLK,看它是否处于处于高电平,如果是处在低电平,说明主机无空闲接受数据,这时键盘将会把数据放在自己的缓冲区,直到CLK重新被拉高。
键盘CLK首先产生下降沿,这时已在数据线上产生信号,如:
起始位总是为0,之后每一个时钟周期时钟电平为高时数据线上加将要输出的电平,在时钟的下降沿它将被主机读取。
3.3 VGA原理
扫描是从屏幕的左上方开始的,从左到右、从上到下地进行扫描。
每扫描完一行,电子束就会回到屏幕左边下一行的起始位置。
在这期间,CRT对电子束进行消隐。
每行结束时,用行同步信号进行行同步。
扫描完所有行后,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一次的扫描。
PS2键盘控制模型电子琴顶层电路的设计
如图所示,该图是电子琴顶层设计电路。
按实现功能电路主要分成这几个模块:
1)锁相环、用宏模块搭建的22位.23位.24位计数器、用Verilog写的时钟分频模块fdiv:
1 提供25MHz的时钟信号驱动VGA显示
2 与24位计数器结合提供1Hz给数字时钟用以计时
3 与23位计数器结合提供2MHz给CNT138T与rom_qupu以控制节奏
4 与22位计数器结合提供4MHz给cnt10b以控制RAM的地址
5 与fdiv结合提供1MHz给SPEAK
2)模块PS2_2:
PS2通信模块,将键盘输出码转换为ASCII码,只处理字母
3)二进制编码器CODE3:
根据键盘码的ASCII码,用verilog写高、中、低三个音阶的分别对应的键盘字母代码,与F_CODE模块相对应,以此来扩大音域
4)模块F_CODE:
1 模块F_CODE的功能首先是为模块SPKER提供决定所发音符的分频预置数,而此数在SPKER输入口停留的时间即为此音符的节拍长度。
2 同时,F_CODE把CODE3中音符的代码转化为音符频率所对应的数值
3 与模块DECL7S结合显示音符
4 H[3..0]显示0,1,2表示高、中、低三个音阶
5)模块DECL7S:
7段译码显示模块,在数码管上显示1,2,3,4,5,6,7音符
6)模块RAM:
与模块cnt10b结合记录弹奏的乐曲
7)模块ROM:
与模块cnt138b结合可自动播放储存的音乐
8)模块shizhong:
可记录弹奏时间
9)模块VGA:
显示按键的位置,当音乐响时同步显示对应的音的键盘位置
10)模块SPEAK
输出每一个音符的音调
11)模块MUX21
选择播放RAM中的音乐或ROM中的储存音乐
第四章PS2键盘控制电子琴(VHDL)
4.1 PS2键盘控制电子琴程序
ﻫ共分为DIV1、DIV2分频模块,PS2键盘控制模块,music发音模块,tone音符分频模块,spk发声模块。
libraryIEEE;
ﻫuseIEEE.STD_LOGIC_1164.ALL;
ﻫuseIEEE.STD_LOGIC_ARITH.ALL;
ﻫuse IEEE.STD_LOGIC_UNSIGNED.ALL;
ﻫﻫ----Uncommentthefollowinglibrarydeclarationif instantiating
----anyXilinxprimitivesinthis code.
--library UNISIM;
ﻫ--use UNISIM.VComponents.all;
ﻫ
entity Div1isﻫ
PORT(clk_50mhz:
IN STD_LOGIC;
--输入时钟为50MHZ;
c0:
OUTSTD_LOGIC;
c1:
OUTSTD_LOGIC);
ENDDiv1;
ﻫﻫarchitectureartofDiv1is
beginﻫD1:
PROCESS(clk_50mhz)
--工作进程开始,将50MHZ时钟50分频,=1MHZ;
ﻫ
VARIABLEcount6:
INTEGERRANGE0TO50;
BEGINﻫ
IF(clk_50mhz'
EVEN