可编程逻辑器件实验指导书V1.5(精编)_第1页
可编程逻辑器件实验指导书V1.5(精编)_第2页
可编程逻辑器件实验指导书V1.5(精编)_第3页
可编程逻辑器件实验指导书V1.5(精编)_第4页
可编程逻辑器件实验指导书V1.5(精编)_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

1、实验1 开关、发光二极管和多路器本实验的目的是学习如何连接一个简单的外部输入、输出器件到fpga芯片以及如何在fpga器件上实现逻辑电路控制简单外部器件。考虑使用de2开发板上拨动开关sw17-0(toggle switch)作为电路的输入。使用发光二极管(light emitting diodes,leds)和7段显示数码管(7-segment display)作为电路的输出。第1部分de2开发板提供了18个拨动开关,分别被命名为sw17-0,这些开关可以用作为电路的输入。de2开发板同时还提供了18个红色的led,被命名为ledr17-0,用于显示电路的输出值。图1所示一个简单的veril

2、og hdl模块,用led来显示这些开关的状态。因为拨动开关sw和led都是18个,在verilog hdl代码中,将它们表示成向量的形式更为方便,这样我们可以在编程的时候使用一个赋值语句来代替以下的18个赋值语句。assign ledr17 = sw17;assign ledr16 = sw16;assign ledr0 = sw0;在de2开发板上,fpga器件与拨动开关和发光二极管之间已经正确连接。为了正确使用sw17-0和ledr17-0,必须在quartus ii工程中正确的进行引脚分配(pin assignment)。关于引脚分配可以参考de2 user manual。例如,在de

3、2 user manual中已经指明,拨动开关sw0被连接到fpga的n25引脚,ledr0被连接到ae23引脚。最好的引脚分配方式是在quartus ii软件中导入de2_pin_assignments.csv文件,该文件可以在de2 system cd上或者altera公司的大学计划网站上获得。引脚分配过程在quartus ii introduction using verilog design中有详细描述,该文件也可以从altera公司网站上获得。注意:只有在verilog hdl代码中使用的端口名与de2_assignments.csv使用的名字完全一致时,向quarutus ii工程

4、导入de2_assignments.csv才是有效的。在de2_assignments.csv中对拨动开关和发光二极管的命名分别为sw0,sw17和ledr0,ledr17。这也是在例1中使用sw和ledr作为模块端口的原因。例1 de2开发板上使用拨动开关和发光二极管的verilog代码/连接拨动开关sw和红色的发光二极管ledr的简单的verilog hdl模块module part1(sw,ledr);input 17:0 sw;output 17:0 ledr;assign ledr = sw;endmodule执行以下步骤在de2开发板上实现例1的电路:1、 新建quartus ii

5、工程,选择cyclone ii ep2c35f672c6作为目标芯片,该芯片是de2开发板上的fpga芯片;2、 将例1所示的verilog hdl代码加入到quaruts ii工程;3、 引脚分配,并编译工程该工程;4、 将编译好的电路下载到fpga器件。扳动拨动开关观察相应的发光二极管显示,验证电路功能是否正确;第2部分图2(a)给出是2选1数据选择器(multiplexer) 有时也称为多路器的电路原理图,2选1数据选择有多种实现方式。图2(a)给出的是积之和(sum-of-product)形式,其中输入s代表选择输入(select input)。如果s = 0,则多路器的输出m等于输入

6、x,如果s = 1则输出等于y。图2(b)给出了2选1数据选择器的真值表(true table),图2(c)给出的是2选1数据选择器的电路符号。图2 二选一的数据选择器2选1数据选择器可以使用verilog hdl的连续赋值语句语句描述assign m = (s & x) | (s & y);本部分要求编写verilog hdl模块实现图3(a)所示的电路,该模块包含8个类似于上面连续赋值语句。电路包括2个8位输入x和y,产生一个8位的输出m。如果s=0,那么m =x,如果s = 1,则m=y。通常称具有上述功能的逻辑电路为8位宽的2选1数据选择器。图3(b)给出了8位2选1数据选择器的电路符

7、号,其中x,y称为8位宽的数据输入端,m是8位宽的数据输出端。按如下步骤完成本实验:图3 8位宽的数据选择器1、 新建quartus ii工程;2、 在工程中加入8位宽的2选1数据选择器verilog hdl代码。使用de2开发板上的sw17作为输入s,开关sw7-0作为输入x,sw15-8作为输入y。连接拨动开关sw到红色的发光二极管ledr,同时连接输出m到绿色的发光二极管ledg7-0。3、 引脚分配,确保作为电路的输入端口的cyclone ii fpga的引脚正确连接到拨动开关sw,作为电路输出的ppga引脚正确与ledr和ledg连接;4、 编译;5、 将编译好的电路下载到fpga器

8、件。通过扳动拨动开关sw改变电路输入,同时观察ledr和ledg的显示是否与之匹配,测试8位宽的2选1数据选择器的功能是否正确。第3部分图2给出的2选1数据选择器,可以从2个输入x和y中选择一个作为输出。本部分考虑一个稍微复杂的电路5选1数据选择器,5选1数据选择器从5个输入信号u,v,w,x和y选择一个作为输出m的值。图4(a)给出如何通过2选1数据选择器构建5选1数据选择器。电路使用3个数据选择位作为输入s2s1s0,图4(b)给出了电路真值表。图4(c)给出5选1数据选择器的电路符号。第2部分曾经介绍了8位宽的2选1数据选择器,通过实例化8个2选1数据选择器可以容易地实现8位宽的2选1数

9、据选择器。按照类似的思路,图5给出的3位宽的5选1数据选择器,可以通过实例化3个1位宽的5选1数据选择器实现。图4 1位宽5选1数据选择器图5 三位宽5选1数据选择器按照以下步骤实现3位宽的5选1数据选择器:1、 新建quartusii工程;2、 编写3位宽的5选1数据选择器的verilog hdl源文件。使用拨动开关sw17-15作为5选1数据选择器的选择输入,使用其余的15个拨动开关sw14-0作为5个3位宽的输入u,v,w,x和y。连接拨动开关sw到红色发光二极管ledr,同时连接输出m到绿色发光二极管ledg2-0。3、 引脚分配,编译该工程;4、 下载编译好的电路到fpga芯片。扳动

10、拨动开关改变电路的输入,观察leds显示情况测试3位宽的5选1数据选择器是否工作正常。确保每个输入都能被输出m正确选择。第4部分图6给出一个具有3个输入c2,c1,c0的7段显示译码电路模块。该译码电路具有7个输出用于在驱动7段显示数码管显示字符。表1列出每个输入c2,c1,c0的值所对应的显示字符。为了使本实验不至太复杂,表1中只列出了4个字符(另外如果输入为100-111,数码管显示“blank”,即不显示)。图6 每个数码管共有7个笔段,分别标注为0-6。当与每个笔段连接的信号被驱动成逻辑0时,相应的笔段就会被点亮(共阴极数码管)。本实验要求采用verilog hdl设计显示译码电路,其

11、功能是根据输入值的不同产生相应的显示编码,用于驱动数码管显示合适的字符(表1)。要求:只能使用连续赋值语句实现该电路。表1具体操作步骤如下:1. 新建quartus ii工程;2. 编写7段显示译码电路的verilog hdl文件。连接拨动开关sw2-0到译码电路的输入c2,c1,c0,连接译码电路的输出到de2开发板上的数码管hex0。数码管的每个笔段分别叫做hex00,hex01,hex06,如图6所示。代码中需要声明7位宽的输出端口output 6:0hex0;这样可以保证电路输出名与de2 user manual和de2_pin_assignments.csv中的文件名匹配。3. 引脚

12、赋值,并编译该工程;4. 下载编译好的电路到fpga芯片,扳动拨动开关改变电路的输入,观察数码管显示是否正确。第5部分考虑图7所示的电路。3位宽的5选1数据选择器用于从5个需要在数码管显示的字符中选择1个。第4部分设计的7段显示译码电路可以显示5个字符“h”,“e”,“l”,“o”以及“blank”中任意1个。字符显示对应的编码通过拨动开关sw14-0设置,具体需要显式哪个字符通过拨动开关sw17-15选择。图7 图7所示电路对应的verilog hdl代码的框架如图8所示。注意该实现中使用了第3部分和第4部分设计的电路。本部分要求对图8所示的电路进行扩展,使用5个5选1数据选择器和5个7段显

13、示译码电路,每个译码电路连接1个数码管。改变拨动开关sw17-15时,以循环滚动的在5个数码管上显示字符。例如,如果显示字符“hello”,那么电路显示模式如表2所示。表2按照如下步骤完成实验1. 新建quartus ii工程;2. 编写电路的verilog hdl代码,并将其包含到quartus ii工程中。连接拨动开关sw17-15到5个3位宽5选1数据选择器的选择输入端。按照表2的方式,将拨动开关sw14-0连接的每个3位宽5选1数据选择器的数据输入端。分别连接数据选择器的输出到5个7段显示数码管hex4,hex3,hex2,hex1和hex0。3. 引脚分配,编译整个工程;4. 下载编

14、译好的电路到fpga器件。正确设置开关sw14-0的值,扳动拨动开关sw17-15改变电路输入,观察电路工作是否正常。第6部分对第5部分设计的电路进行扩展,使用de2开发板上的全部8个数码管至少显示5个字符。当拨动开关sw17-15变化时,显示模式可以循环滚动。如果希望显示“hello”,电路的显示如表3所示。表3具体操作过程如下:1. 新建quartus ii工程,选择cyclone ii ep2c35f672c6作为目标芯片;2. 设计电路的verilog hdl源文件,并将其加入到工程中。连接拨动开关sw17-15到8个3位宽5选1数据选择器的选择输入端。按照表3的方式,将拨动开关sw1

15、4-0连接的每个3位宽5选1数据选择器的数据输入端。分别连接数据选择器的输出到8个7段显示数码管hex7,hex6,hex5,hex4,hex3,hex2,hex1和hex0。提示:(1)数据选择器的某些输入必须选择字符“blank”;(2)使用8选1数据选择器,不能使用5选1数据选择器;3. 引脚分配;4. 下载电路的fpga芯片,扳动拨动开关改变电路输入,观察显示字符是否正确;实验2 数码和显示本试验的目的是练习设计组合逻辑电路,试验的主要内容是二进制-十进制译码器和bcd码加法器等组合逻辑电路。第1部分考虑将拨动开关sw15-0所代表的值显示在7段显示数码管hex3-hex0上。即分别将

16、开关sw15-12,sw11-8,sw7-4和sw3-0所表示的十进制数显示在数码管hex3,hex2,hex1,hex0上。要求设计电路显示数码0-9。把数值1010-1111处理为dont care。inputoutputabcdhexn6hexn5hexn4hexn3hexn2hexn1hexn0000010000000001111100100100100100001101100000100001100101010010010011000000100111111100010000000000100100110001010xxxxxxx1011xxxxxxx1100xxxxxxx1101x

17、xxxxxx1110xxxxxxx1111xxxxxxx1、 新建quartus ii工程,在de2开发板实现该电路。本试验的目的是用手动方式设计7段显示译码电路。要求只能使用连续赋值语句,将输出定义为关于输入的逻辑表达式。2、 编写电路的verilog hdl源文件,并将其包含到quartus工程。将fpga引脚连接到相应的拨动开关和7段显示数码管。(参考user manual for the de2 board)。引脚分配过程也可以参考quartus ii introduction using verilog design,该文件可以在altera公司网站大学计划网站的de2 system

18、 cd上找到。3、 编译,并且将编译好的电路下载到fpga中;4、 扳动拨动开关改变电路输入,观察数码管显示并分析电路功能是否正确;第2部分本部分设计一个数码转换电路,功能是将四位二进制数v=v3v2v1v0转换为其相应的十进制数d=d1d0,其输出输入关系如表1所示。本设计的一部分电路如图1所示。表2 该设计包含一个比较器(comparator),比较输入值v是否大于9,如果大于9则输出高电平,否则输出低电平。比较器的输出控制数码管显示。本试验要求编写该电路的verilog hdl源代码。整个代码包括比较器、数据选择器、电路a(不包括电路b或者7段显示译码器)。电路一个包含4位宽的输入v,4

19、位宽的输出m和一个1位输出z。要求只使用boolean表达式来表示需要的逻辑功能(只使用assign语句)。在设计中不能包含任何if-else,case或者类似的verilog语句。具体步骤如下:1、 新建quartusii工程;2、 编译,功能仿真;验证比较器、数据选择器和电路a的功能是否正确;3、 编写电路b和7段显示译码电路的verilog hdl代码。使用de2开发板上开关sw3-0代表输入v,使用hex1和hex0显示数字d1和d0。确保引脚分配正确;4、 编译,下载编译好电路到fpga芯片中;5、 拨动拨动开关sw3-0改变收入值v,观察输出显示以测试电路的正确性;图1 二进制十进

20、制转换电路框图第3部分全加器电路的原理图如图2(a)所示,其中a,b和ci为输入,s和co为输出。图2(b)和(c)分别给出了全加器的电路符号和真值表,全加器电路为2位co, s= a + b + ci。图2(d)给出了1个4位全加器原理图,通过实例4个1位全加器可以实现4位全加器。这种类型加法器被称为行波进位加法器,因为进位信号是从一个全加器依次传递到另一个全加器。设计电路的verilog hdl代码,具体步骤如下:、 新建quartus ii工程,编写全加器子电路的verilog hdl文件,然后编写顶层设计模块,在顶层模块中实例化4个1位全加器全加器构成1个四位全加器。、 使用开关sw7

21、-4和sw3-0分别表示输入a和b。使用sw8代表加法器的进位ci,连接sw开关到相应的ledr,连接全加器输出信号cout和s到绿色的ledg。、 在project中作必要的引脚分配,编译,然后下载编译好的电路到fpga芯片。、 通过输入不同的值a,b和ci以测试电路的正确性。图2第4部分第2部分讨论了二进制到十进制数的转换问题。有些情况下,构建十进制加法电路更有意义,十进制一般可以采用bcd码表示。例如,十进制数59的bcd表示为0101 1001。本部分要求设计一个bcd码加法电路。电路的输入是bcd码a、b和进位标志cin。输出是二个bcd码和s1s0。注意本试验要求处理的最大和是s1

22、s0 = 9 + 9 + 1 = 19。执行以下步骤:1. 为bcd码加法电路新建quartus ii工程。利用第3部分的4位全加器电路计算输入信号a和b的和sum以及进位cout。再将4位宽的sum和1位的进位标志cout转换成bcd码,bcd转换电路的设计与第2部分设计的bcd码转换电路非常相似。要求使用简单的assign语句来完成逻辑的设计,设计中不允许使用像if-else和case等行为描述语句。2. 使用开关sw7-4和开关sw3-0代表输入a和b,使用sw8作为进位标志,同时连接拨动开关sw到红色发光二极管ledr,连接由输入a+b产生的四位和以及进位标志到绿色的发光二极管ledg

23、,在7段显示数码管hex6和hex4上显示a和b,在hex1和hex0上显示求和结果s1s0。3. 因为电路只处理bcd码,检查当输入a和b大于9的情况下的结果如何。如果出这种情况出现,通过点亮绿色发光二极管ledg8来指示这种情况。4. 引脚分配,编译你所设计的工程,下载编译好的电路到fpga器件;5、通过改变不同的输入值a,b和cin,测试电路功能是否正确。第5部分设计一个2位bcd码加法电路,a1a0和b1b0相加产生3个bcd码的和s2s1s0。实例第4部分设计bcd码加法电路两次。执行步骤如下:1. 使用开关sw15-8和sw7-0分别代表2个bcd码数字a1a0和b1b0。a1a0

24、的值显示在7段显示数码管hex7和hex6上,而b1b0显示在hex5和hex4上。而bcd的和s2s1s0则分别显示在7段显示数码管hex2,hex1和hex0。2. 引脚分配和编译;3. 下载电路到fpga芯片,然后测试其正确性;第6部分第5部分通过实例化第4部分设计的bcd码加法器电路实现了一个2位bcd码加法电路。根据以下提供的算法(伪代码),可以采用另外的一种方法设计2位bcd码加法电路。考虑使用什么样的电路实现这些伪代码。第1, 9, 10和18行代表加法器,第2-8行和11-17相应于数据选择器,测试条件t0 9和t1 9则需要比较器来实现。试验要求你写verilog代码来实现这

25、些伪码。要求:对于第第9行和18行所示的减法操作,要求在verilog hdl代码使用加法操作,不能使用减法操作。在代码中使用if-else语句、以及verilog hdl操作符“”和“+”,依靠verilog hdl编译器(compiler) 给出实际的电路实现,本实验的目的是考虑verilog hdl编译器对于电路设计的影响。1. 新建quartus ii工程,使用与第5部分相同的开关、发光二极管和7段显示数码管设置,然后编译你设计的电路。2. 使用quartus ii软件的rtl viewer工具检查电路结构,并比较该电路与第4部分设计的电路。3、下载编译好的电路到de2开发板,测试其正

26、确性通过改变输入a1a0和b1b0。第7部分设计组合电路,转换6位二进制数码为2位以bcd码表示的十进制数码。使用开关sw5-0代表输入的二进制数码,使用7段显示数码管hex1和hex0显示十进制数。在de2开发板上实现该电路并验证其功能是否正确。试验3 锁存器、触发器和寄存器本试验的目的是学习锁存器(latches)、触发器(flip-flops)和寄存器(registers)的设计。第1部分altera公司的fpga器件内部包含触发器单元可以用来实现所设计的电路。本试验的第4部分演示如何使用触发器设计电路。本实验首先研究在不使用fpga内部的专用触发器情况下,如何在fpga器件内部实现这些

27、存储元件(锁存器、触发器等)。图3-1 rs锁存器电路图3-1给出了rs锁存器电路的门级实现的原理图。可以使用两种风格的verilog hdl代码描述该rs锁存器电路,代码如图3-2所示。图3-2(a)给出的是rs锁存器的门级描述。图3-2(b)采用连续赋值语句(逻辑表达式)实现该rs锁存器电路,两种描述方式实现的电路结构是一样的。如果在包含4输入查找表的fpga内部实现该rs锁存器,只需要1个4输入查找表实现该rs存储器,如图3-3(a)所示。尽管使用1个4输入查找可以正确实现该锁存器电路,但是这种实现方式无法观察rs触发器的内部信号,比如r_g和s_g,因为这些内部信号不是lut的输出信号

28、。为了在电路中保持这些内部信号,必须在verilog hdl代码中包含一些编译指令。图3-2中指令/* synthesis keep */使quartus ii软件编译器为每个信号r_q,s_q,qa和qb使用独立的逻辑单元。编译后的电路会使用4个4输入查找表实现该电路,如图3-3(b)所示。图2 (a) 图2 (b)图3-3新建quartus ii工程,执行如下操作:1. 新建quartus ii工程实现该rs锁存器电路,选择目标器件为cyclone ii ep2c35f672c6。2. 按照图3-2(a)或者图3-2(b)新建verilog hdl文件,然后将该文件包含到工程中。注意:两个

29、版本的verilog hdl代码产生的电路结构是相同的。3. 编译。使用quartus ii软件的rtl viewer工具观察两种描述方式产生的门级电路结构,使用technology viewer工具验证quartus ii软件实现的电路结构是否与图3-3(b)一致。4. 新建vector waveform file(.vwf)文件,在vwf文件包含电路的输入和输出,在quarutsii软件中画出电路输入r和s的波形,使用quartus ii仿真器仿真该电路。验证电路的功能和时序是否正确。第2部分图3-4给出d锁存器电路的门级实现。图3-4按以下步骤完成本实验1. 新建quartus ii工程

30、。按照图3-2(b)的风格设计d锁存器的verilog hdl文件。使用/*synthesis keep*/综合指令,以确保信号r,s_g,r_g,qa和qb使用独立的逻辑单元实现。2. 选择cyclone ii ep2c35f672c6作为目标芯片,编译该工程。使用technology veiwer工具查看电路结构。3. 功能仿真验证电路功能是否正确,执行时序仿真验证d锁存器的时序是否正确;4. 新建quartus ii工程,在de2开发板上实现d锁存器电路。在该工程的顶层文件中需要为d锁存器电路设计合适的输入和输出端口,在顶层模块中实例d锁存器模块。使用sw0代表d锁存器的输入,sw1表示

31、d锁存器的时钟输入。连接输出q到ledr0。5. 重新编译,下载电路到de2开发板;6. 拨动拨动开关sw改变电路输入,观察输出q,测试电路功能是否正确;第3部分主从d触发器的门级实现如图3-5所示。图3-5完成如下操作:1. 新建quartus ii工程。设计主从d触发器的verilog hdl模块,主要部分是实例2个第2部分设计的d锁存器;2. 在quartus ii工程中包括恰当的输入输出端口。使用sw0表示数据输入d,使用sw1表示clk,连接输出q到ledr0;3. 编译;4. 使用technology viewer观察d触发器电路,功能仿真验证电路实现是否正确;第4部分图3-6给出

32、的电路包括3个存储元件:d锁存器、上升沿触发d触发器和下降沿触发的d触发器。按如下步骤在quartus ii软件中实现并仿真图3-6所示的电路:1. 新建quartus ii工程;2. 编写verilog hdl文件实例这3个存储元件。本部分要求不能使用/*synthesis keep*/综合指令。图3-7给出了d锁存器(图3-4)的行为级描述。d锁存器可以采用1个4输入查找表实现。使用图3-7所示的行为级描述描述图3-6所示的电路。3. 编译该工程,使用technology viewer观察实现的电路。验证使用1个查找表实现的锁存器以及fpga提供的触发器的功能。4. 新建vector wa

33、veform file(.vwf),该文件中包含电路的输入和输出,按图3-6画出输入d和clk信号。仿真产生电路的输出信号,比较3个存储元件的不同行为。图3-6module d_latch(d, clk, q) input d,clk; output reg q; always(d, clk)if(clk) q = d;endmodule图3-7第5部分本实验希望在4个7段显示数码管hex7-4上显式16位数a的值(十进制),在4个7段显示数码管hex3-0上显式16位数b值的值(十六进制)。a和b的值由de2开发板上的拨动开关提供。因为开发板上只有16个拨动开关,所以需要首先设置a的,之后在

34、设置b的值,因此电路必须具有存储功能存储a的值。1. 新建quartus ii工程;2. 设计电路的verilog hdl代码。使用key0代码低电平有效的异步复位信号,使用key1作为时钟输入;3. 将verilog hdl文件包含到quartus ii工程;4. 引脚分配;5. 重新编译,下载编译好的电路到fpga器件;6. 改变电路输入,测试电路功能是否正确;试验4 计数器本试验的目的是练习使用计数器(counter)第1部分考虑图4-1所示电路,该电路是1个由4个t触发器构成的同步四位计数器。在使能信号enable有效的情况下,该计数器在每个时钟上升沿时计数值加1。复位信号reset置

35、位时,计数器的计数值清0。本实验要求实现一个一个同类型的16位计数器。图4-1 同步4位计数器1. 根据图1所描述的计数器结构,使用verilog hdl设计16位计数器。要求:首先设计1个t触发器,通过实例化16个t触发器实现该16位的计数器。编译,观察该实现需要多少个基本逻辑单元(logic elements, les),电路的最高工作频率fmax是使多少?2. 仿真以校验电路功能是否正确。3. 使用key0作为clock输入,开关sw1和sw2分别作为enable和reset输入,7段显示数码管hex3-hex0用来显示十进制计数值。按照de2开发板上的电路做好正确的引脚分配,重新编译。

36、4. 下载编译好的电路到fpga器件,扳动拨动开关改变电路输入,测试电路功能。5. 使用quartus ii软件rtl viewer工具观察quartus ii软件是如何综合电路的?并比较quartus ii软件综合的电路与图1的差别。第2部分简化第1部分设计的verilog hdl代码,直接使用q = q + 1计算电路次态逻辑。编译16位计数器,观察所使用的基本逻辑单元(logic element, les)数目和电路的最高频率。使用rtl viewer工具观察电路结构,并比较本部分所实现的电路与第1部分所设计的电路的不同。第3部分使用lpm (library of parameteriz

37、ed modules)实现一个16位计数器,按照与以上部分相同的参数选择lpm参数,也就是说带使能端和同步复位端,比较它与前两部分所设计的电路的不同?第4部分设计并实现一个电路,功能是在7段显示数码管hex0上依次显示数字0到数字9,要求每个数字的显示时间大约是1秒钟。使用计数器来确定1秒的时间间隔。计数器使用de2开发板提供的50mhz时钟信号作为时钟输入。设计中不要使用任何其它的时钟信号,确保设计中所有的触发器所使用的时钟信号都是50mhz的时钟信号。第5部分设计并实现一个电路,功能是在7段显示数码管hex7-hex0上显示“hello”。使得5个字母大约每隔1秒从右向左依次移动。电路的显

38、示结果如表1所示。表1 试验5 时钟和定时器 本试验的目的是实现并使用实时时钟。第1部分实现一个3位的bcd码计数器,在7段显示数码管hex2-hex0上显示计数器的计数值。利用de2开发板上提供的50mhz时钟信号获得计数器的时钟输入信号,使计数器每隔1秒中计数值加1。计数器使用按钮开关key0作为复位信号,如果key0被按下计数器的计数值清0。1、新建quartus ii工程,用来实现你所设计的电路;2、采用verilog hdl语言设计电路;3、将以上编写的verilog hdl文件加入到project中,编译;4、仿真,以确定功能是否正确;5、引脚分配。将fpga的引脚连接到7段显示数

39、码管和按键key0,具体可以参考user manual for the de2 board。6、重新编译,下载设计好的电路到fpga芯片;7、观察电路工作是否正常;第2部分设计一个时钟电路并在de2开发板上实现。该时钟能够显示时、分和秒。时的显示范围为0到23,显式在7段显示数码管hex7-hex6;分的显式范围0到60,显式在数码管hex5-hex4;秒的消失范围0到60,在数码管hex3-hex2。使用开关sw15-0来预先设定时钟的小时和分钟部分的初值。第3部分在de2开发板上设计并实现一个反映时间测试电路。电路工作方式如下:1、电路通过按钮开关key0进行复位;2、经过时间t后,红色的

40、发光二极管ledr0点亮,四位bcd计数器开始工作,计数单位为毫秒。以秒计的时间从电路复位ledr0点亮开始,从复位到ledr0点亮的间隔时间使用sw7-0设置,该时间的单位为秒。3、接受测试的人员必须尽可能快按下按键key3,以熄灭ledr0,数码管显式的数字同时保持key3被按下时的状态不变。数码管上显式的时间即是需要测试的反映时间。实验6 加法器、减法器和乘法器本实验的目的是练习算术运算电路加法器、减法器和乘法器的设计。以上三个电路都需要采用2种方式实现。第一,编写verilog hdl代码实现需要的设计功能;第二,使用altera公司的lpm库中的流水线减法电路;最后,从电路结构和工作

41、速度角度对两种实现方式进行比较。第1部分实验2完成了4位行波计算器,其结构如图1(a)所示。本实验要求设计8位加法器,并在图1(b)的电路中使用该8位加法器。要求:(1)支持有符号数的加法(2的补码);(2)如果加法器给出错误符号,溢出符号overflow置位;图1具体步骤如下:1. 新建quartus ii工程,编写电路图1(b)实现的verilog hdl代码,其中的加法器使用图1(a)的电路结构;2. 在de2开发板上实现该加法器电路,连接电路的输入和输出到开发板的相应器件。连接输入a和b到开关sw15-8和sw7-0。使用key0作为低电平有效的异步复位输入,key1作为时钟输入。将加

42、法器的输出连接到开发板的发光二极管ledr7-0,使用ledg8显式电路的溢出情况。输入信号a和b的值显式在数码管hex7-6和hex5-4,加法器的和s的值显式在hex1-0。3. 编译和仿真 通过时序仿真验证电路功能是否正确,如果仿真显式电路工作正常,将电路下载到开发板验证其是否工作正常;改变a和b的值,观察电路输出是否正确。4. 在quartus ii中打开quartus ii compilation report,关注时序分析器(timing analyzer)给出的时序分析结果。找出电路的最高工作频率fmax以及电路的最常延迟路径;第2部分改进第1部分设计的电路,使其不但可以支持8位

43、二进制数的加法电路,同时还可以支持减法电路。使用sw16指定电路执行加法或者是减法操作,电路的其它连接方式与第1部分相同。1. 仿真 通过仿真验证设计功能是否正确,如果仿真通过下载设计到de开发板,通过设置不同的输入情况验证电路是否工作正常;2. 在quartus ii中打开quartus ii compilation report,关注时序分析器(timing analyzer)给出的时序分析结果。找出电路的最高工作频率fmax以及电路的最常延迟路径;第3部分使用quartus ii的参数化模块库(library of parameterized module, lpms)提供的lpm_ad

44、d_sub模块取代图1(a)给出的加法器。调用lpm模块的具体操作可以参考using library module in verilog design(附录1)。1. 配置lpm_add_sub模块,使其只执行加法操作,其余参数参考第1部分的加法器参数。使用lpm向导产生的lpm_add8.v文件。在verilog hdl代码中实例该模块,编译该工程,并使用quartus ii chip editor工具观察电路实现的细节;图2给出了一种调用chip editor工具的方法,在quartus ii project navigator窗口,右键点lpm_add8子电路,选择locate loca

45、te in chip editor,打开chip editor窗口,如图3所示。cyclone ii fpga器件内部用于实现加法器的逻辑单元会被高亮成蓝色。将鼠标指向这些被高亮的逻辑单元并双击可以打开resource property editor窗口,如图4所示。在resource property editor窗口通过节点名(node name)可以选择实现加法电路的9个逻辑单元中的任何一个。在resource property editor窗口,设计者可以检查逻辑单元以及逻辑单元之间是如何连接的。图2 图3 使用以上介绍的工具,同时参考cyclone ii fpga的数据手册,分析采用

46、lpm_add_sub模块实现的8位加法器电路。图42. 查看quartus ii compilation report,比较以上几种实现方式的最高工作频率。讨论不同实现方式之间的差别。第4部分使用预先定义的lpm_add_sub模块取代图1中加减嗲了,重复第2部分实验过程。简单评论使用lpm模块会的电路结构,并比较两次得到的电路结构的最高工作频率有何不同。并分析lpm_add_sub模块是如何实现overflow信号的。第5部分图5(a)给出经典乘法的操作计算过程,其中,。图5(b)给出两个4位二进制数乘法计算过程。因为b的每一位要么是1,要么是0,因此需要对a或者0移位并求和。图5(c)给

47、出二进制数乘法的计算过程,首先将a与b的每一位进行与操作并移位,在进行求和操作。四位二进制乘法的一种实现如图6所示。因为这种实现方式电路结构比较规则,所以这种结构的乘法器叫做矩阵乘法器(array multiplier)。图中的阴影部分与图5(c)中的阴影部分对应。图5图6按照如下步骤实现矩阵乘法器电路:1. 新建project工程;2. 设计电路的verilog hdl代码,将其包含到quartus ii工程中,编译;3. 功能仿真,验证代码功能是否正确;4. 使用sw11-8表示输入a,开关sw3-0表示输入b,将a和b对应的十进制值显示在7段显示数码管hex6和hex4上,结果显示在数码

48、管hex1和hex0上;5. 引脚分配;6. 重新编译,下载设计到fpga芯片;7. 搬到开关改变输入信号a和b的值,观察设计是否工作正常;第6部分将第5部分设计的4位乘法器扩展为8位乘法器电路,两个8位二进制数相乘,其乘积为16位的二进制数。使用开关sw15-8表示输入a,开关sw7-0表示输入b。输入a和b对应的十进制值分别显示在7段显示数码管hex7-6和hex5-4上。a和b的乘积显示在数码管hex3-0上。在电路中加入寄存器,用于保存输入信号a,b以及乘积p,电路结构与第1部分的图1相似。编译、仿真,验证电路工作是否正常。使用quartus ii的timing analyzer工具观

49、察电路的最高工作频率,以及电路最长的延迟路径?第7部分修改上述设计的verilog hdl代码,使用参数化模块库lpm提供的lpm_mult模块实现上述的88的乘法器。完成以上设计任务。比较该设计与第5部分设计:电路的最高工作频率和电路的最高工作频率;第8部分在许多的实际应用中,往往需要执行多个乘法操作,并求多个乘积的和。本部分要求设计电路实现以下计算输入和是8位无符号数,是16位二进制数。电路必须提供一个进位信号。电路的所有的输入和输出都使用寄存器,与图1(b)所示的电路结构类似。1. 新建quartus ii工程用于在de2开发板上实现该电路;使用lpm_mult和lpm_add_sub模

50、块实现设计中的乘法和加法操作;2. 连接输入a和c到开关sw15-8,连接输入b和d到开关sw7-0。使用开关sw16作为选择信号,从输入信号和选择合适的输入。使用sw17作为写使能信号(we)。如果we=1时,每个时钟信号的上升沿,输入数据被装载到输入寄存器。如果we=0,输入寄存器不工作。3. 使用key0作为低电平有效的异步复位信号,使用key1作为时钟信号。4. 使用数码管hex7-6显示a或者c对应的十进制数,使用hex5-4显示b或者d,使用sw16作为选择信号。使用数码管hex3-0显示和s,使用ledg8显示进位输出。5. 编译,进行功能仿真或者时序仿真验证电路是否工作正常。下

51、载电路到de2开发板,验证电路是否工作正常。6. 数字电路设计通常需要满足某些速度要求,比如电路必须使用某些特定频率的信号作为时钟信号。这些要求一般以时序约束(timing constraints)的形式提供给cad系统。(quartus ii 软件使用时序约束的方法,参考timing considerations with verilog-based designs)本设计使用按键模拟时钟信号,因此电路的时序约束容易满足(时钟频率非常低)。但是为了演示电路设计中涉及的问题,这里假设电路要求的工作频率为220mhz。在quartus ii软件中输入电路的工作频率为220mhz,重新编译。tim

52、ing analyzer报告无法满足该时序要求。检查quartus ii给出的时序分析报告,简要描述电路中违反时序要求的路径。7. 对于给定的电路,在电路中插入寄存器,缩短电路中最长的组合逻辑通常可以提供系统最高工作频率。这种设计技术通常称为流水线设计,插入到电路中的寄存器通常称为流水线寄存器。在乘法器和加法器之间插入流水线寄存器。重新编译,讨论电路结构。第9部分quartus ii软件提供预先设计的模块altmult_add可以执行类似形式的计算。使用模块altmult_add重新实现上述设计。仿真该设计,下载电路到fpga验证电路是否正确。简要讨论采用altmult_add模块实现的电路与

53、前面介绍电路模块之间的差别,比较各种实现方法实现的电路之间的性能差别。实验7 有限状态机本实验练习有限状态机的设计;第1部分采用有限状态机的方式设计序列检测器。所谓序列检测就是检测连续输入的位流中是否存在特定的编码。本部分要求设计有限状态机检测序列中是否包含连续的4个1或者连续的4个0。电路输入为w,输出为z,如果w在连续四个时钟周期为0或者1,输出z将被置位1个时钟周期。输入w和输出z之间的时序关系如图1所示。图1 该序列检测器电路的状态转换图如图2所示。本部分要求手动设计序列检测器fsm实现该状态转换图,包括每个寄存器的次态逻辑。表1采用独热码对状态转换图中的各个状态进行赋值,需要8个状态

54、寄存器(触发器)。表1 序列检测器的状态转换表图2 按照如下步骤设计该电路,并在de2开发板上实现该电路:1. 新建quartus ii工程,选择cyclone ii ep2c35f672c6作为目标器件;2. 编写序列检测器的verilog hdl代码。verilog hdl代码要实例化9个触发器,并指明每个触发器的数据输入端的组合逻辑的逻辑表达式。要求代码中只能使用连续赋值语句assign说明触发器数据输入端口的组合逻辑的逻辑表达式。注意:因为设计中使用独热码,所以通过观察很容易确定这些逻辑表达式。使用de2开发板上的开关sw0作为fsm的低电平有效的异步复位信号,使用开关sw1作为输入w

55、,使用按钮key0表示时钟输入。使用ledg0表示输出z。时钟红色的leds显示状态寄存器的取值。3. 加设计文件加入到quartus ii工程,在quartus ii中进行引脚分配,编译整个工程;4. 仿真;5. 如果仿真验证电路工作正常,下载电路到fpga芯片。验证电路是否工作正常。输入不同的序列,观察输出led是否工作正常。重点观察fsm的状态转换过程是否正常以及输出ledg0是否显示正确。6. 最后,考虑修改表1给出的独热码状态赋值。如果fsm处于复位状态时,状态寄存器的输出如果全部为0,在使用fpga实现fsm时,fsm往往得到简化。fpga内部的触发器通常包含一个清零端(clear

56、),该输入端通常用于实现电路的复位状态,但是触发器通常不会包含置位端set。表2给出一个改进的独热码状态赋值(有时称为几乎独热码),其复位状态a全部使用0。这种编码方式可以通过对状态变量取反实现。使用表2所示的状态赋值重新设计verilog hdl代码。(提示:只需对原设计做很少的修改即可)。编译新设计,仿真,并下载设计的de2开发板,观察设计是否正确。表2 第2部分本部分依然要设计图2给出的fsm,但需要设计另一种风格的verilog hdl代码,不在需要人为为每个触发器的输入端设计组合逻辑电路。相反,在可以在verilog hdl代码中使用一个always块(在其中使用case语句)描述fsm的状态转换过程,再通过另一个always块描述fsm的状态寄存器;可以再使用第三个always块或者简单的连续赋值语句实现

温馨提示

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

评论

0/150

提交评论