《FPGA与SOPC设计教程》课件第6章_第1页
《FPGA与SOPC设计教程》课件第6章_第2页
《FPGA与SOPC设计教程》课件第6章_第3页
《FPGA与SOPC设计教程》课件第6章_第4页
《FPGA与SOPC设计教程》课件第6章_第5页
已阅读5页,还剩172页未读 继续免费阅读

下载本文档

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

文档简介

第6章数字系统设计练习6.1开关、LED灯及多路复用器6.2二进制与BCD码的转换及显示6.3无符号数乘法器6.4锁存器和触发器6.5计数器6.6时钟与定时器6.7有限状态机6.8存储器块6.9简单的处理器6.10增强型处理器6.1开关、LED灯及多路复用器6.1.1将输入/输出器件连接到FPGA上

DE2平台上提供了18个波段开关,可以作为电路的输入,表示为SW17~SW0;还有18个红色LED,表示为LEDR17~LEDR0,可以作为输出显示之用。使用红色LED显示波段开关状态的电路可以用Verilog语言简单地实现,代码如下:

assignLEDR[17]=SW[17]; assignLEDR[16]=SW[16]; assignLEDR[0]=SW[0];由于分别有18个红色LED和18个波段开关,因此在Verilog语言中可以很方便地用向量表示它们,进而可用一个赋值语句完成同样的功能。DE2平台上,LEDR17~LEDR0和SW17~SW0是与FPGA管脚直接相连的,使用这些管脚之前应参照本书附录B或DE2用户手册中DE2平台的引脚分配表,分配连接波段开关和LEDR的FPGA管脚,例如SW0连接在FPGA的N25脚,LEDR0连接在FPGA的AE23脚。最简单的做法是在Quartus中导入DE2_pin_assignments.csv,导入方法参见本书2.10.3小节。为保证从DE2_pin_assignments.csv导入的引脚分配表能够正确使用,在Verilog模块中使用到的引脚名称必须与该文件中的完全一致,DE2_pin_assignments.csv中用SW[0]~SW[17]和LEDR[0]~LEDR[17]分别表示18个波段开关和18个红色LED灯,因此在编写的Verilog代码中也必须用这种方式来表示。用向量实现波段开关与红色LED相连的模块代码如代码6.1所示。代码6.1将波段开关与红色LED相连的Verilog代码。modulepart1(SW,LEDR);input[17:0]SW; //波段开关output[17:0]LEDR; //红色LEDassignLEDR=SW;endmodule请按照以下步骤在DE2上实现代码6.1并进行测试:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路,将FPGA器件设置为EP2C35F672C6。

(2)建立一个Verilog文件,其内容如代码6.1所示,将该Verilog文件添加到工程中并编译整个工程。

(3)导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表,分配连接波段开关和红色LED的FPGA管脚。

(4)编译该工程,完成后下载到FPGA中。

(5)通过拨动波段开关并观察红色LED的变化来验证所设计的功能是否正确。6.1.22选1多路复用器图6.1(a)是一个2选1多路复用器电路,如果s=1,则输出m=y;如果s=0,则输出m=x。图6.1(b)是这个电路的真值表。图6.1(c)是该电路的符号表示。图6.1最简单的多路复用器这个多路复用器可以用以下的Verilog语句来实现:

assignm=(∼s&x)|(s&y);这部分练习的任务是实现如图6.2(a)所示的8位2选1多路复用电路,需要用8个赋值语句。该多路复用器的输入为X和Y,都是8位宽,输出M也为8位宽。如果s=0,M=X;如果s=1,则M=Y。图6.2(b)是该电路的符号表示。

2选1多路复用器电路的具体实现步骤如下:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog文件,用SW17作为输入s,以SW7~SW0作为输入X,以SW15~SW8作为输入Y,将波段开关与红色LED连接以显示其状态,用绿色LED即LEDG7~LEDG0作为输出M,将该Verilog文件添加到工程中。

(3)导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表,分配连接波段开关、红色LED以及绿色LED的FPGA管脚。

(4)编译工程,完成后下载到FPGA中。

(5)拨动波段开关并观察红色LED与绿色LED的变化,以验证8位2选1多路复用器的功能是否正确。图6.28位2选1多路复用器6.1.33位宽5选1多路复用器与图6.2(a)所示的2选1多路复用器不同,图6.3(a)所示电路的任务是实现一个5选1的多路复用器,即从5个输入x、y、w、u和v中选取一个输出到m。这个电路采用了4个2选1多路复用器来实现,输出选择用一个3位的输入s2s1s0实现,该电路的符号表示如图6.3(b)所示,表6.1为该5选1多路复用器的真值表。图6.35选1多路复用器图6.4实现了一个3位5选1多路复用器,这个电路中包含了3个图6.3(a)所示的电路。请按照以下步骤实现3位5选1多路复用器:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog文件,用SW17~SW15作为选择端输入s2s1s0,用剩下的15个波段开关SW14~SW0作为输入U、V、W、X、Y,将波段开关与红色LED连接以显示波段开关的状态,用绿色LED即LEDG2~LEDG0作为输出M,将该Verilog文件添加到工程中。图6.43位5选1多路复用器

(3)导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表,分配连接波段开关、红色LED以及绿色LED的FPGA管脚。

(4)编译工程,完成后下载到FPGA中。

(5)拨动波段开关并观察红色LED和绿色LED的变化,以验证3位5选1多路复用器的功能是否正确,确定从U到Y的所有输入都能够被选择输出到M。6.1.4用七段数码管显示简单字符图6.5所示是一个简单的七段解码器模块,c2c1c0是解码器的3个输入,用c2c1c0的不同取值来选择在七段数码管上输出不同的字符。七段数码管上的不同段位用数字0~6表示。注意七段数码管是共阳极的。表6.2列出了c2c1c0取不同值时数码管上输出的字符。本例中只输出4个字符,当c2c1c0取值为100~111时,输出空格。图6.5七段解码器请按照以下步骤实现七段解码器电路:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog文件,实现七段解码器电路,用SW2~SW0作为输入c2~c0,DE2平台上的数码管分别为HEX0~HEX7,输出接HEX0,在Verilog中用以下语句定义端口:

output[0:6]HEX0;

(3)导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表分配引脚。

(4)编译工程,完成后下载到FPGA中。

(5)拨动波段开关并观察七段数码管HEX0的显示,以验证设计的功能是否正确。6.1.5循环显示5个字符图6.6中的电路采用了一个3位5选1多路复用电路,可分别从输入的5个字符中选择1个字符并通过七段解码器电路在数码管上显示H、E、L、O和空格中的任一字符。将SW14~SW0分为5组,分别代表H、E、L、O和空格等5个字符,用SW17~SW15来选择要显示的字符。图6.6循环显示5个字符的电路代码6.2是实现这个电路的代码大纲,其中部分代码省略,被省略掉的代码是前文练习中编写过的。在这个电路中我们将6.1.3小节和6.1.4小节中的电路作为子电路。对代码6.2中的代码进行扩展后,可以用5个数码管显示,当改变SW17~SW15的状态时,最终显示的内容与SW17~SW15的对应关系如表6.3所示,即可以循环显示单词“HELLO”。代码6.2图6.6所示电路的Verilog代码。modulepart5(SW,HEX0);input[17:0]SW; //声明波段开关output[0:6]HEX0; //声明七段数码管wire[2:0]M;mux_3bit_5to1M0(SW[17:15],SW[14:12],SW[11:9],SW[8:6],SW[5:3],SW[2:0],M);char7segH0(M,HEX0);endmodule //实现一个3位5选1多路复用器

modulemux_3bit_5to1(S,U,V,W,X,Y,M); input[2:0]S,U,V,W,X,Y; output[2:0]M;endmodule//实现一个H、E、L、O和空格的5字符七段解码器modulechar_7seg(C,Display);input[2:0]C;//输入码output[0:6]Display;//输出码

Endmodule请按照以下步骤实现“HELLO”的循环显示电路:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog文件,用SW17~SW15作为5个3位5选1多路复用器的选择输入,按照表6.3的对应关系,将SW14~SW0连接到每个多路复用器实例的输入端,将5个多路复用器的输出接到5个七段数码管HEX4~HEX0上,将Verilog文件添加到工程中来。

(3)导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表,分配引脚。

(4)编译工程,完成后下载到FPGA中。

(5)先按表6.3设置好SW14~SW0的位置,然后改变波段开关SW17~SW15的位置,观察显示是否正确。6.1.6循环显示8个字符在6.1.5小节的基础上,把5个字符扩展到8个字符,如果显示内容少于8个,比如显示“HELLO”,则数码管显示输出与SW17~SW15的对应关系如表6.4所示。请按照以下步骤实现“HELLO”的循环显示电路:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog文件,这里会用到8个5选1多路复用器的电路,用SW17~SW15作为8个3位5选1多路复用器的选择输入,按照表6.4的对应关系,将SW14~SW0连接到每个多路复用器电路的输入端(有些多路复用器的输入会是空格),将8个多路复用器的输出接到8个七段数码管HEX7~HEX0上,将Verilog文件添加到工程文件中来。

(3)导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表,分配引脚。

(4)编译工程,完成后下载到FPGA中。

(5)先按表6.4设置好SW14~SW0的位置,然后改变波段开关SW17~SW15的位置,观察循环显示是否正确。6.2二进制与BCD码的转换及显示6.2.1二进制数字的显示在HEX3~HEX0上显示SW15~SW0所对应的数值,SW15~SW12、SW11~SW8、SW7~SW4和SW3~SW0分别对应HEX3、HEX2、HEX1和HEX0。在数码管上只显示数字0~9,当波段开关表示的数字在1010~1111之间时,没有显示输出。显示二进制数字的具体步骤如下:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog文件,实现要求的任务,本练习的目的是手工推导出数码管显示的逻辑函数,因此要求只能用assign语句和布尔表达式实现所有的功能。

(3)导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表,分配引脚。

(4)编译工程,完成后下载到FPGA中。

(5)改变SW15~SW0的位置,观察显示是否正确。6.2.2二进制值到十进制值的转换若将4位二进制输入V=v3v2v1v0转换成2位十进制的等价表示D=d1d0,在HEX1和HEX0上分别显示d1和d0,则输入的二进制值与输出的十进制值之间的对应关系如表6.5所示。图6.7是实现这个任务的部分电路,比较器判断V是否大于9,比较器的输出z可以控制数码管的显示。二进制值转换为十进制值的步骤如下:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog模块,包括电路中的比较器、多路复用器和电路B,但不包括电路A和七段解码器。这个模块的输入为4位二进制数V,输出是z和4位的M。与6.2.1小节的要求一样,编写这个模块时只能用assign语句和布尔表达式实现所要求的功能,而不能出现if-else和case等语句。图6.7显示二进制数值的电路6.2.3并行加法器全加器的电路如图6.8(a)所示,输入为a、b和ci,输出为s和co;图6.8(b)是该电路的符号表示。表6.6是全加器的真值表。全加器实现了二进制加法,其输出为一个2位的二进制和:cos=a+b+ci。用4个全加器模块的电路可以实现4位二进制数的加法,如图6.8(c)所示,这种加法电路一般称为并行加法器。图6.8全加器及并行加法器(a)全加器电路;(b)全加器电路符号;(c)并行加法器电路实现并行加法器电路的步骤如下:

(1)为并行加法器建立一个QuartusⅡ工程文件。

(2)用Verilog编写一个全加器电路模块,然后用4个全加器电路来实现并行加法器电路。

(3)分别用SW7~SW4和SW3~SW0代表输入A和B,使用SW8代表加法器的进位输入ci,将SW8~SW0直接连接到LEDR8~LEDR0上,而将加法器的输出co和S连接到LEDG4~LEDG0上,将代码添加到工程中。

(4)导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表,分配引脚。

(5)编译工程,完成后下载到FPGA中。

(6)改变输入A、B和ci的值,观察计算结果是否正确。6.2.41位BCD加法器在6.2.2小节的练习中,将二进制数转换成十进制数,而在有些场合,我们需要用二进制数表示十进制数,就是将十进制数的每一位用4位二进制数来表示,比如将十进制数59表示为二进制数01011001。这种用4位二进制数表示十进制数的编码,称为BCD码。本节练习的任务是实现BCD码的加法,输入为两个BCD码A和B以及1位的进位输入,输出是和的BCD码S1S0。这个电路能够处理的和的最大值为S1S0=9+9+1=19。请按照以下步骤完成练习:

(1)为BCD加法器新建一个QuartusⅡ工程。

(2)建立一个Verilog文件,实现要求的任务。先用6.2.3小节中完成的加法器实现4位二进制加法,输出为A+B的4位和S1S0及进位位输出c,然后再设计一个二进制到十进制的转换电路,这个电路类似于6.2.2小节中完成的电路,注意最大输出为19。编写这个模块时只能用assign语句和布尔表达式实现所要求的功能,而不能出现if-else和case等语句。

(3)将编写好的Verilog文件添加到工程中,导入DE2_pin_assignments.csv中的引脚分配或参照附录B中DE2平台的引脚分配表,分配引脚。

(4)编译工程,完成后下载到FPGA中。

(5)输入不同的A、B和ci,验证输出S是否正确。6.2.52位BCD加法器若设计一个2位BCD加法器,计算两个2位BCD码A1A0和B1B0的和,输出为3位BCD码S2S1S0,则可以用两个1位BCD加法器来实现本电路。请按照以下步骤完成练习:

(1)用SW15~SW8和SW7~SW0分别表示两个BCD码输入A1A0和B1B0,A1A0的值显示在数码管HEX7和HEX6上,B1B0的值显示在数码管HEX5和HEX4上,S2S1S0显示在数码管HEX2~HEX0上。

(2)分配引脚。

(3)编译工程,完成后下载到FPGA中。

(4)输入不同的A1A0和B1B0的值,验证输出S2S1S0是否正确。6.2.62位BCD加法器的另一种实现在6.2.5小节的练习中,通过调用两个1位BCD加法器实现了一个2位BCD加法器。在本节练习中,我们按代码6.3所示的用伪代码描述的算法重新设计一个2位BCD加法器。代码6.3实现2位BCD加法器的伪代码。1 T0=A0+B02 if(T0>9)then3 Z0=10;4 c1=1;5 else6 Z0=0;7 c1=0;8 endif9 S0=T0-Z010 T1=A1+B1+c111 if(T1>9)then12 Z1=10;13 c2=1;14 else15 Z1=0;16 c2=0;17 endif18 S1=T1-Z119 S2=c2这个伪代码用电路实现起来很容易,第1、9、10和18行可用加法器实现,第2~8行及第11~17行是多路复用器,可以用比较器判断T0>9和T1>9。用Verilog代码实现这段伪代码时,注意第9行和第18行的减法可以用加法实现。该伪代码中使用了if-else结构以及“>”及“+”等运算,比实际的电路要抽象一些,其目的是让Verilog编译器去决定具体电路的实现。请按照以下步骤完成练习:

(1)建立新的QuartusⅡ工程,所有的输入、输出以及显示都与6.2.5小节中的练习相同,参照代码6.3所示的伪代码编写一个Verilog文件,并添加到工程中去。

(2)编译该工程,用QuartusⅡ的RTLViewer工具查看编译后生成的电路,并与6.2.5小节中的电路进行比较。

(3)把编译后的电路下载到FPGA中。

(4)对电路进行功能验证。6.2.76位二进制数转换为2位十进制数的电路用Verilog语言实现一个电路,将6位二进制数转换成2位BCD编码的十进制数,用SW5~SW0作为6位二进制数输入,用HEX1和HEX0显示2位十进制数,完成后在DE2上验证该电路。6.3无符号数乘法器6.3.14位二进制数乘法图6.9(a)为两位十进制数乘法的实现P=A×B,其中A=12,B=11,P=132;图6.9(b)是用4位二进制乘法实现的A和B的乘积,对于二进制乘法,B的每一位要么是0,要么是1,因此算式中的加数要么是移位的A,要么是0000;图6.9(c)是用逻辑与实现二进制乘法的过程。图6.9二进制数相乘(a)十进制;(b)二进制;(c)二进制数乘法的实现过程图6.10是实现4位二进制乘法P=A×B的电路。该电路中,用逻辑与实现每一行的乘法,用全加器实现每一列的加法,从而得到所需要的和。根据这种乘法器的结构,我们把它称做矩阵乘法器。图6.104位二进制乘法器的实现电路请按照以下步骤完成本练习:

(1)新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog文件,实现要求的任务,再编译工程,仿真并验证代码的正确性。

(3)用SW11~SW8表示输入A,用SW3~SW0表示输入B,将A和B的十六进制值分别用HEX6和HEX4显示,将P=A×B的乘积结果用HEX1和HEX0显示。

(4)重新编译工程,并下载到FPGA中。

(5)改变相关波段开关的位置,观察显示结果。6.3.28位二进制数乘法参照6.3.1小节的结果,将乘数A和B扩展到8位宽,用SW15~SW8和SW7~SW0分别表示乘数A和B,A和B的十六进制值分别在HEX7~HEX6和HEX5~HEX4上显示,16位乘积输出P=A×B在HEX3~HEX0上显示。6.3.3用LPM实现8位二进制数乘法用QuartusⅡ软件中提供的参数化功能模块lpm_mult实现8位二进制无符号数的乘法。完成后,与6.3.2小节的电路比较,看这两种实现方法所占用的逻辑单元的数量有什么不同。6.4锁存器和触发器6.4.1RS锁存器

Altera公司的FPGA内有可供用户使用的触发器电路。在6.4.4小节中将会涉及到这些触发器的使用方法,而在本小节的练习中我们探讨如何不使用专用触发器而在FPGA中构建存储单元。图6.11是一个门控RS锁存电路。这个锁存电路可以用两种方法实现:第一种方法为使用逻辑门电路来实现,如代码6.4所示;另一种方法则使用逻辑表达式来实现,如代码6.5所示。如果在一个含有4输入查找表的FPGA中实现这个电路,那么只需一个查找表即可,如图6.12(a)所示。图6.11门控RS锁存器图6.12在FPGA上实现门控RS锁存器(a)用一个4输入查找表实现;(b)用4个4输入查找表实现代码6.4用逻辑门电路实现的RS锁存器。modulepart1(Clk,R,S,Q);inputClk,R,S;outputQ;wireR_g,S_g,Qa,Qb; /*synthesiskeep*/and(R_g,R,Clk);and(S_g,S,Clk);nor(Qa,R_g,Qb);nor(Qb,S_g,Qa);assignQ=Qa;endmodule代码6.5用逻辑表达式实现的RS锁存器。modulepart1(Clk,R,S,Q);inputClk,R,S;outputQ;wireR_g,S_g,Qa,Qb; /*synthesiskeep*/assignR_g=R&Clk;assignS_g=S&Clk;assignQa=∼(R_g|Qb);assignQb=∼(S_g|Qa);assignQ=Qa;endmodule图6.12(a)中,尽管用一个4输入查找表就可以实现门控RS锁存器,但使用这种方法无法观察锁存器的内部信号,比如R_g和S_g信号。为了能够观察到这两个内部信号,需要使用编译指令,在Verilog代码中出现的/*synthesiskeep*/就是编译指令,要求Quartus在编译R_g、S_g、Qa和Qb信号时各自采用独立的逻辑单元。编译后生成的电路如图6.12(b)所示。请按照以下步骤完成练习:

(1)为RS锁存器新建一个QuartusⅡ工程,用以在DE2平台上实现所要求的电路。

(2)建立一个Verilog文件,采用代码6.4或代码6.5(两种代码生成的电路是一样的)将这个Verilog文件添加到工程中。

(3)编译这个工程,用RTLViewer工具查看代码生成的门级电路,然后用TechnologyMapViewer工具查看锁存器是否是按图6.12(b)所示方式实现的。

(4)建立一个矢量波形文件,绘制R、S和Clk的波形,并使用仿真工具对电路进行仿真。6.4.2D锁存器图6.13所示是一个D锁存器电路。图6.13D锁存器电路请按照以下步骤完成练习:

(1)为D锁存器新建一个QuartusⅡ工程。

(2)建立一个Verilog文件,采用类似于代码6.4和代码6.5的代码,实现图6.13中的D锁存器。在Verilog代码中采用编译指令/*synthesiskeep*/ 以保证编译时编译器采用独立的逻辑单元实现R、R_g、S_g、Qa和Qb信号。

(3)用RTLViewer工具查看代码生成的门级电路,然后用TechnologyMapViewer工具查看锁存器在FPGA中的实现。

(4)再新建一个QuartusⅡ工程,用以在DE2平台上实现D锁存器。

(5)建立一个顶层文件,在顶层文件中使用一个D锁存器来定义相应的输入/输出引脚,用SW0作为输入D,用SW1作为Clk,并将Q连接到LEDR0。

(6)编译工程,并将电路下载到DE2平台上。

(7)对电路进行功能测试。6.4.3D触发器图6.14所示是一个主从式D触发器电路。图6.14主从式D触发器电路请按照以下步骤完成练习:

(1)为D触发器新建一个QuartusⅡ工程。

(2)建立一个Verilog文件,采用两个D锁存器来实现D触发器。

(3)将Verilog文件添加到工程中,配置输入/输出引脚,用SW0作为输入D,用SW1作为Clk,并将Q输出连接到LEDR0;

(4)编译工程,用RTLViewer工具查看代码生成的门级电路,然后用TechnologyMapViewer工具查看触发器在FPGA中的实现。

(5)将电路下载到DE2平台上,对电路进行功能测试。6.4.4三种存储单元图6.15(a)所示的电路包含了三种不同的储存单元:一个门控D锁存器、一个以上升沿触发的D触发器和一个以下降沿触发的D触发器。图6.15三种存储单元的电路和时序图(a)电路;(b)时序请在QuartusⅡ中按以下步骤完成练习:

(1)新建一个QuartusⅡ工程。

(2)建立一个Verilog文件,调用三种不同的存储单元来完成电路。在这部分的练习中,可以不用编译指令/*synthesiskeep*/。代码6.6给出了用Verilog实现D锁存器的代码,这段代码使用一个4输入查找表实现D锁存器。可采用类似的代码来实现D触发器。

(3)编译工程,用RTLViewer工具查看代码生成的门级电路,然后用TechnologyMapViewer工具查看触发器在FPGA中的实现,可以看到D锁存器由一个4输入查找表实现,而D触发器则由FPGA内的触发器实现。

(4)建立一个矢量波形文件,按图6.15(b)的时序绘制D和Clk的波形,使用仿真工具对电路进行仿真,并比较三种存储单元的不同。代码6.6用Verilog语言实现D锁存器。moduleD_latch(D,Clk,Q);inputD,Clk;outputregQ;always@(D,Clk)if(Clk)Q=D;endmodule6.4.5D触发器的应用在DE2上显示两个16位数A和B,A在HEX7~HEX4上显示,B在HEX3~HEX0上显示。用SW15~SW0输入A和B,先输入A,然后再输入B,因此要将数据A保存在电路中。可按照以下步骤完成练习:

(1)新建一个QuartusⅡ工程。

(2)建立一个Verilog文件,实现所要求的任务,用KEY0作为低电平有效的异步复位输入,KEY1作为时钟输入。

(3)将Verilog文件添加到工程中,编译工程,用RTLViewer工具查看代码生成的门级电路,然后用TechnologyMapViewer工具查看触发器在FPGA中的实现。

(4)将电路下载到DE2平台上并进行功能测试。6.5计数器6.5.1用T触发器实现16位计数器图6.16是由4个T触发器构成的4位计数器,如果Enable端有效,则在Clock的每个上升沿,计数器输出加1。Clear信号可以使计数器清零。按照这种结构,用T触发器实现一个16位计数器。图6.164位计数器请按以下步骤完成练习:

(1)建立一个Verilog文件,参照图6.16所示的结构实现一个16位的计数器。Verilog文件中应该有一个T触发器模块,通过对T触发器模块的16次调用来实现16位计数器。

(2)编译这个电路,查看所占用的LE数量以及Fmax值。

(3)对电路进行仿真。

(4)在DE2平台上,用KEY0作为Clock输入,用SW1作为Enable,用SW0作为Clear,用HEX3~HEX0显示计数器的输出。

(5)将电路下载到DE2平台上,测试电路功能的正确性。

(6)用RTLViewer查看QuartusⅡ软件是如何对该电路进行综合的,与图6.16相比,综合后的电路有什么不同。6.5.2用赋值语句实现16位计数器在Verilog中可以用Q<=Q+1简单地实现一个计数器。现在用这种方法实现一个16位计数器,查看该电路一共占用了多少个LE以及Fmax是多少;再用同样的方法实现一个4位的计数器,用RTLViewer查看QuartusⅡ软件是如何综合这个电路的,与前面设计的电路相比看看有何不同。6.5.3用LPM实现16位计数器用参数化功能模块实现一个16位计数器,配置与6.5.2小节的练习一样,即包含使能端和同步清除端。查看该电路所占用的LE数量和Fmax值。再用这种方法实现一个4位的计数器,用RTLViewer查看QuartusⅡ软件是如何综合这个电路的,与用T触发器及赋值语句实现的计数器电路相比,看看有何不同。6.5.4闪烁的数码管在HEX0上连续循环地显示数字0~9,每秒刷新一次显示。使用计数器产生1 s的时间间隔,这个计数器的时钟由DE2平台上的50 MHz时钟提供。注意:这个设计中只允许使用DE2平台上的50 MHz时钟,而不允许使用其他时钟,并保证所有的触发器都使用这个50 MHz的时钟。6.5.5循环显示的“HELLO”设计一个电路来实现在HEX7~HEX0上循环显示“HELLO”,使所有字母从右向左移动,每秒移动一次,移动模式如表6.7所示。6.6时钟与定时器6.6.13位BCD计数器设计一个3位BCD计数器。计数器值每秒增加一次,计数器的输出显示在HEX2~HEX0上,用KEY0可以将计数器清零。计数器的控制信号由DE2平台上的50 MHz时钟提供。请按以下步骤完成练习:

(1)新建一个QuartusⅡ工程。

(2)建立一个Verilog文件,实现所要求的电路。

(3)将Verilog文件添加到工程中,编译工程并对电路进行仿真,确定其功能的正确性。

(4)分配引脚,将显示输出连接到HEX2~HEX0,用KEY0作为同步清除端。

(5)重新编译工程,将电路下载到DE2平台上并测试其功能。6.6.2实时时钟在DE2上实现一个实时时钟,用HEX7~HEX6显示小时(0~23),用HEX5~HEX4显示分钟(0~59),用HEX3~HEX2显示秒钟(0~59),用SW15~SW0设定时间。6.6.3反应时间测试电路在DE2上实现一个反应时间测试电路。测试电路的工作过程如下:

(1)按KEY0键可以复位测试电路。

(2)复位后过一段时间,红灯LEDR0打开,4位BCD计数器开始以毫秒为单位计数。从复位到红灯亮之间的时间可以用SW7~SW0以秒为单位进行设置。

(3)被测试的人看到红灯亮时,马上按KEY3键,KEY3键按下后,红灯熄灭,4位计数器停止计数并将此时的计数值显示在HEX2~HEX0上,此计数值即为反应时间。6.7有 限 状 态 机本节练习主要学习使用有限状态机。在数字电路系统中,有限状态机是一种十分重要的时序逻辑电路模块,它对数字系统的设计具有十分重要的作用。有限状态机是指输出取决于过去输入和当前输入的时序逻辑电路。一般来说,除了输入和输出以外,有限状态机还含有一组具有“记忆”功能的寄存器,这些寄存器的功能是记忆有限状态机的内部状态,它们常被称为状态寄存器。在有限状态机中,状态寄存器的下一个状态不仅与输入信号有关,而且还与该寄存器的当前状态有关,因此有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。其中,寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑又可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的输出。在实际的应用中,根据有限状态机是否使用输入信号,设计人员经常将其分为Moore型有限状态机和Mealy型有限状态机两种类型。Moore型有限状态机的输出信号仅与当前状态有关,即可以把Moore型有限状态机的输出看成是当前状态的函数。Mealy型有限状态机的输出信号不仅与当前状态有关,而且还与输入信号有关,即可以把Mealy型有限状态机的输出看成是当前状态和所有输入信号的函数。6.7.1One-hot编码的FSM在这部分的练习中我们设计一个区别两种特定时序的有限状态机(FSM)。该有限状态机有一个输入w和一个输出z。当w是4个连续的0或4个连续的1时,输出z=1,否则z=0。时序允许重叠,若w是连续的5个1时,则在第4个和第5个时钟之后,z均为1。图6.17是这个有限状态机的时序图。图6.17FSM的时序图这个有限状态机的状态图如图6.18所示,按照该状态图实现这个有限状态机的电路,就是从输入到每一个状态触发器的逻辑表达式的实现电路。可以用9个状态触发器来实现这个有限状态机,这9个状态触发器用表示。该有限状态机的One-hot编码如表6.8所示。图6.18FSM的状态图请按照以下步骤完成练习:

(1)新建一个QuartusⅡ工程,以在DE2上实现该状态机。

(2)建立一个Verilog文件,调用9个触发器来实现这个FSM,用简单的assign语句连接触发器的输入,用SW0作为FSM的低电平有效同步复位端,用SW1作为输入w,用KEY0作为手动的时钟输入,用LEDG0作为输出z,用LEDR8~LEDR0显示9个触发器的状态。

(3)将Verilog文件添加到工程中,编译工程并对电路进行仿真,确定其功能的正确性。

(4)分配引脚,重新编译工程,将电路下载到DE2平台上并进行功能测试。

(5)对表6.8所示的One-hot码进行简单的改动,将复位状态的所有触发器输出改为全0,这样在FPGA中实现FSM时会简化电路。因为FPGA中的触发器一般都带有Clear端,而没有Set端,所以用Clear端复位电路很方便。

(6)表6.9是对One-hot码所做的另一种改变,对于状态A,所有触发器的状态都是0。为了实现这个FSM,只要对表6.8中One-hot码的取反即可。按照表6.9的One-hot码修改前面完成的FSM并进行功能测试。6.7.2二进制编码的FSM这部分的练习中,我们用另一种Verilog代码实现如图6.18所示的状态机。在这个版本的状态机中,不需要手工推导每一个状态触发器的逻辑表达式,而是在第一个always块中用case语句描述FSM的状态表,用第二个always块实例化状态触发器,用第三个always块为输出z赋值。如表6.10所示,可以用4个状态寄存器按二进制编码的形式实现这个FSM。代码6.7是本练习的Verilog代码的建议架构。代码6.7FSM的建议架构。modulepart2(...); //定义输入/输出

//定义信号reg[3:0]y_Q,Y_D;//y_Q代表当前状态,Y_D代表下一状态parameterA=4’b0000,B=4’b0001,C=4’b0010,D=4’b0011,E=4’b0100,F=4’b0101,G=4’b0110,H=4’b0111,I=4’b1000;always@(w,y_Q)begin:state_tablecase(y_Q)A:if(!w)Y_D=B;elseY_D=F;//状态表其余部分default:Y_D=4’bxxxx;endcaseend//状态表always@(posedgeClock)begin:state_FFsend//state_FFS //为z和LED赋值endmodule请按照以下步骤完成练习:

(1)新建一个QuartusⅡ工程,以在DE2上实现该状态机。

(2)建立一个Verilog文件,调用9个触发器来实现这个FSM,用简单的assign语句连接触发器的输入。用SW0作为FSM的低电平有效同步复位端,用SW1作为输入w,用KEY0作为手动时钟输入,用LEDG0作为输出z,用LEDR3~LEDR0显示4个状态触发器的输出。

(3)在编译工程之前,应明确指定QuartusⅡ的综合工具采用Verilog代码中的状态分配,如果不作明确说明,综合工具会自动选择状态机的状态分配,而忽略Verilog代码中指定的状态码。要改变这个设置,在QuartusⅡ中选择Assignments>Settings,单击窗口左端的Analysis&SynthesisSettings项,如图6.19所示,在StateMachineProcessing栏中选中User-Encoded即可。

(4)编译工程,用RTLViewer工具查看具体电路。单击电路中的状态机,将它与图6.18的状态图比较,检查是否正确。打开编译报告,选择Analysis&SynthesisSettings,然后单击StateMachines可以查看状态机的状态代码。

(5)对生成的电路进行仿真。

(6)确认电路功能没有问题后即可分配引脚,将电路下载到FPGA中,进行实际功能的测试。

(7)在第(3)步中,在StateMachineProcessing栏中选择One-hot选项,编译后打开编译报告,选择Analysis&SynthesisSettings,然后单击StateMachines可以查看状态机的状态代码,再将该状态代码与表6.8的One-hot编码作比较,看看有何不同。图6.19在QuartusⅡ中改变状态机设置的处理方法6.7.3序列检测FSM本练习中使用两个移位寄存器实现序列检测FSM。在Verilog代码中用两个4位移位寄存器来识别0000和1111这两个序列。参照6.7.2小节的步骤完成练习,并将其结果与One-hot编码FSM及二进制编码FSM进行比较。请仔细考虑一下能否只用一个4位移位寄存器来实现这个状态机,为什么?6.7.4模10加计数器本练习实现一个模10加计数器,具体功能如下:Reset输入用于将计数器清零;两个输入和用于控制计数器的计数操作,当=00时计数值不变,当=01时计数值加1,当=10时计数值加2,当=11时计数值减1。所有的改变都由Clock输入端的上升沿触发。用SW2和SW1分别作为和,用SW0作为Reset输入,用KEY0作为手动Clock输入,在HEX0上显示计数器的十进制计数值。请按以下步骤完成练习:

(1)新建一个QuatusⅡ工程,以在DE2上实现该计数器。

(2)建立一个Verilog文件,参照代码6.7所示的代码架构实现所要求的电路。

(3)将Verilog文件添加到工程中,编译工程并对电路进行仿真,确定其功能的正确性。

(4)分配引脚,将显示输出连接到HEX0上。

(5)重新编译工程,将电路下载到DE2平台上并进行功能测试。6.7.5用移位寄存器与FSM实现“HELLO”的循环显示本练习用移位寄存器结合FSM实现在DE2平台上的“HELLO”循环显示。在HEX7~HEX0上循环显示“HELLO”,根据手动时钟输入脉冲的控制,每接收到一个脉冲,显示左移一位,当“HELLO”移出左边后,从右边重新开始显示。将8个7位寄存器按流水线的形式排列,即第一个寄存器的输出作为第二个寄存器的输入,第二个寄存器的输出作为第三个寄存器的输入,依此类推。每个寄存器的输出同时驱动七段数码管显示。请设计一个状态机对寄存器流水线进行以下控制:

(1)在前8个时钟,FSM将字符“H,E,L,L,O,,,”分别插入8个7位寄存器。

(2)第(1)步完成后,将寄存器流水线配置成循环模式,即最后一个寄存器的输出作为第一个寄存器的输入,使字符可以无限循环显示。建立一个新的QuartusⅡ工程,完成以上任务。用DE2平台上的KEY0作为FSM及移位寄存器的手动时钟输入,用SW0作为低电平有效同步清除输入,并参照代码6.7所示的代码架构实现所要求的电路。工程编译完成后,将电路下载到FPGA中测试其功能。6.7.6用FSM实现“HELLO”的自动循环显示本练习对6.7.5小节中的内容加以改动,字符的移动以1 s为间隔自动进行,在HEX7~HEX0上循环显示“HELLO”,“HELLO”从左边移出后,再从右边重新开始显示。建立一个新的QuartusⅡ工程,完成此任务,用DE2平台上的50 MHz时钟(CLOCK_50)作为FSM及移位寄存器的时钟输入,并确保所有的触发器都采用CLOCK_50作为时钟,用KEY0作为低电平有效同步清除输入,并参照代码6.7所示的代码架构实现所要求的电路。工程编译完成后,将电路下载到FPGA中进行功能测试。6.7.7移动速度可控的“HELLO”的自动循环显示对6.7.6小节中的练习加以改动,使“HELLO”移动的速度可以控制:当KEY1按下时,移动速度增加一倍;当KEY2按下时,移动速度减小一半。

KEY2和KEY1是经过去抖处理的,能够产生一个精确的脉冲,但脉冲的长度是任意的。建议另外增加一个FSM以监测按键的状态,这个FSM的输出可以作为调整移动时间间隔的一个变量。KEY2和KEY1是异步输入的,因此在FSM中使用时应先与系统时钟同步。电路复位后,字符每秒移动一次。当连续按KEY1键时,字符最快以每秒4次的速度移动;当连续按KEY2键时,字符最慢以每4秒一次的速度移动。建立一个新的QuartusⅡ工程,完成以上任务,并在DE2上测试其功能。6.8存储器块在计算机系统中,一般都需要提供一定数量的存储器。在用FPGA实现的系统中,除可以使用FPGA本身提供的存储器资源外,还可以使用FPGA的外部扩充存储器。本节练习主要是研究与存储器相关的内容。图6.20(a)是一个RAM的结构示意图,它包含32个8位宽的字节,可通过一个5位的地址口、8位的数据口和一个写控制端口来操作。我们考虑用两种方法实现这个存储器:第一种方法采用FPGA上的存储器块实现;第二种方法采用外部存储器芯片实现。

EP2C35FPGA片内提供专用存储器M4K存储器块。每个M4K存储器块包含4096位,支持4K×1、2K×2、1K×4和512×8四种配置。本练习中选择其512×8的配置,只使用存储器的前32个字节。本练习不涉及M4K支持的其他存储模式。

M4K有两个重要特性,即每个M4K存储器块都有专用的寄存器用于所有输入/输出与时钟同步,而每一个M4K存储器块的数据读端口和写端口是独立的。因此在使用M4KRAM时,要让输入/输出端口之一或全部与输入时钟同步。图6.20(b)所示是一个改进的32×8RAM模块,其Address、Write和DataIn端口都通过寄存器与时钟Clock同步,DataOut没有经过寄存器而直接输出。图6.2032×8RAM模块(a)RAM的结构;(b)改进的32×8RAM模块6.8.1用LPM实现RAM常用的逻辑电路如加法器、计数器、寄存器及存储器,都可调用QuartusⅡ提供的参数化功能模块LPM来实现。Altera公司推荐采用LPMaltsyncram实现存储器。请按照以下步骤,用LPM实现图6.20(b)所示的存储器。

(1)新建一个QuartusⅡ工程,设定其目标器件为EP2C35F672C6。

(2)用MegaWizardPlug-InManager产生需要的LPM模块,在如图6.21所示的MegaWizardPlug-InManager[page2a]对话框中选择Storage类的ALTSYNCRAMLPM模块,将Whichtypeofoutputfiledoyouwanttocreate一项选为VerilogHDL,即选择生成VerilogHDL文件。在Whatnamedoyouwantfortheoutputfile框中输入要建立的Verilog文件名,本例中将这个Verilog文件命名为ramlpm。按Next按钮继续,在page3of10对话框中选择单端口模式(Single-portmode),如图6.22所示。将page7of10对话框中的Whatportsshouldberegistered栏下的复选项Readoutputports(s)'q'去掉,如图6.23所示。其他配置均选用默认值。按Finish按钮即可生成如图6.20(b)所示的RAM模块的Verilog代码。图6.21选择ALTSYNCRAMLPM图6.22选择单端口模式图6.23配置输入/输出端口

(3)编译工程,在编译报告里可以看到工程占用了1个M4K块中256个字节的RAM。

(4)对电路进行仿真,并验证电路的功能。6.8.2在DE2上验证RAM本练习的任务是在DE2上验证6.8.1小节中的存储器电路,即用波段开关写一部分数据到RAM中,并将RAM中的内容读出来,显示在数码管上。请按照以下步骤完成练习:

(1)新建一个QuartusⅡ工程。

(2)新建一个Verilog文件,例化ramlpm模块,用DE2平台上的资源作为其输入/输出。用SW15~SW11作为5位的地址输入,用SW7~SW0作为数据输入,用SW17作为Write信号,用KEY0作为时钟信号,将Write信号的值在LEDG0上显示,将地址值在HEX7~HEX6上显示,将输入数据在HEX5和HEX4上显示,从RAM中读出的数据在HEX1~HEX0上显示。

(3)编译工程,并下载到DE2上。

(4)对电路进行功能测试,确保所有的地址都能够被正确地读/写。6.8.3用Verilog实现RAM除调用LPM外,我们还可以用Verilog实现RAM的结构。在Verilog代码中,可以用多维数组定义存储器。一个32字节的8位RAM块,可以定义为32×8的数组,在Verilog中可用以下声明语句来定义:

Reg[7:0]memory_array[31:0];在CycloneⅡ系列FPGA中,这种数组可以由触发器实现,也可以由M4K存储器块实现。有两种方法可以保证用M4K存储器块实现RAM:第一种方法是调用LPM库;另一种方法是用适当形式的Verilog代码定义RAM,QuartusⅡ软件在编译的时候,会自动推断出该代码描述的是一个RAM块,从而用M4K存储器块实现RAM。具体实现方法可通过在QuartusⅡ的软件帮助中搜索主题“Inferredmemory”来查阅。参照Inferredmemory的内容完成以下练习:

(1)新建一个QuartusⅡ工程。

(2)新建一个Verilog文件,用Verilog代码实现类似于6.8.2小节中练习的功能。RAM模块用数组定义,Verilog代码中应包含RAM的写入和读出功能。

(3)编译工程,并下载到DE2上。

(4)对电路进行功能测试,确保所有的地址都能够被正确地读/写,并与6.8.2小节中练习的功能作比较。6.8.4FPGA片外RAM的使用

DE2平台上集成了一个SRAM芯片IS61LV25616AL-10,这是一个256 K字节的16位静态RAM(SRAM)。这个SRAM芯片的接口包括18位地址口A17~A0,16位双向数据口I/O 15~I/O 0,还包括CE、OE、WE、UB和LB等控制信号,且这些控制信号都是低电平有效的,具体功能如表6.11所示。

IS61LV25616AL的具体操作参考其数据手册,数据手册中描述了IS61LV25616AL的多种操作模式以及各种操作模式的时序及参数。本练习中采用最简单的一种操作模式,即保持CE、OE、UB和LB等信号有效(置0),而只用WE信号作为读/写控制。这种操作模式的时序如图6.24所示,其中图6.24(a)是读循环的时序,当WE保持高电平而地址信号A17~A0有效时,存储器延时,然后将有效数据送到I/O15~I/O0端口。地址信号改变后,读循环结束,有效数据仍然可以保持。图6.24(b)是写循环的时序,从WE置0开始到WE置1结束,在WE上升沿之前,地址信号必须保持地址建立时间有效,而数据必须保持数据建立时间有效。表6.12列出了图6.24中的所有时间参数。图6.24SRAM读/写操作时序(a) SRAM读循环时序;(b) SRAM写循环时序本练习用SRAM芯片实现如图6.20(a)所示的32×8的RAM模块,请按照以下步骤完成练习:

(1)建立一个新的QuartusⅡ工程,编写Verilog代码,完成所需的功能,包括对存储器的读/写,使用与6.8.2小节及6.8.3小节相同的LED和七段数码管显示,使用表6.11的引脚配置实现IS61LV256AL的接口设置。注意,本例中没有使用IS61LV256AL的所有数据及地址引脚,故在Verilog中应将不需要使用的引脚接地。

(2)编译工程,并下载到FPGA中。

(3)对电路进行功能测试,确保所有的地址都能够正确读/写。6.8.5用LPM实现简单双口RAM图6.20所示的存储器是一个单口RAM,即对RAM的读/写操作共用一组地址端口。本练习建立另外一种RAM模块,即双口RAM,其读/写采用不同的地址端口。请按以下步骤完成练习:

(1)建立一个新的QuartusⅡ工程,在MegaWizardPlug-InManager[Page2a]对话框中选择Storage类下的ALTSYNCRAMLPM模块,在Whichtypeofoutputfiledoyouwanttocreate项中选VerilogHDL,即选择生成VerilogHDL文件。在Whatnamedoyouwantfortheoutputfile框中输入要建立的Verilog文件名。按Next按钮继续,在如图6.25所示的page3of10对话框中,选择简单双口模式(Simpledual-portmode),在如图6.26所示的page8of10对话框中,在MixedPortRead-During-WriteforSingleInputClockRAM栏中选择Idon’tcare,表示当读/写地址相同时,不考虑输出的是旧数据还是新数据;在如图6.27所示的page9of10对话框的Doyouwanttospecifytheinitialcontentofthememory栏中选择yes,use…,这种选择允许当电路下载到FPGA中去的时候,可以对存储器的内容进行初始化,初始化的内容以存储器初始化文件(MemoryInitializationFile,MIF)格式存储。在Filename栏中输入.mif文件的文件名,本例中选用的文件名为ramlpm.mif。关于MIF文件的具体格式,请参照QuartusⅡ的帮助或相关手册,这个文件需要由用户建立。图6.25确定RAM的模式图6.26确定同时读同一个地址内容时的处理机制图6.27确定存储器初始化文件的名称

(2)关闭向导后,测试生成的存储器模块文件ramlpm.v。

(3)编写一个Verilog文件,然后调用一个存储器模块的实例。为了查看RAM中的内容,将RAM中的内容用十六进制形式逐字节地显示在HEX1和HEX0上,约每秒钟滚动一次,同时在HEX3和HEX2上显示该字节的地址。使用DE2平台上的50 MHz时钟CLOCK_50作为时钟源,使用KEY0作为Reset输入。输入数据所用的波段开关、数码管与6.8.2小节中的相同,注意要将波段开关的输入与50 MHz时钟同步。

(4)编译工程并在DE2上对电路进行测试,确认存储器中的内容是否与ramlpm.mif文件中的相同,确保可以用波段开关向任何地址写入任何数据。6.8.6伪双口RAM在6.8.5小节中建立的双口RAM,由于有两个地址口,因此可以同时对其进行读操作和写操作。本练习中建立的RAM具有类似的功能,但只使用一个单口RAM来实现。由于只有一个地址端口,因此需要通过复用来分时进行读/写操作。请按以下步骤完成练习:

(1)新建一个QuartusⅡ工程,使用MegaWizardPlug-InManager建立一个单口RAM。与6.8.1小节中建立的单口RAM不同的是,在Page9of10对话框中选择RAM内容的初始化文件时,要同时选中AllowIn-SystemMemoryContentEditortocaptureandupdatecontentindependentlyofthesystemclock项,即允许QuartusⅡ的在系统存储器内容编辑器(In-SystemMemoryContentEditor)查看和修改这个RAM块中的内容,如图6.28所示。使用这个工具的时候,可以为存储器块设定一个“InstanceID”,本例中将这个存储器的InstanceID设为32x8。图6.28允许在系统存储器内容编辑器修改的RAM内容

(2)编写一个Verilog文件,调用这个RAM模块,实现与6.8.5小节练习一样的功能。

(3)在使用In-SystemMemoryContentEditor查看和编辑RAM内容之前,还要对另一个设置进行修改。用Assignment>settings菜单打开Settings对话框,在Analysis&SynthesisSettings栏的DefaultParameters中添加一个参数CYCLONEII_SAFE_WRITE,其默认设置为RESTRUCTURE,如图6.29所示。这个参数允许Quartus的综合工具对单口RAM加以改进,使之能被In-SystemMemoryContentEditor查看和修改。图6.29设置CYCLONEII_SAFE_WRITE参数

(4)编译并将电路下载到DE2中,对电路进行功能测试,确认所有RAM的内容都可以读/写,并与6.8.5小节中练习的结果进行比较。

(5)用Tools>In-SystemMemoryContentEditor菜单打开如图6.30所示的窗口,通过这个窗口可以读取或修改RAM中的内容,具体使用方法请参照QuartusⅡ软件的使用帮助。改变RAM中的内容,确认在数码管上显示的内容与In-SystemMemoryContentEditor中的内容一致。图6.30In-SystemMemoryContentEditor窗口6.8.7用DE2控制面板查看并修改片外RAM的内容本练习用SRAM芯片IS61LV25616AL取代M4K存储器块,实现6.8.6小节和

温馨提示

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

评论

0/150

提交评论