1. 做实验前,先连接好下载线,然后才能接上电源。
2. 做完实验后,先拨掉实验箱上的电源,然后才能拨下载线。
实验一:简单逻辑门
实验目的:掌握Quartus使用及基于Verilog的FPGA开发的基本流程
实验要求:掌握Quartus使用及基于Verilog的FPGA开发的基本流程,注意设
备及人身安全,严禁带电插拔JTAG下载线,防止损坏设备
所需器材:FPGA教学实验系统,带并口的普通计算机 实验介绍:本实验是在FPGA教学实验系统上实现简单的逻辑门,例如2输入的
与门、与非门、或门、异或门等,对应部分的原理图如图1所示。当K0(K1)按键断开时,FPGA引脚175(173)的输入为低电平,对应发光二极管D2(D3)熄灭,当K0(K1)按键按下时,FPGA引脚175(173)的输入为高电平,对应发光二极管D2(D3)发光。FPGA引脚175、173在本实验中可用作输入引脚。FPGA引脚、65、66、73分别接有发光二极管(LED)DR0~DR3,在实验中可用作输出引脚,当引脚输出高电平时,对应的LED被驱动发光。这些输出引脚可用于实现2个输入的不同逻辑功能。
图1 部分按键与LED的原理图
实验步骤:
1. 为工程建立工作目录
为了方便工程涉及到的文件的管理,以后的每一个工程,都需要为其建立专门的工作目录,目录路径中不要包含有非英文或数字的字符(例如不要包含空格或中文字符等)。请利用系统自带的“我的电脑”或“资源管理器”建立目录。在此假设在E:\\work目录下建立名为mylogic的工程工作目录,其目录路径为E:\\work\\mylogic,本实验所涉及的文件都需要放置在该目录当中。
1
2. 运行Quartus II程序
方法1(通过开始菜单):
开始->程序(P)->Altera->Quartus II 7.2->Quartus II 7.2 (32-Bit)
方法2(桌面快捷方式):双击桌面的快捷方式图标打开Quartus II后,其界面如图2所示。
图2 Quartus II集成环境
3. 建立工程
在Quartus II上进行FPGA的开发是针对工程进行的,所有的设计任务都应当建立对应的工程。运行菜单命令File->New Project Wizard,打开新建工程向导,分别如图3~图8所示。完成后,即可在Quartus II中建立起对应的工程。
2
图3 新建工程向导介绍 图4 工作目录、工程名、顶层实体名
图 5 添加文件 图6 选定器件
图7 第三方工具设置 图 8 信息汇总
在图4所示的对话框中,我们将工作目录(working directory)设定为E:\\work\\mylogic,将工程名(name of this project)设定为mylogic,将顶层实体
3
名(top-level design entity)设定为mylogic。顶层实体名最好和工程名一致,如不一致,应根据实际情况修改。
在图7中,我们需要根据实际情况选中EP2C20Q240C8芯片,该芯片为Cyclone II系列的芯片之一,引脚为240个。因此,可以先在Family中选定Cyclone II系列,然后在Pin count中选定引脚为240,通过这些过滤条件,可以快速找到EP2C20Q240C8。
在其他图中的设置,不需要更改,直接点击Next即可。
4. 编辑Verilog设计文件
可以使用记事本等任何的文本编辑器编辑Verilog设计文件,Quartus II自带有编辑器,支持Verilog等多种设计文件的语法彩色显示,使用它来编辑可以帮助我们减少语法错误。运行菜单命令File->New,或点击工具栏上的
4
图10 保存文件
// filename: mylogic.v module mylogic ( k0, k1, dr0, dr1, dr2, dr3 );
input k0; //按键K0输入,按下为高电平1 input k1; //按键K1输入,按下为高电平1 output dr0;//输出1则发光二极管DR0点亮 output dr1;//输出1则发光二极管DR1点亮 output dr2;//输出1则发光二极管DR2点亮 output dr3;//输出1则发光二极管DR3点亮
reg dr2; reg dr3;
5
assign dr0 = k0 & k1; //实现与门 assign dr1 = !(k0 & k1);//实现与非门
always @(*) begin
dr2 = k0 | k1; //实现或门 end
always @(*) begin
dr3 = k0 ^ k1; //实现异或门 end
endmodule
5. 分析设计
分析设计这个步骤不是必需的,但是通过分析设计,可以对设计文件进行错误检查,并给出相应的提示、警告、错误等信息,检查过后,还可以提取出整个工程的结构层次、端口列表等信息,方便进行引脚锁定。如果直接对工程进行完整的编译,将会耗费比较多的时间,并且修改锁定引脚后,还是得完整编译一次。
运行菜单命令Processing->Start->Start Analysis & Elaboration,对设计进行分析,分析完成后,弹出一完成提示对话框,如图11所示。点击确定后,可查看自动打开的编译报告,如图12所示。
图11 分析完成提示
6
图12 分析完成后的编译报告
6. 功能仿真
运行菜单命令File->New,或点击工具栏上的
7
图14 波形编辑窗口
在Name对应的这一栏下面空白的地方双击鼠标左键,可以打开向波形编辑窗口插入节点或总线的对话框,如图15所示。点击Node Finder按钮,打开并使用节点查找器来查找添加节点,在Filter这一栏中,选择Pins:all,然后再点击List按钮,即可列出所有的引脚,如图16所示。
图15 插入节点或总线
8
图16 节点查找器
在节点查找器中,查找出来的符合匹配条件的节点列在左边的Nodes Found栏中,选择待添加的节点,然后点击中间的>按钮,即可把其添加到右边的Selected Nodes栏中作为选中节点,如果要把左边所有节点都添加到右边作为选中节点,则只需要点击中间的>>按钮即可。相反的,<按钮和<<按钮则是把右边的Selected Nodes栏中的选中节点去掉。我们在此把所有的引脚节点都添加到右边作为选中节点,如图17所示。然后点击OK按钮,返回到节点查找器中,如图18所示。
图17 添加所有引脚节点
9
图18 选择了节点的插入节点对话框
在选择了节点的插入节点对话框中,点击OK按钮,即可返回到波形编辑窗口,并将选中的节点添加到编辑窗口中。如图19所示。
图19 添加了节点的波形编辑窗口
我们在仿真时,只需要设置输入的波形,输出的波形由仿真得到。设置输入波形时,在输入信号上用鼠标左键框选一个区段,如图20所示,然后点击右边的相应值的按钮即可进行设置,在此,我们把这段选中的区域设为高电平1,则相应点击左边的
功能按钮,对波形
编辑窗口进行放大或缩小。
10
图20 选择待设置的信号区段
图21 仿真输入波形
编辑好输入波形文件后,即可进行保存,在此以mylogic为文件名(会自动添加.vwf的扩展名)保存文件,如图22所示,在其中默认选择上了Add file to current project选项,将会添加进当前工程当中。
图22 保存波形文件
运行菜单命令Processing->Simulator Tool,打开仿真器窗口,在Simulation mode中选择Functional类型,如图23所示。然后点击右边的Generate Functional Simulation Netlist按钮,生成功能仿真所需的网表文件,如无错误,完成后将弹出一如图24所示的提示成功生成功能仿真网表的对话框,点击上面的确定按钮将其关闭。然后点击下面的Start按钮,即可开始仿真,仿真结束后,将弹出如图25所示的提示成功仿真的对话框,点击上面的确定按钮将其关闭。在仿真器窗口中点击下面的Report按钮,可以打开查看功能仿真的结果,如图26所示,仔细检查各输出信号的波形是否与期望的一致,如无错误,可将其关闭。
11
图23 仿真器窗口
图24 成功生成功能仿真网表
图25 成功仿真
12
图26 功能仿真结果
7. 修改工程设置
工程设置包含有很多不同的方面,其默认值或自动分配值在不同的工程中并不一定能满足我们的期望,当和我们的期望值不一致时,就需要进行修改。建立工程过后,一般需要对工程的某些设置进行修改,使其满足我们期望的要求。修改过后,才进行完整的编译。
(1) 锁定引脚
锁定引脚是将设计当中的输入输出等端口(例如前面例子当中的k0、dr0)和FPGA实际引脚(175引脚、引脚)锁定对应起来,最终编译实现过后,在FPGA锁定的引脚上实现对应端口的功能。如果是在已经做好的FPGA电路板上进行FPGA程序设计,锁定引脚是必需进行的一项工程设置。
运行菜单命令Assignments->Pins,可打开Pin Planner窗口进行引脚锁定设置,如图27所示。
13
图27 Pin Planner窗口
在每个端口对应的Location栏中双击,即可打开下拉列表进行引脚选择,选择完之后点击其他地方即可进行确定,如图28所示。
图28 选定引脚
根据图1所示的实际情况给每个端口锁定引脚,全部设置好后如图29所示。设置好后,可以关闭Pin Planner窗口。
图29 全部锁定引脚
(2) 修改器件与引脚选项
运行菜单命令Assignments->Device,可打开工程设置窗口器件属性页,如图30所示。
14
图30 工程设置窗口器件属性页
点击其中的Device and Pin Options按钮,可打开器件与引脚选项窗口,默认打开的是General标签页,如图31所示,在其中可以进行一些全局的器件与引脚选项设定。因为我们的实验系统使用了FPGA配置完成后的INIT_DONE输出作为一个复位输入来产生系统的复位,因此,需要把General标签页中的Enable INIT_DONE output选项选上。
15
图31 General标签页
然后点击Configuration页标签,打开Configuration标签页,如图32所示。因为我们的实验系统使用了AS(Active Serial)模式的EPCS4配置芯片用于存储设计数据并在上电后自动对FPGA进行配置,因此,需要选择Active Serial模式并指明使用EPCS4配置芯片。
16
图32 Configuration标签页
然后点击Unused Pins页标签,打开Unused Pins标签页,如图33所示。因为在本次实验当中只使用到了部分的FPGA引脚,有一些FPGA的引脚并没有使用到,因此,需要选择这些在当前设计中没有使用到的FPGA引脚的处理方法,防止其对当前设计造成干扰,我们在此选择As input tri-stated,将其作为三态的输入端。
其他的选项我们不需要修改,使用默认设置即可。
17
图33 Unused Pins标签页
8. 完整编译设计
工程设置修改完毕后,即可点击工具栏上
18
图35 完整编译报告
9. 查看RTL视图
编译过后,运行菜单命令Tools->Netlist Viewers->RTL Viewer,可以打开RTL视图窗口,如图36所示,查看原始设计代码经综合器综合后对应的寄存器传输级别(RTL)的硬件实现原理图,该图应该跟我们期望的电路结构功能一致,否则,则为我们的设计描述有误,需要对设计代码进行修改。
图36 RTL Viewer
10. 器件在线配置
编译过后,点击工具栏上的
19
可以打开编程窗口,如图37所示。点击其中的Start按钮,即可开始对器件进行在线配置,如无问题,当Progress进度条达到100%时,即完成器件的配置。
图37 编程器窗口
11. 硬件验证
对芯片进行完在线配置后,在FPGA芯片里即实现了我们所设计的逻辑功能,构成了一个专用芯片,我们可以按下K0、K1等按键,进行不同的组合,并检查DR0、DR1、DR2、DR3等4个发光二极管的状态,看是否和期望的输出结果一致。
实验二:简单组合逻辑之if语句
实验目的:掌握Verilog语言中用if语句描述组合逻辑电路
实验要求:掌握Verilog语言中用if语句描述组合逻辑电路,注意设备及人身安
全,严禁带电插拔JTAG下载线,防止损坏设备
所需器材:FPGA教学实验系统,带并口的普通计算机
实验介绍:本实验是在FPGA教学实验系统上实现2-4译码器,对应部分的原理
图如图1所示。按键K0和K1用作译码的输入控制,发光二极管DR0~DR3用作译码的输出显示。2-4译码器是纯粹的组合逻辑电路,其真值表(功能表)如表1所示,我们在此作用if语句进行描述。
表1 2-4译码器真值表
输入 k1 0 0 1 1
k0 0 1 0 1
dr3 0 0 0 1
输出 dr2 dr1 0 0 0 1 1 0 0 0
dr0
1 0 0 0
实验步骤:本次实验的步骤及工程设置和实验一的相似,只是设计代码不一样。 // filename: if2to4.v module if2to4 (
20
k0, k1, dr0, dr1, dr2, dr3 );
input k0; //按键K0输入,按下为高电平1 input k1; //按键K1输入,按下为高电平1 output dr0;//输出1则发光二极管DR0点亮 output dr1;//输出1则发光二极管DR1点亮 output dr2;//输出1则发光二极管DR2点亮 output dr3;//输出1则发光二极管DR3点亮
reg dr0; reg dr1; reg dr2; reg dr3;
always @(*) begin
if (k1==1'b0) begin if (k0==1'b0) begin
{dr3, dr2, dr1, dr0} = 4'b0001; end
else begin
{dr3, dr2, dr1, dr0} = 4'b0010; end end
else begin
if (k0==1'b0) begin
{dr3, dr2, dr1, dr0} = 4'b0100; end
else begin
{dr3, dr2, dr1, dr0} = 4'b1000; end end end
endmodule
编译过后,对应的RTL视图如图38所示。
21
图38 RTL Viewer
编译过后,运行菜单命令Tools->Netlist Viewers->Technology Map Viewer (Post-Mapping),可以打开设计的工艺映射后的视图,如图39所示。双击其中的各个框图模块,可查看其内的详细结构,如图40所示。
图39 工艺映射后视图
22
dr3~11k1k0dr3dr2~4dr2dr1~11dr1dr0~4dr0 图40 工艺映射后视图(显示底层结构) 使用if语句描述组合逻辑时,描述单个节点变量的单个if-else语句通常和2选1选择器相对应,即当if的条件成立时,该节点变量取其中一个选项值输出,当if的条件不成立时,该节点变量取其中另一个选项值输出。
实验三:简单组合逻辑之case语句
实验目的:掌握Verilog语言中用case语句描述组合逻辑电路
实验要求:掌握Verilog语言中用case语句描述组合逻辑电路,注意设备及人身
安全,严禁带电插拔JTAG下载线,防止损坏设备
所需器材:FPGA教学实验系统,带并口的普通计算机
实验介绍:本实验是在FPGA教学实验系统上实现2-4译码器,对应部分的原理
图如图1所示。按键K0和K1用作译码的输入控制,发光二极管DR0~DR3用作译码的输出显示。2-4译码器是纯粹的组合逻辑电路,其真值表(功能表)如表1所示,我们在此作用case语句进行描述。
实验步骤:本次实验的步骤及工程设置和实验一的相似,只是设计代码不一样。 // filename: case2to4.v module case2to4 ( k0, k1, dr0, dr1, dr2, dr3 );
23
input k0; //按键K0输入,按下为高电平1 input k1; //按键K1输入,按下为高电平1 output dr0;//输出1则发光二极管DR0点亮 output dr1;//输出1则发光二极管DR1点亮 output dr2;//输出1则发光二极管DR2点亮 output dr3;//输出1则发光二极管DR3点亮
reg dr0; reg dr1; reg dr2; reg dr3;
always @(*) begin case ({k1, k0}) 2'b00 : begin
{dr3, dr2, dr1, dr0} = 4'b0001; end
2'b01 : begin
{dr3, dr2, dr1, dr0} = 4'b0010; end
2'b10 : begin
{dr3, dr2, dr1, dr0} = 4'b0100; end
2'b11 : begin
{dr3, dr2, dr1, dr0} = 4'b1000; end
default : begin
{dr3, dr2, dr1, dr0} = 4'b0000; end endcase end
endmodule
图41 RTL Viewer
24
图42 工艺映射后视图(显示底层结构)
实验四:计数器设计:LED输出
实验目的:掌握简单的时序电路设计方法及单时钟使能结构计数器的设计技巧 实验要求:掌握简单的时序电路设计方法及单时钟使能结构计数器的设计技巧,
注意设备及人身安全,严禁带电插拔JTAG下载线,防止损坏设备
所需器材:FPGA教学实验系统,带并口的普通计算机 实验介绍:本实验是在FPGA教学实验系统上实现一个计数器,计数器是一常用
的功能电路,它为简单的时序逻辑电路,其一般结构如图43所示。时序逻辑电路设计中应包含时钟和复位的输入,且应包含记忆性元件D触发器。计数器工作时,其工作方式为在每次时钟的上升沿将D触发器组里保存的当前计数值加1后的结果再寄存进D触发器组当中,实现计数值的递增更新。
25
图43 计数器结构
1. 复位电路
在本教学实验系统中,复位电路如图44所示,复位芯片U4产生的低电平有效复位信号(电路图上的信号名为SYSTEM_RESET#)连接到FPGA的238引脚上,因此可以使用238引脚作为低电平有效复位信号的输入。
图44 复位电路
2. 时钟电路
在本教学实验系统中,时钟电路如图45所示,其中有源晶振Y1产生的20MHz的时钟(电路图上的信号名为OSC_CLK1)同时连接到FPGA的30和31引脚上,因此可以使用30引脚或31引脚作为时钟输入。
26
图45 时钟电路
我们在此实现一个4位模16的计数器,计数器的4位输出连接到DR0~DR3上(对应引脚参看图1),当对应计数位为1时,相应的发光二极管点亮。如果直接使用有源晶振Y1产生的20MHz的时钟进行计数,则计数频率太快,计数位上的跳变频率也会过快,导致人眼看不到发光二极管的状态变化。在此,我们使用一个预分频计数器用于降低主功能计数器的计数频率,其方法有两种:一是利用前者计数器对原有时钟进行分频,使用分频过后的时钟作为后一计数器的时钟,如图46所示,此方法因为在同一设计中使用了不同的时钟,增加了对设计进行时序分析的难度,并且后者使用的时钟一般在质量和驱动强度上较差,不适于驱动多个数据路径或较长的数据路径;二是在前者计数器计数到某些特定值时产生后者的计数使能信号下,后者在该计数使能信号下才进行有效的计数,如图47所示,此方法只使用一个统一的时钟,便于对设计进行时序分析,且可以通过使用锁相环、专用时钟树等资源使得该时钟且有较好的质量和驱动强度。假设需要进行等效10分频,则前面的分频使能计数器precnt相应为模10计数器,计数状态为从0到9,计数最大值为9;当计数值为最大值9时,输出相应的后级计数使能信号en;在下一时钟的上升沿,主功能计数器cnt检测到计数使能信号en有效时进行加1计数,而分频使能计数器precnt检测到en有效时则相应回复到0,重新开始计数,相应的波形如图48所示。实际设计中需要将20MHz的时钟等效分频到1Hz,请自行计算precnt计数的最大值,并计算能够表示该最大值所需的比特宽度。
图46 先分频再计数结构
图47 两级单时钟使能计数器结构
27
图48 两级单时钟使能计数器计数示例波形
// filename: cnt_1.v module cnt_1 ( clk, rst_n, dr0, dr1, dr2, dr3 );
input clk; //20MHz时钟输入
input rst_n; //低电平有效复位信号输入
output dr0; //输出1则发光二极管DR0点亮 output dr1; //输出1则发光二极管DR1点亮 output dr2; //输出1则发光二极管DR2点亮 output dr3; //输出1则发光二极管DR3点亮
reg [24:0] precnt; //预分频计数器 reg [3:0] cnt; //主功能计数器 reg en; //计数使能
//计数使能描述
always @(*) begin
if ( precnt== 此处填写比较的值 ) begin //产生计数使能有效信号 end
else begin
//产生计数使能无效信号 end end
//precnt分频计数描述
always @(posedge clk or negedge rst_n) begin if (rst_n==1'b0) begin //precnt复位描述 end
else begin
if (en==1'b1) begin //precnt计数回零判别
28
//precnt计数回零描述 end
else begin
//precnt正常计数加1描述 end end end
//cnt主功能计数描述
always @(posedge clk or negedge rst_n) begin if (rst_n==1'b0) begin //cnt复位计数描述 end
else begin
if (en==1'b1) begin //cnt计数使能判别 //cnt正常计数加1 end end end
//cnt连接到发光二极管进行输出显示
assign {dr3, dr2, dr1, dr0} = cnt;
endmodule
Add1cnt[3..0]A[3..0]4' h1 --B[3..0]OUT[3..0]DPREQEqual0precnt[24..0]ADDERPREDQ25' h1312CFF --ENAA[24..0]B[24..0]CLROUTdr0dr1dr2dr3Add0precnt~[24..0]ENASELOUT[24..0]25' h0000000 --A[24..0]25' h0000001 --CLROUT0B[24..0]DATAADATABEQUALADDERMUX21clkrst_n 图49 RTL Viewer
实验五:计数器设计:数码管输出
实验目的:掌握混合功能单元电路的描述方法
29
实验要求:掌握混合功能单元电路的描述方法,注意设备及人身安全,严禁带电
插拔JTAG下载线,防止损坏设备
所需器材:FPGA教学实验系统,带并口的普通计算机 实验介绍:本实验是将前一个实验的计数输出经译码后用于驱动一个数码管进行
计数显示,同时增加按键K0作为计数“暂停/继续”的控制,即在计数时按第一次计数暂停,再按一次将继续计数。
1. 数码管的使用
实验系统上的数码管为4位数码管,其硬件电路如图50所示,其中的信号名对应的FPGA引脚如下表2所示。工作时,先将要点亮的数码管位对应的公共端的FPGA控制引脚置为高电平1,则相应的三极管被导通,数码管位对应的公共端上为低电平(三极管反相器电路在此起了取反的作用),此时,当某段的输入控制端为高电平1时,则数码管该位该段将被点亮。在本实验当中,我们可以选择数码管位1进行显示,即先将公共端1的控制引脚置为高电平1,其他的公共端控制引脚置为低电平0,然后将4位计数值译码到数码管的8个段位(含小数点)进行显示输出,译码为组合逻辑,适于采用case语句进行描述。
表2 数码管与FPGA引脚信号名对应表
数码管端 信号名 FPGA引脚 数码管端 信号名 FPGA引脚
A NTA 6 C SW-ROW3 66
B NTB 235 G SW-ROW4 73
E NTE 7 公共端1 PDC-CS 72
F NTF 233 公共端2 PDC-RD 70
D SW-ROW1 公共端3 PDC-WR 68
DP SW-ROW2 65 公共端4 PDC-DAT 67
SW-COL1 / SW-COL2 / SW-COL3 / SW-COL4 /
30
图50 数码管硬件电路
2. 按键的处理
(1) 按键的波形
通常按键所用的开关为机械弹性开关,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,当采用我们实验箱上如图1所示的高电平有效接法(按键按下时为高电平),机械触点断开、闭合时的电压信号波型如图51所示。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
图51 高电平有效接法的按键波形
(2) 异步信号的去亚稳态处理
异步信号是指没有同步到本地工作时钟的信号。同步到本地工作时钟的信号(即同步信号),是指经过使用本地工作时钟的D触发器进行寄存过后的信号,或寄存过后又进行了组合逻辑处理的信号,这样的信号,总是在时钟的有效沿到来后的确定时间内进行跳变更新的,并且一般能够在下一级寄存器的下一个时钟有效沿到来时稳定保持其状态。在本实验当中,按键输入的信号是由人手按动来确定其变化的,其跳变变化的时刻具有不确定性,并且还伴随有抖动,这样的信号没有同步到本地工作时钟,即为异步信号。如果这样的信号直接送到后面的时序系统中进行控制或处理,会造成后面的时序系统出现亚稳态。
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
31
为避免亚稳态的出现,进行去亚稳态处理,只需要将异步的信号经过使用本地工作时钟的D触发器进行寄存同步到本地时钟后,才在后面的时序系统中进行控制或处理即可。但是使用一级的D触发器进行寄存,并不能完全防止亚稳态的出现,只是出现的概率小了一些。在工程应用上,为进一步降低亚稳态出现的概率,一般使用如图52所示的两级D触发器进行寄存的结构,其工作波形如图53所示,即使第一个触发器输出存在亚稳态,再经过一个时钟周期后,第二个触发器输出仍处于亚稳态的概率非常小。如果增加D触发器进行寄存的级数,可以进一步降低亚稳态出现的概率,但无论增加多少级,均无法完全防止亚稳态的出现,只是其出现的概率可以逐步变得很小而已。图51所示的按键波形经去亚稳态处理得到的波形类似于如图54所示,可以看出,经过去亚稳态处理,可以消除部分周期小于采样时钟周期的抖动,但对于周期大于采样时钟周期的抖动则无法消除,对应位置会留下有毛刺。
图52 两级寄存电路
图53 两级寄存电路工作波形
图54 去亚稳态处理后的按键波形
(3) 边沿检测技术
在按键检测等应用中通常会使用到边沿检测技术。因为每次按下按键的时间长短不可能一样,有些人可能按得快只按下几百毫秒,有些人按得慢按下几秒的时间,在应用中很多时候都是等按键释放的时候即开始进行处理,因此我们需要检测到按键释放时的状态变化,例如从0跳变到1,或从1跳变到0,即对应的跳变边沿,当检测到对应的跳变边沿时即开始进行处理。跳变的边沿,即其当前时刻的状态相对前一个时刻的状态发生了变化,两者不再一致。因此,要进行边沿检测,只需要用D触发器保存待检测信号在上一个时钟有效沿的值,如果检测到保存的值为0,而当前输入值为1,即为出现了一个上升沿,其电路结构如图55所示,工作波形如图56所示,如果检测到保存的值为1,而当前输入值为0,即为出现了一个下降沿,其电路结构如图57所示,工作波形如图58所示。
32
图55 上升沿检测电路
图56 上升沿检测波形
图57 下降沿检测电路
图58 下降沿检测波形
(4) 按键去抖技术
根据一般人按键的速度小于10Hz(每秒小于10次),所以按键时间大于100ms,按占空比50%计算,按下的时间大于50ms。按这种约定,我们认为按下的时间小于50ms的为抖动信号,按下的时间大于50ms的是按键信号。
按键抖动会引起一次按键被误读多次。为确保对按键的一次闭合仅作一次处理,必须去除按键抖动。按键的抖动,可用硬件或软件两种解决方法,我们在此采用硬件的解决方法。
图54去亚稳态处理后的按键波形中还有可能存在毛刺,因此,我们需要将毛刺屏蔽掉,毛刺的宽度小于50ms,我们只需要认定只有宽度不小于50ms的才为有效按键信号即可,如果我们每10ms采样一次,即连续5次的采样值应该为有效值1。为避免按键时间较长时一次按键被误读多次,还需要结合边沿检测技术,即每10ms采样一次时连续5次的采样值为有效值1,并且最新一次的采样值为0时认为是一次有效按键。结合去亚稳态处理及去抖动处理的电路结构如图59所示,ena信号由对时钟计数给出,每10ms给出一个时钟周期宽度的有效信号(时钟频率为20MHz,周期为50ns,请计算10ms应计数多少次)。在ena信号有效时,如果ff4~ff8为1(按键曾有效),ff3为0(按键已释放,发生跳变),则可以认为发生了一次有效按键,给出一个时钟周期宽的检测出按键有效信号。
33
图59 按键处理电路
(5) 按键对计数的控制
要实现按键对计数的“暂停/继续”的控制,只需要做一个pause寄存器,其复位初始值为0,在每次按键有效时进行翻转,当该寄存器为0时允许计数,为1时暂停计数即可。按键处理的仿真波形如图60所示。
图60 按键处理仿真波形
实验六:计数器设计:电子表
实验目的:掌握信号边沿检测技术、数码管扫描显示技术
实验要求:掌握Quartus使用及FPGA开发的基本流程,注意设备及人身安全,
严禁带电插拔JTAG下载线,防止损坏设备
所需器材:FPGA教学实验系统,带并口的普通计算机 实验介绍:本实验是在FPGA教学实验系统上将前面介绍的时钟电路、复位电路、
按键电路、数码管电路等组合起来,实现一个“分分:秒秒”4位显示的电子秒表。其中K0按键在设计中起秒表的“暂停/继续”功能,即在计数时按第一次计数暂停,再按一次将继续计数。数码管的4位全部使用起来,用于进行分秒的计数显示。数码管中间的时间分隔冒号点还需进行闪烁,每秒钟闪烁一次。
1. “分分:秒秒”计数器设计
我们要实现“分分:秒秒”显示的电子秒表,需要设计计数频率为1Hz的计数器。因为“分分:秒秒”的结构对应有4个十进制数字(个位的秒,十位的秒,个位的分,十位的分),如果采用统一计数再分别求出“分分:秒秒” 对应的4个十进制数字进行译码显示,则求解对应的4个十进制数字的过程难于用硬件实现。在此,我们将每个显示的值分别进行计数,即分别针对个位的秒、十位的秒、个位的分、十位的分设计对应的计数器,其中个位的秒计数频率为1Hz,其从0到9计数,当从9回到0时,向前进一位,使得十位的秒进行计数加1。
34
十位的秒从0到5计数,当从5回到0时,向前进一位,使得个位的分进行计数加1。个位的分从0到9计数,当从9回到0时,向前进一位,使得十位的分进行计数加1。十位的分则从0到5计数,计数到5时,又回到0。
2. 扫描显示技术
因为4位数码管的段控制输入是复用的,要分别显示不同的计数数值,需要使用动态扫描显示技术,其电路结构如图61所示。首先,以扫描显示的频率进行2比特宽的模4计数,然后由其值从4个数码管的待显示值输入中选择对应的一个经译码后连接到公共的段控制输入端,同时将计数值经2到4译码后输出到对应数码管位的公共端,点亮对应的数码管。虽然各数码管位是轮流显示,每个数码管位上的数字是断续的显示,只要扫描的频率够快,由于人眼的视觉残余效应,就可以看到各数码管位上稳定的数字显示值。这和我们使用的电视、显示器的显示原理是一样的。参考液晶显示器的刷新频率,经验证,在每秒钟扫描60帧的时候,各数码管位上即能得到稳定的数字显示,此时,对应计数时钟的等效频率为240Hz。我们可以参考实验四的图47,再做一个等效分频计数器,通过产生的后级时钟使能信号将20MHz的时钟等效分频到240Hz。
图61 扫描显示电路结构
3. 冒号点的处理
数码管中间的时间分隔冒号点(对应为左边第2个数码管位的DP点)每秒钟闪烁一次,其频率为1Hz,只需要输出1Hz,占空比为50%的周期信号即可。其他数码管位的点号不需要显示,对应的DP点输出低电平无效信号即可。这4个信号再由图61所示的显示切换计数值进行4选1选择后接到数码管上公共的DP控制端。
在实验四的图47中,我们为了得到1Hz的主功能计数频率,前面利用precnt进行了等效分频计数,其一个完整的计数周期即为1s,对应产生的使能信号en频率即为1Hz,但我们在此不能直接使用en的信号,因为其占空比只有1/20000000,肉眼无法看到其闪烁的效果。为得到占空比为50%的1Hz信号,我们可以通过对precnt的计数值进行比较得出,只需要在precnt计数周期内一半的时间输出1,一半的时间输出0即可,例如,当precnt>25'd9999999时输出0,否则输出1,此时即可得到占空比为50%的1Hz信号。
4. 总体设计
总体设计只需要将时钟电路、复位电路、按键电路、数码管电路等组合起来,
35
综合使用时钟使能的同步设计技术、按键处理技术、扫描显示技术、“分分:秒秒”计数器设计技术及冒号点的处理技术即可。
实验七:序列检测器设计:电子密码锁
实验目的:掌握序列检测的设计技术 实验要求:掌握序列检测的设计技术,注意设备及人身安全,严禁带电插拔JTAG
下载线,防止损坏设备
所需器材:FPGA教学实验系统,带并口的普通计算机
实验介绍:本实验是在FPGA教学实验系统上实现简单的序列检测,按下按键
K0表示输入0,按下按键K1表示输入1(假定K1比K0有较高的优先级,当两者同时按下时也认为是输入1)当检测到按键输入序列11001010时,使蜂鸣器发出鸣响警报。此类序列检测的技术,通常可以应用在电子密码锁等产品上,当检测到输入正确的密码序列,才能进行开锁。
1. 硬件电路
K0和K1按键部分的电路原理图如图1所示。蜂鸣器的电路原理图如图62所示,图中的控制端BUZZER连接到FPGA的引脚78上,当FPGA引脚78上输出高电平逻辑1时,NPN三极管Q2导通,蜂鸣器上有电流流过,发出响声,否则输出低电平逻辑0时,Q2截止,蜂鸣器上没有电流流过,没有响声。二极管D14在图中起保护作用,用于吸收开关蜂鸣器时在蜂鸣器上可能产生的反向电动势。
图62 蜂鸣器电路
2. 序列检测技术
要检测某长度的输入序列(例如序列11001010的长度是8),关键是设法将输入的序列用一个对应长度的先进先出的寄存器组存起来。当检测到按下按键输入一个值时,应该将该值推入到寄存器组的尾部,并按顺序推挤将最前面的记录的最早值推出丢掉,当寄存器组中保存的序列和待检测序列一致时,即为检测到了待检测的序列,如图63所示。为测试方便,我们将这个保存的序列输出到发
36
光二极管进行显示,实验板上8个发光二极管对应的FPGA引脚如表3所示。
图63 先进先出寄存器组结构 表3 发光二极管对应引脚
发光二极管 FPGA引脚
DG0 72
DG1 70
DG2 68
DG3 67
DR0
DR1 65
DR2 66
DR3 73
3. 按键处理
因为使用了K0和K1两个按键分别表示0值和1值的输入,因此,当按下一次按键时,应该把一个并且只能把一个该按键对应的值,推入到上述寄存器组的尾部。要达到这样的功能,应该对K0和K1的输入进行上升沿检测,当检测到K0或K1的上升沿时,各自对应产生一个时钟周期宽的标志信号k0_valid或k1_valid。当k0_valid或k1_valid有效时,才在时钟上升沿将一个数据推入到上述寄存器组的尾部(右边),并按顺序推挤将最前面的记录的最早值(左边)推出丢掉,当k1_valid有效时推入的是1,当k0_valid有效时则推入0。
实验八:电子琴设计
实验目的:掌握矩阵键盘扫描检测原理以及任意分频计数器的设计
实验要求:掌握矩阵键盘扫描检测原理以及任意分频计数器的设计,注意设备及
人身安全,严禁带电插拔JTAG下载线,防止损坏设备
所需器材:FPGA教学实验系统,带并口的普通计算机 实验介绍:本实验是在FPGA教学实验系统上实现一个电子琴,当按下不同的按
键时,能发出不同频响的声音。
1. 矩阵键盘扫描检测技术
前面实验当中使用到的K0、K1等按键,每个都使用了一个单独的FPGA引脚来连接及判别状态,这样虽然使用方便,但如果按键数目较多的话,将会占用大量的FPGA引脚。在实际应用中,当按键数目较多时,为提高引脚的使用效率,通常矩阵键盘的连接方法,在此方式中,按键组成一个二维矩阵,矩阵的每行与每列需要一个单独的FPGA引脚来控制,图即为我们实验箱上实际采用的4x4矩阵键盘电路,这样的话16个按键只使用了8个FPGA引脚,减少了引脚使用的数目。矩阵键盘的行数和列数可以不相等,视乎实际的需要,例如3x2和3x4等都是可以的。
矩阵键盘虽然减少了引脚使用的数目,但使用时则麻烦一些,不能通过单个FPGA引脚直接判别某个按键的状态,而需要采用扫描检测的方式来判别按键的状态。在此以按列扫描检测方式为例进行介绍。按列扫描检测时,列控制引脚作为输出,行控制引脚作为输入。按顺序依次给各列输出1,当前输出1的列为待检测列,其他输出0的列在该轮中不参与检测,每次只能有一个列进行检测。此时从行控制引脚即可读回待检测列上所有按键的状态,当按键闭合时,行输入连接到了列输出的高电平1上,因此读出值为1的表示按键闭合,读出值为0的表
37
示按键断开。依次扫描各列,即可得出全部按键的状态。例如,通过PIN_72给第一列输出1,其他列输出0,通过行输入引脚PIN_、PIN_65、PIN_66、PIN_73即可读回第一列上按键SW1-1、SW2-1、SW3-1、SW4-1的状态。我们可以使用一个16位宽的寄存器组(key_save),依次把各列的扫描状态保存下来。
图 矩阵键盘电路
实际使用中,如果列输出1后马上就去读行的输入,因为存在按键导通延迟,读到的值可能不稳定,因此需要列输出1后等待上一段时间,等行输入稳定后才去读行输入的状态。在此,我们使用一个模8的计数器,每次待检测列均输出两个周期宽的有效信号1,而在中间位置(即这两个周期中的后一个周期的时钟上升沿处)才检测行输入的状态,如图65中两根红色虚线所示。为防止亚稳状的出现,我们可以增加2级寄存器进行寄存(key_save_ff1、key_save_ff2)。寄存的位置应选择在一轮4列都扫描完之后,即计数值从7跳变回0的时钟上升沿处。
图65 矩阵键盘扫描波形
2. 音阶频率
根据音乐律学的十二平均律理论,音阶中各唱名的频率对do音的频率比有如下关系:
表4 各唱名的频率对do音的频率比
音名 对do音的频率比
do re mi fa sol la si !do 1 38
(2) (2) (2) (2) (2) (2)1221241251271291211 2 音程关系 全音 全音 半音 全音 全音 全音 半音
如将C调(C4)的第一个音名do定为261.63HZ,则各唱名所对应的十二平均律及取整后的纯率分别为(单位:Hz):
表5 各唱名对应的频率表
唱名 十二平均律 纯率
do 261.63 262
re 293.66 294
mi 329.63 330
fa 349.23 349
sol 392 392
la 440 440
si 493.88 494
!do 523.25 523
图66给出了标准钢琴及常用乐器频率范围对照表,在此,我们利用16个按键实现其中的C4到C6的16个白键音阶频率,即从262Hz到1175Hz的频率值。
39
图66 标准钢琴及常用乐器频率范围对照表
3. 喇叭及放大电路
实验箱上自带有喇叭及放大电路,如图67所示,其中使用了LM386进行功率放大,左边的SPEAKER输入端连接到FPGA的117引脚上。当J17跳线选择2与3短路连接时,放大电路选择FPGA的117引脚输出作为输入,只要在该引脚给出特定频率的信号,即可以驱动喇叭发出对应音阶的响声。
40
图67 喇叭及放大电路
4. 任意分频计数器
为使得按下不同的按键能产生不同的声音,一种办法是先对20MHz的输入时钟进行不同的计数分频,对应产生16个音阶的不同频率信号,然后再根据按键状态选择对应频率的信号进行输出,但是这样需要进行16组的分频,每组分频都带来相应的硬件开销(加法器、寄存器等);另一种办法是只设计一个任意分频计数器divcnt,然后根据按键状态选择对应的输出使能spken及分频计数值divfrq控制分频计数器进行计数,为保证输出信号占空比为50%,后面再接一个D触发器构成二分频电路,该D触发器当divcnt计数值等于divfrq控制值,并且输出使能spken有效时,在时钟的上升沿处进行翻转,产生期望频率的信号,这样则只需要一大一小的两组的分频计数器,如图68所示。假设输入时钟频率为Fclk,期望输出信号频率为Fout,则divfrq可根据公式divfrq=round( Fclk/(2*Fout) ) - 1确定,round函数在此表示取其四舍五入的整数。在此以输出C调的262Hz为例,即Fclk=20MHz=20000000Hz,Fout=262Hz,因此有divfrq=round(20000000/(2*262) ) - 1=round(38167.9) - 1=38167。
图68 任意分频计数器电路
41
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务