实验三常用模块电路的设计一、实验目的:1、掌握QuartusII宏功能模块的设计方法。2、掌握VHDL设计ROM和RAM的方法。3、掌握三态总线的设计与使用方法。4、掌握4×4键盘扫描模块设计方法。5、掌握PS2接口电路设计方法。6、了解640×480VGA显示控制电路的原理和设计方法。二、实验的硬件要求:1、EDA/SOPC实验箱。2、计算机。三、实验原理1、QuartusII宏功能模块应用Altera提供多种方法来获取AlteraMegafunctionPartnersProgram(AMPP™)和MegaCore®宏功能模块,这些函数经严格的测试和优化,可以在Altera特定器件结构中发挥出最佳性能。可以使用这些知识产权的参数化模块减少设计和测试的时间。MegaCore和AMPP宏功能模块包括应用于通信、数字信号处理(DSP)、PCI和其它总线界面,以及存储器控制器中的宏功能模块。Altera提供的宏功能模块与LPM函数有:①算术组件:包括累加器、加法器、乘法器和LPM算术函数;②门电路:包括多路复用器和LPM门函数。③I/O组件:包括时钟数据恢复(CDR)、锁相环(PLL)、双数据速率(DDR)、千兆位收发器块(GXB)、LVDS接收器和发送器、PLL重新配置和远程更新宏功能模块。④存储器编译器:包括FIFOPartitioner、RAM和ROM宏功能模块。⑤存储组件:包括存储器、移位寄存器宏模块和LPM存储器函数。宏功能模块应用可以通过元件库中的“Megafunctions/LPM”或“MegaWizardPlug-InManager”进行参数化设置并使用。其操作方法请参考“QuartusII基于宏功能模块的设计”。2、ROM和RAM存储器设计用FPGA实现ROM和RAM存储器可以用逻辑单元,也可以用内含的EAB/ESB,一般用VHDL直接构造存储器时用的是逻辑单元,对于内含EAB/ESB的FPGA芯片,使用“MegaWizardPlug-InManager”定制存储器,可选择使用EAB/ESB,这样可以节约大量的逻辑单元。一般较大规模的ROM和RAM使用“MegaWizardPlug-InManager”定制,而较小规模,且有特殊特性要求时用VHDL直接构造。3、四、实验内容:1、QuartusII宏功能模块实现ROM存储器模块①新建一个原理图文件。②使用“MegaWizardPlug-InManager”向导,按图3.1的步骤定制一个32×8bit的ROM模块。③建立内存初始化文件QuartusII能接受的LPM_ROM中的初始化数据文件的格式有2种:MemoryInitializationFile(.mif)格式和Hexadecimal(Intel-Format)File(.hex)格式。内存初始化文件可以手工编写,也可以用其它软件生成。本例数据量较小,可以在QuartusII中直接file→new→……MemoryFile→MemoryInitializationFile,然后填写每个存储单元的数据(如:0~31依次递增)即可。图3.1使用“MegaWizardPlug-InManager”定制ROM④生成图3.2所示的ROM模块添加管脚,编译并仿真测试。启动“MegaWizardPlug-InManager”向导选择ROM模块生成的VHDL源文件名选择VHDL语言设计适用的芯片系列数据总线宽度存储器容量内存初始化文件图3.2测试ROM模块2、QuartusII宏功能模块实现RAM存储器模块RAM与ROM定制方法相似,按图3.3定制一个32×8bit一端口RAM,该RAM读写共用一个地址总线,“wren”为写入信号,高电平有效。除了一端口RAM,还有二端口、三端口RAM,也可以采用读写地址总线分开的形式。还有一种形式,读写数据采用同一条总线,应使用三态总线,且读写控制必须分开进行。图3.332×8bit一端口RAM图3.4为仿真波形,注意观察哪些地址位写入了什么数据?图3.4一端口RAM仿真波形3、用VHDL设计ROM和RAM用VHDL可以非常灵活地设计各种特性的存储器。图3.5和图3.6分别是实现ROM和RAM的VHDL代码。图3.5一端口ROM存储器VHDL代码图3.5的ROM存储器采用组合逻辑电路方式设计,从下面的功能仿真波形可以看到,输出“d”与地址“adr”同步变化。请改用时序逻辑电路方式实现,该怎么描述?输出“d”定义存储字子类型和数组类型用于存储数据与地址“adr”的时序关系是怎样的?图3.6的RAM读写数据采用一条总线“d”,“d”应使用“inout”类型端口,注意代码中是如何描述三态总线的?(要点:没有数据输出的时候(只有wr=0并且cs=1时才输出数据),“d”应设置为高阻态,即释放总线,允许总线输入数据。)图3.6一端口RAM存储器VHDL代码在仿真设置时,双向端口“d”设置的值是外部电路输入值,而“d”总线最终的值显示在d[i]~result上。在数据输出的时候(wr=0并且cs=1),“d”应设置为高阻态(即外部电路应释放总线)。图3.7为一端口RAM存储器仿真波形。图中,当cs=1、wr=1时(对应地址04~11)写入数据,此时应设置“d”总线的值(如04~11依次递增),数据被写入相应地址。其余时候“d”设置为高阻(“Z”)。cs=1、wr=0时读出数据,后面一段显示读出的各个地址位的数据(未写入数据的地方保持初始化的“0”),数据输出“d”与地址“adr”是否有延时?为什么?。cs=0(片选无效),无论wr的值是什么,总线都保持高阻态“Z”。图3.7一端口RAM存储器仿真波形4、用ROM作为流水线乘法器数据输入,并测试用VHDL设计ROM和RAM可以非常灵活地设计存储器的功能,以满足不同的应用要求。如图3.5的一端口ROM存储器代码稍加修改为如图3.8,即可实现每个时钟周期地址自动从“00000”增加到“11111”,循环输出各位数据。图3.8地址自动增加,循环输出的ROM将图3.8生成的模块输出“d”替代“实验二”中“流水线乘法器”的输入“A、B”(d为8位,其中高4位作为A,低4位作为B)。按图3.10连接,这样可以在数码管上看到乘数和结果。图3.10ROM作为流水线乘法器的输入测试电路5、4×4键盘扫描模块设计①图3.11是4×4键盘阵列电路原理图。行字符ROW[3..0]表示一行的状态,COL[3..0]表示一列的状态。使用时采用行扫描方式检测按键,即设置COL[3..0]中某一位为“0”,其余为“1”,如COL=“1011”(COL[2]=’0’)表示选择第三行(COL[2]对应一行);然后检测ROW[3..0]的值,全“1”说明没有任何键按下,为“0”一位表示该列有键按下,如ROW=“0101”表示第二和第四列(ROW[2]、ROW[4]对应列)被按下;结合COL和ROW即可确定按键值(如“8”和“C”)。图3.114×4键盘阵列电路原理图②图3.12是键盘扫描模块VHDL源码。注意:是如何判断键盘按下时刻的?图3.12键盘扫描模块VHDL源码图3.13键盘扫描模块仿真波形③图3.13是键盘扫描模块仿真波形,注意:如何设置Kr的值?④在实验箱上测试4×4键盘扫描模块,可按图3.14连接,为便于观察,使用1Hz频率时钟信号,Kr、Kc连接FPGA引出线ROW[3..0]和COL[3..0],同时将其分别输出到4个LED显示,BCD_OUT通过译码器显示在数码管上。图3.144×4键盘扫描模块测试电路6、PS/2接口键盘读取模块设计①PS2通信协议是一种双向同步串行通迅协议。通迅的两端通过CLOCK(时钟信号端)同步,并通过DATA(数据端口)交换数据。任何一方如果想要抑制另外一方的通迅时,只需要把CLOCK拉到低电平。PS2控制接口仅使用到两条传输端口,一为频率端口,另一则为数据端口如图3.15所示,且此传输埠必为三态(Tri-State)并具有双向(bidirectional)特性。PS2传输产品上,常见为鼠标与键盘,两者的驱动原理均相同,仅扫描码(scancode)不同。因此我们以PS2键盘为例进行说明。②PS2标准,规范每笔数据传输包含起始位(startbit)、扫描码(scancode)、奇同位检查(oddparity)、以及终止位(stopbit)共计11位,并以双向串行数据传输的方式,达到通信的目的。且当主机端(host)或从机端(slave)并无传送或接收数据时,数据传输端口及频率均将升为高电位。图3.16所示为每一笔数据传输所包含之内容如下:a.起始位(“0”)b.8位数据宽度的扫描码(scancode)。c.奇同位检查,使扫描码与奇同位加起来1的数字为奇数个。d.终止位(“1”)图3.16PS/2接口时序③键盘其实就是一个大型的按键矩阵,它们由安装在电路板上的处理器(叫做“键盘编码器”)来监视着。虽然不同的键盘可能采用不同的处理器,但是它们完成的任务都是一样的,即监视哪些按键被按下,哪些按键被释放了,并将这些信息传送到主机。每个键盘被分配了唯一的通码(键盘按下时发送的编码)和断码(键盘释放时发送的编码),这样主机通过查找唯一的扫描码就可以确定是哪个按键被按下或释放。PS2键盘扫描码见“键盘扫描码表”④图3.16是PS/2接口键盘接收模块的VHDL源码,在对其进行仿真时,可以将“keyboard_clk_filtered”信号输出查看。图3.16PS/2接口键盘接收模块VHDL源码⑤图3.17是PS/2接口键盘接收模块仿真波形,为便于分析,把“keyboard_clk_filtered”信号和“SHIFTIN”信号连接到端口“filtered_out”和“SHIFTIN_out”输出显示。图3.17PS/2接口键盘接收模块仿真波形⑥按图3.17设计,即可在实验箱的数码管上显示键盘的扫描码。“Sel_time2”模块用实验二中的数码管扫描模块修改一下即可(只是用2个数码管,SEL绑定到SEL[0]管脚),代码如图3.18:图3.17PS/2接口键盘接收模块测试电路开始位01位2位3位4位5位6位7位8位扫描码输出PS/2时钟信号中的干扰信号图3.18修改后的数码管扫描模块7、VGA显示控制VGA显示器在显示过程中主要由五个信号来控制,分别是R、G、B、HS和VS。其中R、G、B分别用来驱动显示器三个基色的显示,即红、绿和蓝,HS是行同步信号,VS是场同步信号。在做本实验时,由于没有任何显示器驱动,所以显示器工作在默认状态,分辨率:640×480,刷新率:60Hz。在此状态下,当VS和HS都为低电平时,VGA显示器显示亮的状态,其正向扫描过程约为26us。当一行扫描结束后,行同步信号HS置高电平,持续约6us后,变成低电平,在HS为高电平期间,显示器产生消隐信号,这就是显示器回扫的过程。当扫描完一场后,也就是扫描完480行以后,场同步信号VS置高电平,产生场同步,此同步信号可以使扫描线回到显示器的第一行第一列位置。显示器显示的时序图如图3.19所示:图3.19VGA时序以640*480@60Hz模式为例,图中Ta为同步头信号(行同步头96像素、场同步头2行),Tb+Tc为同步后信号(行40+8像素、场25+8行),Td为图像显示时间(行640像素、场480行),Te+Tf为同步前信号(行8+8像素、场8+2行)。总共一行800像素(约32us,其中行显示过程约为26us,行同步脉冲加上同步前后约6us);一帧图像525行(其中显示过程约为480行,场同步脉冲加上同步前后45行)。图3.20为VGA显示控制模块VHDL代码,通过FPGA在显示器上显示一些条纹或图案,由key[1..0]两个开关的组合控制CRT显示器上能够显示横条纹、竖条纹以及棋盘格子图案。稍微修改代码即可由本模块实现VGA扫描控制,将屏幕行列位置hcnt,vcnt输出,由外部电路计算当前颜色值,通过imag_GRB端口返回,即可显示由ROM提供或外部模块设置的图像。图3.2