配套文本教程-hellofpga-项目实战篇_第1页
配套文本教程-hellofpga-项目实战篇_第2页
配套文本教程-hellofpga-项目实战篇_第3页
配套文本教程-hellofpga-项目实战篇_第4页
配套文本教程-hellofpga-项目实战篇_第5页
免费预览已结束,剩余213页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目实战篇包含哪些内容:例举三人表决器、数字时钟、多终端点歌系统、数字示波器这的实际问题,来学习原汁原味的FPGA设计。本篇一改传统里逐个讲解外设的方寄存 计数 §3.3数字时钟的理论实 第四章数字时钟设计实 §4.1LED进 功能概 设计说 源码解 板级调 §4.2按键进 功能概 设计说 源码解 板级调 §4.3数码管进 功能概 设计说 源码解 板级调 §4.4蜂鸣器外 功能概 设计说 源码解 板级调 §4.5用外设来实现数字时 功能概 设计说 源码解 板级调 第五章多终端点歌系统设计分 §5.1UART控制原 UART基本概 UART通信协 §5.2UART实际应 功能概 设计说 源码解 板级调 §5.3红外控制原 红外基本概 红外通信协 §5.4红外实际应 功能概 设计说 源码解 板级调 §5.5PS/2控制原 PS/2基本概 PS/2通信协 功能概 设计说 源码解 板级调 第六章多终端点歌系统设计实 §6.1功能概 §6.2设计说 §6.3源码解 §6.4板级调 第七章数字示波器设计分 VGA基本概 VGA通信协 §7.2VGA实际应 功能概 设计说 源码解 板级调 §7.3AD控制原 AD基本概 AD通信协 §7.4AD实际应 功能概 设计说 源码解 板级调 §7.5DA控制原 DA基本概 DA通信协 §7.6DA实际应 功能概 设计说 源码解 板级调 第八章数字示波器设计实 §8.1功能概 §8.2设计说 §8.3源码解 §8.4板级调 文档修订历 .........................................................................................................................................201学习交 第一整个工程框架图。为什么不容易呢给大家分析分析,大家看如图1.1所示,这是一个实现班里面竞选班长,就是通过这一原理来投票竞选的。对于一个FPG整个工程框架图。为什么不容易呢给大家分析分析,大家看如图1.1所示,这是一个实现数数字电路基础知按键外LED外基础外设学按键外LED外基础外设学板级调完成三人表决融会贯基础知识学逻辑代数基组合电路基VerlgQuarus数码管外图1.1实现三人表决器的数码管外通过该 可以看出,想要实现三人表决器,首 得具备数字电路基础知识,因为是,只会字路道么实人器了怎么样能够实现三人表决器以后,接下来就需要学习Verilog硬件描述语言,因为学习Verilog硬件描述语言,可以将数字电路中学到的组合电路知识描述成Verilog代码。当然,只有这些基础知识是不够的,还需要学习QuartusII,因为QuartrusII可以将的Verilog代码综实际的硬件电路运行至的FPGA吗案有从框图看,完一任的三人表决器的电路是有了,但是的三人表决器电路它没有输入设备,也没有输出设,的三人表决器是空有一身功夫没处用。了能够让的三人表决器能够正常使用,还需要学习LED外设、按键外设,以及的数码管外设,学习了这三个外设以后,就可以将这三个外设合理的应用到的三人表决器上最终完成三人表决器的设计,实现三人表决器的功能。§1.1逻辑代数基通过上面的分析,想必大家对整个工程框架有了一定的了解,如果你在开始学习的《设计方法流设计方法流程图,如图1.4所示说完了逻辑分析再来看下逻辑设计,逻辑设计或称逻辑综合是逻辑分析的逆合和国内的电路符号稍微有点不同,所以这里这两种符号都列了出来,方便读者对比学§1.2组合电路基出组合电路出组合电路的分析方法流程图,如图1.3所示图1.3组合电路的电路技术指标的合理性;或者进行产品仿制、维修和改进时,分析的过程是很重要的。下电路的基本问题是逻辑分析和逻辑设计,逻辑分析,是根据给定的组合电路逻辑图,确定其逻辑给说完说完了逻辑代数基础知识,下 就来讲解数字电路的第二部分组合电路基础知识。组变真值过逻辑最简表达逻辑表达程电合变真值图1.4组合逻辑电路的设计方法1.2.2三人表决器的理论实战复习完了组合电路的分析与设计,接下 就可以动手去设 的三人表决器电路了逻辑合理)逻辑表首先根据实际逻辑问题建立真值表,这里设A、B、C分别代表参加表决的三个输入变量,L为表决结果。规定变量A=1、B=1、C=1表示赞成,反之表示不赞成;L=1表示多数赞成,即通过,反之表示不通过。故可列出真值表,如表1.2所示。1.2三人表决器真值ABCL00000010010001111000101111011111就利用公式化进行化简,行化利用并项法AA1将上述函数表达式进行化简可以用公式法化简也可以用卡诺图法化简,由于的函数表达式比较简单,这接下来便可以通过真值表写出函数表达式,就利用公式化进行化简,行化利用并项法AA1将上述函数表达式进行化简可以用公式法化简也可以用卡诺图法化简,由于的函数表达式比较简单,这根据最后化根据最后化简的函LAA)BCA(BB)CAB(CCLBCAB。画出三人表决器的逻辑图,逻辑图如图1.5所示&&& 图1.5三人表决器的逻辑达式,以及逻辑电路图来写出其相对应的ri代码。§1.3Verilog在写出三人表决器的Verilog代码之前,先来复下Verilog的基础知识。用Verilog描述的数字逻辑电路也被称为HDL建模。模块是Verilog的基本描述单位,用于描述每个设计的功能或结构,以及与其他模块通信的外部接口。在Verilog中大约使用100个预定义的Verilog使用一个或多个模块对数字电路建模,模块代表硬件上的逻辑实体,其范围可以从简单的门到整个大的系统,比如一个计数器、一个子系个微处理器等。一个模块可以包括整个设计模块或者设计模型的一部分,模块的定义总是以module开始,以endmodule结尾,它的一般语法结构如代码1.1所示。代码1.1一般的rio1module模块2(3端口1,端口2,端口45端口类型说明6参数定义(可选789//----------以上为描述接口说明部 //----------以下为描述逻辑功能部 实例低层次模块和基本门级元件连续赋值语句过程赋值语句(initial和功能描述语句任务和函数“模块名”是模块唯一的标示符,括号中以逗号分隔列出的端口名是该模块的输入、输出接着是模块的说明部分,“端口类型说明”为n(输入)、output(输出)、iut(双向端口)三者之一,wr是使用实例化低层次模块的方法,即调用其他已定义过的低层次模块对整个电路的功能进行描述,或者直接调用Verilog预先定义的基本门级元件描述电路的结构,通常将这种方法称为结构化描述方式;可以选用这几种方式中的任一一种,或者混合使用几种方式描述电路的逻辑功能,也就是说,在一个模块中可以包含连续赋值语句、always语句和结构型描述方式,并且这些描述方式在程序中排列的先后顺序是任意的。复习完了Verilog的基础知识,接下来就可以利用这三种不同描述方式来描述的三人表决器。的逻辑图到此处,如图1.6所示。 CL图1.6三人表决器的逻辑下 给出结构化描述方式的V代码,如代码1.2所示&&&1.2结构化描述方1inputinputinputC;output23456789wireandand//and////解了。如果你对结构化描述方法还不太理解,那么你可以参考的《硬件语法篇》,该篇中有对结构化描述方法详细的讲解。下面给出一些关于结构化描述方式的rio拓展小知识:rioHDL内置26个基本元件,其中14个是门级元件,12个为开关级元件,只介绍了7(同或三人表决器的逻辑函数到此处,逻辑函数如下所示。LBCAC下面给出数据流描述方式的Vo代码,如代码1.3所示12345671234567//输出端//模块名A4_Vote2,即模块8inputinput output//模块的输入端口//模块的输入端口//模块的输入端口//模块的输出端口 assignL=(B&&C)||(A&&C)||(A&& //模块的结如果你对数据流描述方法还不太理解,那么你可以参考的《硬件语法篇》,该篇中有对数据流描述方法详细的讲解。下面给出一些关于数据流描述方式的ri拓展小知识:inputoutput和inout默认类型是wireassign语句是针对线网变量的一种赋值语句,线网变量一般对应到FPGA中的一段连线,而连线的值时会随着它的驱动源的变化而不停变化的,因此也就称之为连续赋值语句。对应于实际的数字电路,线网wire是线网中最常用的一种数据类型,wire型数据常用来表示用以assign关键字指定的组合逻辑信号。oHDL中绝大多数运算操作符都是可综合的:+(加、-(减(逻辑非、(取反、&(与、~&(与非、|(或、~|(或非、^(异或、~^(同或、*(乘人表决器的真值表到此处,如表1.2所示。1.3三人ABCL00000010010001111000101111011111下面给出行为级描述方式的o代码,如代码1.4所示1.4行为级描述方式1module//模块名A4_Vote3,即模块2(3//输入端45//输出端6L789 //模块的输入端口 //模块的输入端口 //模块的输入端口output //模块的输出端口always@//always在组合逻辑中的//其中有一个信号有变化便会执行begincase语3'b000:L=//也可以写always@(*),3'b001:L=//always@(A,B,C)3'b010:L=//{A,B,C}解析:把A,B,C三条一条总3'b011:L=//举例说明3'b100:L=3'b101:L=3'b110:L=3'b111:L=default:L=//不要省//case语句//begin语句//module语句的结查查看选择器程配置工分配管编译工输入设新建工打如果你对行为级描述方法还不太理解,那么你可以参考的《硬件语法篇》,该篇中有对行为级描述方法详细的讲解。下面给出一些关于行为级描述方式的Verilog拓展小知识:always和assign相对来说,还是assign比较容易理解,这里我将always@(A,B,C)详细讲解一下,@是事件等待语句,意思是always不断循环等待AB和C三个敏感变量变化,不管AB和Calways下面的begin……end中的语句。如果AB和C都没有变化,那么always也将不往下执行,将一直循环等待。新标准可以这样书写always@(*),其解释如下:always@(*)是个组合逻辑电路的描述方式;是为了防止你在设计时考虑不周全带来一些操作,所以敏感表用(表示全部的敏感变量,只要有任何输入信号变化,其输出立即发送变化。……:begin…………:begin…………:begin……endalways@(posedge串行语句的执行思路是顺序执行的,一般高级编程语言中的语句执行方式都是顺序执行的,C此序的更帮达设想其描序辑变FPGA的设计思想都是并行的,module中仅支持并行语句的调用,但是为了Verilog中的一些并行语句中的字语句体允许是顺序执行的。而关键字beg……:begin…………:begin…………:begin……endalways@(posedge想要利用a§1.4Quartus基综合三人表决器l代码需要完成下面的utIIcase语句是一种多分支选择语句,if语句只想要利用a§1.4Quartus基综合三人表决器l代码需要完成下面的utII图1.7uII设计流程码就写完了,接下来就可以使用QuartusII综合三人表决器Verlg代码从图1.7中可以知道,打开tII第一件事就是新建一个工程,在uruII软件中新建工程还是比较简单的,uruII提供了一个新建工程向导,只需要跟着向导一步步走,就可以完成整个工程的建立。工程建立完毕以后,需要新建一个rio顶层文件,然后将三人表决器的Vrl代码输入到新建的rl顶层文件中,输入完成以后,就可以编译,这时QtuII会检查你输入的代码,如果代码出现错误,那么rII将会在控制台中给出错误信息,如果代码没有错误,那么QruII将会显示编译完成,编译完成后,还需要给工程分配管脚、配置工程。最后,通过工具将编译生成的.sof文件双击计算机桌面上的utuII13.1(64-bit)图标(如果安装的是32位程序应选择rtII13.1(32-bit)图标),打开rII。rII主界面如图1.8所示,第一次打开软图1.8QrII主界II工程,这个工程的路径名应该只有字母、数字和下划线,以字母为首字符,且不要包含中文和其他符号。在菜单栏上选择【e】→【NewProjectd】,首先弹出了uo”页面,单击【Next】按钮进入“Drector,NmeTop-vEi页面,如图1.9所示。图1.9新建工程向导的文件Wha输入工程名Whatisthenameofthetop-leveldesigneiforthist”下输入工程顶层“A4_Vote1Ne有什么文件可以添们直接点击【Next】按钮进入下一个页面,如图1.10所示页面。1.10器件选择在该页面中,在“Family选CycloneIVE”列然在Availabledevices”中选择具体型号“EP4CE10F17C8”。由于开发板主用的EP4CE10F17C8我Next一图.11所示。1.11EDA在该页面中,由于只用到仿真工具,所以“Simulation设置为“-Altera”,ioi工程创建完成以后,下面就来创建o顶层文件,找到菜单栏【Fe】→【New】按钮并点击,则弹出如图1.12所示的新建文件窗口。1.12Vrio文件窗在该窗口中,选择“VerilogHDLFile”并单击【OK】按钮完成erilg文件创建。在创建好的Vo文件中,就可以将三人表决器i代码输入至的V文件中。Verlg代码为例,如图1.13所示。1.13三人表Vo代码输入完成以后,接下来就可以编译工程了,找到【Processing】→【ltn】按钮并点击,这时QuartuII会自动编译的工程,可以通过Qut 界面中的右下角来查看编译进度。在编译过,可以通过信息打印窗口来查看错(Error)和警告Wg)信息,如图1.14所示1.14信息提查看编译完成以后,下面就可以查看RTL了,在查看RTL之前,先来简单的介绍一下什么是RTL?RT(RegisterTransferel即寄存器传输级),是的数字电路,抽象层次相对较低。虽然行为综合可以综合算法级别的代码,但实际上,大多数的设计团队只使用RTL样就会用到“RTLViwr”和TcolMapViwe”这两个工具。RTLVeer:是编译后的结果,反映的是模块之间的连接,显示的图形都是调用标准单元的结果,跟工艺库,FPGA型,都没有关系。nlMapr:是已经到FPGA器件的,可以直接看到门电路的Viewer板子上是什,就看ehooMapViewer。这里在QuarttusII菜单栏中找【Tols】→【Ns】→【RTLr】按钮并点击打开,弹出如图1.15所示页面1.15RTLViewer窗三人表决器逻辑电路来描述的,所以RTLVieer中的电路和三人表决器的电路是一样的。因此,可以确定的Verilg代码是正确无误的。查看完了RTL视图,接下来就需要给工程分配管脚了,这里需要注意的是,由于的三人表决器现在只是一个功能模块,并没有使用按键、LED和数码管外设,所以没有管脚可以分配。接下来的步骤也不需要再进行了,即使进行下去,至A4开发板上也是看到任何效的。为了够验证的三人决器模块,下来通过仿真来对三人表决器模块进行。§1.5仿首先找到菜单栏中的【Processing】→【St】→【tTestBenchTemplatei】按钮并点击,这时,urII会自动创建一个仿真文件。可以在工程路径下的n\文件夹中找到该仿真文件,如图1.16所示1.16oe仿真在该图中可以看到,的仿真文件名叫4_Vote1.vt,可以直接用记事本打开“A4_Vote1.vt并进行修改,也可以将该文件拖到QarII窗口中进行修改,也可以用QrtII菜单栏中的【Fe】→【Open】选中Ae”进行打开并修改。仿真文件代码修改如代码1.5所示。代码1.5修改完成后的仿真文件代码1`timescale1ps/12module3//4//generalpurpose5reg6//testvectorinput7reg8reg9reg//wire//assignstatements(ifA4_Vote1i1//portmap-connectionbetweenmasterportsandY信号的变化,如果其值发生变化,马上打印$monitor($time,"Yvaule=//激励信号产A=1'b0;B=1'b0;C=//1000ps#1000;A=1'b0;B=1'b0;C=//#1000;A=1'b0;B=1'b1;C=//#1000;A=1'b0;B=1'b1;C=//#1000;A=1'b1;B=1'b0;C=//#1000;A=1'b1;B=1'b0;C=//#1000;A=1'b1;B=1'b1;C=//#1000;A=1'b1;B=1'b1;C=完成仿真文件代码编写以后,接下来返回到urII中对仿真进行设置,找igetg“Ceory的【EDAToolSetig】→【Simuation1.17所示。1.17仿真设在该页面中,选中CompileTestbench”后,单击后面的【TstBenches】按钮则弹出如图1.18所示页面。1.18添加仿在“TestBenches”窗口(上面的窗口)中,单击【New】按钮,接着弹出图1.18所示的“NewsBenches窗口(下面的窗口。在此窗口中,根据Aoe仿真文件输入“Testbenchname”和“Topleveluintestbench”的名称。接着还要在“Testbenchandsmltifes”中将仿真文件Ae添加进来,如图1.19所示。1.19已经选中t菜单栏中的【TolsRunSlRTLSimuation】按钮并点击,随后“Altera”便启动,如图1.20所示。这是“-Altera”的工作界面下面给出仿真波形的特写,如图1.21所示。图1.21仿真波另外,也可以查看打印的信息,如图1.22所示。图1.22信息打印窗从仿真波形窗口和信息打印窗口中可以看出,当ABC为10时,L均为0,当ABC为011,101,110,111的,L为1。因此,可以确定,的三人表决器电路功能也第二三个外设完成三人表决器设计。如图2.1所示了三人表决器的Vo代码,完成了ur三个外设完成三人表决器设计。如图2.1所示了三人表决器的Vo代码,完成了ur三人表决器总体设计学习框图。LED还没有学习如何使用LEDA4工程创建和代码综合,以及实现了d数数码管外按键外LED外完成三人表决板级调基础外设学图2.1三人表决器总体设从该图中可以看出,首先需要学习的是LED外设,紧接着还要学习按键和数码管外设,每一个外设都会从功能概述、设计说明、源码解析和板级调试,这四个方面进行学习。当三个外设学习完以,最终就能够完三人表决器设计,在A4开发板上实现三人表决器的功能。§2.1LED外LED外设可以说是所有外设中最简单的一个外设了,虽然LED外设操作简单,但是LED的却能起到大作用。通过LED外设的学习,可以很直观的了解到如何使用Verilog硬件描述语言控制LED亮灭这一过程。不仅仅如此,还可以通过控制LED获得以下四条信LED程序完成后,检测FPGA是否能够正常运行在这里第一步新建工程和第二步设计输入就不在进行详细介绍了,如果还有不是很熟悉的读者可以参面1.4Quartus基础章节,新建工程,命名为“A4_Led1在专门的文件夹下,新建o源文件,命名为“A4_Led1.v输入设计代码,综合编译并验证完成代码设计后,可以选择菜单栏【Ass】→【iPaner】对工程的I/O引脚进PiPn图2.2PPane这里会提供FPGA的管脚分配pdf文件和tcl文件,通过原理图也可以找到LED指示灯所连接的I/O引脚,将它们对应的引脚号输入到对应信号名的“n”中,如图2.3所2.3LED示具体内容,默认的“FlowSmmry”报告中则给出了该设计的最主要的一些资源利用情况。图图2.4编译完成后的2.1.3源码解本实例代码中设计了8个输出端口,分别对应的是LED0~LED7,也即是开发板上LED的和灭,功能框如图2.5所示。LED外2.5LED下面给出该实例的o代码,如代码2.1所示 module//方法1,模块 module//方法1,模块 //输出端 6 output8assignLED11'b0;为什么要1'b0,不直接assignLED31'b0;只有数字没有进制默认就为十进制,并且位宽默认为32位assignLED41'b1;1'b032'd0结果是相同的 assignLED5=1'b0;//但是用十进制表示的话会浪费资源 assignLED6=1'b0;//因为的资源是有限的assignLED7=1'b0;//所以节约资源从细节做起,养成良好的编。 //模块的结//module //方法2,模块的开// //输出端口//output[7:0]//////assignLED= //模块的结//这里要注意的是,不同的方法,管脚分配名称也是不一样以上两种方法实现的功能相同,代码相对比较简单,注释给出了详细说明,这里我就不多做解释,有一点要强调说明,不同的方法,在引脚分配时是不同的,比如方法1中引脚分配名是LED02中引脚分配却是LED[0]个:才辨给LED赋值1’b0是给1’b1亮。这里可不是能控制了的,这里要看硬件上的设计,要看原理图才能知道,A4开发板上的LED原理图,如图2.6所示。2.6LEDLED,LEDLEDXLED,LED此,可以通过程序FPGALEDX管脚IO的输出电平来使LED(这X1、2、3、4、5、6、7、8)。由于这里可以直接上板调试并验证设计的正确性,就不在进行仿真调试。直接单击rgmTsomr2.7图2.7Programmer窗口界Bstr(PC理器中通用串行总线控制器下是否有“AlteraUSB-sr”设备,如果没有则检查“USB-Blster设备是否正确安装驱动,然后在“PormmerurusII“USBt器。若没有识别,则按照如图2所示,单击左上角的【rp】按钮建2.8USB-Blaster前面的步骤都确定好,就可以点击【addFile找到“output_files”下的“A4_Led1.sof将文件添加进来即可,如图2.9所示,直接单击右侧的【Start】按钮就可以启动操,观右上的“Pogres”是从0化到100%。2.9设备连接当点击S按钮,将.文件到A4开发板上后,可以看到A4开发板上的D1和D5是熄灭的,其余的LED都是点亮的,如图2.10所示。2.10LED§2.2按键外设按键检测处理是FPGA设计学习开发的基本功,必须很好地学习掌握按键处理技术。在FPGA为主控的应用系统中,按键主要有两种形式:独立式按键和矩阵式按键。独立式按键的每个按键都单独接到FPGA的一个I/O口上,通过判断按键端口的电位即可识别按键操作;而矩阵式按键通过行列交叉按键编码进行识别。A4开发板上使用的便是独立式按键,其原理图,如图2.11所示。图2.11A4开发板上的按键从该图中可以看出,如果按下按键,那么按键就会接通并连接到高电平VCC3V3,如果力动接断。面理中还看,仅有按按键的耐用性所,电容式触摸按键的结构与电阻相似,其原理是利用的感应电容来测是否有手指存在,在存或寄到变化量超过一定的域值时就认为手指按下。在没有手指按下时,各按键对地有一个等效的静态电容,指时就到IC控制的电路,该电路包括一个能放置在任何介质面板上的简使用也是非常的长久,一般来说是半性。A4开发板上所采用的触摸按键是TTP226,TTP226是一款接触板检测(touchpaddetector)IC,提供8个接触键。这里只用到了4个,另外的4个按键被实体按键取代,对于TTP226这个我就不多费口舌拉,想要进一步了解的读者的FPGA的FPGALEDLED按键外 以查阅其下面我将利用按键与LED联调,实现按键点灯,让大家深刻的感受一下实体按键和触摸按键的不同之处及不同体验,当然,还可以利用触摸按键的优势,来实现滑动效果,这里实基础章节。新建V源文件,命名为“A4_Key1.v”,输入设计代码,综合编译后进行引脚分配,本例程的引脚分配如图2.12所示。2.2.3源码解2.2.3源码解中的配图2.13按键的逻辑设计功能框图下面给出该实例的l代码,如代码2.2所示2.2按键外Vo123456789moduleA4_Key1 inputKEY0,KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7;outputassignLED7KEY7//实体4 //模块的结//module ////对应开发板上的//对应开发板上的//input[7:0] //输入端//output[7:0] //输出端//assignLED //8个按8 //模块的结这里也可以和LED代码一样,也可以用两种方法实现。这里有一点要重点提示一下,根据原理图可以得出按键悬空的时候是0,按下按键后按键的值就为1,因此,在没有按下按键时,所有的按键都为0,又因为LED低电平有效,所以LED都是点亮的。想要让按键以相反的状态工作,那么只需要在每个按键前面进行取反即可。2.2.4板级调最后Qa编译生成的AK文件到开发板中,接着按下实体按键,对应的LED将会熄灭,松开按键,对应的LED将会点亮,按下了触摸的第四个按键和实体的第一个按键,其相对应的D4D5也都熄灭,如图2.14示,图2.14按键外设板级调试当所有的按键都按下,对应的所有的LED将会熄灭,这里触摸按键与实体按键相比较会更有趣,触摸按键可以实现实体按键实现不了的滑键效果,你可以左滑,也可以右滑,摩擦摩擦,魔鬼的步伐。§2.3数码管外说完了按键外设,接下来再来看下数码管外设,数码管是一种价格便宜、使用简单的半导发光二极管,a、b、c、d、e、f、g、dp八段按一定的方式排列起来,利用不同的组合,来显示不同的数字,如图2.15所示。 gfCOMae gfCOMaedCOMc图2.15七段数字显示器及发光段组合图(a)显示器(b)数码管按各发光二极管电极的连接方式分为共阳数码管和共阴数码管两种,如图2.16所示 bd ga ga 图2.16半导体数字显示器的接 (a)共阳极接法(b)共阴极接从图中可以看出,将八段数码管中的每个二极管的阴极并联在一起,组成公共阴。那么此时不管哪个管脚输入高电平,对应发光二极管就被点亮。如果共阳极接高电平,那么此时管哪个脚输入电平,应发光极管就点亮。的A4开发板采用的是共阴极连接方式,原理图如图2.17所示。图2.17A4开发板上的数码管原理图从该图中可以看出,6个数码管的a~g及小数点dp管脚并联在一起连接到FPGA简单的介绍完了数码管,下面再来看下数码管例程将要实现一个怎样的功能,该例程主要实现的功能是让6个数码管同时显示一个数字。为了方便大家编写代码,共阴极的数码管编码表,总结如表2.12.1数码管编0123456789ABCDEF新建工程,命名为“A4_Segled1把这个工程放在专门的文件夹下,其他设置参考1.4r基础章节。新建o源文件,命名为“A4_Segled1.v输入设计代码,综合编译后进行引脚分配,本例程的引脚分配如图2.18所示。图2.18数码管外设管脚分本实例代码中设计了8个输出端口SEG_DATAa,SEG_DATAb,SEG_D,SEG_DATAd,SEG_DATAe,SEG_DATAf,SEG_DATAg,SEG_DATADP分别对应的是数码管的def八个数据位,即控制数码管显示什么数字。设计了6个输出端口SEG_EN1,SEG_EN2,SEG_EN3,SEG_EN4,SEG_EN5,SEG_EN6,分别对应的是六个数码管上的片选端,即控制数码管的亮和灭。通过编写相应代码到FPGA中,FPGA管脚输出数据直接到数码管上,便可实现点亮数码管功能。功能框图2.19所示。 SEG_60SG图2.19数码管的逻辑设计下面给出该实例的V代码,如代码2.3代码2.2所示2.3数码管外设的Vl123moduleA4_Segled1 //数码管数据引4 56//数码管使能引789//将数码管数据位和数码管使能位为输出默认类型output//ouput6:0]SEG_DATA;SEG_DATA[0]等价SEG_DATAaSEG_DATA[7]等价于//ouput5:0]SEG_ENSEG_EN[0]等价SEG_EN1SEG_EN[5]等价//数码管显示0~F SEG_NUM0 //SEG_NUM1 //SEG_NUM2 //SEG_NUM3 //SEG_NUM4 //SEG_NUM5 //SEG_NUM6 //SEG_NUM7 //SEG_NUM8 //SEG_NUM9 //SEG_NUMA //SEG_NUMB //SEG_NUMC //SEG_NUMD //SEG_NUME //SEG_NUMF8'hf1;////给数码管数据位赋值,也可以这样写SEG_DATA[7:0]=assignSEG_DATAd,SEG_D,SEG_DATAb,SEG_DATAa}=//给数码管使能位赋值也可以这样写SEG[5:0]=6'b000000;同assign{SEG_EN6,SEG_EN5,SEG_EN4,SEG_EN3,SEG_EN2,SEG_EN1}= //模块的结这里需要注意的是_6SEG_ENSSE3E2_1}=_1,SEG_EN2SEG_EN3,SEG_ENSGE5SEG_EN6}=0第一个句子是把SEG_EN6给赋值为1,而第二个句子是SEG_EN1给赋值为1。最后,Quartus编译生成的4_Segled1.sof文件到开发板中,接着就能看到数码管将会被点亮,显示8.,如图2.20所示。图2.20数码管外§2.4用外设来实现三人表决器前边基础越牢固,后面学起来就越轻松,因为它们是有一个进阶关系的。首先要知道何利用FPGA实现三人表决电路,第二,要会控制外设LED、按键和数码管,然后只要将其拼合在一起,就是一个实际应用小工程。做项目思路也是如此,当碰到一个大项目,会目干块实小,大是按键作为输入进行人机交互实现投票功能,当按下按键其相对应的LED将会点亮,表示该按键进行了投票。FPGA实现三人表决电路,数码管是用来显示投票的总票数。新建工程“A4_Vote4把这个工程放在专门的文件夹设置参考1.4uar基础章节。新建o源文件,命名为“A4_Vote4.v输入设计代码,综合编译后进行引脚分配,本例程的引脚分配如图2.21所示。图2.21外设的管2EG_DATA和SEG_EN,SEG_ATA7个输端口SE_DATA,SG_DATAb,EG_D,SEGDATAd,SE_DATAe,SEG_DATAf,SEG_DATAga,b,c,d,e,f,gSEG_EN包含6SEGEN1,SEGEN,SEG_N,SGE4SGE5E_N和灭这里省点DP据。代中还计了3输端口KEY、KE2、KEY3和3个输口LE1、LED、LED3过编相应码到FPGA中,FPGA.22 LEDN50SGDN50SGD下面给出该实例的o代码,如代码2.4代码2.2所示2.4三人表r module //模块名A4_Vote4,//检测按键是否按下,按下为1,悬空为//组合电路,实现三人表决器电路(行为描述always@(*) SEG_NUM07'h3fSEG_NUM17'h06SEG_NUM27'h5bSEG_NUM37'h4fKEY1,KEY2,KEY3;//按LED1,LED2,LED3; //数码管使能管 //数码管数据管 outputreg //输入端//输出端 8default:SEG_DATA= //case//begin语句assignLED1=//当触1按下其对应的D1将会亮assignLED2=//当触2按下其对应的D2将会亮assignLED3=//当触3按下其对应的D3将会亮assignSEG_EN=//SEG1-SEG3熄灭,SEG4点//模块的结最后,Quaus编译生成的A4_Vt4sf文件到开发板中,接着会发现开发板上的SEG6数码管将会点亮显示0,这是因为没有按键按下,当三个按键全部按键,可以看到LED灯将全亮,数码管也同时显示3,如图2.23所示。图2.23三人表决器板第三数字时钟设计分下到时序电路,这主要是因为,时序电路比组合电路会稍微难上一点有没有发现这么一个问题,那的数字时钟下到时序电路,这主要是因为,时序电路比组合电路会稍微难上一点有没有发现这么一个问题,那的数字时钟项目划分为哪几个知识点,如图3.1所示才能够进一步进阶学习时序电路。老规矩,在开始设的数字时钟项目之前只有掌握了组合电路学的所有的外设都是用的组合电路来实现的,并没有涉及LED进按键进数码管蜂鸣器锁存器和触发寄存器和计数锁存器和触发寄存器和计数基础进阶学板级调融会贯时序逻辑基组合逻辑基器和计数器这四个最基本的时序电路。对于这部分知识,如果你在之前已经看过了的《数字电路那么相信这些知识你都已经很好的掌握了,当然如果你学习的太久,对这部分知识有所遗忘,那么你也无需担心,会带领大家进行一个简单的复习,帮助大家巩固复习这部分知识。当学习完了时序电路基础以后,就可以进一步学习的LED、键、数码管和蜂鸣器这四个外设了,这里需要注意的是,学习的LED、按键和数码管这三就可以将以上所学的知识进行一个结合,最终实现整个数字电路时钟项目。§3.1锁存器和触发一部分时序逻辑基础知识,如3.2所示。 图3.2首要说的是锁存器,锁存器(th)图,如图3.3有功能,它只在输入脉冲的高电平(或低电平)期间对输入信号敏感并改变状态。在数字电路中可以记录二进制数字信号“0”和“1”。这里就以D锁存器为例进图,如图3.3&&&&Q&&Q&& 从D锁存器的电路图中可以看出,该电路主要是由两个部分组成,第一个部G1、G2RS锁存器,第二个部分是由G3、G4两个与非门组成的控制门电路。C为控制信号,它被加到了G3、G4两个与非门的输入端上,用来控制激励信号的输入。下面来分析一下D锁存器的工作原理,当控制端C0时,根据与非门的逻辑规律,DRDSD1RSD0SD1,RD0,RS0就是前面所说的,将单路数据D存入到锁存器之中。根据上面的讲解,已经知道了D锁存器的逻辑功能了。下面就根据逻辑功能,来写出它的特性表,如表3.1所示。么Qn1么Qn1就等于1D 表3.1D锁存器的特根据这里的特性表便可以写出它的特性方程,还是按照老方法,将输出等0X000X111000101011011111接下Qn接下Qn1于1的项提出来后,组成一个与或式,那么再来画出它的状态图,如图3.4所示就不一步步的化简了,直接给出化简后的 下D下D1时,那么输出Qn1将从01画出它的波形图,如图3.5所示可以看出D0态时,也就D0时,输出Qn1将保持0锁锁Q跟随锁Q跟随锁 Q是锁存器的输出信号,当控制信号C为高电平时,输出信号QD的变化而变化,大家看虚线内,QD的波形。当控制信号C从高电平变为低电平时,输入信号DC由高变低的那两条虚线内,所对应D为低电平,那么输出信号Q也将会锁存低电平。最后面的那两条虚线也同理,D为高电平,Q锁存高电平,至此关于D锁存器的内容就复习啦。在数字电路中可以记录二进制数字信号“0”和1。这的单元电路功能,它只在触在数字电路中可以记录二进制数字信号“0”和1。这的单元电路功能,它只在触发脉冲的上升沿(或下降沿)瞬间改变其状态D CLK

面D3.6面D3.61CLK

Q Q1 1而成的,图中的F1和F2就是D锁存器的电路符号,F1为主锁存器,F2为从锁存器,由于主锁存器的输出信号Q1就是从锁存器的输入信号,因而造成了两个锁存器的主从关系,这两个锁存器的控制信号都由外部时钟信号CLK提供 来分析D触发器是如何工作的,并且看看它是否能够解决空翻的现象。当CLK0时,CLK经过非门后直接F1的控制信号,那么此时F1的控制信号为1,F1被选通,处于工作状态,如果现在输入信号D为1的话,它经过F1,F1的输出Q1将为1,这里的Q1,不仅是F1的输出信号,也同时是F2的输入信号,不过现在F2的控制信号为0,F2被 于保持状态,输入信号D没有办法直接改变输出Q的状态,这是前半拍的工作情况,也就是说,输入信号先存入主锁存器中,而不直接影响输出Q的状态。下面再来看后半拍,外部的控制信号CLK由0变为1了,这个1,经过非门后直接作为F1的控制信号,那么此时F1的控制信号为0,主锁存器F1就被 了,它的输出Q1将保持在当前的状态,即使现在输入信号D再发生改变,Q1的值也不再受影响了。而F2的控制信号CLK此时为1,F2处于工作状态,Q1将会作为F2这个从锁存器的输入信号,直接影响到输出信号Q的状态。Q1为1,那么根据D锁存器的逻辑规律,输出的Q将为1,Q非将为0。这就是后半拍的工作情况,在后半拍里我们才能实现整个电路状态的改变,因此从上面的分析中就可以看出,在CLK01,这样的一个变化周期内,触发器的输出状态只可能改变一次,这样就克服了锁存器中存在的D主选选 保 保有翻空空D,DCLK0的值,并将这个值锁存起来,当控制信号CLK变为1时,输出信号Q才会被改变。那么D触发器,其实就是在CLK这个时钟信号由0变为1的这个边沿进行触发的,通常 就将这种触发选保D锁存器的触发方式是电平触发,和刚刚讲的边沿触发是有所不同的。这种不同是由于锁存器和触发器的电路结构不同,而造成的。这里需要注意的是,由于D锁存器的功能和D触发器的功能是一样的,所以在编写代码时很容易把D锁存器当成D触发器来使用,这种情况是应该要极力避免的。至此关于触发器的基础知识内容就已经讲完啦,在这里需要注意的是,在下面讲解的寄存器和计数器其实都是用这些边沿触发器组合而成的。§3.2寄存器和计数说完了触发器,接下来就说一说寄存器,其实只要搞明白、弄清楚触发器,寄存器也是分分钟就能够学会的。为什么会这样说呢,因为寄存器就是由多个触发器组成的,知道能够一位二进制码的时序电路叫做触发器,其实寄存器就是能够多位二进制数码的时路。为了让家能够进一步了解明白寄存器,下面举例进行说,给出由四位D触发器组成的寄存器电路图,如图示。 1 存器的工作原理的给电存器的工作原理的给电CP端一个脉冲的话,那D0D1D2D3的值就将角则表示它们的触发方式是边沿触发,这个就是寄存器的基本结构,下就来看一↑1X、X、X、0X、X、X、 从特性表 可以看出,这种寄存器有两种工作状态,分别是寄 从特性表 可以看出,这种寄存器有两种工作状态,分别是寄存和保持。当时钟信号的最后在来说一下计数器,计数器也是今后在FPGA设计中,最常用到的一种时序电你一共来了多少次脉冲。这样的特性不仅可以直接用于计数,还可以用于定时,分频等多种功能。为了让大家能够进一步了解和明白计数器,这里同寄存器一样举例进行说明,下面给出计数器的电路结构图,如3.9所示。 D2&D3&D4DQ这里的电路结构图还是稍微有点复杂的,并不能像看寄存器一样很直观的看出计数器的逻辑功能,大家看计数器的结构,它是由1、2、3和4这四个边沿D触发器,并加上三个异或门和二个与门组成的。下面来通过分析了解一下这个电路是如何被用来计数的。,假设现在电路的初始状态是0000,也就是输出端口Q1Q2Q3Q40000,下面 看下这四个D触发器此时的输入信号是什么,先看F1,F1的输入信号D,是由Q1反馈回 已知此时的Q是0,那么Q1就是1,这个1反馈给输入信号D,此时F1的输入信号就是1,下面再看F2,F2的输入信号,是Q1和Q2的值经过一个异或门之后得到的, 经此时的Q1是0,Q2也是0,那么这两个0,经过异或门,根据异或门的逻辑规律,相同出0,是由Q1和Q2经过一个与门之后的输出值,与Q3的值相异或得到的, 两个0相与,输出肯定还是0,这个输出的0,再与Q3的值相异或,根据异或门的规律,两个F4的输入信号是由,Q1、Q2和Q3经过一个与门之后,得到的输出值,再与Q4的值相异或得到的,Q1、Q2和Q3此时都是0,它们相与之后,得到的输出值也还是0,那么这个0再与Q4的值相异或,根据异或门的逻辑规律,两个输入值都是0,那么异或门输出也是0,F4的输入此, 已经分析出了F1、F2、F3和F4,这四个触发器此时的输入值了,下面 升沿,也就是CLK由0变为1了,那么四个边沿D触发器将会同时触发,当CLK这个时钟信号的上升沿到来时,D触发器的输入值将会被锁存,根据逻辑规律,下一刻4个D触发器的输出值就分别为1,0,0,0。这里如果 把Q4的值当做二进制数的最 ,把Q1的值当做二进制数的最低位,那么现在计数器所输出的值,就是二进制数0001,也就是十进制的1。计数器,接3.103.10表比较容易理解由于该特性表过于 .就不在进一步讲解给出模16同步加法计数器的状态图就省略了一部分内容,由于模16同步加法计数 收到了第一个时钟信号的上升沿,那么计数器就输出二进制数0001,依次类推,如果第二个时钟信号的上升沿到来时,大家可以试着自己推一下,这个时候计数器将会输出二进制数0010,也就是十进制数2,每当电路多到来一个时钟上升沿,计数器就会作加1运算。当电路计到第十六个脉冲时,电路状态将由1111又变为0000,完成一个循环周期,所以该电路也称为模16同步加法计数器。所谓同步就是指该电路中的四个边沿D型触发器共用一个时钟脉冲CLK,当时钟上表3.3 同步加法计数器的特性16同步加法计数器的表3.3 同步加法计数器的特性0000000011000100102001000101000101001 3.1016同步加法计数器的状态§3.3数字时钟的理 最基本的功能就是显示时、分、秒三个单位,这里就以单位秒为主进行讲解,当知道了秒是如何实现的以后,再想实现单位时和分也是非常容易的。一个两位数的单位秒一个两位数的单位秒 可以从0一直累加计数到59,然后再返回0循环进行累加,刚一个可以从0到15循环累加的计数器,叫16计数器,那么这里从0到循环累加,其实就是一个模60计数器,模60计数器的电路结构相比之前的模16是有点复杂的,如果想用门电路直接搭一个的话,还是有点麻烦的,所以一般情况,不选择直接用模60计数器来实现,而是选择用模6计数器加上模10计数器的方法实现,为什么要选择模10和模6呢,一个两位的秒,是分为个位和十位的,个位无非是要显示0到9这10个数,十位非是要显示0到5这6个数,可以将十位和个位分开来进行计数,它的个位数字现在每隔1秒变化一次,变化到9的时候,它下一刻将会归0,然后重新计数,而十位的数字每间隔10秒变化一次,变化到5的时候,它的下一刻也将会归0,然后重新计数,这就是两位数单位秒的一种实现方法,下面我给出两位数单位秒的电路示意图,如图3.11所示。模模一个上

1显示显示计数器D4模计数器显显示十 个 图3.11两位数单位秒的电路示意图从电路示意图中可以看出,先将个位的数码管和十位的数码管分别与模10和模6中的两个计数器,它们的时钟信号不是共用的,模10计数器的时钟端,信号的上升沿是需要间隔1秒来一次,而模6计数器的时钟端,信号的上升沿是需要间隔10秒来一次的,具体怎么产生需要的时钟信号,这里就不具体讲了,会在后面给大家进行讲解。当然实现这种电路的方法不仅仅只有这一种,还可以通过当模10计数器从9变成0的时候输出一个信号给模6计数器,让模6计数器工作一次来完成整个电路功能。通过上面的讲解与分析,大家有没有感觉到,想要实现一个数字时钟并不是想象中的那么难,只要实现了单位秒,后面辑基础知识就复习完了,下面就来学习整个框架的第二部分外设进阶知识。4.1所示钟设计。接4.1所示钟设计。接下在上一章节的学习由理论转为实战,来学习整个工程框架图的第二部分外设进阶知主要讲解了数字时钟整个工程框架图的第一部分时序电路基础数字时钟设计实LED进图4.1数字时钟总体设计学习框架图从该需要学习的是LED外设,进还要学习按键、数码管和蜂鸣器外设,每一个外设与讲解三人表决器时一样,也会从功能概述、设计说明、源图4.1数字时钟总体设计学习框架图从该需要学习的是LED外设,进还要学习按键、数外设相结合完成数字时钟项目的设计,并且在A4开发板上实现上数字时钟的功能§4.1LED进下面就来讲解第一个LED外设进阶,在LED外设进阶中,利用LED外设实现闪烁效果。虽然是从点灯变成了闪灯,只是一步之遥,但是从点灯到闪灯却有着本质的变化,在这里要引入一个时钟的概念,在FPGA的设计中,90%以上的功能都是基于时钟来完成的。下面就来简单的介绍一下时钟是如何产生的。晶振荡器称晶振晶振可不用任电,只要加就可以出时钟使用起十分FPGA系统的时钟源,也就是产生高低电平的周期(产生一个高电平和一个低电平为一个周期,)一般说来此频率越高,FPGA在单位时间里处理的速度越快。晶振分为无源晶体与有源晶振,无源晶体(crystal)是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来;有源晶振则叫做oscillator(振荡器。有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻振而言其缺陷是信号质量较差,通常需要精确匹配电路(用于信号匹配的电容、电感、电阻等能不要采用精度低的陶瓷晶体,如图4.2所示为各种类型的晶振。4.2各种类型的带宽不够,好像有源晶振0,如果用40MHz或60MHz的示波器测量,显示的是正弦波,这是由于的分解为基频和奇次谐波的叠加,带宽不够的话,就只剩下基频20MHz和60MHz的谐波,所以显示正弦波。完美的再现需要至少10倍的带宽,5倍的带宽只能算是勉强,所以需要至少100M的示波器。FPGA所用的晶振必须是有源的,因为FPGA没有无源晶体的启动电路。FPGA的晶振一般要接入全局时钟引脚,尽管和接在普通IO也可以实现功能,在这个实例中,用到A4开发板上的一个LED指示灯,首先在FPGA产生一个分频计数器,对FPGA的输入50MHz时钟进行分频,然后得到的分频信号(50%占4.3LED知道了整个工程是如何设计的之后,接下来就可以新建工程了,该工程命名为“A4_Led2”,把这个工程放在专门的文件夹下,其他设置参考1.4Quartus基础章节。新建o源文件,命名为“A4_Led2.v”,输入设计代码,综合编译后进行引脚分配,本例程的引4.1.3源码4.1.3源码解中的配 脚分配如图4.4所示4.4LED4.5LED从该图 可以看出,本实例代码中设计了2个输入端口和1个输出端口,其中2个判断时间1s并根据判断结果来改变LED亮灭状态入端口分别对应的是开发板上的复位按键和时钟管脚。1个输出端口对应的是开发板的D1,该代码使用FPGA外部时钟不停地对27bit的计数器 t做循环计数,然后将这个计数器t的值与设定的SET_TIME_1S(50_000_000也即是1s)做比较,当达到设定的值后,D1将会翻转状态实现闪烁,同时计数器也会得到清零,从0开始计数。下面给出该实例Vrl代码,如代码4.1所示。//--文件//--作4//-描:::5//--文件//--作4//-描:::5LED闪2014-1-6//--修订历史module(//输入端//输出端 //--外部端 //时钟的端口,开发板用的50M晶 //复位的端口,低电平复 //对应开发板上的//--端 //用来控制LED闪烁频率的定时计数 t的下一 //用来控制LED亮灭的显示寄存 //led_reg的下一个状//设置1s,计算方法为(1*10^6)us(1/50)us50MHz为开发板晶parameterSET_TIME_1S=//--逻辑功能实//时序电路,用来 t寄存器赋always@(posedgeCLK_50Mornegedge //判断复t<= //初始 tt<= //用来 t赋//组合电路,实现1s的定时always@ t //1s时t_n //如果到达1s,定时计数器将会被清t_n //时序电路,用来给led_reg寄存器赋always@(posedgeCLK_50Mornegedge //判断复led_reg<=//初始化led_regled_reg<=//用来给led_reg赋//组合电路,判断时间,控制LED的亮或always@ t==//1s时led_reg_n=//如果到达1s,显示寄存器将会改变LED的状led_reg_n=//如果未到1s,显示寄存器将会将保持LED的原状assignLED1=//最后,将显示寄存器的值赋值给端口定义了一个27位 t寄存器(当然26位才是最好的选择,这里笔者是想要说明以下问题。通过观察程序寄存器最大运行到50000000,经计算26位寄存器就能装得下50000000这个大数目,怎么计算的呢,一个一位寄存器能表示两个值0和1,那一个2位寄存器能表示个值00,01,0,11,几位寄存器就是2的几次方,而这里的27位寄存器可以存放2的27说完了这个t寄存器,接下来在来看下参数定义,这个50000000是如何得到的,的晶振是50MHz,也就是说,的时钟一个周期变化就是20ns,如果想要1秒钟变化一次,那么只需要让时钟运行个50000000次,也就得到了想要的1秒。下面也就是本程序中最的,也是用法相对比较多的a模块。always模块敏感表可以为电平、沿信号(上升沿)posedge(下降沿)e;前面都把always模块用在组1always@(*)//具体逻//always@(A,B)也可always@(Aor234laspsd always@posedgeCLK_50M)//单个沿触发的时序逻//5always@posedgeCLK_50MornegedgeRST_N////下面我对这两个组合和时序代码结构用语言进行描述一下,组合逻辑电路中al前面已al)@等待语句,意思是一直等待A和B二个敏感变量变化,不管A和B是从高变低,还是从低变高,都将会执行aw下面gin……n中的语句。如果AB都没有变化,那么als也将不往下执行,将一直循环等待。新标准可以这样书写al@(*),其解释如下:al@(*)是个组合逻辑电路的描述方式;是为了防止你在设计时考虑不周全带来一些操作,所以敏感表用*(表示全部的敏感变量,这里表示A和B),只要有任何输入信号变化,其输出立即发送变而时序逻辑电路中always@(posedgeCLK_50MornegedgeRST_N):也同样是时间等待语句,只是这里一直等待的是CLK_50M和RST_N二个敏感变量的上升沿和下降沿的变CLK_50Malwaysbgn……d中的语句。同样的如果有一个RST_N的下降沿到来,也同样会执行alwaysbgi……nd中的语句。如果两个信号都没有到来,那么将不会执行beginnd中的语句,一直等待信号的到细心的读者一定会发现时序电路中的赋值是<=,而组合逻辑电路中的赋值是=,是不是我在编写代码的时候小手一抖,多打了一个符号呢,不是这样的,在Verilog中有这么两个概念。阻塞赋值操作符用等号(即=)表示,非阻塞赋值操作符用小于等于号(即<=)表示。阻塞和非阻塞赋值的语言结构,在Verilog语言中相对来说还是比较最难理解的。在很多时候,用"="或者是"<="实际上对应的是不同的硬件电路,在这里我就不多做解释,1、是一句两句是解释不清楚它们之间的关系,2、是有可能越解释读者反而越凌乱。想要进一步了解阻塞和非阻塞可以(<=,组合电路用阻塞赋值(=,是不是一下就能分清楚了。2、是当工程很大时,分析起来很有优势,因为时序逻辑部分的写法几乎是完全一样的,这时就可以将主要精力放在分析组合逻辑3、就是代码容易解读,别人读你写的代码更容易理解。存器来把每一次1的结果保存下来,下一次加1就是累加的了。这就是第一次看时序电路代码的原因所在。为了能够让大家有更深的体会和理解,下面就将上面的这个代码改写成另一种风格,如代码4.2所示代码。代码4LED进阶外设其他风格的Vo//--文件 ://--作 ://--描 :同样使LED闪烁和之前不同的代码风//--修订历史:2014-1-module(//输入端//输出端 //--外部端 //时钟的端口,开发板用的50M晶 //复位的端口,低电平复 //对应开发板上的//--端 //定义显示寄存 //定义定时寄存//设置1s,计算方法为(1*10^9)ns(1/50)ns50MHz为开发板晶parameterSET_TIME_1S=//--逻辑功能实always@(posedgeCLK_50MornegedgeRST_N) //判断复led_reg //初始化led_regelseif tSET_TIME_1S)//1s时led_reg //如果到达1s,显示寄存器将会被取t<=//如果到达1s, t t1'b1;//1s, assignLED1 //最后,将显示寄存器的值赋值给端口 的学习知道评价硬件描述语言写的好坏的标准和其他编程语言的标准是完全不同的,我们在学习Verilog硬件描述语言的时候,一定要摒弃编程的一些固有思路,多费口舌了,代码在屏幕上,RTL在心中,这便是学习Verilog的最高境界。的代码风格不一定是最好的,但会尽量做到最好,因为知道初学者学习Verilog个者们能成一个代码风。最后,Quartus编译生成的A4_Ledsof文件到开发板中,接着可以看到D1114.64.6LED§4.2按键进阶在机械按键的触点闭合和断开时,都会产生抖动。键在机械按键的触点闭合和断开时,都会产生抖动。键开关是各种电子设备不可或缺的人应用很大一部分的按键是机械按,键按键按键稳4.7按键抖动波形图后沿抖如图4.7所示,在按键被按下的短暂一瞬间,往往会产生几毫秒的抖动,在这时候 号,势必导致误操作,甚至系统;同样,在按键的那一刻,硬件上会相应的产生抖动,会产生同样的。因此,为了保证系统能正确识别按键操作,就必须对按键的抖动进行处理。讲解,大家看,如图4.8所示。 VVC4&AB4VC&波。这一点通过分析RS触发器的工作过程很容易得到验证。由于这个A4开发板没有使用硬件消抖电路,所以只能使用消抖来解决的按键抖动问题了。对于消抖来说,可以采用延迟消抖,当检测到按下的信号后,并不立刻就执行,而是延时一段时间,然后再测按键是不是被按下,如果是按下的信号,那么说明确实是按下去了,否则就是没按下去或者发生其他的意外产生的毛刺。理论上按键抖动时间为5ms-10ms,这里就用20ms的延迟来实现按键消抖并点亮LED。基础章节。新建o源文件,命名为“A4_Key2.v输入设计代码,综合编译后进行引脚分配,本例程的引脚分配,如图4.9所示。4.2.3源码解大家看,如图.所示,4.2.3源码解大家看,如图.所示,这就是按键的逻辑设计功能框图中的配 [0[…图4.10按键进阶的逻辑设计功能框从该图 可以看出,该程序 设计了10个输入端口和8个输出端口,10个输入口分别对应着的时钟、复位以及8个按键,8个输出端口对应着的8个LED。该程序当下一个20ms到来后,再一次接收按键的值,然后与key_reg中的值做对比,看下是否LEDLED保持不变。下面给出该实例的V代码,如代码4.3所示。.按键进阶外设的o12//--文件:3//--作:4//--描:按键消抖模5//--修订历:2014-1-67module8(9//输入端//输出端//--外部端 //时钟的端口,开发板用的50MHz晶 //复位的端口,低电平复 //对应开发板上的 //对应开发板上的//--端 //用来计数按键延迟的定时计数 t的下一 //用来接收按键信号的寄存 //key_reg的下一个状 //消抖完成输出按 //对应开发板上的 //LED的下一个状//设置定时器的时间为20ms,计算方法为(20*10^6)ns1/50)ns50MHz为开发板晶parameterSET_TIME_20MS=//--逻辑功能实//时序电路,用来 t寄存器赋always@(posedgeCLK_50M,negedge //判断复t<= //初始 tt //用来 t赋//组合电路,实现20ms的定时always@ t //20ms时t_n //如果到达20ms,定时计数器将会被清t_n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论